/ Hex Artifact Content
Login

Artifact ac9d259eea3123faa05fabe6dd8717696aca72b1:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t.h"../*.** Retu
0220: 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74 79  rn the 'affinity
0230: 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  ' of the express
0240: 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e 79  ion pExpr if any
0250: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
0260: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61 20   is a column, a 
0270: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 63  reference to a c
0280: 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41 53  olumn via an 'AS
0290: 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20 61  ' alias,.** or a
02a0: 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74 68   sub-select with
02b0: 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65   a column as the
02c0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 74   return value, t
02d0: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66 69  hen the .** affi
02e0: 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f 6c  nity of that col
02f0: 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  umn is returned.
0300: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30 30   Otherwise, 0x00
0310: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
0320: 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 61   indicating no a
0330: 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65 20  ffinity for the 
0340: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
0350: 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52 45  * i.e. the WHERE
0360: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 73   clause expresss
0370: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0380: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0390: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
03a0: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
03b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
03c0: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
03d0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
03e0: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
03f0: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0400: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
0410: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
0420: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
0430: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
0440: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
0450: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
0460: 20 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   op;.  pExpr = s
0470: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0480: 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
0490: 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
04a0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c    if( op==TK_SEL
04b0: 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ECT ){.    asser
04c0: 74 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 26  t( pExpr->flags&
04d0: 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b 0a  EP_xIsSelect );.
04e0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
04f0: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
0500: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  Expr->x.pSelect-
0510: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
0520: 78 70 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  xpr);.  }.#ifnde
0530: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41  f SQLITE_OMIT_CA
0540: 53 54 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  ST.  if( op==TK_
0550: 43 41 53 54 20 29 7b 0a 20 20 20 20 61 73 73 65  CAST ){.    asse
0560: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
0570: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
0580: 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
0590: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41 66  return sqlite3Af
05a0: 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70 72  finityType(pExpr
05b0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 7d  ->u.zToken);.  }
05c0: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 28 6f  .#endif.  if( (o
05d0: 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
05e0: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   || op==TK_COLUM
05f0: 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49  N || op==TK_REGI
0600: 53 54 45 52 29 20 0a 20 20 20 26 26 20 70 45 78  STER) .   && pEx
0610: 70 72 2d 3e 70 54 61 62 21 3d 30 0a 20 20 29 7b  pr->pTab!=0.  ){
0620: 0a 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52  .    /* op==TK_R
0630: 45 47 49 53 54 45 52 20 26 26 20 70 45 78 70 72  EGISTER && pExpr
0640: 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e  ->pTab!=0 happen
0650: 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61 73  s when pExpr was
0660: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20   originally.    
0670: 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62  ** a TK_COLUMN b
0680: 75 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  ut was previousl
0690: 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  y evaluated and 
06a0: 63 61 63 68 65 64 20 69 6e 20 61 20 72 65 67 69  cached in a regi
06b0: 73 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ster */.    int 
06c0: 6a 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  j = pExpr->iColu
06d0: 6d 6e 3b 0a 20 20 20 20 69 66 28 20 6a 3c 30 20  mn;.    if( j<0 
06e0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
06f0: 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  AFF_INTEGER;.   
0700: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
0710: 70 54 61 62 20 26 26 20 6a 3c 70 45 78 70 72 2d  pTab && j<pExpr-
0720: 3e 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  >pTab->nCol );. 
0730: 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d     return pExpr-
0740: 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61  >pTab->aCol[j].a
0750: 66 66 69 6e 69 74 79 3b 0a 20 20 7d 0a 20 20 72  ffinity;.  }.  r
0760: 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61 66 66  eturn pExpr->aff
0770: 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  inity;.}../*.** 
0780: 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  Set the collatin
0790: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65  g sequence for e
07a0: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
07b0: 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c 61 74  to be the collat
07c0: 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20  ing.** sequence 
07d0: 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e 2e  named by pToken.
07e0: 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e     Return a poin
07f0: 74 65 72 20 74 6f 20 61 20 6e 65 77 20 45 78 70  ter to a new Exp
0800: 72 20 6e 6f 64 65 20 74 68 61 74 0a 2a 2a 20 69  r node that.** i
0810: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 43 4f  mplements the CO
0820: 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a  LLATE operator..
0830: 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72  **.** If a memor
0840: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
0850: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 61 74 20  or occurs, that 
0860: 66 61 63 74 20 69 73 20 72 65 63 6f 72 64 65 64  fact is recorded
0870: 20 69 6e 20 70 50 61 72 73 65 2d 3e 64 62 0a 2a   in pParse->db.*
0880: 2a 20 61 6e 64 20 74 68 65 20 70 45 78 70 72 20  * and the pExpr 
0890: 70 61 72 61 6d 65 74 65 72 20 69 73 20 72 65 74  parameter is ret
08a0: 75 72 6e 65 64 20 75 6e 63 68 61 6e 67 65 64 2e  urned unchanged.
08b0: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
08c0: 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54  3ExprAddCollateT
08d0: 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72  oken(Parse *pPar
08e0: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
08f0: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d   Token *pCollNam
0900: 65 29 7b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 4e  e){.  if( pCollN
0910: 61 6d 65 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20  ame->n>0 ){.    
0920: 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c  Expr *pNew = sql
0930: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50  ite3ExprAlloc(pP
0940: 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c  arse->db, TK_COL
0950: 4c 41 54 45 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c  LATE, pCollName,
0960: 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65   1);.    if( pNe
0970: 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  w ){.      pNew-
0980: 3e 70 4c 65 66 74 20 3d 20 70 45 78 70 72 3b 0a  >pLeft = pExpr;.
0990: 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67        pNew->flag
09a0: 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 3b  s |= EP_Collate;
09b0: 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70  .      pExpr = p
09c0: 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  New;.    }.  }. 
09d0: 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d   return pExpr;.}
09e0: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
09f0: 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69  prAddCollateStri
0a00: 6e 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ng(Parse *pParse
0a10: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63  , Expr *pExpr, c
0a20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 29 7b 0a  onst char *zC){.
0a30: 20 20 54 6f 6b 65 6e 20 73 3b 0a 20 20 61 73 73    Token s;.  ass
0a40: 65 72 74 28 20 7a 43 21 3d 30 20 29 3b 0a 20 20  ert( zC!=0 );.  
0a50: 73 2e 7a 20 3d 20 7a 43 3b 0a 20 20 73 2e 6e 20  s.z = zC;.  s.n 
0a60: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
0a70: 30 28 73 2e 7a 29 3b 0a 20 20 72 65 74 75 72 6e  0(s.z);.  return
0a80: 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43   sqlite3ExprAddC
0a90: 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72  ollateToken(pPar
0aa0: 73 65 2c 20 70 45 78 70 72 2c 20 26 73 29 3b 0a  se, pExpr, &s);.
0ab0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6b 69 70 20 6f 76  }../*.** Skip ov
0ac0: 65 72 20 61 6e 79 20 54 4b 5f 43 4f 4c 4c 41 54  er any TK_COLLAT
0ad0: 45 20 61 6e 64 2f 6f 72 20 54 4b 5f 41 53 20 6f  E and/or TK_AS o
0ae0: 70 65 72 61 74 6f 72 73 20 61 74 20 74 68 65 20  perators at the 
0af0: 72 6f 6f 74 20 6f 66 0a 2a 2a 20 61 6e 20 65 78  root of.** an ex
0b00: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45 78 70  pression..*/.Exp
0b10: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 53 6b  r *sqlite3ExprSk
0b20: 69 70 43 6f 6c 6c 61 74 65 28 45 78 70 72 20 2a  ipCollate(Expr *
0b30: 70 45 78 70 72 29 7b 0a 20 20 77 68 69 6c 65 28  pExpr){.  while(
0b40: 20 70 45 78 70 72 20 26 26 20 28 70 45 78 70 72   pExpr && (pExpr
0b50: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
0b60: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
0b70: 4b 5f 41 53 29 20 29 7b 0a 20 20 20 20 70 45 78  K_AS) ){.    pEx
0b80: 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  pr = pExpr->pLef
0b90: 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
0ba0: 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pExpr;.}../*.** 
0bb0: 52 65 74 75 72 6e 20 74 68 65 20 63 6f 6c 6c 61  Return the colla
0bc0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
0bd0: 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
0be0: 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a 20 74 68   pExpr. If.** th
0bf0: 65 72 65 20 69 73 20 6e 6f 20 64 65 66 69 6e 65  ere is no define
0c00: 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
0c10: 65 6e 63 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c  ence, return NUL
0c20: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c  L..**.** The col
0c30: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
0c40: 6d 69 67 68 74 20 62 65 20 64 65 74 65 72 6d 69  might be determi
0c50: 6e 65 64 20 62 79 20 61 20 43 4f 4c 4c 41 54 45  ned by a COLLATE
0c60: 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 6f 72 20   operator.** or 
0c70: 62 79 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  by the presence 
0c80: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 77 69 74 68  of a column with
0c90: 20 61 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61   a defined colla
0ca0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
0cb0: 2a 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  * COLLATE operat
0cc0: 6f 72 73 20 74 61 6b 65 20 66 69 72 73 74 20 70  ors take first p
0cd0: 72 65 63 65 64 65 6e 63 65 2e 20 20 4c 65 66 74  recedence.  Left
0ce0: 20 6f 70 65 72 61 6e 64 73 20 74 61 6b 65 0a 2a   operands take.*
0cf0: 2a 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65  * precedence ove
0d00: 72 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 73  r right operands
0d10: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
0d20: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
0d30: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
0d40: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
0d50: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
0d60: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 43 6f 6c 6c  arse->db;.  Coll
0d70: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
0d80: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 78 70    Expr *p = pExp
0d90: 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  r;.  while( p ){
0da0: 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 2d  .    int op = p-
0db0: 3e 6f 70 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d  >op;.    if( op=
0dc0: 3d 54 4b 5f 43 41 53 54 20 7c 7c 20 6f 70 3d 3d  =TK_CAST || op==
0dd0: 54 4b 5f 55 50 4c 55 53 20 29 7b 0a 20 20 20 20  TK_UPLUS ){.    
0de0: 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a    p = p->pLeft;.
0df0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
0e00: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
0e10: 28 20 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45  ( op!=TK_REGISTE
0e20: 52 20 7c 7c 20 70 2d 3e 6f 70 32 21 3d 54 4b 5f  R || p->op2!=TK_
0e30: 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20 69  COLLATE );.    i
0e40: 66 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  f( op==TK_COLLAT
0e50: 45 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  E ){.      pColl
0e60: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c   = sqlite3GetCol
0e70: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 45 4e 43  lSeq(pParse, ENC
0e80: 28 64 62 29 2c 20 30 2c 20 70 2d 3e 75 2e 7a 54  (db), 0, p->u.zT
0e90: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  oken);.      bre
0ea0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
0eb0: 28 20 70 2d 3e 70 54 61 62 21 3d 30 0a 20 20 20  ( p->pTab!=0.   
0ec0: 20 20 26 26 20 28 6f 70 3d 3d 54 4b 5f 41 47 47    && (op==TK_AGG
0ed0: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54  _COLUMN || op==T
0ee0: 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20  K_COLUMN.       
0ef0: 20 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47     || op==TK_REG
0f00: 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  ISTER || op==TK_
0f10: 54 52 49 47 47 45 52 29 0a 20 20 20 20 29 7b 0a  TRIGGER).    ){.
0f20: 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f        /* op==TK_
0f30: 52 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e 70  REGISTER && p->p
0f40: 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20 77  Tab!=0 happens w
0f50: 68 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f 72  hen pExpr was or
0f60: 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 20 20 2a  iginally.      *
0f70: 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75  * a TK_COLUMN bu
0f80: 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t was previously
0f90: 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 63   evaluated and c
0fa0: 61 63 68 65 64 20 69 6e 20 61 20 72 65 67 69 73  ached in a regis
0fb0: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ter */.      int
0fc0: 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b   j = p->iColumn;
0fd0: 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 30 20  .      if( j>=0 
0fe0: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
0ff0: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
1000: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ->pTab->aCol[j].
1010: 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  zColl;.        p
1020: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
1030: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e  ndCollSeq(db, EN
1040: 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29  C(db), zColl, 0)
1050: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1060: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1070: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
1080: 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  EP_Collate ){.  
1090: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
10a0: 2d 3e 70 4c 65 66 74 29 20 26 26 20 28 70 2d 3e  ->pLeft) && (p->
10b0: 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45  pLeft->flags & E
10c0: 50 5f 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b  P_Collate)!=0 ){
10d0: 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 2d 3e  .        p = p->
10e0: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 65 6c  pLeft;.      }el
10f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20  se{.        p = 
1100: 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  p->pRight;.     
1110: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
1120: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1130: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
1140: 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70  e3CheckCollSeq(p
1150: 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b  Parse, pColl) ){
1160: 20 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b   .    pColl = 0;
1170: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43  .  }.  return pC
1180: 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45  oll;.}../*.** pE
1190: 78 70 72 20 69 73 20 61 6e 20 6f 70 65 72 61 6e  xpr is an operan
11a0: 64 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f  d of a compariso
11b0: 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 61 66 66  n operator.  aff
11c0: 32 20 69 73 20 74 68 65 0a 2a 2a 20 74 79 70 65  2 is the.** type
11d0: 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65   affinity of the
11e0: 20 6f 74 68 65 72 20 6f 70 65 72 61 6e 64 2e 20   other operand. 
11f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
1200: 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 74 79 70  turns the.** typ
1210: 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20  e affinity that 
1220: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66  should be used f
1230: 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  or the compariso
1240: 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63  n operator..*/.c
1250: 68 61 72 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  har sqlite3Compa
1260: 72 65 41 66 66 69 6e 69 74 79 28 45 78 70 72 20  reAffinity(Expr 
1270: 2a 70 45 78 70 72 2c 20 63 68 61 72 20 61 66 66  *pExpr, char aff
1280: 32 29 7b 0a 20 20 63 68 61 72 20 61 66 66 31 20  2){.  char aff1 
1290: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
12a0: 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20  inity(pExpr);.  
12b0: 69 66 28 20 61 66 66 31 20 26 26 20 61 66 66 32  if( aff1 && aff2
12c0: 20 29 7b 0a 20 20 20 20 2f 2a 20 42 6f 74 68 20   ){.    /* Both 
12d0: 73 69 64 65 73 20 6f 66 20 74 68 65 20 63 6f 6d  sides of the com
12e0: 70 61 72 69 73 6f 6e 20 61 72 65 20 63 6f 6c 75  parison are colu
12f0: 6d 6e 73 2e 20 49 66 20 6f 6e 65 20 68 61 73 20  mns. If one has 
1300: 6e 75 6d 65 72 69 63 0a 20 20 20 20 2a 2a 20 61  numeric.    ** a
1310: 66 66 69 6e 69 74 79 2c 20 75 73 65 20 74 68 61  ffinity, use tha
1320: 74 2e 20 4f 74 68 65 72 77 69 73 65 20 75 73 65  t. Otherwise use
1330: 20 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20 20   no affinity..  
1340: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
1350: 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66  ite3IsNumericAff
1360: 69 6e 69 74 79 28 61 66 66 31 29 20 7c 7c 20 73  inity(aff1) || s
1370: 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41  qlite3IsNumericA
1380: 66 66 69 6e 69 74 79 28 61 66 66 32 29 20 29 7b  ffinity(aff2) ){
1390: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
13a0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
13b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13d0: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d  _AFF_NONE;.    }
13e0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66  .  }else if( !af
13f0: 66 31 20 26 26 20 21 61 66 66 32 20 29 7b 0a 20  f1 && !aff2 ){. 
1400: 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 73 69     /* Neither si
1410: 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72  de of the compar
1420: 69 73 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  ison is a column
1430: 2e 20 20 43 6f 6d 70 61 72 65 20 74 68 65 0a 20  .  Compare the. 
1440: 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 20 64 69     ** results di
1450: 72 65 63 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20  rectly..    */. 
1460: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1470: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 65 6c  _AFF_NONE;.  }el
1480: 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 73  se{.    /* One s
1490: 69 64 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c  ide is a column,
14a0: 20 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f   the other is no
14b0: 74 2e 20 55 73 65 20 74 68 65 20 63 6f 6c 75 6d  t. Use the colum
14c0: 6e 73 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a  ns affinity. */.
14d0: 20 20 20 20 61 73 73 65 72 74 28 20 61 66 66 31      assert( aff1
14e0: 3d 3d 30 20 7c 7c 20 61 66 66 32 3d 3d 30 20 29  ==0 || aff2==0 )
14f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 61 66  ;.    return (af
1500: 66 31 20 2b 20 61 66 66 32 29 3b 0a 20 20 7d 0a  f1 + aff2);.  }.
1510: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
1520: 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  s a comparison o
1530: 70 65 72 61 74 6f 72 2e 20 20 52 65 74 75 72 6e  perator.  Return
1540: 20 74 68 65 20 74 79 70 65 20 61 66 66 69 6e 69   the type affini
1550: 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a  ty that should.*
1560: 2a 20 62 65 20 61 70 70 6c 69 65 64 20 74 6f 20  * be applied to 
1570: 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 70 72  both operands pr
1580: 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 74 68 65  ior to doing the
1590: 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a   comparison..*/.
15a0: 73 74 61 74 69 63 20 63 68 61 72 20 63 6f 6d 70  static char comp
15b0: 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 45  arisonAffinity(E
15c0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63  xpr *pExpr){.  c
15d0: 68 61 72 20 61 66 66 3b 0a 20 20 61 73 73 65 72  har aff;.  asser
15e0: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
15f0: 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _EQ || pExpr->op
1600: 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70 45 78 70 72  ==TK_IN || pExpr
1610: 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20  ->op==TK_LT ||. 
1620: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
1630: 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70 45 78  op==TK_GT || pEx
1640: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c  pr->op==TK_GE ||
1650: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c   pExpr->op==TK_L
1660: 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70  E ||.          p
1670: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20  Expr->op==TK_NE 
1680: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
1690: 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _IS || pExpr->op
16a0: 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20  ==TK_ISNOT );.  
16b0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
16c0: 4c 65 66 74 20 29 3b 0a 20 20 61 66 66 20 3d 20  Left );.  aff = 
16d0: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
16e0: 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ity(pExpr->pLeft
16f0: 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  );.  if( pExpr->
1700: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 61 66  pRight ){.    af
1710: 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  f = sqlite3Compa
1720: 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  reAffinity(pExpr
1730: 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 29 3b 0a  ->pRight, aff);.
1740: 20 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72    }else if( Expr
1750: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1760: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1770: 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71   ){.    aff = sq
1780: 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
1790: 6e 69 74 79 28 70 45 78 70 72 2d 3e 78 2e 70 53  nity(pExpr->x.pS
17a0: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  elect->pEList->a
17b0: 5b 30 5d 2e 70 45 78 70 72 2c 20 61 66 66 29 3b  [0].pExpr, aff);
17c0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66  .  }else if( !af
17d0: 66 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53  f ){.    aff = S
17e0: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
17f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66    }.  return aff
1800: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72  ;.}../*.** pExpr
1810: 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   is a comparison
1820: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e   expression, eg.
1830: 20 27 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e   '=', '<', IN(..
1840: 2e 29 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61  .) etc..** idx_a
1850: 66 66 69 6e 69 74 79 20 69 73 20 74 68 65 20 61  ffinity is the a
1860: 66 66 69 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e  ffinity of an in
1870: 64 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65  dexed column. Re
1880: 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20  turn true.** if 
1890: 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 61  the index with a
18a0: 66 66 69 6e 69 74 79 20 69 64 78 5f 61 66 66 69  ffinity idx_affi
18b0: 6e 69 74 79 20 6d 61 79 20 62 65 20 75 73 65 64  nity may be used
18c0: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a   to implement.**
18d0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
18e0: 69 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74  in pExpr..*/.int
18f0: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66   sqlite3IndexAff
1900: 69 6e 69 74 79 4f 6b 28 45 78 70 72 20 2a 70 45  inityOk(Expr *pE
1910: 78 70 72 2c 20 63 68 61 72 20 69 64 78 5f 61 66  xpr, char idx_af
1920: 66 69 6e 69 74 79 29 7b 0a 20 20 63 68 61 72 20  finity){.  char 
1930: 61 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e  aff = comparison
1940: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b  Affinity(pExpr);
1950: 0a 20 20 73 77 69 74 63 68 28 20 61 66 66 20 29  .  switch( aff )
1960: 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
1970: 45 5f 41 46 46 5f 4e 4f 4e 45 3a 0a 20 20 20 20  E_AFF_NONE:.    
1980: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1990: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f  case SQLITE_AFF_
19a0: 54 45 58 54 3a 0a 20 20 20 20 20 20 72 65 74 75  TEXT:.      retu
19b0: 72 6e 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d  rn idx_affinity=
19c0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
19d0: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
19e0: 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
19f0: 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69  te3IsNumericAffi
1a00: 6e 69 74 79 28 69 64 78 5f 61 66 66 69 6e 69 74  nity(idx_affinit
1a10: 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  y);.  }.}../*.**
1a20: 20 52 65 74 75 72 6e 20 74 68 65 20 50 35 20 76   Return the P5 v
1a30: 61 6c 75 65 20 74 68 61 74 20 73 68 6f 75 6c 64  alue that should
1a40: 20 62 65 20 75 73 65 64 20 66 6f 72 20 61 20 62   be used for a b
1a50: 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e  inary comparison
1a60: 0a 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45  .** opcode (OP_E
1a70: 71 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29 20 75  q, OP_Ge etc.) u
1a80: 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 70  sed to compare p
1a90: 45 78 70 72 31 20 61 6e 64 20 70 45 78 70 72 32  Expr1 and pExpr2
1aa0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 62  ..*/.static u8 b
1ab0: 69 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28 45  inaryCompareP5(E
1ac0: 78 70 72 20 2a 70 45 78 70 72 31 2c 20 45 78 70  xpr *pExpr1, Exp
1ad0: 72 20 2a 70 45 78 70 72 32 2c 20 69 6e 74 20 6a  r *pExpr2, int j
1ae0: 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38  umpIfNull){.  u8
1af0: 20 61 66 66 20 3d 20 28 63 68 61 72 29 73 71 6c   aff = (char)sql
1b00: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
1b10: 28 70 45 78 70 72 32 29 3b 0a 20 20 61 66 66 20  (pExpr2);.  aff 
1b20: 3d 20 28 75 38 29 73 71 6c 69 74 65 33 43 6f 6d  = (u8)sqlite3Com
1b30: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78  pareAffinity(pEx
1b40: 70 72 31 2c 20 61 66 66 29 20 7c 20 28 75 38 29  pr1, aff) | (u8)
1b50: 6a 75 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65  jumpIfNull;.  re
1b60: 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a  turn aff;.}../*.
1b70: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
1b80: 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61  ter to the colla
1b90: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68  tion sequence th
1ba0: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  at should be use
1bb0: 64 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79  d by.** a binary
1bc0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
1bd0: 61 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 70  ator comparing p
1be0: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e  Left and pRight.
1bf0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65  .**.** If the le
1c00: 66 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69  ft hand expressi
1c10: 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69  on has a collati
1c20: 6e 67 20 73 65 71 75 65 6e 63 65 20 74 79 70 65  ng sequence type
1c30: 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20  , then it is.** 
1c40: 75 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  used. Otherwise 
1c50: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
1c60: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72  quence for the r
1c70: 69 67 68 74 20 68 61 6e 64 20 65 78 70 72 65 73  ight hand expres
1c80: 73 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c  sion.** is used,
1c90: 20 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20   or the default 
1ca0: 28 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69 74  (BINARY) if neit
1cb0: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 68  her expression h
1cc0: 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a  as a collating.*
1cd0: 2a 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72  * type..**.** Ar
1ce0: 67 75 6d 65 6e 74 20 70 52 69 67 68 74 20 28 62  gument pRight (b
1cf0: 75 74 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61  ut not pLeft) ma
1d00: 79 20 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e  y be a null poin
1d10: 74 65 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ter. In this cas
1d20: 65 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20  e,.** it is not 
1d30: 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43  considered..*/.C
1d40: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 42  ollSeq *sqlite3B
1d50: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
1d60: 53 65 71 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Seq(.  Parse *pP
1d70: 61 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70  arse, .  Expr *p
1d80: 4c 65 66 74 2c 20 0a 20 20 45 78 70 72 20 2a 70  Left, .  Expr *p
1d90: 52 69 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53  Right.){.  CollS
1da0: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73  eq *pColl;.  ass
1db0: 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20  ert( pLeft );.  
1dc0: 69 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73  if( pLeft->flags
1dd0: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b   & EP_Collate ){
1de0: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
1df0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
1e00: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a  pParse, pLeft);.
1e10: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67    }else if( pRig
1e20: 68 74 20 26 26 20 28 70 52 69 67 68 74 2d 3e 66  ht && (pRight->f
1e30: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
1e40: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f  e)!=0 ){.    pCo
1e50: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
1e60: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1e70: 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65  pRight);.  }else
1e80: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
1e90: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1ea0: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b  (pParse, pLeft);
1eb0: 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20  .    if( !pColl 
1ec0: 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  ){.      pColl =
1ed0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
1ee0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69 67  Seq(pParse, pRig
1ef0: 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ht);.    }.  }. 
1f00: 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d   return pColl;.}
1f10: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1f20: 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70   code for a comp
1f30: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
1f40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
1f50: 6f 64 65 43 6f 6d 70 61 72 65 28 0a 20 20 50 61  odeCompare(.  Pa
1f60: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1f70: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 28  /* The parsing (
1f80: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
1f90: 69 6e 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ing) context */.
1fa0: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20    Expr *pLeft,  
1fb0: 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20      /* The left 
1fc0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70  operand */.  Exp
1fd0: 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 2f  r *pRight,     /
1fe0: 2a 20 54 68 65 20 72 69 67 68 74 20 6f 70 65 72  * The right oper
1ff0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63  and */.  int opc
2000: 6f 64 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  ode,       /* Th
2010: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63  e comparison opc
2020: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31  ode */.  int in1
2030: 2c 20 69 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65  , int in2, /* Re
2040: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f  gister holding o
2050: 70 65 72 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74  perands */.  int
2060: 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f   dest,         /
2070: 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74  * Jump here if t
2080: 72 75 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a  rue.  */.  int j
2090: 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20  umpIfNull    /* 
20a0: 49 66 20 74 72 75 65 2c 20 6a 75 6d 70 20 69 66  If true, jump if
20b0: 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20   either operand 
20c0: 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  is NULL */.){.  
20d0: 69 6e 74 20 70 35 3b 0a 20 20 69 6e 74 20 61 64  int p5;.  int ad
20e0: 64 72 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  dr;.  CollSeq *p
20f0: 34 3b 0a 0a 20 20 70 34 20 3d 20 73 71 6c 69 74  4;..  p4 = sqlit
2100: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
2110: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
2120: 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
2130: 20 70 35 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70   p5 = binaryComp
2140: 61 72 65 50 35 28 70 4c 65 66 74 2c 20 70 52 69  areP5(pLeft, pRi
2150: 67 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  ght, jumpIfNull)
2160: 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74  ;.  addr = sqlit
2170: 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 50 61  e3VdbeAddOp4(pPa
2180: 72 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f  rse->pVdbe, opco
2190: 64 65 2c 20 69 6e 32 2c 20 64 65 73 74 2c 20 69  de, in2, dest, i
21a0: 6e 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n1,.            
21b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
21c0: 76 6f 69 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c  void*)p4, P4_COL
21d0: 4c 53 45 51 29 3b 0a 20 20 73 71 6c 69 74 65 33  LSEQ);.  sqlite3
21e0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 70 50 61  VdbeChangeP5(pPa
21f0: 72 73 65 2d 3e 70 56 64 62 65 2c 20 28 75 38 29  rse->pVdbe, (u8)
2200: 70 35 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64  p5);.  return ad
2210: 64 72 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  dr;.}..#if SQLIT
2220: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
2230: 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  >0./*.** Check t
2240: 68 61 74 20 61 72 67 75 6d 65 6e 74 20 6e 48 65  hat argument nHe
2250: 69 67 68 74 20 69 73 20 6c 65 73 73 20 74 68 61  ight is less tha
2260: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
2270: 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 65 78 70  e maximum.** exp
2280: 72 65 73 73 69 6f 6e 20 64 65 70 74 68 20 61 6c  ression depth al
2290: 6c 6f 77 65 64 2e 20 49 66 20 69 74 20 69 73 20  lowed. If it is 
22a0: 6e 6f 74 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  not, leave an er
22b0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 0a 2a  ror message in.*
22c0: 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e 74  * pParse..*/.int
22d0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
22e0: 6b 48 65 69 67 68 74 28 50 61 72 73 65 20 2a 70  kHeight(Parse *p
22f0: 50 61 72 73 65 2c 20 69 6e 74 20 6e 48 65 69 67  Parse, int nHeig
2300: 68 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ht){.  int rc = 
2310: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
2320: 20 6d 78 48 65 69 67 68 74 20 3d 20 70 50 61 72   mxHeight = pPar
2330: 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  se->db->aLimit[S
2340: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52  QLITE_LIMIT_EXPR
2350: 5f 44 45 50 54 48 5d 3b 0a 20 20 69 66 28 20 6e  _DEPTH];.  if( n
2360: 48 65 69 67 68 74 3e 6d 78 48 65 69 67 68 74 20  Height>mxHeight 
2370: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
2380: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
2390: 20 20 20 20 20 20 20 22 45 78 70 72 65 73 73 69         "Expressi
23a0: 6f 6e 20 74 72 65 65 20 69 73 20 74 6f 6f 20 6c  on tree is too l
23b0: 61 72 67 65 20 28 6d 61 78 69 6d 75 6d 20 64 65  arge (maximum de
23c0: 70 74 68 20 25 64 29 22 2c 20 6d 78 48 65 69 67  pth %d)", mxHeig
23d0: 68 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63  ht.    );.    rc
23e0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
23f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2400: 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;.}../* The foll
2410: 6f 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63  owing three func
2420: 74 69 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66 45  tions, heightOfE
2430: 78 70 72 28 29 2c 20 68 65 69 67 68 74 4f 66 45  xpr(), heightOfE
2440: 78 70 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e 64  xprList().** and
2450: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
2460: 29 2c 20 61 72 65 20 75 73 65 64 20 74 6f 20 64  ), are used to d
2470: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 61 78  etermine the max
2480: 69 6d 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20 6f  imum height.** o
2490: 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  f any expression
24a0: 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64   tree referenced
24b0: 20 62 79 20 74 68 65 20 73 74 72 75 63 74 75 72   by the structur
24c0: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a  e passed as the.
24d0: 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  ** first argumen
24e0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  t..**.** If this
24f0: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
2500: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
2510: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
2520: 65 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20  e pointed.** to 
2530: 62 79 20 70 6e 48 65 69 67 68 74 2c 20 74 68 65  by pnHeight, the
2540: 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
2550: 72 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 6e 48  r, then set *pnH
2560: 65 69 67 68 74 20 74 6f 20 74 68 61 74 0a 2a 2a  eight to that.**
2570: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
2580: 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45  c void heightOfE
2590: 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  xpr(Expr *p, int
25a0: 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69   *pnHeight){.  i
25b0: 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  f( p ){.    if( 
25c0: 70 2d 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48 65  p->nHeight>*pnHe
25d0: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2a 70  ight ){.      *p
25e0: 6e 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48 65  nHeight = p->nHe
25f0: 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ight;.    }.  }.
2600: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  }.static void he
2610: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 45  ightOfExprList(E
2620: 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20  xprList *p, int 
2630: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66  *pnHeight){.  if
2640: 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ( p ){.    int i
2650: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2660: 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  <p->nExpr; i++){
2670: 0a 20 20 20 20 20 20 68 65 69 67 68 74 4f 66 45  .      heightOfE
2680: 78 70 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78 70  xpr(p->a[i].pExp
2690: 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  r, pnHeight);.  
26a0: 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63    }.  }.}.static
26b0: 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 53 65   void heightOfSe
26c0: 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20  lect(Select *p, 
26d0: 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a  int *pnHeight){.
26e0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 68    if( p ){.    h
26f0: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
2700: 57 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29  Where, pnHeight)
2710: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
2720: 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70  pr(p->pHaving, p
2730: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
2740: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c  ightOfExpr(p->pL
2750: 69 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  imit, pnHeight);
2760: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
2770: 72 28 70 2d 3e 70 4f 66 66 73 65 74 2c 20 70 6e  r(p->pOffset, pn
2780: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
2790: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
27a0: 3e 70 45 4c 69 73 74 2c 20 70 6e 48 65 69 67 68  >pEList, pnHeigh
27b0: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
27c0: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f  ExprList(p->pGro
27d0: 75 70 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b  upBy, pnHeight);
27e0: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
27f0: 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42  rList(p->pOrderB
2800: 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  y, pnHeight);.  
2810: 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74    heightOfSelect
2820: 28 70 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48 65  (p->pPrior, pnHe
2830: 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ight);.  }.}../*
2840: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
2850: 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c  .nHeight variabl
2860: 65 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75  e in the structu
2870: 72 65 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  re passed as an 
2880: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e  .** argument. An
2890: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
28a0: 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78   no children, Ex
28b0: 70 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20  pr.pList or .** 
28c0: 45 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d  Expr.pSelect mem
28d0: 62 65 72 20 68 61 73 20 61 20 68 65 69 67 68 74  ber has a height
28e0: 20 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72   of 1. Any other
28f0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68   expression.** h
2900: 61 73 20 61 20 68 65 69 67 68 74 20 65 71 75 61  as a height equa
2910: 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  l to the maximum
2920: 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f   height of any o
2930: 74 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e  ther .** referen
2940: 63 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e  ced Expr plus on
2950: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
2960: 64 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28  d exprSetHeight(
2970: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Expr *p){.  int 
2980: 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68  nHeight = 0;.  h
2990: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
29a0: 4c 65 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  Left, &nHeight);
29b0: 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  .  heightOfExpr(
29c0: 70 2d 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69  p->pRight, &nHei
29d0: 67 68 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72  ght);.  if( Expr
29e0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
29f0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
2a00: 20 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65      heightOfSele
2a10: 63 74 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  ct(p->x.pSelect,
2a20: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65   &nHeight);.  }e
2a30: 6c 73 65 7b 0a 20 20 20 20 68 65 69 67 68 74 4f  lse{.    heightO
2a40: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70  fExprList(p->x.p
2a50: 4c 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  List, &nHeight);
2a60: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68  .  }.  p->nHeigh
2a70: 74 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b  t = nHeight + 1;
2a80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
2a90: 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76  e Expr.nHeight v
2aa0: 61 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68  ariable using th
2ab0: 65 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28  e exprSetHeight(
2ac0: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a  ) function. If.*
2ad0: 2a 20 74 68 65 20 68 65 69 67 68 74 20 69 73 20  * the height is 
2ae0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
2af0: 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   maximum allowed
2b00: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74   expression dept
2b10: 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65  h,.** leave an e
2b20: 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a  rror in pParse..
2b30: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
2b40: 78 70 72 53 65 74 48 65 69 67 68 74 28 50 61 72  xprSetHeight(Par
2b50: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
2b60: 20 2a 70 29 7b 0a 20 20 65 78 70 72 53 65 74 48   *p){.  exprSetH
2b70: 65 69 67 68 74 28 70 29 3b 0a 20 20 73 71 6c 69  eight(p);.  sqli
2b80: 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67  te3ExprCheckHeig
2b90: 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48  ht(pParse, p->nH
2ba0: 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eight);.}../*.**
2bb0: 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69   Return the maxi
2bc0: 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e  mum height of an
2bd0: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  y expression tre
2be0: 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20  e referenced.** 
2bf0: 62 79 20 74 68 65 20 73 65 6c 65 63 74 20 73 74  by the select st
2c00: 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
2c10: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  s an argument..*
2c20: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c  /.int sqlite3Sel
2c30: 65 63 74 45 78 70 72 48 65 69 67 68 74 28 53 65  ectExprHeight(Se
2c40: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20  lect *p){.  int 
2c50: 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68  nHeight = 0;.  h
2c60: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2c  eightOfSelect(p,
2c70: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 72 65   &nHeight);.  re
2c80: 74 75 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d 0a  turn nHeight;.}.
2c90: 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20  #else.  #define 
2ca0: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 79 29  exprSetHeight(y)
2cb0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2cc0: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
2cd0: 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  >0 */../*.** Thi
2ce0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
2cf0: 20 63 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72 20   core allocator 
2d00: 66 6f 72 20 45 78 70 72 20 6e 6f 64 65 73 2e 0a  for Expr nodes..
2d10: 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  **.** Construct 
2d20: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
2d30: 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e   node and return
2d40: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
2d50: 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  .  Memory.** for
2d60: 20 74 68 69 73 20 6e 6f 64 65 20 61 6e 64 20 66   this node and f
2d70: 6f 72 20 74 68 65 20 70 54 6f 6b 65 6e 20 61 72  or the pToken ar
2d80: 67 75 6d 65 6e 74 20 69 73 20 61 20 73 69 6e 67  gument is a sing
2d90: 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  le allocation.**
2da0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
2db0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29  qlite3DbMalloc()
2dc0: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
2dd0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65  unction.** is re
2de0: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
2df0: 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e 6f  king sure the no
2e00: 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65  de eventually ge
2e10: 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20  ts freed..**.** 
2e20: 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 74 72  If dequote is tr
2e30: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b  ue, then the tok
2e40: 65 6e 20 28 69 66 20 69 74 20 65 78 69 73 74 73  en (if it exists
2e50: 29 20 69 73 20 64 65 71 75 6f 74 65 64 2e 0a 2a  ) is dequoted..*
2e60: 2a 20 49 66 20 64 65 71 75 6f 74 65 20 69 73 20  * If dequote is 
2e70: 66 61 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f 74  false, no dequot
2e80: 69 6e 67 20 69 73 20 70 65 72 66 6f 72 6d 61 6e  ing is performan
2e90: 63 65 2e 20 20 54 68 65 20 64 65 51 75 6f 74 65  ce.  The deQuote
2ea0: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
2eb0: 20 69 67 6e 6f 72 65 64 20 69 66 20 70 54 6f 6b   ignored if pTok
2ec0: 65 6e 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66  en is NULL or if
2ed0: 20 74 68 65 20 74 6f 6b 65 6e 20 64 6f 65 73 20   the token does 
2ee0: 6e 6f 74 0a 2a 2a 20 61 70 70 65 61 72 20 74 6f  not.** appear to
2ef0: 20 62 65 20 71 75 6f 74 65 64 2e 20 20 49 66 20   be quoted.  If 
2f00: 74 68 65 20 71 75 6f 74 65 73 20 77 65 72 65 20  the quotes were 
2f10: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 2e 2e 2e  of the form "...
2f20: 22 20 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73  " (double-quotes
2f30: 29 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 45 50  ).** then the EP
2f40: 5f 44 62 6c 51 75 6f 74 65 64 20 66 6c 61 67 20  _DblQuoted flag 
2f50: 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 65 78  is set on the ex
2f60: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 0a 2a  pression node..*
2f70: 2a 0a 2a 2a 20 53 70 65 63 69 61 6c 20 63 61 73  *.** Special cas
2f80: 65 3a 20 20 49 66 20 6f 70 3d 3d 54 4b 5f 49 4e  e:  If op==TK_IN
2f90: 54 45 47 45 52 20 61 6e 64 20 70 54 6f 6b 65 6e  TEGER and pToken
2fa0: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72   points to a str
2fb0: 69 6e 67 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20  ing that.** can 
2fc0: 62 65 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e  be translated in
2fd0: 74 6f 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  to a 32-bit inte
2fe0: 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20 74 6f  ger, then the to
2ff0: 6b 65 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 74  ken is not.** st
3000: 6f 72 65 64 20 69 6e 20 75 2e 7a 54 6f 6b 65 6e  ored in u.zToken
3010: 2e 20 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20  .  Instead, the 
3020: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 69  integer values i
3030: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
3040: 6f 20 75 2e 69 56 61 6c 75 65 20 61 6e 64 20 74  o u.iValue and t
3050: 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66  he EP_IntValue f
3060: 6c 61 67 20 69 73 20 73 65 74 2e 20 20 4e 6f 20  lag is set.  No 
3070: 65 78 74 72 61 20 73 74 6f 72 61 67 65 0a 2a 2a  extra storage.**
3080: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f   is allocated to
3090: 20 68 6f 6c 64 20 74 68 65 20 69 6e 74 65 67 65   hold the intege
30a0: 72 20 74 65 78 74 20 61 6e 64 20 74 68 65 20 64  r text and the d
30b0: 65 71 75 6f 74 65 20 66 6c 61 67 20 69 73 20 69  equote flag is i
30c0: 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70 72 20  gnored..*/.Expr 
30d0: 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f  *sqlite3ExprAllo
30e0: 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c(.  sqlite3 *db
30f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
3100: 48 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74  Handle for sqlit
3110: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29  e3DbMallocZero()
3120: 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a   (may be null) *
3130: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
3140: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
3150: 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65  xpression opcode
3160: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65   */.  const Toke
3170: 6e 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f 2a  n *pToken,    /*
3180: 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e   Token argument.
3190: 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20    Might be NULL 
31a0: 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65  */.  int dequote
31b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31c0: 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20  True to dequote 
31d0: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e  */.){.  Expr *pN
31e0: 65 77 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61  ew;.  int nExtra
31f0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56 61 6c   = 0;.  int iVal
3200: 75 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  ue = 0;..  if( p
3210: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28  Token ){.    if(
3220: 20 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20   op!=TK_INTEGER 
3230: 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a  || pToken->z==0.
3240: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
3250: 69 74 65 33 47 65 74 49 6e 74 33 32 28 70 54 6f  ite3GetInt32(pTo
3260: 6b 65 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75 65 29  ken->z, &iValue)
3270: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 45 78  ==0 ){.      nEx
3280: 74 72 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 2b  tra = pToken->n+
3290: 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
32a0: 20 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20 20   iValue>=0 );.  
32b0: 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d    }.  }.  pNew =
32c0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
32d0: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
32e0: 45 78 70 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20  Expr)+nExtra);. 
32f0: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
3300: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29   pNew->op = (u8)
3310: 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41  op;.    pNew->iA
3320: 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28  gg = -1;.    if(
3330: 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20   pToken ){.     
3340: 20 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29   if( nExtra==0 )
3350: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
3360: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56  flags |= EP_IntV
3370: 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e  alue;.        pN
3380: 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69  ew->u.iValue = i
3390: 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c  Value;.      }el
33a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
33b0: 63 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  c;.        pNew-
33c0: 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61  >u.zToken = (cha
33d0: 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20  r*)&pNew[1];.   
33e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f       assert( pTo
33f0: 6b 65 6e 2d 3e 7a 21 3d 30 20 7c 7c 20 70 54 6f  ken->z!=0 || pTo
3400: 6b 65 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20  ken->n==0 );.   
3410: 20 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d       if( pToken-
3420: 3e 6e 20 29 20 6d 65 6d 63 70 79 28 70 4e 65 77  >n ) memcpy(pNew
3430: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54 6f 6b  ->u.zToken, pTok
3440: 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e  en->z, pToken->n
3450: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
3460: 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b 65 6e  >u.zToken[pToken
3470: 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  ->n] = 0;.      
3480: 20 20 69 66 28 20 64 65 71 75 6f 74 65 20 26 26    if( dequote &&
3490: 20 6e 45 78 74 72 61 3e 3d 33 20 0a 20 20 20 20   nExtra>=3 .    
34a0: 20 20 20 20 20 20 20 20 20 26 26 20 28 28 63 20           && ((c 
34b0: 3d 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 29 3d  = pToken->z[0])=
34c0: 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 22 27 20  ='\'' || c=='"' 
34d0: 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d 3d  || c=='[' || c==
34e0: 27 60 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '`') ){.        
34f0: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
3500: 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  (pNew->u.zToken)
3510: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
3520: 63 3d 3d 27 22 27 20 29 20 70 4e 65 77 2d 3e 66  c=='"' ) pNew->f
3530: 6c 61 67 73 20 7c 3d 20 45 50 5f 44 62 6c 51 75  lags |= EP_DblQu
3540: 6f 74 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  oted;.        }.
3550: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
3560: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  f SQLITE_MAX_EXP
3570: 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 70 4e  R_DEPTH>0.    pN
3580: 65 77 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b  ew->nHeight = 1;
3590: 0a 23 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20  .#endif  .  }.  
35a0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
35b0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
35c0: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
35d0: 6e 6f 64 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f  node from a zero
35e0: 2d 74 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65  -terminated toke
35f0: 6e 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c  n that has.** al
3600: 72 65 61 64 79 20 62 65 65 6e 20 64 65 71 75 6f  ready been dequo
3610: 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ted..*/.Expr *sq
3620: 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c  lite3Expr(.  sql
3630: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
3640: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
3650: 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  or sqlite3DbMall
3660: 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65  ocZero() (may be
3670: 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20   null) */.  int 
3680: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
3690: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
36a0: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  n opcode */.  co
36b0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e  nst char *zToken
36c0: 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61        /* Token a
36d0: 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20  rgument.  Might 
36e0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
36f0: 54 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d  Token x;.  x.z =
3700: 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d   zToken;.  x.n =
3710: 20 7a 54 6f 6b 65 6e 20 3f 20 73 71 6c 69 74 65   zToken ? sqlite
3720: 33 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e  3Strlen30(zToken
3730: 29 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ) : 0;.  return 
3740: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
3750: 28 64 62 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b  (db, op, &x, 0);
3760: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68  .}../*.** Attach
3770: 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20   subtrees pLeft 
3780: 61 6e 64 20 70 52 69 67 68 74 20 74 6f 20 74 68  and pRight to th
3790: 65 20 45 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f  e Expr node pRoo
37a0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f  t..**.** If pRoo
37b0: 74 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61  t==NULL that mea
37c0: 6e 73 20 74 68 61 74 20 61 20 6d 65 6d 6f 72 79  ns that a memory
37d0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
37e0: 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a  r has occurred..
37f0: 2a 2a 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  ** In that case,
3800: 20 64 65 6c 65 74 65 20 74 68 65 20 73 75 62 74   delete the subt
3810: 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70  rees pLeft and p
3820: 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Right..*/.void s
3830: 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68  qlite3ExprAttach
3840: 53 75 62 74 72 65 65 73 28 0a 20 20 73 71 6c 69  Subtrees(.  sqli
3850: 74 65 33 20 2a 64 62 2c 0a 20 20 45 78 70 72 20  te3 *db,.  Expr 
3860: 2a 70 52 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a  *pRoot,.  Expr *
3870: 70 4c 65 66 74 2c 0a 20 20 45 78 70 72 20 2a 70  pLeft,.  Expr *p
3880: 52 69 67 68 74 0a 29 7b 0a 20 20 69 66 28 20 70  Right.){.  if( p
3890: 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61  Root==0 ){.    a
38a0: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
38b0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73  cFailed );.    s
38c0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
38d0: 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20  (db, pLeft);.   
38e0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
38f0: 74 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a  te(db, pRight);.
3900: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
3910: 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   pRight ){.     
3920: 20 70 52 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d   pRoot->pRight =
3930: 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70   pRight;.      p
3940: 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Root->flags |= E
3950: 50 5f 43 6f 6c 6c 61 74 65 20 26 20 70 52 69 67  P_Collate & pRig
3960: 68 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d  ht->flags;.    }
3970: 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 20 29  .    if( pLeft )
3980: 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70  {.      pRoot->p
3990: 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20  Left = pLeft;.  
39a0: 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73      pRoot->flags
39b0: 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 20 26   |= EP_Collate &
39c0: 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 3b 0a 20   pLeft->flags;. 
39d0: 20 20 20 7d 0a 20 20 20 20 65 78 70 72 53 65 74     }.    exprSet
39e0: 48 65 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a 20  Height(pRoot);. 
39f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
3a00: 63 61 74 65 20 61 20 45 78 70 72 20 6e 6f 64 65  cate a Expr node
3a10: 20 77 68 69 63 68 20 6a 6f 69 6e 73 20 61 73 20   which joins as 
3a20: 6d 61 6e 79 20 61 73 20 74 77 6f 20 73 75 62 74  many as two subt
3a30: 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20  rees..**.** One 
3a40: 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20 73  or both of the s
3a50: 75 62 74 72 65 65 73 20 63 61 6e 20 62 65 20 4e  ubtrees can be N
3a60: 55 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61 20 70  ULL.  Return a p
3a70: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65  ointer to the ne
3a80: 77 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e 20  w.** Expr node. 
3a90: 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65   Or, if an OOM e
3aa0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74  rror occurs, set
3ab0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
3ac0: 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66 72  locFailed,.** fr
3ad0: 65 65 20 74 68 65 20 73 75 62 74 72 65 65 73 20  ee the subtrees 
3ae0: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
3af0: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
3b00: 33 50 45 78 70 72 28 0a 20 20 50 61 72 73 65 20  3PExpr(.  Parse 
3b10: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
3b20: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
3b30: 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  text */.  int op
3b40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3b50: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
3b60: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72  opcode */.  Expr
3b70: 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20 20   *pLeft,        
3b80: 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72      /* Left oper
3b90: 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  and */.  Expr *p
3ba0: 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20  Right,          
3bb0: 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61 6e   /* Right operan
3bc0: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b  d */.  const Tok
3bd0: 65 6e 20 2a 70 54 6f 6b 65 6e 20 20 20 20 20 2f  en *pToken     /
3be0: 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 6b 65 6e  * Argument token
3bf0: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
3c00: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  ;.  if( op==TK_A
3c10: 4e 44 20 26 26 20 70 4c 65 66 74 20 26 26 20 70  ND && pLeft && p
3c20: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 2f 2a 20  Right ){.    /* 
3c30: 54 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f  Take advantage o
3c40: 66 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74 20  f short-circuit 
3c50: 66 61 6c 73 65 20 6f 70 74 69 6d 69 7a 61 74 69  false optimizati
3c60: 6f 6e 20 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20  on for AND */.  
3c70: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70    p = sqlite3Exp
3c80: 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  rAnd(pParse->db,
3c90: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b   pLeft, pRight);
3ca0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
3cb0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  = sqlite3ExprAll
3cc0: 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6f  oc(pParse->db, o
3cd0: 70 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20  p, pToken, 1);. 
3ce0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74     sqlite3ExprAt
3cf0: 74 61 63 68 53 75 62 74 72 65 65 73 28 70 50 61  tachSubtrees(pPa
3d00: 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66  rse->db, p, pLef
3d10: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a  t, pRight);.  }.
3d20: 20 20 69 66 28 20 70 20 29 20 7b 0a 20 20 20 20    if( p ) {.    
3d30: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
3d40: 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70  Height(pParse, p
3d50: 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a  ->nHeight);.  }.
3d60: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
3d70: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66  *.** Return 1 if
3d80: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d   an expression m
3d90: 75 73 74 20 62 65 20 46 41 4c 53 45 20 69 6e 20  ust be FALSE in 
3da0: 61 6c 6c 20 63 61 73 65 73 20 61 6e 64 20 30 20  all cases and 0 
3db0: 69 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  if the.** expres
3dc0: 73 69 6f 6e 20 6d 69 67 68 74 20 62 65 20 74 72  sion might be tr
3dd0: 75 65 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20  ue.  This is an 
3de0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49  optimization.  I
3df0: 66 20 69 73 20 4f 4b 20 74 6f 0a 2a 2a 20 72 65  f is OK to.** re
3e00: 74 75 72 6e 20 30 20 68 65 72 65 20 65 76 65 6e  turn 0 here even
3e10: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
3e20: 6f 6e 20 72 65 61 6c 6c 79 20 69 73 20 61 6c 77  on really is alw
3e30: 61 79 73 20 66 61 6c 73 65 20 28 61 20 0a 2a 2a  ays false (a .**
3e40: 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 29   false negative)
3e50: 2e 20 20 42 75 74 20 69 74 20 69 73 20 61 20 62  .  But it is a b
3e60: 75 67 20 74 6f 20 72 65 74 75 72 6e 20 31 20 69  ug to return 1 i
3e70: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
3e80: 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 74 72 75  .** might be tru
3e90: 65 20 69 6e 20 73 6f 6d 65 20 72 61 72 65 20 63  e in some rare c
3ea0: 69 72 63 75 6d 73 74 61 6e 63 65 73 20 28 61 20  ircumstances (a 
3eb0: 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 29  false positive.)
3ec0: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
3ed0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
3ee0: 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 63 6f  on is part of co
3ef0: 6e 64 69 74 69 6f 6e 61 6c 20 66 6f 72 20 61 0a  nditional for a.
3f00: 2a 2a 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68  ** LEFT JOIN, th
3f10: 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74  en we cannot det
3f20: 65 72 6d 69 6e 65 20 61 74 20 63 6f 6d 70 69 6c  ermine at compil
3f30: 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f  e-time whether o
3f40: 72 20 6e 6f 74 0a 2a 2a 20 69 73 20 69 74 20 74  r not.** is it t
3f50: 72 75 65 20 6f 72 20 66 61 6c 73 65 2c 20 73 6f  rue or false, so
3f60: 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 30   always return 0
3f70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3f80: 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
3f90: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Expr *p){.  int 
3fa0: 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70  v = 0;.  if( Exp
3fb0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
3fc0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72  EP_FromJoin) ) r
3fd0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
3fe0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
3ff0: 65 67 65 72 28 70 2c 20 26 76 29 20 29 20 72 65  eger(p, &v) ) re
4000: 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
4010: 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   v==0;.}../*.** 
4020: 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73  Join two express
4030: 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e  ions using an AN
4040: 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20  D operator.  If 
4050: 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f  either expressio
4060: 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68  n is.** NULL, th
4070: 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74  en just return t
4080: 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  he other express
4090: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e  ion..**.** If on
40a0: 65 20 73 69 64 65 20 6f 72 20 74 68 65 20 6f 74  e side or the ot
40b0: 68 65 72 20 6f 66 20 74 68 65 20 41 4e 44 20 69  her of the AND i
40c0: 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66 61  s known to be fa
40d0: 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74 65 61  lse, then instea
40e0: 64 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69 6e  d.** of returnin
40f0: 67 20 61 6e 20 41 4e 44 20 65 78 70 72 65 73 73  g an AND express
4100: 69 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75 72 6e  ion, just return
4110: 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72   a constant expr
4120: 65 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 61  ession with.** a
4130: 20 76 61 6c 75 65 20 6f 66 20 66 61 6c 73 65 2e   value of false.
4140: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
4150: 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74 65 33  3ExprAnd(sqlite3
4160: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c 65 66   *db, Expr *pLef
4170: 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 29  t, Expr *pRight)
4180: 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30  {.  if( pLeft==0
4190: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
41a0: 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69  Right;.  }else i
41b0: 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a  f( pRight==0 ){.
41c0: 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74      return pLeft
41d0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78  ;.  }else if( ex
41e0: 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 4c  prAlwaysFalse(pL
41f0: 65 66 74 29 20 7c 7c 20 65 78 70 72 41 6c 77 61  eft) || exprAlwa
4200: 79 73 46 61 6c 73 65 28 70 52 69 67 68 74 29 20  ysFalse(pRight) 
4210: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
4220: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65  prDelete(db, pLe
4230: 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ft);.    sqlite3
4240: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
4250: 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75  Right);.    retu
4260: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c  rn sqlite3ExprAl
4270: 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  loc(db, TK_INTEG
4280: 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54  ER, &sqlite3IntT
4290: 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20 20  okens[0], 0);.  
42a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70 72 20  }else{.    Expr 
42b0: 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45  *pNew = sqlite3E
42c0: 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f  xprAlloc(db, TK_
42d0: 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  AND, 0, 0);.    
42e0: 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63  sqlite3ExprAttac
42f0: 68 53 75 62 74 72 65 65 73 28 64 62 2c 20 70 4e  hSubtrees(db, pN
4300: 65 77 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  ew, pLeft, pRigh
4310: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70  t);.    return p
4320: 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  New;.  }.}../*.*
4330: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65  * Construct a ne
4340: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  w expression nod
4350: 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e  e for a function
4360: 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a   with multiple.*
4370: 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a  * arguments..*/.
4380: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
4390: 72 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20  rFunction(Parse 
43a0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73  *pParse, ExprLis
43b0: 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
43c0: 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72  *pToken){.  Expr
43d0: 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65   *pNew;.  sqlite
43e0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
43f0: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  db;.  assert( pT
4400: 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d  oken );.  pNew =
4410: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
4420: 63 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49 4f  c(db, TK_FUNCTIO
4430: 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20  N, pToken, 1);. 
4440: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
4450: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
4460: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
4470: 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6d  ist); /* Avoid m
4480: 65 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e 20  emory leak when 
4490: 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a  malloc fails */.
44a0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
44b0: 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73  }.  pNew->x.pLis
44c0: 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73 73  t = pList;.  ass
44d0: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
44e0: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78  perty(pNew, EP_x
44f0: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 73  IsSelect) );.  s
4500: 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69  qlite3ExprSetHei
4510: 67 68 74 28 70 50 61 72 73 65 2c 20 70 4e 65 77  ght(pParse, pNew
4520: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
4530: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67  ;.}../*.** Assig
4540: 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  n a variable num
4550: 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73  ber to an expres
4560: 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64 65  sion that encode
4570: 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20  s a wildcard.** 
4580: 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  in the original 
4590: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  SQL statement.  
45a0: 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73  .**.** Wildcards
45b0: 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61   consisting of a
45c0: 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65 20   single "?" are 
45d0: 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65 78  assigned the nex
45e0: 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20  t sequential.** 
45f0: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e  variable number.
4600: 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73  .**.** Wildcards
4610: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e   of the form "?n
4620: 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65 64  nn" are assigned
4630: 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e   the number "nnn
4640: 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73  ".  We make.** s
4650: 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74  ure "nnn" is not
4660: 20 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69 64   too be to avoid
4670: 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65 72   a denial of ser
4680: 76 69 63 65 20 61 74 74 61 63 6b 20 77 68 65 6e  vice attack when
4690: 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74  .** the SQL stat
46a0: 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d  ement comes from
46b0: 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f 75   an external sou
46c0: 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63  rce..**.** Wildc
46d0: 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ards of the form
46e0: 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22 2c   ":aaa", "@aaa",
46f0: 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61   or "$aaa" are a
4700: 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65  ssigned the same
4710: 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68   number.** as th
4720: 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61  e previous insta
4730: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
4740: 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66  wildcard.  Or if
4750: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
4760: 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f  st.** instance o
4770: 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20  f the wildcard, 
4780: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 69  the next sequeni
4790: 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  al variable numb
47a0: 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65  er is.** assigne
47b0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
47c0: 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e  e3ExprAssignVarN
47d0: 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50 61  umber(Parse *pPa
47e0: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
47f0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
4800: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
4810: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
4820: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
4830: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
4840: 72 74 28 20 21 45 78 70 72 48 61 73 41 6e 79 50  rt( !ExprHasAnyP
4850: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
4860: 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65  P_IntValue|EP_Re
4870: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
4880: 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78  ly) );.  z = pEx
4890: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
48a0: 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a  assert( z!=0 );.
48b0: 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d    assert( z[0]!=
48c0: 30 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d  0 );.  if( z[1]=
48d0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c  =0 ){.    /* Wil
48e0: 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72  dcard of the for
48f0: 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74  m "?".  Assign t
4900: 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65  he next variable
4910: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 61   number */.    a
4920: 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27  ssert( z[0]=='?'
4930: 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69   );.    pExpr->i
4940: 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29  Column = (ynVar)
4950: 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29  (++pParse->nVar)
4960: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 79  ;.  }else{.    y
4970: 6e 56 61 72 20 78 20 3d 20 30 3b 0a 20 20 20 20  nVar x = 0;.    
4980: 75 33 32 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  u32 n = sqlite3S
4990: 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20  trlen30(z);.    
49a0: 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b  if( z[0]=='?' ){
49b0: 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  .      /* Wildca
49c0: 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rd of the form "
49d0: 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20  ?nnn".  Convert 
49e0: 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65  "nnn" to an inte
49f0: 67 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ger and.      **
4a00: 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76   use it as the v
4a10: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  ariable number *
4a20: 2f 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a 20  /.      i64 i;. 
4a30: 20 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30       int bOk = 0
4a40: 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28  ==sqlite3Atoi64(
4a50: 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20  &z[1], &i, n-1, 
4a60: 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
4a70: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
4a80: 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72 29  mn = x = (ynVar)
4a90: 69 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  i;.      testcas
4aa0: 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20  e( i==0 );.     
4ab0: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31 20   testcase( i==1 
4ac0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
4ad0: 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74  e( i==db->aLimit
4ae0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
4af0: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31  RIABLE_NUMBER]-1
4b00: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
4b10: 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69  se( i==db->aLimi
4b20: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
4b30: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20  ARIABLE_NUMBER] 
4b40: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f 6b  );.      if( bOk
4b50: 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e  ==0 || i<1 || i>
4b60: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
4b70: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
4b80: 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20  _NUMBER] ){.    
4b90: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
4ba0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61 72  Msg(pParse, "var
4bb0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73  iable number mus
4bc0: 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20  t be between ?1 
4bd0: 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20  and ?%d",.      
4be0: 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74        db->aLimit
4bf0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
4c00: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b  RIABLE_NUMBER]);
4c10: 0a 20 20 20 20 20 20 20 20 78 20 3d 20 30 3b 0a  .        x = 0;.
4c20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
4c30: 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72  ( i>pParse->nVar
4c40: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72   ){.        pPar
4c50: 73 65 2d 3e 6e 56 61 72 20 3d 20 28 69 6e 74 29  se->nVar = (int)
4c60: 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  i;.      }.    }
4c70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57  else{.      /* W
4c80: 69 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22 3a  ildcards like ":
4c90: 61 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72 20  aaa", "$aaa" or 
4ca0: 22 40 61 61 61 22 2e 20 20 52 65 75 73 65 20 74  "@aaa".  Reuse t
4cb0: 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65  he same variable
4cc0: 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  .      ** number
4cd0: 20 61 73 20 74 68 65 20 70 72 69 6f 72 20 61 70   as the prior ap
4ce0: 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20  pearance of the 
4cf0: 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66  same name, or if
4d00: 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 20 20   the name.      
4d10: 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70 70  ** has never app
4d20: 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65  eared before, re
4d30: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
4d40: 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20  iable number.   
4d50: 20 20 20 2a 2f 0a 20 20 20 20 20 20 79 6e 56 61     */.      ynVa
4d60: 72 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  r i;.      for(i
4d70: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 7a  =0; i<pParse->nz
4d80: 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Var; i++){.     
4d90: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61     if( pParse->a
4da0: 7a 56 61 72 5b 69 5d 20 26 26 20 73 74 72 63 6d  zVar[i] && strcm
4db0: 70 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b  p(pParse->azVar[
4dc0: 69 5d 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20  i],z)==0 ){.    
4dd0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
4de0: 6c 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61  lumn = x = (ynVa
4df0: 72 29 69 2b 31 3b 0a 20 20 20 20 20 20 20 20 20  r)i+1;.         
4e00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
4e10: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
4e20: 69 66 28 20 78 3d 3d 30 20 29 20 78 20 3d 20 70  if( x==0 ) x = p
4e30: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
4e40: 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65  (ynVar)(++pParse
4e50: 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 7d 0a 20  ->nVar);.    }. 
4e60: 20 20 20 69 66 28 20 78 3e 30 20 29 7b 0a 20 20     if( x>0 ){.  
4e70: 20 20 20 20 69 66 28 20 78 3e 70 50 61 72 73 65      if( x>pParse
4e80: 2d 3e 6e 7a 56 61 72 20 29 7b 0a 20 20 20 20 20  ->nzVar ){.     
4e90: 20 20 20 63 68 61 72 20 2a 2a 61 3b 0a 20 20 20     char **a;.   
4ea0: 20 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33       a = sqlite3
4eb0: 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 50  DbRealloc(db, pP
4ec0: 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 78 2a 73  arse->azVar, x*s
4ed0: 69 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20  izeof(a[0]));.  
4ee0: 20 20 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29        if( a==0 )
4ef0: 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 72 72   return;  /* Err
4f00: 6f 72 20 72 65 70 6f 72 74 65 64 20 74 68 72 6f  or reported thro
4f10: 75 67 68 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  ugh db->mallocFa
4f20: 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  iled */.        
4f30: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 20 3d 20  pParse->azVar = 
4f40: 61 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  a;.        memse
4f50: 74 28 26 61 5b 70 50 61 72 73 65 2d 3e 6e 7a 56  t(&a[pParse->nzV
4f60: 61 72 5d 2c 20 30 2c 20 28 78 2d 70 50 61 72 73  ar], 0, (x-pPars
4f70: 65 2d 3e 6e 7a 56 61 72 29 2a 73 69 7a 65 6f 66  e->nzVar)*sizeof
4f80: 28 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 20  (a[0]));.       
4f90: 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 20 3d   pParse->nzVar =
4fa0: 20 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   x;.      }.    
4fb0: 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27 3f 27 20    if( z[0]!='?' 
4fc0: 7c 7c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  || pParse->azVar
4fd0: 5b 78 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  [x-1]==0 ){.    
4fe0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4ff0: 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 7a  e(db, pParse->az
5000: 56 61 72 5b 78 2d 31 5d 29 3b 0a 20 20 20 20 20  Var[x-1]);.     
5010: 20 20 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72     pParse->azVar
5020: 5b 78 2d 31 5d 20 3d 20 73 71 6c 69 74 65 33 44  [x-1] = sqlite3D
5030: 62 53 74 72 4e 44 75 70 28 64 62 2c 20 7a 2c 20  bStrNDup(db, z, 
5040: 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
5050: 7d 0a 20 20 7d 20 0a 20 20 69 66 28 20 21 70 50  }.  } .  if( !pP
5060: 61 72 73 65 2d 3e 6e 45 72 72 20 26 26 20 70 50  arse->nErr && pP
5070: 61 72 73 65 2d 3e 6e 56 61 72 3e 64 62 2d 3e 61  arse->nVar>db->a
5080: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
5090: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
50a0: 45 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ER] ){.    sqlit
50b0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
50c0: 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c  e, "too many SQL
50d0: 20 76 61 72 69 61 62 6c 65 73 22 29 3b 0a 20 20   variables");.  
50e0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72  }.}../*.** Recur
50f0: 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e  sively delete an
5100: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
5110: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5120: 33 45 78 70 72 44 65 6c 65 74 65 28 73 71 6c 69  3ExprDelete(sqli
5130: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
5140: 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  ){.  if( p==0 ) 
5150: 72 65 74 75 72 6e 3b 0a 20 20 2f 2a 20 53 61 6e  return;.  /* San
5160: 69 74 79 20 63 68 65 63 6b 3a 20 41 73 73 65 72  ity check: Asser
5170: 74 20 74 68 61 74 20 74 68 65 20 49 6e 74 56 61  t that the IntVa
5180: 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74  lue is non-negat
5190: 69 76 65 20 69 66 20 69 74 20 65 78 69 73 74 73  ive if it exists
51a0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 45   */.  assert( !E
51b0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
51c0: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c  , EP_IntValue) |
51d0: 7c 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30  | p->u.iValue>=0
51e0: 20 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48   );.  if( !ExprH
51f0: 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 2c  asAnyProperty(p,
5200: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
5210: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
5220: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
5230: 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Left);.    sqlit
5240: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
5250: 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20   p->pRight);.   
5260: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
5270: 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75  perty(p, EP_Redu
5280: 63 65 64 29 20 26 26 20 28 70 2d 3e 66 6c 61 67  ced) && (p->flag
5290: 73 32 20 26 20 45 50 32 5f 4d 61 6c 6c 6f 63 65  s2 & EP2_Malloce
52a0: 64 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20  dToken)!=0 ){.  
52b0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
52c0: 65 28 64 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65  e(db, p->u.zToke
52d0: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  n);.    }.    if
52e0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
52f0: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
5300: 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  t) ){.      sqli
5310: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
5320: 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74  db, p->x.pSelect
5330: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
5340: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
5350: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
5360: 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  >x.pList);.    }
5370: 0a 20 20 7d 0a 20 20 69 66 28 20 21 45 78 70 72  .  }.  if( !Expr
5380: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
5390: 50 5f 53 74 61 74 69 63 29 20 29 7b 0a 20 20 20  P_Static) ){.   
53a0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
53b0: 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  b, p);.  }.}../*
53c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
53d0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
53e0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
53f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72 75   expression stru
5400: 63 74 75 72 65 20 0a 2a 2a 20 70 61 73 73 65 64  cture .** passed
5410: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
5420: 67 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20  gument. This is 
5430: 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20 45 58  always one of EX
5440: 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20  PR_FULLSIZE,.** 
5450: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
5460: 20 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e   or EXPR_TOKENON
5470: 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69  LYSIZE..*/.stati
5480: 63 20 69 6e 74 20 65 78 70 72 53 74 72 75 63 74  c int exprStruct
5490: 53 69 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a 20  Size(Expr *p){. 
54a0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
54b0: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
54c0: 4f 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20 45  Only) ) return E
54d0: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
54e0: 45 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  E;.  if( ExprHas
54f0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52  Property(p, EP_R
5500: 65 64 75 63 65 64 29 20 29 20 72 65 74 75 72 6e  educed) ) return
5510: 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a   EXPR_REDUCEDSIZ
5520: 45 3b 0a 20 20 72 65 74 75 72 6e 20 45 58 50 52  E;.  return EXPR
5530: 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a  _FULLSIZE;.}../*
5540: 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70  .** The dupedExp
5550: 72 2a 53 69 7a 65 28 29 20 72 6f 75 74 69 6e 65  r*Size() routine
5560: 73 20 65 61 63 68 20 72 65 74 75 72 6e 20 74 68  s each return th
5570: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
5580: 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f  s required.** to
5590: 20 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66   store a copy of
55a0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f   an expression o
55b0: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  r expression tre
55c0: 65 2e 20 20 54 68 65 79 20 64 69 66 66 65 72 20  e.  They differ 
55d0: 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f  in.** how much o
55e0: 66 20 74 68 65 20 74 72 65 65 20 69 73 20 6d 65  f the tree is me
55f0: 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  asured..**.**   
5600: 20 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63    dupedExprStruc
5610: 74 53 69 7a 65 28 29 20 20 20 20 20 53 69 7a 65  tSize()     Size
5620: 20 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45 78 70   of only the Exp
5630: 72 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20  r structure .** 
5640: 20 20 20 20 64 75 70 65 64 45 78 70 72 4e 6f 64      dupedExprNod
5650: 65 53 69 7a 65 28 29 20 20 20 20 20 20 20 53 69  eSize()       Si
5660: 7a 65 20 6f 66 20 45 78 70 72 20 2b 20 73 70 61  ze of Expr + spa
5670: 63 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20  ce for token.** 
5680: 20 20 20 20 64 75 70 65 64 45 78 70 72 53 69 7a      dupedExprSiz
5690: 65 28 29 20 20 20 20 20 20 20 20 20 20 20 45 78  e()           Ex
56a0: 70 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62  pr + token + sub
56b0: 74 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a  tree components.
56c0: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
56d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
56e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
56f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
5710: 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78  *.** The dupedEx
5720: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 66  prStructSize() f
5730: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
5740: 74 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65 64  two values OR-ed
5750: 20 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20   together:  .** 
5760: 28 31 29 20 74 68 65 20 73 70 61 63 65 20 72 65  (1) the space re
5770: 71 75 69 72 65 64 20 66 6f 72 20 61 20 63 6f 70  quired for a cop
5780: 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74  y of the Expr st
5790: 72 75 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64  ructure only and
57a0: 20 0a 2a 2a 20 28 32 29 20 74 68 65 20 45 50 5f   .** (2) the EP_
57b0: 78 78 78 20 66 6c 61 67 73 20 74 68 61 74 20 69  xxx flags that i
57c0: 6e 64 69 63 61 74 65 20 77 68 61 74 20 74 68 65  ndicate what the
57d0: 20 73 74 72 75 63 74 75 72 65 20 73 69 7a 65 20   structure size 
57e0: 73 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68  should be..** Th
57f0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20  e return values 
5800: 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66  is always one of
5810: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50  :.**.**      EXP
5820: 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20  R_FULLSIZE.**   
5830: 20 20 20 45 58 50 52 5f 52 45 44 55 43 45 44 53     EXPR_REDUCEDS
5840: 49 5a 45 20 20 20 7c 20 45 50 5f 52 65 64 75 63  IZE   | EP_Reduc
5850: 65 64 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f  ed.**      EXPR_
5860: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20  TOKENONLYSIZE | 
5870: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a  EP_TokenOnly.**.
5880: 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  ** The size of t
5890: 68 65 20 73 74 72 75 63 74 75 72 65 20 63 61 6e  he structure can
58a0: 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73   be found by mas
58b0: 6b 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20  king the return 
58c0: 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73  value.** of this
58d0: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 30 78   routine with 0x
58e0: 66 66 66 2e 20 20 54 68 65 20 66 6c 61 67 73 20  fff.  The flags 
58f0: 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20  can be found by 
5900: 6d 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72  masking the.** r
5910: 65 74 75 72 6e 20 76 61 6c 75 65 20 77 69 74 68  eturn value with
5920: 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54   EP_Reduced|EP_T
5930: 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20  okenOnly..**.** 
5940: 4e 6f 74 65 20 74 68 61 74 20 77 69 74 68 20 66  Note that with f
5950: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
5960: 44 55 43 45 2c 20 74 68 69 73 20 72 6f 75 74 69  DUCE, this routi
5970: 6e 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c  nes works on ful
5980: 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64  l-size.** (unred
5990: 75 63 65 64 29 20 45 78 70 72 20 6f 62 6a 65 63  uced) Expr objec
59a0: 74 73 20 61 73 20 74 68 65 79 20 6f 72 20 6f 72  ts as they or or
59b0: 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75  iginally constru
59c0: 63 74 65 64 20 62 79 20 74 68 65 20 70 61 72 73  cted by the pars
59d0: 65 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78  er..** During ex
59e0: 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69  pression analysi
59f0: 73 2c 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  s, extra informa
5a00: 74 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65 64  tion is computed
5a10: 20 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a   and moved into.
5a20: 2a 2a 20 6c 61 74 65 72 20 70 61 72 74 73 20 6f  ** later parts o
5a30: 66 20 74 65 68 20 45 78 70 72 20 6f 62 6a 65 63  f teh Expr objec
5a40: 74 20 61 6e 64 20 74 68 61 74 20 65 78 74 72 61  t and that extra
5a50: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67   information mig
5a60: 68 74 20 67 65 74 20 63 68 6f 70 70 65 64 0a 2a  ht get chopped.*
5a70: 2a 20 6f 66 66 20 69 66 20 74 68 65 20 65 78 70  * off if the exp
5a80: 72 65 73 73 69 6f 6e 20 69 73 20 72 65 64 75 63  ression is reduc
5a90: 65 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74  ed.  Note also t
5aa0: 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  hat it does not 
5ab0: 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20  work to.** make 
5ac0: 61 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  a EXPRDUP_REDUCE
5ad0: 20 63 6f 70 79 20 6f 66 20 61 20 72 65 64 75 63   copy of a reduc
5ae0: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ed expression.  
5af0: 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c  It is only legal
5b00: 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65 20 61 20  .** to reduce a 
5b10: 70 72 69 73 74 69 6e 65 20 65 78 70 72 65 73 73  pristine express
5b20: 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20 74 68  ion tree from th
5b30: 65 20 70 61 72 73 65 72 2e 20 20 54 68 65 20 69  e parser.  The i
5b40: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a  mplementation.**
5b50: 20 6f 66 20 64 75 70 65 64 45 78 70 72 53 74 72   of dupedExprStr
5b60: 75 63 74 53 69 7a 65 28 29 20 63 6f 6e 74 61 69  uctSize() contai
5b70: 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73 73 65 72  n multiple asser
5b80: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
5b90: 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  hat attempt.** t
5ba0: 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 63  o enforce this c
5bb0: 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74  onstraint..*/.st
5bc0: 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78  atic int dupedEx
5bd0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70  prStructSize(Exp
5be0: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
5bf0: 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20  {.  int nSize;. 
5c00: 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
5c10: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 7c  EXPRDUP_REDUCE |
5c20: 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a  | flags==0 ); /*
5c30: 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76   Only one flag v
5c40: 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a  alue allowed */.
5c50: 20 20 69 66 28 20 30 3d 3d 28 66 6c 61 67 73 26    if( 0==(flags&
5c60: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 20  EXPRDUP_REDUCE) 
5c70: 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 45  ){.    nSize = E
5c80: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20 20  XPR_FULLSIZE;.  
5c90: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
5ca0: 74 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72  t( !ExprHasAnyPr
5cb0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
5cc0: 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
5cd0: 64 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  d) );.    assert
5ce0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
5cf0: 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  ty(p, EP_FromJoi
5d00: 6e 29 20 29 3b 20 0a 20 20 20 20 61 73 73 65 72  n) ); .    asser
5d10: 74 28 20 28 70 2d 3e 66 6c 61 67 73 32 20 26 20  t( (p->flags2 & 
5d20: 45 50 32 5f 4d 61 6c 6c 6f 63 65 64 54 6f 6b 65  EP2_MallocedToke
5d30: 6e 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  n)==0 );.    ass
5d40: 65 72 74 28 20 28 70 2d 3e 66 6c 61 67 73 32 20  ert( (p->flags2 
5d50: 26 20 45 50 32 5f 49 72 72 65 64 75 63 69 62 6c  & EP2_Irreducibl
5d60: 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  e)==0 );.    if(
5d70: 20 70 2d 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e   p->pLeft || p->
5d80: 70 52 69 67 68 74 20 7c 7c 20 70 2d 3e 78 2e 70  pRight || p->x.p
5d90: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 53  List ){.      nS
5da0: 69 7a 65 20 3d 20 45 58 50 52 5f 52 45 44 55 43  ize = EXPR_REDUC
5db0: 45 44 53 49 5a 45 20 7c 20 45 50 5f 52 65 64 75  EDSIZE | EP_Redu
5dc0: 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ced;.    }else{.
5dd0: 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58        nSize = EX
5de0: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
5df0: 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b   | EP_TokenOnly;
5e00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
5e10: 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a  urn nSize;.}../*
5e20: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
5e30: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 70  n returns the sp
5e40: 61 63 65 20 69 6e 20 62 79 74 65 73 20 72 65 71  ace in bytes req
5e50: 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74  uired to store t
5e60: 68 65 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74  he copy .** of t
5e70: 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72  he Expr structur
5e80: 65 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20  e and a copy of 
5e90: 74 68 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65  the Expr.u.zToke
5ea0: 6e 20 73 74 72 69 6e 67 20 28 69 66 20 74 68 61  n string (if tha
5eb0: 74 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 64  t.** string is d
5ec0: 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61 74  efined.).*/.stat
5ed0: 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72  ic int dupedExpr
5ee0: 4e 6f 64 65 53 69 7a 65 28 45 78 70 72 20 2a 70  NodeSize(Expr *p
5ef0: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
5f00: 69 6e 74 20 6e 42 79 74 65 20 3d 20 64 75 70 65  int nByte = dupe
5f10: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
5f20: 70 2c 20 66 6c 61 67 73 29 20 26 20 30 78 66 66  p, flags) & 0xff
5f30: 66 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  f;.  if( !ExprHa
5f40: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
5f50: 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e  IntValue) && p->
5f60: 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  u.zToken ){.    
5f70: 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33  nByte += sqlite3
5f80: 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54  Strlen30(p->u.zT
5f90: 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20 72  oken)+1;.  }.  r
5fa0: 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42 79  eturn ROUND8(nBy
5fb0: 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  te);.}../*.** Re
5fc0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
5fd0: 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65  of bytes require
5fe0: 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 75  d to create a du
5ff0: 70 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20 0a  plicate of the .
6000: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61  ** expression pa
6010: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
6020: 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20  t argument. The 
6030: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
6040: 69 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e  is a.** mask con
6050: 74 61 69 6e 69 6e 67 20 45 58 50 52 44 55 50 5f  taining EXPRDUP_
6060: 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a  XXX flags..**.**
6070: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
6080: 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 73 70 61  ned includes spa
6090: 63 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 63  ce to create a c
60a0: 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 20  opy of the Expr 
60b0: 73 74 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c 66  struct.** itself
60c0: 20 61 6e 64 20 74 68 65 20 62 75 66 66 65 72 20   and the buffer 
60d0: 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20 45  referred to by E
60e0: 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66  xpr.u.zToken, if
60f0: 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   any..**.** If t
6100: 68 65 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  he EXPRDUP_REDUC
6110: 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  E flag is set, t
6120: 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76  hen the return v
6130: 61 6c 75 65 20 69 6e 63 6c 75 64 65 73 20 0a 2a  alue includes .*
6140: 2a 20 73 70 61 63 65 20 74 6f 20 64 75 70 6c 69  * space to dupli
6150: 63 61 74 65 20 61 6c 6c 20 45 78 70 72 20 6e 6f  cate all Expr no
6160: 64 65 73 20 69 6e 20 74 68 65 20 74 72 65 65 20  des in the tree 
6170: 66 6f 72 6d 65 64 20 62 79 20 45 78 70 72 2e 70  formed by Expr.p
6180: 4c 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78 70  Left .** and Exp
6190: 72 2e 70 52 69 67 68 74 20 76 61 72 69 61 62 6c  r.pRight variabl
61a0: 65 73 20 28 62 75 74 20 6e 6f 74 20 66 6f 72 20  es (but not for 
61b0: 61 6e 79 20 73 74 72 75 63 74 75 72 65 73 20 70  any structures p
61c0: 6f 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a 2a  ointed to or .**
61d0: 20 64 65 73 63 65 6e 64 65 64 20 66 72 6f 6d 20   descended from 
61e0: 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74  the Expr.x.pList
61f0: 20 6f 72 20 45 78 70 72 2e 78 2e 70 53 65 6c 65   or Expr.x.pSele
6200: 63 74 20 76 61 72 69 61 62 6c 65 73 29 2e 0a 2a  ct variables)..*
6210: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70  /.static int dup
6220: 65 64 45 78 70 72 53 69 7a 65 28 45 78 70 72 20  edExprSize(Expr 
6230: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
6240: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b    int nByte = 0;
6250: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
6260: 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45 78 70  nByte = dupedExp
6270: 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c 61  rNodeSize(p, fla
6280: 67 73 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61  gs);.    if( fla
6290: 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55 43  gs&EXPRDUP_REDUC
62a0: 45 20 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65  E ){.      nByte
62b0: 20 2b 3d 20 64 75 70 65 64 45 78 70 72 53 69 7a   += dupedExprSiz
62c0: 65 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61 67  e(p->pLeft, flag
62d0: 73 29 20 2b 20 64 75 70 65 64 45 78 70 72 53 69  s) + dupedExprSi
62e0: 7a 65 28 70 2d 3e 70 52 69 67 68 74 2c 20 66 6c  ze(p->pRight, fl
62f0: 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ags);.    }.  }.
6300: 20 20 72 65 74 75 72 6e 20 6e 42 79 74 65 3b 0a    return nByte;.
6310: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
6320: 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61  nction is simila
6330: 72 20 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72  r to sqlite3Expr
6340: 44 75 70 28 29 2c 20 65 78 63 65 70 74 20 74 68  Dup(), except th
6350: 61 74 20 69 66 20 70 7a 42 75 66 66 65 72 20 0a  at if pzBuffer .
6360: 2a 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  ** is not NULL t
6370: 68 65 6e 20 2a 70 7a 42 75 66 66 65 72 20 69 73  hen *pzBuffer is
6380: 20 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e   assumed to poin
6390: 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6c 61  t to a buffer la
63a0: 72 67 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20 74  rge enough .** t
63b0: 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79  o store the copy
63c0: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70   of expression p
63d0: 2c 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20  , the copies of 
63e0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28  p->u.zToken.** (
63f0: 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 20  if applicable), 
6400: 61 6e 64 20 74 68 65 20 63 6f 70 69 65 73 20 6f  and the copies o
6410: 66 20 74 68 65 20 70 2d 3e 70 4c 65 66 74 20 61  f the p->pLeft a
6420: 6e 64 20 70 2d 3e 70 52 69 67 68 74 20 65 78 70  nd p->pRight exp
6430: 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20  ressions,.** if 
6440: 61 6e 79 2e 20 42 65 66 6f 72 65 20 72 65 74 75  any. Before retu
6450: 72 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65 72  rning, *pzBuffer
6460: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 66   is set to the f
6470: 69 72 73 74 20 62 79 74 65 20 70 61 73 73 65 64  irst byte passed
6480: 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20   the.** portion 
6490: 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 63 6f  of the buffer co
64a0: 70 69 65 64 20 69 6e 74 6f 20 62 79 20 74 68 69  pied into by thi
64b0: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  s function..*/.s
64c0: 74 61 74 69 63 20 45 78 70 72 20 2a 65 78 70 72  tatic Expr *expr
64d0: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
64e0: 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c   Expr *p, int fl
64f0: 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66  ags, u8 **pzBuff
6500: 65 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  er){.  Expr *pNe
6510: 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  w = 0;          
6520: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
6530: 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  alue to return *
6540: 2f 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  /.  if( p ){.   
6550: 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 52 65 64   const int isRed
6560: 75 63 65 64 20 3d 20 28 66 6c 61 67 73 26 45 58  uced = (flags&EX
6570: 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20  PRDUP_REDUCE);. 
6580: 20 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 0a 20     u8 *zAlloc;. 
6590: 20 20 20 75 33 32 20 73 74 61 74 69 63 46 6c 61     u32 staticFla
65a0: 67 20 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73 65  g = 0;..    asse
65b0: 72 74 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20  rt( pzBuffer==0 
65c0: 7c 7c 20 69 73 52 65 64 75 63 65 64 20 29 3b 0a  || isReduced );.
65d0: 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
65e0: 75 74 20 77 68 65 72 65 20 74 6f 20 77 72 69 74  ut where to writ
65f0: 65 20 74 68 65 20 6e 65 77 20 45 78 70 72 20 73  e the new Expr s
6600: 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 20  tructure. */.   
6610: 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b   if( pzBuffer ){
6620: 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20  .      zAlloc = 
6630: 2a 70 7a 42 75 66 66 65 72 3b 0a 20 20 20 20 20  *pzBuffer;.     
6640: 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20 45 50   staticFlag = EP
6650: 5f 53 74 61 74 69 63 3b 0a 20 20 20 20 7d 65 6c  _Static;.    }el
6660: 73 65 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63  se{.      zAlloc
6670: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
6680: 6f 63 52 61 77 28 64 62 2c 20 64 75 70 65 64 45  ocRaw(db, dupedE
6690: 78 70 72 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  xprSize(p, flags
66a0: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  ));.    }.    pN
66b0: 65 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c  ew = (Expr *)zAl
66c0: 6c 6f 63 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e  loc;..    if( pN
66d0: 65 77 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53  ew ){.      /* S
66e0: 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74  et nNewSize to t
66f0: 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65  he size allocate
6700: 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63 74  d for the struct
6710: 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20  ure pointed to. 
6720: 20 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e       ** by pNew.
6730: 20 54 68 69 73 20 69 73 20 65 69 74 68 65 72 20   This is either 
6740: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45  EXPR_FULLSIZE, E
6750: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
6760: 6f 72 0a 20 20 20 20 20 20 2a 2a 20 45 58 50 52  or.      ** EXPR
6770: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20  _TOKENONLYSIZE. 
6780: 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f  nToken is set to
6790: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
67a0: 79 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20  ytes consumed.  
67b0: 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63 6f      ** by the co
67c0: 70 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e 7a  py of the p->u.z
67d0: 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66  Token string (if
67e0: 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a   any)..      */.
67f0: 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69        const unsi
6800: 67 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a 65  gned nStructSize
6810: 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75   = dupedExprStru
6820: 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29  ctSize(p, flags)
6830: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e  ;.      const in
6840: 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74  t nNewSize = nSt
6850: 72 75 63 74 53 69 7a 65 20 26 20 30 78 66 66 66  ructSize & 0xfff
6860: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 6b  ;.      int nTok
6870: 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21 45  en;.      if( !E
6880: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
6890: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26  , EP_IntValue) &
68a0: 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b  & p->u.zToken ){
68b0: 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20  .        nToken 
68c0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
68d0: 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b  0(p->u.zToken) +
68e0: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
68f0: 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20  .        nToken 
6900: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
6910: 20 20 20 69 66 28 20 69 73 52 65 64 75 63 65 64     if( isReduced
6920: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
6930: 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  rt( ExprHasPrope
6940: 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65  rty(p, EP_Reduce
6950: 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  d)==0 );.       
6960: 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20   memcpy(zAlloc, 
6970: 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20  p, nNewSize);.  
6980: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6990: 20 20 20 69 6e 74 20 6e 53 69 7a 65 20 3d 20 65     int nSize = e
69a0: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 29  xprStructSize(p)
69b0: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
69c0: 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a  (zAlloc, p, nSiz
69d0: 65 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  e);.        mems
69e0: 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65  et(&zAlloc[nSize
69f0: 5d 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c 53  ], 0, EXPR_FULLS
6a00: 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20 20  IZE-nSize);.    
6a10: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65    }..      /* Se
6a20: 74 20 74 68 65 20 45 50 5f 52 65 64 75 63 65 64  t the EP_Reduced
6a30: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20  , EP_TokenOnly, 
6a40: 61 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66 6c  and EP_Static fl
6a50: 61 67 73 20 61 70 70 72 6f 70 72 69 61 74 65 6c  ags appropriatel
6a60: 79 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  y. */.      pNew
6a70: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f  ->flags &= ~(EP_
6a80: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
6a90: 4f 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 29 3b  Only|EP_Static);
6aa0: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  .      pNew->fla
6ab0: 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53 69 7a  gs |= nStructSiz
6ac0: 65 20 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c  e & (EP_Reduced|
6ad0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20  EP_TokenOnly);. 
6ae0: 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73       pNew->flags
6af0: 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b 0a   |= staticFlag;.
6b00: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74  .      /* Copy t
6b10: 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73  he p->u.zToken s
6b20: 74 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a  tring, if any. *
6b30: 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 54 6f 6b  /.      if( nTok
6b40: 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  en ){.        ch
6b50: 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65  ar *zToken = pNe
6b60: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63  w->u.zToken = (c
6b70: 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65  har*)&zAlloc[nNe
6b80: 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20  wSize];.        
6b90: 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70  memcpy(zToken, p
6ba0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  ->u.zToken, nTok
6bb0: 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  en);.      }..  
6bc0: 20 20 20 20 69 66 28 20 30 3d 3d 28 28 70 2d 3e      if( 0==((p->
6bd0: 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61 67  flags|pNew->flag
6be0: 73 29 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  s) & EP_TokenOnl
6bf0: 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  y) ){.        /*
6c00: 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65   Fill in the pNe
6c10: 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72 20  w->x.pSelect or 
6c20: 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65  pNew->x.pList me
6c30: 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  mber. */.       
6c40: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
6c50: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
6c60: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
6c70: 20 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65     pNew->x.pSele
6c80: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
6c90: 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70  ctDup(db, p->x.p
6ca0: 53 65 6c 65 63 74 2c 20 69 73 52 65 64 75 63 65  Select, isReduce
6cb0: 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  d);.        }els
6cc0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  e{.          pNe
6cd0: 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71 6c  w->x.pList = sql
6ce0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
6cf0: 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2c 20  db, p->x.pList, 
6d00: 69 73 52 65 64 75 63 65 64 29 3b 0a 20 20 20 20  isReduced);.    
6d10: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
6d20: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
6d30: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20  pNew->pLeft and 
6d40: 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f  pNew->pRight. */
6d50: 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
6d60: 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 4e  asAnyProperty(pN
6d70: 65 77 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45  ew, EP_Reduced|E
6d80: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
6d90: 20 20 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 2b          zAlloc +
6da0: 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53  = dupedExprNodeS
6db0: 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20  ize(p, flags);. 
6dc0: 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48         if( ExprH
6dd0: 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c  asProperty(pNew,
6de0: 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 7b 0a   EP_Reduced) ){.
6df0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
6e00: 70 4c 65 66 74 20 3d 20 65 78 70 72 44 75 70 28  pLeft = exprDup(
6e10: 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58  db, p->pLeft, EX
6e20: 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a  PRDUP_REDUCE, &z
6e30: 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20  Alloc);.        
6e40: 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d    pNew->pRight =
6e50: 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e   exprDup(db, p->
6e60: 70 52 69 67 68 74 2c 20 45 58 50 52 44 55 50 5f  pRight, EXPRDUP_
6e70: 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29  REDUCE, &zAlloc)
6e80: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6e90: 20 20 20 20 69 66 28 20 70 7a 42 75 66 66 65 72      if( pzBuffer
6ea0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   ){.          *p
6eb0: 7a 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63  zBuffer = zAlloc
6ec0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6ed0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6ee0: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 32 20 3d 20   pNew->flags2 = 
6ef0: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  0;.        if( !
6f00: 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
6f10: 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ty(p, EP_TokenOn
6f20: 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ly) ){.         
6f30: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73   pNew->pLeft = s
6f40: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
6f50: 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a  , p->pLeft, 0);.
6f60: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
6f70: 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
6f80: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
6f90: 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
6fa0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
6fb0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
6fc0: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
6fd0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72  The following gr
6fe0: 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  oup of routines 
6ff0: 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69 65 73  make deep copies
7000: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2c   of expressions,
7010: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
7020: 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73 2c 20  ists, ID lists, 
7030: 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74 65  and select state
7040: 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f 70 69  ments.  The copi
7050: 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c  es can.** be del
7060: 65 74 65 64 20 28 62 79 20 62 65 69 6e 67 20 70  eted (by being p
7070: 61 73 73 65 64 20 74 6f 20 74 68 65 69 72 20 72  assed to their r
7080: 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c  espective ...Del
7090: 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73 29 0a  ete() routines).
70a0: 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66 65 63  ** without effec
70b0: 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61  ting the origina
70c0: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78  ls..**.** The ex
70d0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49  pression list, I
70e0: 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20 6c 69  D, and source li
70f0: 73 74 73 20 72 65 74 75 72 6e 20 62 79 20 73 71  sts return by sq
7100: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
7110: 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64  (),.** sqlite3Id
7120: 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64 20 73  ListDup(), and s
7130: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
7140: 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20 66 75  () can not be fu
7150: 72 74 68 65 72 20 65 78 70 61 6e 64 65 64 20 0a  rther expanded .
7160: 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65 6e 74  ** by subsequent
7170: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
7180: 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72 6f  *ListAppend() ro
7190: 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e  utines..**.** An
71a0: 79 20 74 61 62 6c 65 73 20 74 68 61 74 20 74 68  y tables that th
71b0: 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20  e SrcList might 
71c0: 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74  point to are not
71d0: 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a   duplicated..**.
71e0: 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61 72  ** The flags par
71f0: 61 6d 65 74 65 72 20 63 6f 6e 74 61 69 6e 73 20  ameter contains 
7200: 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  a combination of
7210: 20 74 68 65 20 45 58 50 52 44 55 50 5f 58 58 58   the EXPRDUP_XXX
7220: 20 66 6c 61 67 73 2e 0a 2a 2a 20 49 66 20 74 68   flags..** If th
7230: 65 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  e EXPRDUP_REDUCE
7240: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
7250: 65 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  en the structure
7260: 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 0a 2a   returned is a.*
7270: 2a 20 74 72 75 6e 63 61 74 65 64 20 76 65 72 73  * truncated vers
7280: 69 6f 6e 20 6f 66 20 74 68 65 20 75 73 75 61 6c  ion of the usual
7290: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20   Expr structure 
72a0: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 73 74 6f  that will be sto
72b0: 72 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f  red as.** part o
72c0: 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  f the in-memory 
72d0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
72e0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
72f0: 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70 72 20 2a  chema..*/.Expr *
7300: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 73  sqlite3ExprDup(s
7310: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
7320: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
7330: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 44 75  .  return exprDu
7340: 70 28 64 62 2c 20 70 2c 20 66 6c 61 67 73 2c 20  p(db, p, flags, 
7350: 30 29 3b 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a  0);.}.ExprList *
7360: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
7370: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
7380: 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74  ExprList *p, int
7390: 20 66 6c 61 67 73 29 7b 0a 20 20 45 78 70 72 4c   flags){.  ExprL
73a0: 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72  ist *pNew;.  str
73b0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
73c0: 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49  m *pItem, *pOldI
73d0: 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tem;.  int i;.  
73e0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
73f0: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
7400: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
7410: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
7420: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
7430: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
7440: 20 20 70 4e 65 77 2d 3e 69 45 43 75 72 73 6f 72    pNew->iECursor
7450: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45   = 0;.  pNew->nE
7460: 78 70 72 20 3d 20 69 20 3d 20 70 2d 3e 6e 45 78  xpr = i = p->nEx
7470: 70 72 3b 0a 20 20 69 66 28 20 28 66 6c 61 67 73  pr;.  if( (flags
7480: 20 26 20 45 58 50 52 44 55 50 5f 52 45 44 55 43   & EXPRDUP_REDUC
7490: 45 29 3d 3d 30 20 29 20 66 6f 72 28 69 3d 31 3b  E)==0 ) for(i=1;
74a0: 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 3d   i<p->nExpr; i+=
74b0: 69 29 7b 7d 0a 20 20 70 4e 65 77 2d 3e 61 20 3d  i){}.  pNew->a =
74c0: 20 70 49 74 65 6d 20 3d 20 73 71 6c 69 74 65 33   pItem = sqlite3
74d0: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
74e0: 20 69 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30   i*sizeof(p->a[0
74f0: 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65  ]) );.  if( pIte
7500: 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  m==0 ){.    sqli
7510: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e  te3DbFree(db, pN
7520: 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ew);.    return 
7530: 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74  0;.  } .  pOldIt
7540: 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72  em = p->a;.  for
7550: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72  (i=0; i<p->nExpr
7560: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20  ; i++, pItem++, 
7570: 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  pOldItem++){.   
7580: 20 45 78 70 72 20 2a 70 4f 6c 64 45 78 70 72 20   Expr *pOldExpr 
7590: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70  = pOldItem->pExp
75a0: 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45  r;.    pItem->pE
75b0: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
75c0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78 70  rDup(db, pOldExp
75d0: 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  r, flags);.    p
75e0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
75f0: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
7600: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  , pOldItem->zNam
7610: 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a  e);.    pItem->z
7620: 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62  Span = sqlite3Db
7630: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
7640: 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20  tem->zSpan);.   
7650: 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65   pItem->sortOrde
7660: 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f  r = pOldItem->so
7670: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74  rtOrder;.    pIt
7680: 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20  em->done = 0;.  
7690: 20 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65 72 42    pItem->iOrderB
76a0: 79 43 6f 6c 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  yCol = pOldItem-
76b0: 3e 69 4f 72 64 65 72 42 79 43 6f 6c 3b 0a 20 20  >iOrderByCol;.  
76c0: 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20    pItem->iAlias 
76d0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 41 6c 69  = pOldItem->iAli
76e0: 61 73 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  as;.  }.  return
76f0: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
7700: 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69 67  If cursors, trig
7710: 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64 20  gers, views and 
7720: 73 75 62 71 75 65 72 69 65 73 20 61 72 65 20 61  subqueries are a
7730: 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 0a  ll omitted from.
7740: 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74 68  ** the build, th
7750: 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 66  en none of the f
7760: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
7770: 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a 2a  s, except for .*
7780: 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  * sqlite3SelectD
7790: 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61 6c  up(), can be cal
77a0: 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c 65  led. sqlite3Sele
77b0: 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65 74  ctDup() is somet
77c0: 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77  imes.** called w
77d0: 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75 6d  ith a NULL argum
77e0: 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ent..*/.#if !def
77f0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
7800: 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
7810: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
7820: 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21 64  RIGGER) \. || !d
7830: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
7840: 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72 63  IT_SUBQUERY).Src
7850: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
7860: 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20  ListDup(sqlite3 
7870: 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c  *db, SrcList *p,
7880: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53   int flags){.  S
7890: 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  rcList *pNew;.  
78a0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79  int i;.  int nBy
78b0: 74 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  te;.  if( p==0 )
78c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79   return 0;.  nBy
78d0: 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20  te = sizeof(*p) 
78e0: 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73  + (p->nSrc>0 ? s
78f0: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a  izeof(p->a[0]) *
7900: 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30   (p->nSrc-1) : 0
7910: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
7920: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
7930: 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  b, nByte );.  if
7940: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
7950: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53  rn 0;.  pNew->nS
7960: 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f  rc = pNew->nAllo
7970: 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66  c = p->nSrc;.  f
7980: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72  or(i=0; i<p->nSr
7990: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  c; i++){.    str
79a0: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
79b0: 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e   *pNewItem = &pN
79c0: 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74  ew->a[i];.    st
79d0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
79e0: 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70  m *pOldItem = &p
79f0: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c  ->a[i];.    Tabl
7a00: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e 65  e *pTab;.    pNe
7a10: 77 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 20 3d  wItem->pSchema =
7a20: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 63 68 65   pOldItem->pSche
7a30: 6d 61 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ma;.    pNewItem
7a40: 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71  ->zDatabase = sq
7a50: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
7a60: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74  , pOldItem->zDat
7a70: 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77  abase);.    pNew
7a80: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
7a90: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
7aa0: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  , pOldItem->zNam
7ab0: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
7ac0: 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74  ->zAlias = sqlit
7ad0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
7ae0: 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  OldItem->zAlias)
7af0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
7b00: 6a 6f 69 6e 74 79 70 65 20 3d 20 70 4f 6c 64 49  jointype = pOldI
7b10: 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20  tem->jointype;. 
7b20: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75     pNewItem->iCu
7b30: 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rsor = pOldItem-
7b40: 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e  >iCursor;.    pN
7b50: 65 77 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c  ewItem->addrFill
7b60: 53 75 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  Sub = pOldItem->
7b70: 61 64 64 72 46 69 6c 6c 53 75 62 3b 0a 20 20 20  addrFillSub;.   
7b80: 20 70 4e 65 77 49 74 65 6d 2d 3e 72 65 67 52 65   pNewItem->regRe
7b90: 74 75 72 6e 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  turn = pOldItem-
7ba0: 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20  >regReturn;.    
7bb0: 70 4e 65 77 49 74 65 6d 2d 3e 69 73 43 6f 72 72  pNewItem->isCorr
7bc0: 65 6c 61 74 65 64 20 3d 20 70 4f 6c 64 49 74 65  elated = pOldIte
7bd0: 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 3b  m->isCorrelated;
7be0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 76  .    pNewItem->v
7bf0: 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 70 4f  iaCoroutine = pO
7c00: 6c 64 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75  ldItem->viaCorou
7c10: 74 69 6e 65 3b 0a 20 20 20 20 70 4e 65 77 49 74  tine;.    pNewIt
7c20: 65 6d 2d 3e 7a 49 6e 64 65 78 20 3d 20 73 71 6c  em->zIndex = sql
7c30: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
7c40: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 49 6e 64 65   pOldItem->zInde
7c50: 78 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  x);.    pNewItem
7c60: 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 70  ->notIndexed = p
7c70: 4f 6c 64 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65  OldItem->notInde
7c80: 78 65 64 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  xed;.    pNewIte
7c90: 6d 2d 3e 70 49 6e 64 65 78 20 3d 20 70 4f 6c 64  m->pIndex = pOld
7ca0: 49 74 65 6d 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  Item->pIndex;.  
7cb0: 20 20 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65    pTab = pNewIte
7cc0: 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74  m->pTab = pOldIt
7cd0: 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66  em->pTab;.    if
7ce0: 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ( pTab ){.      
7cf0: 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  pTab->nRef++;.  
7d00: 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d    }.    pNewItem
7d10: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
7d20: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
7d30: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65   pOldItem->pSele
7d40: 63 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  ct, flags);.    
7d50: 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20  pNewItem->pOn = 
7d60: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
7d70: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e  b, pOldItem->pOn
7d80: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
7d90: 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d  ewItem->pUsing =
7da0: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
7db0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
7dc0: 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65  pUsing);.    pNe
7dd0: 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d  wItem->colUsed =
7de0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73   pOldItem->colUs
7df0: 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ed;.  }.  return
7e00: 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20   pNew;.}.IdList 
7e10: 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75  *sqlite3IdListDu
7e20: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  p(sqlite3 *db, I
7e30: 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c  dList *p){.  IdL
7e40: 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  ist *pNew;.  int
7e50: 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   i;.  if( p==0 )
7e60: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
7e70: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
7e80: 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
7e90: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
7ea0: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
7eb0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49  rn 0;.  pNew->nI
7ec0: 64 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e  d = p->nId;.  pN
7ed0: 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44  ew->a = sqlite3D
7ee0: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 70  bMallocRaw(db, p
7ef0: 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e  ->nId*sizeof(p->
7f00: 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70  a[0]) );.  if( p
7f10: 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20  New->a==0 ){.   
7f20: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
7f30: 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65  b, pNew);.    re
7f40: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a  turn 0;.  }.  /*
7f50: 20 4e 6f 74 65 20 74 68 61 74 20 62 65 63 61 75   Note that becau
7f60: 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  se the size of t
7f70: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f  he allocation fo
7f80: 72 20 70 2d 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a  r p->a[] is not.
7f90: 20 20 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c 79    ** necessarily
7fa0: 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 2c   a power of two,
7fb0: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70   sqlite3IdListAp
7fc0: 70 65 6e 64 28 29 20 6d 61 79 20 6e 6f 74 20 62  pend() may not b
7fd0: 65 20 63 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e  e called.  ** on
7fe0: 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20 63   the duplicate c
7ff0: 72 65 61 74 65 64 20 62 79 20 74 68 69 73 20 66  reated by this f
8000: 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f  unction. */.  fo
8010: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b  r(i=0; i<p->nId;
8020: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
8030: 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70  t IdList_item *p
8040: 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d  NewItem = &pNew-
8050: 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63  >a[i];.    struc
8060: 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70  t IdList_item *p
8070: 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b  OldItem = &p->a[
8080: 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  i];.    pNewItem
8090: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
80a0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
80b0: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
80c0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64      pNewItem->id
80d0: 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64  x = pOldItem->id
80e0: 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  x;.  }.  return 
80f0: 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a  pNew;.}.Select *
8100: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
8110: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65  (sqlite3 *db, Se
8120: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61  lect *p, int fla
8130: 67 73 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  gs){.  Select *p
8140: 4e 65 77 2c 20 2a 70 50 72 69 6f 72 3b 0a 20 20  New, *pPrior;.  
8150: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
8160: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
8170: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
8180: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20  (db, sizeof(*p) 
8190: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
81a0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
81b0: 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71  New->pEList = sq
81c0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
81d0: 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  (db, p->pEList, 
81e0: 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e  flags);.  pNew->
81f0: 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  pSrc = sqlite3Sr
8200: 63 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  cListDup(db, p->
8210: 70 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a 20 20  pSrc, flags);.  
8220: 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73  pNew->pWhere = s
8230: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
8240: 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61  , p->pWhere, fla
8250: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72  gs);.  pNew->pGr
8260: 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
8270: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
8280: 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c 61 67  ->pGroupBy, flag
8290: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76  s);.  pNew->pHav
82a0: 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ing = sqlite3Exp
82b0: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48 61 76  rDup(db, p->pHav
82c0: 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  ing, flags);.  p
82d0: 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  New->pOrderBy = 
82e0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
82f0: 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  up(db, p->pOrder
8300: 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  By, flags);.  pN
8310: 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a  ew->op = p->op;.
8320: 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d    pNew->pPrior =
8330: 20 70 50 72 69 6f 72 20 3d 20 73 71 6c 69 74 65   pPrior = sqlite
8340: 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
8350: 2d 3e 70 50 72 69 6f 72 2c 20 66 6c 61 67 73 29  ->pPrior, flags)
8360: 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 20 29  ;.  if( pPrior )
8370: 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d   pPrior->pNext =
8380: 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70   pNew;.  pNew->p
8390: 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77  Next = 0;.  pNew
83a0: 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74  ->pLimit = sqlit
83b0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
83c0: 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29 3b  >pLimit, flags);
83d0: 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74  .  pNew->pOffset
83e0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
83f0: 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74  p(db, p->pOffset
8400: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
8410: 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
8420: 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20  pNew->iOffset = 
8430: 30 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c  0;.  pNew->selFl
8440: 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67  ags = p->selFlag
8450: 73 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68 65  s & ~SF_UsesEphe
8460: 6d 65 72 61 6c 3b 0a 20 20 70 4e 65 77 2d 3e 70  meral;.  pNew->p
8470: 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20  Rightmost = 0;. 
8480: 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45   pNew->addrOpenE
8490: 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70  phm[0] = -1;.  p
84a0: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
84b0: 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  m[1] = -1;.  pNe
84c0: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
84d0: 32 5d 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72  2] = -1;.  retur
84e0: 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a  n pNew;.}.#else.
84f0: 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53  Select *sqlite3S
8500: 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65 33  electDup(sqlite3
8510: 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c   *db, Select *p,
8520: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61   int flags){.  a
8530: 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20  ssert( p==0 );. 
8540: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
8550: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  dif.../*.** Add 
8560: 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
8570: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65   the end of an e
8580: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
8590: 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20   If pList is.** 
85a0: 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20  initially NULL, 
85b0: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65  then create a ne
85c0: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  w expression lis
85d0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  t..**.** If a me
85e0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
85f0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
8600: 65 20 65 6e 74 69 72 65 20 6c 69 73 74 20 69 73  e entire list is
8610: 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e 55   freed and.** NU
8620: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  LL is returned. 
8630: 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20   If non-NULL is 
8640: 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 69  returned, then i
8650: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a  t is guaranteed.
8660: 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77 20  ** that the new 
8670: 65 6e 74 72 79 20 77 61 73 20 73 75 63 63 65 73  entry was succes
8680: 73 66 75 6c 6c 79 20 61 70 70 65 6e 64 65 64 2e  sfully appended.
8690: 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71  .*/.ExprList *sq
86a0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
86b0: 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50  end(.  Parse *pP
86c0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
86d0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
86e0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
86f0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  *pList,        /
8700: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
8710: 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74  to append. Might
8720: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
8730: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20  pr *pExpr       
8740: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
8750: 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64  ion to be append
8760: 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  ed. Might be NUL
8770: 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  L */.){.  sqlite
8780: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
8790: 64 62 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  db;.  if( pList=
87a0: 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
87b0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
87c0: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
87d0: 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20  (ExprList) );.  
87e0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
87f0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
8800: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  mem;.    }.    p
8810: 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65  List->a = sqlite
8820: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
8830: 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61   sizeof(pList->a
8840: 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 70  [0]));.    if( p
8850: 4c 69 73 74 2d 3e 61 3d 3d 30 20 29 20 67 6f 74  List->a==0 ) got
8860: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 65 6c 73  o no_mem;.  }els
8870: 65 20 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e 45  e if( (pList->nE
8880: 78 70 72 20 26 20 28 70 4c 69 73 74 2d 3e 6e 45  xpr & (pList->nE
8890: 78 70 72 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20  xpr-1))==0 ){.  
88a0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
88b0: 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61  t_item *a;.    a
88c0: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
88d0: 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 61 20 3d  xpr>0 );.    a =
88e0: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
88f0: 63 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 2c 20  c(db, pList->a, 
8900: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2a 32 2a 73  pList->nExpr*2*s
8910: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
8920: 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d  ]));.    if( a==
8930: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
8940: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  no_mem;.    }.  
8950: 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a    pList->a = a;.
8960: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c    }.  assert( pL
8970: 69 73 74 2d 3e 61 21 3d 30 20 29 3b 0a 20 20 69  ist->a!=0 );.  i
8980: 66 28 20 31 20 29 7b 0a 20 20 20 20 73 74 72 75  f( 1 ){.    stru
8990: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
89a0: 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74   *pItem = &pList
89b0: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->a[pList->nExpr
89c0: 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ++];.    memset(
89d0: 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  pItem, 0, sizeof
89e0: 28 2a 70 49 74 65 6d 29 29 3b 0a 20 20 20 20 70  (*pItem));.    p
89f0: 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45  Item->pExpr = pE
8a00: 78 70 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  xpr;.  }.  retur
8a10: 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d  n pList;..no_mem
8a20: 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69  :     .  /* Avoi
8a30: 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79  d leaking memory
8a40: 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66   if malloc has f
8a50: 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69  ailed. */.  sqli
8a60: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
8a70: 2c 20 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69  , pExpr);.  sqli
8a80: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
8a90: 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
8aa0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
8ab0: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 4c  ** Set the ExprL
8ac0: 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c  ist.a[].zName el
8ad0: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73  ement of the mos
8ae0: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
8af0: 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20   item.** on the 
8b00: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
8b10: 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67  .**.** pList mig
8b20: 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f  ht be NULL follo
8b30: 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  wing an OOM erro
8b40: 72 2e 20 20 42 75 74 20 70 4e 61 6d 65 20 73 68  r.  But pName sh
8b50: 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a  ould never be.**
8b60: 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d   NULL.  If a mem
8b70: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
8b80: 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65  ails, the pParse
8b90: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
8ba0: 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65  ed flag.** is se
8bb0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
8bc0: 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d  e3ExprListSetNam
8bd0: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
8be0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
8bf0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
8c00: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
8c10: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  List,        /* 
8c20: 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f  List to which to
8c30: 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a   add the span. *
8c40: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
8c50: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
8c60: 61 6d 65 20 74 6f 20 62 65 20 61 64 64 65 64 20  ame to be added 
8c70: 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65  */.  int dequote
8c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8c90: 54 72 75 65 20 74 6f 20 63 61 75 73 65 20 74 68  True to cause th
8ca0: 65 20 6e 61 6d 65 20 74 6f 20 62 65 20 64 65 71  e name to be deq
8cb0: 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73  uoted */.){.  as
8cc0: 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c  sert( pList!=0 |
8cd0: 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
8ce0: 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b  llocFailed!=0 );
8cf0: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
8d00: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
8d10: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
8d20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
8d30: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
8d40: 20 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73     pItem = &pLis
8d50: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  t->a[pList->nExp
8d60: 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  r-1];.    assert
8d70: 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d  ( pItem->zName==
8d80: 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  0 );.    pItem->
8d90: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
8da0: 62 53 74 72 4e 44 75 70 28 70 50 61 72 73 65 2d  bStrNDup(pParse-
8db0: 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70  >db, pName->z, p
8dc0: 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66  Name->n);.    if
8dd0: 28 20 64 65 71 75 6f 74 65 20 26 26 20 70 49 74  ( dequote && pIt
8de0: 65 6d 2d 3e 7a 4e 61 6d 65 20 29 20 73 71 6c 69  em->zName ) sqli
8df0: 74 65 33 44 65 71 75 6f 74 65 28 70 49 74 65 6d  te3Dequote(pItem
8e00: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a  ->zName);.  }.}.
8e10: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45  ./*.** Set the E
8e20: 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61  xprList.a[].zSpa
8e30: 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  n element of the
8e40: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
8e50: 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20  dded item.** on 
8e60: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
8e70: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74  ist..**.** pList
8e80: 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66   might be NULL f
8e90: 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20  ollowing an OOM 
8ea0: 65 72 72 6f 72 2e 20 20 42 75 74 20 70 53 70 61  error.  But pSpa
8eb0: 6e 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  n should never b
8ec0: 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61  e.** NULL.  If a
8ed0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
8ee0: 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50  on fails, the pP
8ef0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
8f00: 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69  Failed flag.** i
8f10: 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  s set..*/.void s
8f20: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
8f30: 74 53 70 61 6e 28 0a 20 20 50 61 72 73 65 20 2a  tSpan(.  Parse *
8f40: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
8f50: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
8f60: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
8f70: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
8f80: 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63   /* List to whic
8f90: 68 20 74 6f 20 61 64 64 20 74 68 65 20 73 70 61  h to add the spa
8fa0: 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 53 70 61 6e  n. */.  ExprSpan
8fb0: 20 2a 70 53 70 61 6e 20 20 20 20 20 20 20 20 20   *pSpan         
8fc0: 2f 2a 20 54 68 65 20 73 70 61 6e 20 74 6f 20 62  /* The span to b
8fd0: 65 20 61 64 64 65 64 20 2a 2f 0a 29 7b 0a 20 20  e added */.){.  
8fe0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
8ff0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65  arse->db;.  asse
9000: 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20  rt( pList!=0 || 
9010: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9020: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69  !=0 );.  if( pLi
9030: 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  st ){.    struct
9040: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
9050: 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
9060: 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  a[pList->nExpr-1
9070: 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
9080: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
9090: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
90a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
90b0: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3d 3d 70   pItem->pExpr==p
90c0: 53 70 61 6e 2d 3e 70 45 78 70 72 20 29 3b 0a 20  Span->pExpr );. 
90d0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
90e0: 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61  (db, pItem->zSpa
90f0: 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a  n);.    pItem->z
9100: 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62  Span = sqlite3Db
9110: 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61  StrNDup(db, (cha
9120: 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74  r*)pSpan->zStart
9130: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9150: 20 20 20 20 20 20 28 69 6e 74 29 28 70 53 70 61        (int)(pSpa
9160: 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d  n->zEnd - pSpan-
9170: 3e 7a 53 74 61 72 74 29 29 3b 0a 20 20 7d 0a 7d  >zStart));.  }.}
9180: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ../*.** If the e
9190: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70  xpression list p
91a0: 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d  EList contains m
91b0: 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d 69 74 20  ore than iLimit 
91c0: 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61  elements,.** lea
91d0: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
91e0: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  age in pParse..*
91f0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
9200: 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74  prListCheckLengt
9210: 68 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  h(.  Parse *pPar
9220: 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  se,.  ExprList *
9230: 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20  pEList,.  const 
9240: 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b  char *zObject.){
9250: 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70 50 61 72  .  int mx = pPar
9260: 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  se->db->aLimit[S
9270: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
9280: 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28  MN];.  testcase(
9290: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
92a0: 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a  t->nExpr==mx );.
92b0: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69    testcase( pELi
92c0: 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
92d0: 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69  xpr==mx+1 );.  i
92e0: 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  f( pEList && pEL
92f0: 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b  ist->nExpr>mx ){
9300: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
9310: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
9320: 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69  o many columns i
9330: 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b  n %s", zObject);
9340: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
9350: 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65  lete an entire e
9360: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
9370: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
9380: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 73 71  xprListDelete(sq
9390: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c  lite3 *db, ExprL
93a0: 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
93b0: 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45  nt i;.  struct E
93c0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
93d0: 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  tem;.  if( pList
93e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
93f0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61  assert( pList->a
9400: 21 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45  !=0 || pList->nE
9410: 78 70 72 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28  xpr==0 );.  for(
9420: 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
9430: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
9440: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
9450: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  +){.    sqlite3E
9460: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49  xprDelete(db, pI
9470: 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
9480: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
9490: 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  b, pItem->zName)
94a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
94b0: 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
94c0: 53 70 61 6e 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Span);.  }.  sql
94d0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
94e0: 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69  List->a);.  sqli
94f0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c  te3DbFree(db, pL
9500: 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ist);.}../*.** T
9510: 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
9520: 65 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63  e Walker callbac
9530: 6b 73 2e 20 20 57 61 6c 6b 65 72 2e 75 2e 70 69  ks.  Walker.u.pi
9540: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a   is a pointer.**
9550: 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 20   to an integer. 
9560: 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
9570: 61 72 65 20 63 68 65 63 6b 69 6e 67 20 61 6e 20  are checking an 
9580: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 73 65  expression to se
9590: 65 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 61 20  e.** if it is a 
95a0: 63 6f 6e 73 74 61 6e 74 2e 20 20 53 65 74 20 2a  constant.  Set *
95b0: 57 61 6c 6b 65 72 2e 75 2e 70 69 20 74 6f 20 30  Walker.u.pi to 0
95c0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
95d0: 6f 6e 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e  on is.** not con
95e0: 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  stant..**.** The
95f0: 73 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  se callback rout
9600: 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
9610: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 66   implement the f
9620: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
9630: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
9640: 73 43 6f 6e 73 74 61 6e 74 28 29 0a 2a 2a 20 20  sConstant().**  
9650: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73     sqlite3ExprIs
9660: 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
9670: 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ).**     sqlite3
9680: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
9690: 46 75 6e 63 74 69 6f 6e 28 29 0a 2a 2a 0a 2a 2f  Function().**.*/
96a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
96b0: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57  NodeIsConstant(W
96c0: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
96d0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 0a 20  Expr *pExpr){.. 
96e0: 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65 72 2d 3e   /* If pWalker->
96f0: 75 2e 69 20 69 73 20 33 20 74 68 65 6e 20 61 6e  u.i is 3 then an
9700: 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 65 78  y term of the ex
9710: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f  pression that co
9720: 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68  mes from.  ** th
9730: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
9740: 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e 20  auses of a join 
9750: 64 69 73 71 75 61 6c 69 66 69 65 73 20 74 68 65  disqualifies the
9760: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
9770: 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73   from being cons
9780: 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e  idered constant.
9790: 20 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b 65   */.  if( pWalke
97a0: 72 2d 3e 75 2e 69 3d 3d 33 20 26 26 20 45 78 70  r->u.i==3 && Exp
97b0: 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28  rHasAnyProperty(
97c0: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
97d0: 69 6e 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b  in) ){.    pWalk
97e0: 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 20  er->u.i = 0;.   
97f0: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
9800: 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68  t;.  }..  switch
9810: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
9820: 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66     /* Consider f
9830: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 63  unctions to be c
9840: 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20 74  onstant if all t
9850: 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20 61  heir arguments a
9860: 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20  re constant.    
9870: 2a 2a 20 61 6e 64 20 70 57 61 6c 6b 65 72 2d 3e  ** and pWalker->
9880: 75 2e 69 3d 3d 32 20 2a 2f 0a 20 20 20 20 63 61  u.i==2 */.    ca
9890: 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a  se TK_FUNCTION:.
98a0: 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65        if( pWalke
98b0: 72 2d 3e 75 2e 69 3d 3d 32 20 29 20 72 65 74 75  r->u.i==2 ) retu
98c0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 46  rn 0;.      /* F
98d0: 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  all through */. 
98e0: 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20     case TK_ID:. 
98f0: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
9900: 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  N:.    case TK_A
9910: 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  GG_FUNCTION:.   
9920: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
9930: 55 4d 4e 3a 0a 20 20 20 20 20 20 74 65 73 74 63  UMN:.      testc
9940: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
9950: 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20 20 74  TK_ID );.      t
9960: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
9970: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
9980: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
9990: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
99a0: 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  GG_FUNCTION );. 
99b0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
99c0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
99d0: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
99e0: 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20   pWalker->u.i = 
99f0: 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
9a00: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 64  WRC_Abort;.    d
9a10: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 74 65  efault:.      te
9a20: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
9a30: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 20  p==TK_SELECT ); 
9a40: 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43  /* selectNodeIsC
9a50: 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20 64 69 73  onstant will dis
9a60: 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 74  allow */.      t
9a70: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
9a80: 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b  op==TK_EXISTS );
9a90: 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65 49 73   /* selectNodeIs
9aa0: 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20 64 69  Constant will di
9ab0: 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20  sallow */.      
9ac0: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
9ad0: 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  nue;.  }.}.stati
9ae0: 63 20 69 6e 74 20 73 65 6c 65 63 74 4e 6f 64 65  c int selectNode
9af0: 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65  IsConstant(Walke
9b00: 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
9b10: 63 74 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20  ct *NotUsed){.  
9b20: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
9b30: 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 70 57 61  (NotUsed);.  pWa
9b40: 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20  lker->u.i = 0;. 
9b50: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
9b60: 74 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  t;.}.static int 
9b70: 65 78 70 72 49 73 43 6f 6e 73 74 28 45 78 70 72  exprIsConst(Expr
9b80: 20 2a 70 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61   *p, int initFla
9b90: 67 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  g){.  Walker w;.
9ba0: 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
9bb0: 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e  sizeof(w));.  w.
9bc0: 75 2e 69 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a  u.i = initFlag;.
9bd0: 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
9be0: 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  k = exprNodeIsCo
9bf0: 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c  nstant;.  w.xSel
9c00: 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65  ectCallback = se
9c10: 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61  lectNodeIsConsta
9c20: 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  nt;.  sqlite3Wal
9c30: 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20  kExpr(&w, p);.  
9c40: 72 65 74 75 72 6e 20 77 2e 75 2e 69 3b 0a 7d 0a  return w.u.i;.}.
9c50: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
9c60: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
9c70: 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
9c80: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
9c90: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30  onstant.** and 0
9ca0: 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20   if it involves 
9cb0: 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e  variables or fun
9cc0: 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a  ction calls..**.
9cd0: 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
9ce0: 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ses of this func
9cf0: 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71  tion, a double-q
9d00: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
9d10: 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63  : "abc").** is c
9d20: 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69  onsidered a vari
9d30: 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c  able but a singl
9d40: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
9d50: 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a  (ex: 'abc') is.*
9d60: 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f  * a constant..*/
9d70: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
9d80: 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20  IsConstant(Expr 
9d90: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  *p){.  return ex
9da0: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 29 3b  prIsConst(p, 1);
9db0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
9dc0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
9dd0: 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  e.  Return 1 if 
9de0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
9df0: 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68  s constant.** th
9e00: 61 74 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69  at does no origi
9e10: 6e 61 74 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e  nate from the ON
9e20: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
9e30: 73 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20  s of a join..** 
9e40: 52 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69  Return 0 if it i
9e50: 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65  nvolves variable
9e60: 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61  s or function ca
9e70: 6c 6c 73 20 6f 72 20 74 65 72 6d 73 20 66 72 6f  lls or terms fro
9e80: 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53  m.** an ON or US
9e90: 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69  ING clause..*/.i
9ea0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
9eb0: 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
9ec0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
9ed0: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
9ee0: 2c 20 33 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  , 3);.}../*.** W
9ef0: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
9f00: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
9f10: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
9f20: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
9f30: 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e  ** or a function
9f40: 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74   call with const
9f50: 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  ant arguments.  
9f60: 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69 66 20  Return and 0 if 
9f70: 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79  there.** are any
9f80: 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a   variables..**.*
9f90: 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
9fa0: 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  es of this funct
9fb0: 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75  ion, a double-qu
9fc0: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
9fd0: 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f   "abc").** is co
9fe0: 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61  nsidered a varia
9ff0: 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65  ble but a single
a000: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
a010: 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a  ex: 'abc') is.**
a020: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a   a constant..*/.
a030: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
a040: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
a050: 69 6f 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ion(Expr *p){.  
a060: 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
a070: 73 74 28 70 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a 0a  st(p, 2);.}../*.
a080: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
a090: 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63  sion p codes a c
a0a0: 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20  onstant integer 
a0b0: 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  that is small en
a0c0: 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69  ough.** to fit i
a0d0: 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  n a 32-bit integ
a0e0: 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64  er, return 1 and
a0f0: 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f   put the value o
a100: 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  f the integer.**
a110: 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66   in *pValue.  If
a120: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
a130: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
a140: 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f  r or if it is to
a150: 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20  o big.** to fit 
a160: 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62  in a signed 32-b
a170: 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75  it integer, retu
a180: 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a  rn 0 and leave *
a190: 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64  pValue unchanged
a1a0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
a1b0: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78  ExprIsInteger(Ex
a1c0: 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c  pr *p, int *pVal
a1d0: 75 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ue){.  int rc = 
a1e0: 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65  0;..  /* If an e
a1f0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20  xpression is an 
a200: 69 6e 74 65 67 65 72 20 6c 69 74 65 72 61 6c 20  integer literal 
a210: 74 68 61 74 20 66 69 74 73 20 69 6e 20 61 20 73  that fits in a s
a220: 69 67 6e 65 64 20 33 32 2d 62 69 74 0a 20 20 2a  igned 32-bit.  *
a230: 2a 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20  * integer, then 
a240: 74 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  the EP_IntValue 
a250: 66 6c 61 67 20 77 69 6c 6c 20 68 61 76 65 20 61  flag will have a
a260: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 74 20  lready been set 
a270: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
a280: 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c  op!=TK_INTEGER |
a290: 7c 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  | (p->flags & EP
a2a0: 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 0a 20 20  _IntValue)!=0.  
a2b0: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
a2c0: 74 65 33 47 65 74 49 6e 74 33 32 28 70 2d 3e 75  te3GetInt32(p->u
a2d0: 2e 7a 54 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d 30  .zToken, &rc)==0
a2e0: 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c   );..  if( p->fl
a2f0: 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75  ags & EP_IntValu
a300: 65 20 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65  e ){.    *pValue
a310: 20 3d 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a   = p->u.iValue;.
a320: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
a330: 7d 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  }.  switch( p->o
a340: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
a350: 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20  _UPLUS: {.      
a360: 72 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  rc = sqlite3Expr
a370: 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65  IsInteger(p->pLe
a380: 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20  ft, pValue);.   
a390: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
a3a0: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e      case TK_UMIN
a3b0: 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  US: {.      int 
a3c0: 76 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  v;.      if( sql
a3d0: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
a3e0: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20  r(p->pLeft, &v) 
a3f0: 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c  ){.        *pVal
a400: 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20  ue = -v;.       
a410: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d   rc = 1;.      }
a420: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a430: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
a440: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
a450: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
a460: 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69  * Return FALSE i
a470: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  f there is no ch
a480: 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 65 78  ance that the ex
a490: 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20  pression can be 
a4a0: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  NULL..**.** If t
a4b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 69  he expression mi
a4c0: 67 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69  ght be NULL or i
a4d0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
a4e0: 20 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a   is too complex.
a4f0: 2a 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74 75 72  ** to tell retur
a500: 6e 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20  n TRUE.  .**.** 
a510: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
a520: 75 73 65 64 20 61 73 20 61 6e 20 6f 70 74 69 6d  used as an optim
a530: 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70  ization, to skip
a540: 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64   OP_IsNull opcod
a550: 65 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e  es.** when we kn
a560: 6f 77 20 74 68 61 74 20 61 20 76 61 6c 75 65 20  ow that a value 
a570: 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20  cannot be NULL. 
a580: 20 48 65 6e 63 65 2c 20 61 20 66 61 6c 73 65 20   Hence, a false 
a590: 70 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72 65 74  positive.** (ret
a5a0: 75 72 6e 69 6e 67 20 54 52 55 45 20 77 68 65 6e  urning TRUE when
a5b0: 20 69 6e 20 66 61 63 74 20 74 68 65 20 65 78 70   in fact the exp
a5c0: 72 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65  ression can neve
a5d0: 72 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74  r be NULL) might
a5e0: 0a 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c 20 70  .** be a small p
a5f0: 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 20 62  erformance hit b
a600: 75 74 20 69 73 20 6f 74 68 65 72 77 69 73 65 20  ut is otherwise 
a610: 68 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68  harmless.  On th
a620: 65 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c  e other.** hand,
a630: 20 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76   a false negativ
a640: 65 20 28 72 65 74 75 72 6e 69 6e 67 20 46 41 4c  e (returning FAL
a650: 53 45 20 77 68 65 6e 20 74 68 65 20 72 65 73 75  SE when the resu
a660: 6c 74 20 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c  lt could be NULL
a670: 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  ).** will likely
a680: 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e   result in an in
a690: 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 2e 20  correct answer. 
a6a0: 20 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f 75 62   So when in doub
a6b0: 74 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55  t, return.** TRU
a6c0: 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  E..*/.int sqlite
a6d0: 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63  3ExprCanBeNull(c
a6e0: 6f 6e 73 74 20 45 78 70 72 20 2a 70 29 7b 0a 20  onst Expr *p){. 
a6f0: 20 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28   u8 op;.  while(
a700: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53   p->op==TK_UPLUS
a710: 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d   || p->op==TK_UM
a720: 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70  INUS ){ p = p->p
a730: 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70  Left; }.  op = p
a740: 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
a750: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
a760: 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69   = p->op2;.  swi
a770: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
a780: 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a  ase TK_INTEGER:.
a790: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
a7a0: 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NG:.    case TK_
a7b0: 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20  FLOAT:.    case 
a7c0: 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72  TK_BLOB:.      r
a7d0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 64 65 66  eturn 0;.    def
a7e0: 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75  ault:.      retu
a7f0: 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 1;.  }.}../*.
a800: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 4f  ** Generate an O
a810: 50 5f 49 73 4e 75 6c 6c 20 69 6e 73 74 72 75 63  P_IsNull instruc
a820: 74 69 6f 6e 20 74 68 61 74 20 74 65 73 74 73 20  tion that tests 
a830: 72 65 67 69 73 74 65 72 20 69 52 65 67 20 61 6e  register iReg an
a840: 64 20 6a 75 6d 70 73 0a 2a 2a 20 74 6f 20 6c 6f  d jumps.** to lo
a850: 63 61 74 69 6f 6e 20 69 44 65 73 74 20 69 66 20  cation iDest if 
a860: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 69 52 65  the value in iRe
a870: 67 20 69 73 20 4e 55 4c 4c 2e 20 20 54 68 65 20  g is NULL.  The 
a880: 76 61 6c 75 65 20 69 6e 20 69 52 65 67 20 0a 2a  value in iReg .*
a890: 2a 20 77 61 73 20 63 6f 6d 70 75 74 65 64 20 62  * was computed b
a8a0: 79 20 70 45 78 70 72 2e 20 20 49 66 20 77 65 20  y pExpr.  If we 
a8b0: 63 61 6e 20 6c 6f 6f 6b 20 61 74 20 70 45 78 70  can look at pExp
a8c0: 72 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  r at compile-tim
a8d0: 65 20 61 6e 64 0a 2a 2a 20 64 65 74 65 72 6d 69  e and.** determi
a8e0: 6e 65 20 74 68 61 74 20 69 74 20 63 61 6e 20 6e  ne that it can n
a8f0: 65 76 65 72 20 67 65 6e 65 72 61 74 65 20 61 20  ever generate a 
a900: 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 4f  NULL, then the O
a910: 50 5f 49 73 4e 75 6c 6c 20 6f 70 65 72 61 74 69  P_IsNull operati
a920: 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69  on.** can be omi
a930: 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tted..*/.void sq
a940: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e  lite3ExprCodeIsN
a950: 75 6c 6c 4a 75 6d 70 28 0a 20 20 56 64 62 65 20  ullJump(.  Vdbe 
a960: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *v,            /
a970: 2a 20 54 68 65 20 56 44 42 45 20 75 6e 64 65 72  * The VDBE under
a980: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
a990: 0a 20 20 63 6f 6e 73 74 20 45 78 70 72 20 2a 70  .  const Expr *p
a9a0: 45 78 70 72 2c 20 20 2f 2a 20 4f 6e 6c 79 20 67  Expr,  /* Only g
a9b0: 65 6e 65 72 61 74 65 20 4f 50 5f 49 73 4e 75 6c  enerate OP_IsNul
a9c0: 6c 20 69 66 20 74 68 69 73 20 65 78 70 72 20 63  l if this expr c
a9d0: 61 6e 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  an be NULL */.  
a9e0: 69 6e 74 20 69 52 65 67 2c 20 20 20 20 20 20 20  int iReg,       
a9f0: 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68 65 20      /* Test the 
aa00: 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65  value in this re
aa10: 67 69 73 74 65 72 20 66 6f 72 20 4e 55 4c 4c 20  gister for NULL 
aa20: 2a 2f 0a 20 20 69 6e 74 20 69 44 65 73 74 20 20  */.  int iDest  
aa30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
aa40: 20 68 65 72 65 20 69 66 20 74 68 65 20 76 61 6c   here if the val
aa50: 75 65 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a 29 7b  ue is null */.){
aa60: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
aa70: 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 45 78 70  prCanBeNull(pExp
aa80: 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  r) ){.    sqlite
aa90: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
aaa0: 50 5f 49 73 4e 75 6c 6c 2c 20 69 52 65 67 2c 20  P_IsNull, iReg, 
aab0: 69 44 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  iDest);.  }.}../
aac0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
aad0: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   if the given ex
aae0: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
aaf0: 6e 73 74 61 6e 74 20 77 68 69 63 68 20 77 6f 75  nstant which wou
ab00: 6c 64 20 62 65 0a 2a 2a 20 75 6e 63 68 61 6e 67  ld be.** unchang
ab10: 65 64 20 62 79 20 4f 50 5f 41 66 66 69 6e 69 74  ed by OP_Affinit
ab20: 79 20 77 69 74 68 20 74 68 65 20 61 66 66 69 6e  y with the affin
ab30: 69 74 79 20 67 69 76 65 6e 20 69 6e 20 74 68 65  ity given in the
ab40: 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d   second.** argum
ab50: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ent..**.** This 
ab60: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
ab70: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
ab80: 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20  the OP_Affinity 
ab90: 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e  operation.** can
aba0: 20 62 65 20 6f 6d 69 74 74 65 64 2e 20 20 57 68   be omitted.  Wh
abb0: 65 6e 20 69 6e 20 64 6f 75 62 74 20 72 65 74 75  en in doubt retu
abc0: 72 6e 20 46 41 4c 53 45 2e 20 20 41 20 66 61 6c  rn FALSE.  A fal
abd0: 73 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69  se negative.** i
abe0: 73 20 68 61 72 6d 6c 65 73 73 2e 20 20 41 20 66  s harmless.  A f
abf0: 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2c 20 68  alse positive, h
ac00: 6f 77 65 76 65 72 2c 20 63 61 6e 20 72 65 73 75  owever, can resu
ac10: 6c 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 0a  lt in the wrong.
ac20: 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e  ** answer..*/.in
ac30: 74 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65  t sqlite3ExprNee
ac40: 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e  dsNoAffinityChan
ac50: 67 65 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70  ge(const Expr *p
ac60: 2c 20 63 68 61 72 20 61 66 66 29 7b 0a 20 20 75  , char aff){.  u
ac70: 38 20 6f 70 3b 0a 20 20 69 66 28 20 61 66 66 3d  8 op;.  if( aff=
ac80: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
ac90: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 77   ) return 1;.  w
aca0: 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  hile( p->op==TK_
acb0: 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  UPLUS || p->op==
acc0: 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d  TK_UMINUS ){ p =
acd0: 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f   p->pLeft; }.  o
ace0: 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28  p = p->op;.  if(
acf0: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
ad00: 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a   ) op = p->op2;.
ad10: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
ad20: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
ad30: 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  GER: {.      ret
ad40: 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f  urn aff==SQLITE_
ad50: 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61  AFF_INTEGER || a
ad60: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
ad70: 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20  UMERIC;.    }.  
ad80: 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
ad90: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
ada0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
adb0: 52 45 41 4c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c  REAL || aff==SQL
adc0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
add0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
ade0: 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20  TK_STRING: {.   
adf0: 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53     return aff==S
ae00: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
ae10: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
ae20: 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20  K_BLOB: {.      
ae30: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
ae40: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
ae50: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  MN: {.      asse
ae60: 72 74 28 20 70 2d 3e 69 54 61 62 6c 65 3e 3d 30  rt( p->iTable>=0
ae70: 20 29 3b 20 20 2f 2a 20 70 20 63 61 6e 6e 6f 74   );  /* p cannot
ae80: 20 62 65 20 70 61 72 74 20 6f 66 20 61 20 43 48   be part of a CH
ae90: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  ECK constraint *
aea0: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  /.      return p
aeb0: 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20  ->iColumn<0.    
aec0: 20 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53        && (aff==S
aed0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
aee0: 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  R || aff==SQLITE
aef0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 29 3b 0a 20  _AFF_NUMERIC);. 
af00: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
af10: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
af20: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
af30: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
af40: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
af50: 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d  string is a row-
af60: 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a  id column name..
af70: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73  */.int sqlite3Is
af80: 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72  Rowid(const char
af90: 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69   *z){.  if( sqli
afa0: 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f  te3StrICmp(z, "_
afb0: 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65  ROWID_")==0 ) re
afc0: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
afd0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
afe0: 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65  "ROWID")==0 ) re
aff0: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
b000: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
b010: 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75  "OID")==0 ) retu
b020: 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
b030: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
b040: 6e 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65  n true if we are
b050: 20 61 62 6c 65 20 74 6f 20 74 68 65 20 49 4e 20   able to the IN 
b060: 6f 70 65 72 61 74 6f 72 20 6f 70 74 69 6d 69 7a  operator optimiz
b070: 61 74 69 6f 6e 20 6f 6e 20 61 0a 2a 2a 20 71 75  ation on a.** qu
b080: 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a  ery of the form.
b090: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 78 20 49 4e  **.**       x IN
b0a0: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a   (SELECT ...).**
b0b0: 0a 2a 2a 20 57 68 65 72 65 20 74 68 65 20 53 45  .** Where the SE
b0c0: 4c 45 43 54 2e 2e 2e 20 63 6c 61 75 73 65 20 69  LECT... clause i
b0d0: 73 20 61 73 20 73 70 65 63 69 66 69 65 64 20 62  s as specified b
b0e0: 79 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  y the parameter 
b0f0: 74 6f 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  to this.** routi
b100: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 65  ne..**.** The Se
b110: 6c 65 63 74 20 6f 62 6a 65 63 74 20 70 61 73 73  lect object pass
b120: 65 64 20 69 6e 20 68 61 73 20 61 6c 72 65 61 64  ed in has alread
b130: 79 20 62 65 65 6e 20 70 72 65 70 72 6f 63 65 73  y been preproces
b140: 73 65 64 20 61 6e 64 20 6e 6f 0a 2a 2a 20 65 72  sed and no.** er
b150: 72 6f 72 73 20 68 61 76 65 20 62 65 65 6e 20 66  rors have been f
b160: 6f 75 6e 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ound..*/.#ifndef
b170: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
b180: 51 55 45 52 59 0a 73 74 61 74 69 63 20 69 6e 74  QUERY.static int
b190: 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
b1a0: 6e 4f 70 74 28 53 65 6c 65 63 74 20 2a 70 29 7b  nOpt(Select *p){
b1b0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
b1c0: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
b1d0: 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70  List;.  Table *p
b1e0: 54 61 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  Tab;.  if( p==0 
b1f0: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
b200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b210: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
b220: 20 6f 66 20 49 4e 20 69 73 20 53 45 4c 45 43 54   of IN is SELECT
b230: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   */.  if( p->pPr
b240: 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ior ) return 0; 
b250: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b260: 4e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53  Not a compound S
b270: 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70  ELECT */.  if( p
b280: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
b290: 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
b2a0: 72 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74  regate) ){.    t
b2b0: 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c  estcase( (p->sel
b2c0: 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
b2d0: 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
b2e0: 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74  e))==SF_Distinct
b2f0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
b300: 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
b310: 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
b320: 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
b330: 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20  _Aggregate );.  
b340: 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e    return 0; /* N
b350: 6f 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  o DISTINCT keywo
b360: 72 64 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67  rd and no aggreg
b370: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
b380: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
b390: 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b  ->pGroupBy==0 );
b3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b3b0: 20 48 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59   Has no GROUP BY
b3c0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28   clause */.  if(
b3d0: 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74   p->pLimit ) ret
b3e0: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
b3f0: 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49      /* Has no LI
b400: 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  MIT clause */.  
b410: 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73  assert( p->pOffs
b420: 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20  et==0 );        
b430: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d         /* No LIM
b440: 49 54 20 6d 65 61 6e 73 20 6e 6f 20 4f 46 46 53  IT means no OFFS
b450: 45 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  ET */.  if( p->p
b460: 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30  Where ) return 0
b470: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
b480: 2a 20 48 61 73 20 6e 6f 20 57 48 45 52 45 20 63  * Has no WHERE c
b490: 6c 61 75 73 65 20 2a 2f 0a 20 20 70 53 72 63 20  lause */.  pSrc 
b4a0: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  = p->pSrc;.  ass
b4b0: 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a  ert( pSrc!=0 );.
b4c0: 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63    if( pSrc->nSrc
b4d0: 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  !=1 ) return 0; 
b4e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67           /* Sing
b4f0: 6c 65 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20  le term in FROM 
b500: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20  clause */.  if( 
b510: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
b520: 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ct ) return 0;  
b530: 20 20 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f     /* FROM is no
b540: 74 20 61 20 73 75 62 71 75 65 72 79 20 6f 72 20  t a subquery or 
b550: 76 69 65 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d  view */.  pTab =
b560: 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62   pSrc->a[0].pTab
b570: 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 54  ;.  if( NEVER(pT
b580: 61 62 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20  ab==0) ) return 
b590: 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  0;.  assert( pTa
b5a0: 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b  b->pSelect==0 );
b5b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
b5c0: 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f  ROM clause is no
b5d0: 74 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66  t a view */.  if
b5e0: 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
b5f0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  ) ) return 0;   
b600: 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
b610: 75 73 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61  use not a virtua
b620: 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c  l table */.  pEL
b630: 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
b640: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e  .  if( pEList->n
b650: 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e  Expr!=1 ) return
b660: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65   0;       /* One
b670: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72   column in the r
b680: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69  esult set */.  i
b690: 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  f( pEList->a[0].
b6a0: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pExpr->op!=TK_CO
b6b0: 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  LUMN ) return 0;
b6c0: 20 2f 2a 20 52 65 73 75 6c 74 20 69 73 20 61 20   /* Result is a 
b6d0: 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 72 65 74 75  column */.  retu
b6e0: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
b6f0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
b700: 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  BQUERY */../*.**
b710: 20 43 6f 64 65 20 61 6e 20 4f 50 5f 4f 6e 63 65   Code an OP_Once
b720: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64   instruction and
b730: 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
b740: 66 6f 72 20 69 74 73 20 66 6c 61 67 2e 20 52 65  for its flag. Re
b750: 74 75 72 6e 20 74 68 65 20 0a 2a 2a 20 61 64 64  turn the .** add
b760: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20  ress of the new 
b770: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
b780: 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65 4f  int sqlite3CodeO
b790: 6e 63 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nce(Parse *pPars
b7a0: 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  e){.  Vdbe *v = 
b7b0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
b7c0: 50 61 72 73 65 29 3b 20 20 20 20 20 20 2f 2a 20  Parse);      /* 
b7d0: 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  Virtual machine 
b7e0: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
b7f0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
b800: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
b810: 4f 6e 63 65 2c 20 70 50 61 72 73 65 2d 3e 6e 4f  Once, pParse->nO
b820: 6e 63 65 2b 2b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nce++);.}../*.**
b830: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
b840: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 69 6d  s used by the im
b850: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
b860: 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65  the IN (...) ope
b870: 72 61 74 6f 72 2e 0a 2a 2a 20 54 68 65 20 70 58  rator..** The pX
b880: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
b890: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 6e 20  e expression on 
b8a0: 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
b8b0: 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 68 69 63  N operator, whic
b8c0: 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 65 69  h.** might be ei
b8d0: 74 68 65 72 20 61 20 6c 69 73 74 20 6f 66 20 65  ther a list of e
b8e0: 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20 61 20  xpressions or a 
b8f0: 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  subquery..**.** 
b900: 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
b910: 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 66 69  routine is to fi
b920: 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61 20 62  nd or create a b
b930: 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61  -tree object tha
b940: 74 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64  t can.** be used
b950: 20 65 69 74 68 65 72 20 74 6f 20 74 65 73 74 20   either to test 
b960: 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 69  for membership i
b970: 6e 20 74 68 65 20 52 48 53 20 73 65 74 20 6f 72  n the RHS set or
b980: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
b990: 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65  ugh.** all membe
b9a0: 72 73 20 6f 66 20 74 68 65 20 52 48 53 20 73 65  rs of the RHS se
b9b0: 74 2c 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c  t, skipping dupl
b9c0: 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20  icates..**.** A 
b9d0: 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 65 64  cursor is opened
b9e0: 20 6f 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6f   on the b-tree o
b9f0: 62 6a 65 63 74 20 74 68 61 74 20 74 68 65 20 52  bject that the R
ba00: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
ba10: 72 61 74 6f 72 0a 2a 2a 20 61 6e 64 20 70 58 2d  rator.** and pX-
ba20: 3e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74  >iTable is set t
ba30: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
ba40: 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  hat cursor..**.*
ba50: 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
ba60: 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e  alue of this fun
ba70: 63 74 69 6f 6e 20 69 6e 64 69 63 61 74 65 73 20  ction indicates 
ba80: 74 68 65 20 62 2d 74 72 65 65 20 74 79 70 65 2c  the b-tree type,
ba90: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
baa0: 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f  **   IN_INDEX_RO
bab0: 57 49 44 20 20 20 20 20 20 2d 20 54 68 65 20 63  WID      - The c
bac0: 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  ursor was opened
bad0: 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74   on a database t
bae0: 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e  able..**   IN_IN
baf0: 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 20 2d  DEX_INDEX_ASC  -
bb00: 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20   The cursor was 
bb10: 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 61 73 63  opened on an asc
bb20: 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a  ending index..**
bb30: 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45     IN_INDEX_INDE
bb40: 58 5f 44 45 53 43 20 2d 20 54 68 65 20 63 75 72  X_DESC - The cur
bb50: 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
bb60: 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69  n a descending i
bb70: 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e  ndex..**   IN_IN
bb80: 44 45 58 5f 45 50 48 20 20 20 20 20 20 20 20 2d  DEX_EPH        -
bb90: 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20   The cursor was 
bba0: 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63  opened on a spec
bbb0: 69 61 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e  ially created an
bbc0: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
bbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 70               pop
bbe0: 75 6c 61 74 65 64 20 65 70 68 65 72 65 6d 61 6c  ulated epheremal
bbf0: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e   table..**.** An
bc00: 20 65 78 69 73 74 69 6e 67 20 62 2d 74 72 65 65   existing b-tree
bc10: 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 20 69   might be used i
bc20: 66 20 74 68 65 20 52 48 53 20 65 78 70 72 65 73  f the RHS expres
bc30: 73 69 6f 6e 20 70 58 20 69 73 20 61 20 73 69 6d  sion pX is a sim
bc40: 70 6c 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  ple.** subquery 
bc50: 73 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20  such as:.**.**  
bc60: 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d     SELECT <colum
bc70: 6e 3e 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a  n> FROM <table>.
bc80: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52 48 53  **.** If the RHS
bc90: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
bca0: 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20 6f 72  tor is a list or
bcb0: 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20   a more complex 
bcc0: 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a  subquery, then.*
bcd0: 2a 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  * an ephemeral t
bce0: 61 62 6c 65 20 6d 69 67 68 74 20 6e 65 65 64 20  able might need 
bcf0: 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 20  to be generated 
bd00: 66 72 6f 6d 20 74 68 65 20 52 48 53 20 61 6e 64  from the RHS and
bd10: 20 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61   then.** pX->iTa
bd20: 62 6c 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e  ble made to poin
bd30: 74 20 74 6f 20 74 68 65 20 65 70 68 65 72 6d 65  t to the epherme
bd40: 72 61 6c 20 74 61 62 6c 65 20 69 6e 73 74 65 61  ral table instea
bd50: 64 20 6f 66 20 61 6e 0a 2a 2a 20 65 78 69 73 74  d of an.** exist
bd60: 69 6e 67 20 74 61 62 6c 65 2e 20 20 0a 2a 2a 0a  ing table.  .**.
bd70: 2a 2a 20 49 66 20 74 68 65 20 70 72 4e 6f 74 46  ** If the prNotF
bd80: 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  ound parameter i
bd90: 73 20 30 2c 20 74 68 65 6e 20 74 68 65 20 62 2d  s 0, then the b-
bda0: 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65  tree will be use
bdb0: 64 20 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20  d to iterate.** 
bdc0: 74 68 72 6f 75 67 68 20 74 68 65 20 73 65 74 20  through the set 
bdd0: 6d 65 6d 62 65 72 73 2c 20 73 6b 69 70 70 69 6e  members, skippin
bde0: 67 20 61 6e 79 20 64 75 70 6c 69 63 61 74 65 73  g any duplicates
bdf0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
be00: 6e 0a 2a 2a 20 65 70 68 65 72 65 6d 61 6c 20 74  n.** epheremal t
be10: 61 62 6c 65 20 6d 75 73 74 20 62 65 20 75 73 65  able must be use
be20: 64 20 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c  d unless the sel
be30: 65 63 74 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69  ected <column> i
be40: 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20  s guaranteed.** 
be50: 74 6f 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65  to be unique - e
be60: 69 74 68 65 72 20 62 65 63 61 75 73 65 20 69 74  ither because it
be70: 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50   is an INTEGER P
be80: 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 69 74  RIMARY KEY or it
be90: 0a 2a 2a 20 68 61 73 20 61 20 55 4e 49 51 55 45  .** has a UNIQUE
bea0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20 55   constraint or U
beb0: 4e 49 51 55 45 20 69 6e 64 65 78 2e 0a 2a 2a 0a  NIQUE index..**.
bec0: 2a 2a 20 49 66 20 74 68 65 20 70 72 4e 6f 74 46  ** If the prNotF
bed0: 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  ound parameter i
bee0: 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 74 68  s not 0, then th
bef0: 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65  e b-tree will be
bf00: 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61   used .** for fa
bf10: 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69  st set membershi
bf20: 70 20 74 65 73 74 73 2e 20 49 6e 20 74 68 69 73  p tests. In this
bf30: 20 63 61 73 65 20 61 6e 20 65 70 68 65 72 65 6d   case an epherem
bf40: 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a  al table must .*
bf50: 2a 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73  * be used unless
bf60: 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 61 6e 20   <column> is an 
bf70: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
bf80: 4b 45 59 20 6f 72 20 61 6e 20 69 6e 64 65 78 20  KEY or an index 
bf90: 63 61 6e 20 0a 2a 2a 20 62 65 20 66 6f 75 6e 64  can .** be found
bfa0: 20 77 69 74 68 20 3c 63 6f 6c 75 6d 6e 3e 20 61   with <column> a
bfb0: 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74 20  s its left-most 
bfc0: 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68  column..**.** Wh
bfd0: 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 69 73  en the b-tree is
bfe0: 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20   being used for 
bff0: 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73  membership tests
c000: 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  , the calling fu
c010: 6e 63 74 69 6f 6e 0a 2a 2a 20 6e 65 65 64 73 20  nction.** needs 
c020: 74 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20  to know whether 
c030: 6f 72 20 6e 6f 74 20 74 68 65 20 73 74 72 75 63  or not the struc
c040: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e  ture contains an
c050: 20 53 51 4c 20 4e 55 4c 4c 20 0a 2a 2a 20 76 61   SQL NULL .** va
c060: 6c 75 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  lue in order to 
c070: 63 6f 72 72 65 63 74 6c 79 20 65 76 61 6c 75 61  correctly evalua
c080: 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c  te expressions l
c090: 69 6b 65 20 22 58 20 49 4e 20 28 59 2c 20 5a 29  ike "X IN (Y, Z)
c0a0: 22 2e 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69  "..** If there i
c0b0: 73 20 61 6e 79 20 63 68 61 6e 63 65 20 74 68 61  s any chance tha
c0c0: 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68  t the (...) migh
c0d0: 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c  t contain a NULL
c0e0: 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e   value at.** run
c0f0: 74 69 6d 65 2c 20 74 68 65 6e 20 61 20 72 65 67  time, then a reg
c100: 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74  ister is allocat
c110: 65 64 20 61 6e 64 20 74 68 65 20 72 65 67 69 73  ed and the regis
c120: 74 65 72 20 6e 75 6d 62 65 72 20 77 72 69 74 74  ter number writt
c130: 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 4e 6f 74 46  en.** to *prNotF
c140: 6f 75 6e 64 2e 20 49 66 20 74 68 65 72 65 20 69  ound. If there i
c150: 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74  s no chance that
c160: 20 74 68 65 20 28 2e 2e 2e 29 20 63 6f 6e 74 61   the (...) conta
c170: 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61  ins a.** NULL va
c180: 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72 4e 6f 74  lue, then *prNot
c190: 46 6f 75 6e 64 20 69 73 20 6c 65 66 74 20 75 6e  Found is left un
c1a0: 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  changed..**.** I
c1b0: 66 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20  f a register is 
c1c0: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 74  allocated and it
c1d0: 73 20 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65  s location store
c1e0: 64 20 69 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64  d in *prNotFound
c1f0: 2c 20 74 68 65 6e 0a 2a 2a 20 69 74 73 20 69 6e  , then.** its in
c200: 69 74 69 61 6c 20 76 61 6c 75 65 20 69 73 20 4e  itial value is N
c210: 55 4c 4c 2e 20 20 49 66 20 74 68 65 20 28 2e 2e  ULL.  If the (..
c220: 2e 29 20 64 6f 65 73 20 6e 6f 74 20 72 65 6d 61  .) does not rema
c230: 69 6e 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66  in constant.** f
c240: 6f 72 20 74 68 65 20 64 75 72 61 74 69 6f 6e 20  or the duration 
c250: 6f 66 20 74 68 65 20 71 75 65 72 79 20 28 69 2e  of the query (i.
c260: 65 2e 20 74 68 65 20 53 45 4c 45 43 54 20 77 69  e. the SELECT wi
c270: 74 68 69 6e 20 74 68 65 20 28 2e 2e 2e 29 0a 2a  thin the (...).*
c280: 2a 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65  * is a correlate
c290: 64 20 73 75 62 71 75 65 72 79 29 20 74 68 65 6e  d subquery) then
c2a0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
c2b0: 65 20 61 6c 6c 6f 63 61 74 65 64 20 72 65 67 69  e allocated regi
c2c0: 73 74 65 72 20 69 73 0a 2a 2a 20 72 65 73 65 74  ster is.** reset
c2d0: 20 74 6f 20 4e 55 4c 4c 20 65 61 63 68 20 74 69   to NULL each ti
c2e0: 6d 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  me the subquery 
c2f0: 69 73 20 72 65 72 75 6e 2e 20 54 68 69 73 20 61  is rerun. This a
c300: 6c 6c 6f 77 73 20 74 68 65 0a 2a 2a 20 63 61 6c  llows the.** cal
c310: 6c 65 72 20 74 6f 20 75 73 65 20 76 64 62 65 20  ler to use vdbe 
c320: 63 6f 64 65 20 65 71 75 69 76 61 6c 65 6e 74 20  code equivalent 
c330: 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
c340: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 72 65  :.**.**   if( re
c350: 67 69 73 74 65 72 3d 3d 4e 55 4c 4c 20 29 7b 0a  gister==NULL ){.
c360: 2a 2a 20 20 20 20 20 68 61 73 5f 6e 75 6c 6c 20  **     has_null 
c370: 3d 20 3c 74 65 73 74 20 69 66 20 64 61 74 61 20  = <test if data 
c380: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
c390: 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a 20 20 20 20 20  ns null>.**     
c3a0: 72 65 67 69 73 74 65 72 20 3d 20 31 0a 2a 2a 20  register = 1.** 
c3b0: 20 20 7d 0a 2a 2a 0a 2a 2a 20 69 6e 20 6f 72 64    }.**.** in ord
c3c0: 65 72 20 74 6f 20 61 76 6f 69 64 20 72 75 6e 6e  er to avoid runn
c3d0: 69 6e 67 20 74 68 65 20 3c 74 65 73 74 20 69 66  ing the <test if
c3e0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
c3f0: 63 6f 6e 74 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a  contains null>.*
c400: 2a 20 74 65 73 74 20 6d 6f 72 65 20 6f 66 74 65  * test more ofte
c410: 6e 20 74 68 61 6e 20 69 73 20 6e 65 63 65 73 73  n than is necess
c420: 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ary..*/.#ifndef 
c430: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
c440: 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33  UERY.int sqlite3
c450: 46 69 6e 64 49 6e 49 6e 64 65 78 28 50 61 72 73  FindInIndex(Pars
c460: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
c470: 2a 70 58 2c 20 69 6e 74 20 2a 70 72 4e 6f 74 46  *pX, int *prNotF
c480: 6f 75 6e 64 29 7b 0a 20 20 53 65 6c 65 63 74 20  ound){.  Select 
c490: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
c4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c4b0: 2a 20 53 45 4c 45 43 54 20 74 6f 20 74 68 65 20  * SELECT to the 
c4c0: 72 69 67 68 74 20 6f 66 20 49 4e 20 6f 70 65 72  right of IN oper
c4d0: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54  ator */.  int eT
c4e0: 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ype = 0;        
c4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c500: 2f 2a 20 54 79 70 65 20 6f 66 20 52 48 53 20 74  /* Type of RHS t
c510: 61 62 6c 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a  able. IN_INDEX_*
c520: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   */.  int iTab =
c530: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
c540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
c550: 75 72 73 6f 72 20 6f 66 20 74 68 65 20 52 48 53  ursor of the RHS
c560: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
c570: 6d 75 73 74 42 65 55 6e 69 71 75 65 20 3d 20 28  mustBeUnique = (
c580: 70 72 4e 6f 74 46 6f 75 6e 64 3d 3d 30 29 3b 20  prNotFound==0); 
c590: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 52 48 53    /* True if RHS
c5a0: 20 6d 75 73 74 20 62 65 20 75 6e 69 71 75 65 20   must be unique 
c5b0: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  */.  Vdbe *v = s
c5c0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
c5d0: 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 56 69  arse);     /* Vi
c5e0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65  rtual machine be
c5f0: 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 0a 20 20  ing coded */..  
c600: 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d  assert( pX->op==
c610: 54 4b 5f 49 4e 20 29 3b 0a 0a 20 20 2f 2a 20 43  TK_IN );..  /* C
c620: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61  heck to see if a
c630: 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65  n existing table
c640: 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 62 65   or index can be
c650: 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61   used to.  ** sa
c660: 74 69 73 66 79 20 74 68 65 20 71 75 65 72 79 2e  tisfy the query.
c670: 20 20 54 68 69 73 20 69 73 20 70 72 65 66 65 72    This is prefer
c680: 61 62 6c 65 20 74 6f 20 67 65 6e 65 72 61 74 69  able to generati
c690: 6e 67 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65  ng a new .  ** e
c6a0: 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 0a  phemeral table..
c6b0: 20 20 2a 2f 0a 20 20 70 20 3d 20 28 45 78 70 72    */.  p = (Expr
c6c0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20  HasProperty(pX, 
c6d0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 3f 20  EP_xIsSelect) ? 
c6e0: 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3a 20  pX->x.pSelect : 
c6f0: 30 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  0);.  if( ALWAYS
c700: 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30  (pParse->nErr==0
c710: 29 20 26 26 20 69 73 43 61 6e 64 69 64 61 74 65  ) && isCandidate
c720: 46 6f 72 49 6e 4f 70 74 28 70 29 20 29 7b 0a 20  ForInOpt(p) ){. 
c730: 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
c740: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
c750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
c760: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
c770: 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   */.    Table *p
c780: 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
c790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c7a0: 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e  * Table <table>.
c7b0: 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 45   */.    Expr *pE
c7c0: 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  xpr;            
c7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c7e0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 3c 63 6f  * Expression <co
c7f0: 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20 69 6e 74  lumn> */.    int
c800: 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   iCol;          
c810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c820: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
c830: 63 6f 6c 75 6d 6e 20 3c 63 6f 6c 75 6d 6e 3e 20  column <column> 
c840: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20  */.    int iDb; 
c850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c870: 20 44 61 74 61 62 61 73 65 20 69 64 78 20 66 6f   Database idx fo
c880: 72 20 70 54 61 62 20 2a 2f 0a 0a 20 20 20 20 61  r pTab */..    a
c890: 73 73 65 72 74 28 20 70 20 29 3b 20 20 20 20 20  ssert( p );     
c8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8b0: 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66     /* Because of
c8c0: 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
c8d0: 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61  nOpt(p) */.    a
c8e0: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
c8f0: 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  !=0 );          
c900: 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66     /* Because of
c910: 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
c920: 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61  nOpt(p) */.    a
c930: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
c940: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20  ->a[0].pExpr!=0 
c950: 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66  ); /* Because of
c960: 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
c970: 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61  nOpt(p) */.    a
c980: 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63 21 3d  ssert( p->pSrc!=
c990: 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0 );            
c9a0: 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66     /* Because of
c9b0: 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
c9c0: 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 70  nOpt(p) */.    p
c9d0: 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Tab = p->pSrc->a
c9e0: 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 20 20 70 45  [0].pTab;.    pE
c9f0: 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
ca00: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
ca10: 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69   iCol = pExpr->i
ca20: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 0a 20 20 20 20  Column;.   .    
ca30: 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 56 65  /* Code an OP_Ve
ca40: 72 69 66 79 43 6f 6f 6b 69 65 20 61 6e 64 20 4f  rifyCookie and O
ca50: 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20  P_TableLock for 
ca60: 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20  <table>. */.    
ca70: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
ca80: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
ca90: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
caa0: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
cab0: 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
cac0: 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  e, iDb);.    sql
cad0: 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
cae0: 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
caf0: 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
cb00: 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20  zName);..    /* 
cb10: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
cb20: 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f   only called fro
cb30: 6d 20 74 77 6f 20 70 6c 61 63 65 73 2e 20 49 6e  m two places. In
cb40: 20 62 6f 74 68 20 63 61 73 65 73 20 74 68 65 20   both cases the 
cb50: 76 64 62 65 0a 20 20 20 20 2a 2a 20 68 61 73 20  vdbe.    ** has 
cb60: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
cb70: 6f 63 61 74 65 64 2e 20 53 6f 20 61 73 73 75 6d  ocated. So assum
cb80: 65 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  e sqlite3GetVdbe
cb90: 28 29 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20  () is always.   
cba0: 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 68   ** successful h
cbb0: 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ere..    */.    
cbc0: 61 73 73 65 72 74 28 76 29 3b 0a 20 20 20 20 69  assert(v);.    i
cbd0: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
cbe0: 20 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 0a 20     int iAddr;.. 
cbf0: 20 20 20 20 20 69 41 64 64 72 20 3d 20 73 71 6c       iAddr = sql
cc00: 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61  ite3CodeOnce(pPa
cc10: 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  rse);..      sql
cc20: 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
cc30: 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c  arse, iTab, iDb,
cc40: 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65   pTab, OP_OpenRe
cc50: 61 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65  ad);.      eType
cc60: 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49   = IN_INDEX_ROWI
cc70: 44 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  D;..      sqlite
cc80: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
cc90: 20 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c   iAddr);.    }el
cca0: 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  se{.      Index 
ccb0: 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
ccc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ccd0: 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
cce0: 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ble */..      /*
ccf0: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   The collation s
cd00: 65 71 75 65 6e 63 65 20 75 73 65 64 20 62 79 20  equence used by 
cd10: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20  the comparison. 
cd20: 49 66 20 61 6e 20 69 6e 64 65 78 20 69 73 20 74  If an index is t
cd30: 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 75 73  o.      ** be us
cd40: 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61  ed in place of a
cd50: 20 74 65 6d 70 2d 74 61 62 6c 65 2c 20 69 74 20   temp-table, it 
cd60: 6d 75 73 74 20 62 65 20 6f 72 64 65 72 65 64 20  must be ordered 
cd70: 61 63 63 6f 72 64 69 6e 67 0a 20 20 20 20 20 20  according.      
cd80: 2a 2a 20 74 6f 20 74 68 69 73 20 63 6f 6c 6c 61  ** to this colla
cd90: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20 20  tion sequence.  
cda0: 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  */.      CollSeq
cdb0: 20 2a 70 52 65 71 20 3d 20 73 71 6c 69 74 65 33   *pReq = sqlite3
cdc0: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
cdd0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d  lSeq(pParse, pX-
cde0: 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a  >pLeft, pExpr);.
cdf0: 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
ce00: 74 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74  that the affinit
ce10: 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75  y that will be u
ce20: 73 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 74  sed to perform t
ce30: 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d  he .      ** com
ce40: 70 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73  parison is the s
ce50: 61 6d 65 20 61 73 20 74 68 65 20 61 66 66 69 6e  ame as the affin
ce60: 69 74 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ity of the colum
ce70: 6e 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 69  n. If.      ** i
ce80: 74 20 69 73 20 6e 6f 74 2c 20 69 74 20 69 73 20  t is not, it is 
ce90: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
cea0: 75 73 65 20 61 6e 79 20 69 6e 64 65 78 2e 0a 20  use any index.. 
ceb0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
cec0: 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20  t affinity_ok = 
ced0: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
cee0: 6e 69 74 79 4f 6b 28 70 58 2c 20 70 54 61 62 2d  nityOk(pX, pTab-
cef0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69  >aCol[iCol].affi
cf00: 6e 69 74 79 29 3b 0a 0a 20 20 20 20 20 20 66 6f  nity);..      fo
cf10: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
cf20: 64 65 78 3b 20 70 49 64 78 20 26 26 20 65 54 79  dex; pIdx && eTy
cf30: 70 65 3d 3d 30 20 26 26 20 61 66 66 69 6e 69 74  pe==0 && affinit
cf40: 79 5f 6f 6b 3b 20 70 49 64 78 3d 70 49 64 78 2d  y_ok; pIdx=pIdx-
cf50: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
cf60: 20 69 66 28 20 28 70 49 64 78 2d 3e 61 69 43 6f   if( (pIdx->aiCo
cf70: 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29 0a 20  lumn[0]==iCol). 
cf80: 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
cf90: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
cfa0: 2c 20 45 4e 43 28 64 62 29 2c 20 70 49 64 78 2d  , ENC(db), pIdx-
cfb0: 3e 61 7a 43 6f 6c 6c 5b 30 5d 2c 20 30 29 3d 3d  >azColl[0], 0)==
cfc0: 70 52 65 71 0a 20 20 20 20 20 20 20 20 20 26 26  pReq.         &&
cfd0: 20 28 21 6d 75 73 74 42 65 55 6e 69 71 75 65 20   (!mustBeUnique 
cfe0: 7c 7c 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  || (pIdx->nColum
cff0: 6e 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e 6f 6e  n==1 && pIdx->on
d000: 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 29 29  Error!=OE_None))
d010: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
d020: 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 3b        int iAddr;
d030: 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
d040: 2a 70 4b 65 79 3b 0a 20 20 0a 20 20 20 20 20 20  *pKey;.  .      
d050: 20 20 20 20 70 4b 65 79 20 3d 20 28 63 68 61 72      pKey = (char
d060: 20 2a 29 73 71 6c 69 74 65 33 49 6e 64 65 78 4b   *)sqlite3IndexK
d070: 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyinfo(pParse, p
d080: 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Idx);.          
d090: 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43  iAddr = sqlite3C
d0a0: 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b  odeOnce(pParse);
d0b0: 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 73 71  .  .          sq
d0c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
d0d0: 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
d0e0: 69 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  iTab, pIdx->tnum
d0f0: 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20  , iDb,.         
d100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d110: 20 20 20 20 20 20 70 4b 65 79 2c 50 34 5f 4b 45        pKey,P4_KE
d120: 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
d130: 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
d140: 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
d150: 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pIdx->zName));. 
d160: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
d170: 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f   IN_INDEX_INDEX_
d180: 44 45 53 43 20 3d 3d 20 49 4e 5f 49 4e 44 45 58  DESC == IN_INDEX
d190: 5f 49 4e 44 45 58 5f 41 53 43 2b 31 20 29 3b 0a  _INDEX_ASC+1 );.
d1a0: 20 20 20 20 20 20 20 20 20 20 65 54 79 70 65 20            eType 
d1b0: 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  = IN_INDEX_INDEX
d1c0: 5f 41 53 43 20 2b 20 70 49 64 78 2d 3e 61 53 6f  _ASC + pIdx->aSo
d1d0: 72 74 4f 72 64 65 72 5b 30 5d 3b 0a 0a 20 20 20  rtOrder[0];..   
d1e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d1f0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41  beJumpHere(v, iA
d200: 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ddr);.          
d210: 69 66 28 20 70 72 4e 6f 74 46 6f 75 6e 64 20 26  if( prNotFound &
d220: 26 20 21 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  & !pTab->aCol[iC
d230: 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 7b 0a 20  ol].notNull ){. 
d240: 20 20 20 20 20 20 20 20 20 20 20 2a 70 72 4e 6f             *prNo
d250: 74 46 6f 75 6e 64 20 3d 20 2b 2b 70 50 61 72 73  tFound = ++pPars
d260: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
d270: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d280: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
d290: 6c 2c 20 30 2c 20 2a 70 72 4e 6f 74 46 6f 75 6e  l, 0, *prNotFoun
d2a0: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  d);.          }.
d2b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d2c0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
d2d0: 66 28 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20  f( eType==0 ){. 
d2e0: 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74 20     /* Could not 
d2f0: 66 6f 75 6e 64 20 61 6e 20 65 78 69 73 74 69 6e  found an existin
d300: 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  g table or index
d310: 20 74 6f 20 75 73 65 20 61 73 20 74 68 65 20 52   to use as the R
d320: 48 53 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a  HS b-tree..    *
d330: 2a 20 57 65 20 77 69 6c 6c 20 68 61 76 65 20 74  * We will have t
d340: 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65 70  o generate an ep
d350: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f  hemeral table to
d360: 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20 20   do the job..   
d370: 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 73   */.    double s
d380: 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d  avedNQueryLoop =
d390: 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
d3a0: 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 72 4d 61  oop;.    int rMa
d3b0: 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20  yHaveNull = 0;. 
d3c0: 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
d3d0: 44 45 58 5f 45 50 48 3b 0a 20 20 20 20 69 66 28  DEX_EPH;.    if(
d3e0: 20 70 72 4e 6f 74 46 6f 75 6e 64 20 29 7b 0a 20   prNotFound ){. 
d3f0: 20 20 20 20 20 2a 70 72 4e 6f 74 46 6f 75 6e 64       *prNotFound
d400: 20 3d 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20   = rMayHaveNull 
d410: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
d420: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d430: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d440: 4e 75 6c 6c 2c 20 30 2c 20 2a 70 72 4e 6f 74 46  Null, 0, *prNotF
d450: 6f 75 6e 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ound);.    }else
d460: 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
d470: 28 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79  ( pParse->nQuery
d480: 4c 6f 6f 70 3e 28 64 6f 75 62 6c 65 29 31 20 29  Loop>(double)1 )
d490: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
d4a0: 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 28 64 6f  nQueryLoop = (do
d4b0: 75 62 6c 65 29 31 3b 0a 20 20 20 20 20 20 69 66  uble)1;.      if
d4c0: 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f  ( pX->pLeft->iCo
d4d0: 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78 70 72 48  lumn<0 && !ExprH
d4e0: 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 58  asAnyProperty(pX
d4f0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
d500: 29 7b 0a 20 20 20 20 20 20 20 20 65 54 79 70 65  ){.        eType
d510: 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49   = IN_INDEX_ROWI
d520: 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  D;.      }.    }
d530: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
d540: 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
d550: 2c 20 70 58 2c 20 72 4d 61 79 48 61 76 65 4e 75  , pX, rMayHaveNu
d560: 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e  ll, eType==IN_IN
d570: 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20 20 20 20  DEX_ROWID);.    
d580: 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
d590: 6f 70 20 3d 20 73 61 76 65 64 4e 51 75 65 72 79  op = savedNQuery
d5a0: 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Loop;.  }else{. 
d5b0: 20 20 20 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20     pX->iTable = 
d5c0: 69 54 61 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75  iTab;.  }.  retu
d5d0: 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64  rn eType;.}.#end
d5e0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  if../*.** Genera
d5f0: 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c  te code for scal
d600: 61 72 20 73 75 62 71 75 65 72 69 65 73 20 75 73  ar subqueries us
d610: 65 64 20 61 73 20 61 20 73 75 62 71 75 65 72 79  ed as a subquery
d620: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 45 58 49   expression, EXI
d630: 53 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70  STS,.** or IN op
d640: 65 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c  erators.  Exampl
d650: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53  es:.**.**     (S
d660: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20  ELECT a FROM b) 
d670: 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71           -- subq
d680: 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53  uery.**     EXIS
d690: 54 53 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f  TS (SELECT a FRO
d6a0: 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53  M b)   -- EXISTS
d6b0: 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20   subquery.**    
d6c0: 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20   x IN (4,5,11)  
d6d0: 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49              -- I
d6e0: 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
d6f0: 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61  list on right-ha
d700: 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78  nd side.**     x
d710: 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52   IN (SELECT a FR
d720: 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20  OM b)     -- IN 
d730: 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 73 75  operator with su
d740: 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69  bquery on the ri
d750: 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45  ght.**.** The pE
d760: 78 70 72 20 70 61 72 61 6d 65 74 65 72 20 64 65  xpr parameter de
d770: 73 63 72 69 62 65 73 20 74 68 65 20 65 78 70 72  scribes the expr
d780: 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74  ession that cont
d790: 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f  ains the IN.** o
d7a0: 70 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71 75  perator or subqu
d7b0: 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  ery..**.** If pa
d7c0: 72 61 6d 65 74 65 72 20 69 73 52 6f 77 69 64 20  rameter isRowid 
d7d0: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
d7e0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  n expression pEx
d7f0: 70 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  pr is guaranteed
d800: 0a 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74 68 65  .** to be of the
d810: 20 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49   form "<rowid> I
d820: 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68  N (?, ?, ?)", wh
d830: 65 72 65 20 3c 72 6f 77 69 64 3e 20 69 73 20 61  ere <rowid> is a
d840: 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f   reference.** to
d850: 20 73 6f 6d 65 20 69 6e 74 65 67 65 72 20 6b 65   some integer ke
d860: 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61  y column of a ta
d870: 62 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e 20 74  ble B-Tree. In t
d880: 68 69 73 20 63 61 73 65 2c 20 75 73 65 20 61 6e  his case, use an
d890: 0a 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54 72 65  .** intkey B-Tre
d8a0: 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73  e to store the s
d8b0: 65 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61  et of IN(...) va
d8c0: 6c 75 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20  lues instead of 
d8d0: 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c  the usual.** (sl
d8e0: 6f 77 65 72 29 20 76 61 72 69 61 62 6c 65 20 6c  ower) variable l
d8f0: 65 6e 67 74 68 20 6b 65 79 73 20 42 2d 54 72 65  ength keys B-Tre
d900: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79  e..**.** If rMay
d910: 48 61 76 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d  HaveNull is non-
d920: 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73  zero, that means
d930: 20 74 68 61 74 20 74 68 65 20 6f 70 65 72 61 74   that the operat
d940: 69 6f 6e 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20  ion is an IN.** 
d950: 28 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 6f 72  (not a SELECT or
d960: 20 45 58 49 53 54 53 29 20 61 6e 64 20 74 68 61   EXISTS) and tha
d970: 74 20 74 68 65 20 52 48 53 20 6d 69 67 68 74 20  t the RHS might 
d980: 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a  contains NULLs..
d990: 2a 2a 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20  ** Furthermore, 
d9a0: 74 68 65 20 49 4e 20 69 73 20 69 6e 20 61 20 57  the IN is in a W
d9b0: 48 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64 20  HERE clause and 
d9c0: 74 68 61 74 20 77 65 20 72 65 61 6c 6c 79 20 77  that we really w
d9d0: 61 6e 74 0a 2a 2a 20 74 6f 20 69 74 65 72 61 74  ant.** to iterat
d9e0: 65 20 6f 76 65 72 20 74 68 65 20 52 48 53 20 6f  e over the RHS o
d9f0: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
da00: 72 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 71 75  r in order to qu
da10: 69 63 6b 6c 79 20 6c 6f 63 61 74 65 0a 2a 2a 20  ickly locate.** 
da20: 61 6c 6c 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  all correspondin
da30: 67 20 4c 48 53 20 65 6c 65 6d 65 6e 74 73 2e 20  g LHS elements. 
da40: 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e   All this routin
da50: 65 20 64 6f 65 73 20 69 73 20 69 6e 69 74 69 61  e does is initia
da60: 6c 69 7a 65 0a 2a 2a 20 74 68 65 20 72 65 67 69  lize.** the regi
da70: 73 74 65 72 20 67 69 76 65 6e 20 62 79 20 72 4d  ster given by rM
da80: 61 79 48 61 76 65 4e 75 6c 6c 20 74 6f 20 4e 55  ayHaveNull to NU
da90: 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67 20 72 6f 75  LL.  Calling rou
daa0: 74 69 6e 65 73 20 77 69 6c 6c 20 74 61 6b 65 0a  tines will take.
dab0: 2a 2a 20 63 61 72 65 20 6f 66 20 63 68 61 6e 67  ** care of chang
dac0: 69 6e 67 20 74 68 69 73 20 72 65 67 69 73 74 65  ing this registe
dad0: 72 20 76 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e  r value to non-N
dae0: 55 4c 4c 20 69 66 20 74 68 65 20 52 48 53 20 69  ULL if the RHS i
daf0: 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a  s NULL-free..**.
db00: 2a 2a 20 49 66 20 72 4d 61 79 48 61 76 65 4e 75  ** If rMayHaveNu
db10: 6c 6c 20 69 73 20 7a 65 72 6f 2c 20 74 68 61 74  ll is zero, that
db20: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
db30: 73 75 62 71 75 65 72 79 20 69 73 20 62 65 69 6e  subquery is bein
db40: 67 20 75 73 65 64 0a 2a 2a 20 66 6f 72 20 6d 65  g used.** for me
db50: 6d 62 65 72 73 68 69 70 20 74 65 73 74 69 6e 67  mbership testing
db60: 20 6f 6e 6c 79 2e 20 20 54 68 65 72 65 20 69 73   only.  There is
db70: 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e 69 74   no need to init
db80: 69 61 6c 69 7a 65 20 61 6e 79 0a 2a 2a 20 72 65  ialize any.** re
db90: 67 69 73 74 65 72 73 20 74 6f 20 69 6e 64 69 63  gisters to indic
dba0: 61 74 65 20 74 68 65 20 70 72 65 73 65 6e 63 65  ate the presence
dbb0: 20 6f 72 20 61 62 73 65 6e 63 65 20 6f 66 20 4e   or absence of N
dbc0: 55 4c 4c 73 20 6f 6e 20 74 68 65 20 52 48 53 2e  ULLs on the RHS.
dbd0: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 53 45 4c  .**.** For a SEL
dbe0: 45 43 54 20 6f 72 20 45 58 49 53 54 53 20 6f 70  ECT or EXISTS op
dbf0: 65 72 61 74 6f 72 2c 20 72 65 74 75 72 6e 20 74  erator, return t
dc00: 68 65 20 72 65 67 69 73 74 65 72 20 74 68 61 74  he register that
dc10: 20 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 72 65   holds the.** re
dc20: 73 75 6c 74 2e 20 20 46 6f 72 20 49 4e 20 6f 70  sult.  For IN op
dc30: 65 72 61 74 6f 72 73 20 6f 72 20 69 66 20 61 6e  erators or if an
dc40: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
dc50: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
dc60: 69 73 20 30 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  is 0..*/.#ifndef
dc70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
dc80: 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65  QUERY.int sqlite
dc90: 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 0a  3CodeSubselect(.
dca0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
dcb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
dcc0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
dcd0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
dce0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
dcf0: 20 49 4e 2c 20 53 45 4c 45 43 54 2c 20 6f 72 20   IN, SELECT, or 
dd00: 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 20  EXISTS operator 
dd10: 2a 2f 0a 20 20 69 6e 74 20 72 4d 61 79 48 61 76  */.  int rMayHav
dd20: 65 4e 75 6c 6c 2c 20 20 20 20 20 20 20 2f 2a 20  eNull,       /* 
dd30: 52 65 67 69 73 74 65 72 20 74 68 61 74 20 72 65  Register that re
dd40: 63 6f 72 64 73 20 77 68 65 74 68 65 72 20 4e 55  cords whether NU
dd50: 4c 4c 73 20 65 78 69 73 74 20 69 6e 20 52 48 53  LLs exist in RHS
dd60: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 77 69   */.  int isRowi
dd70: 64 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d             /*
dd80: 20 49 66 20 74 72 75 65 2c 20 4c 48 53 20 6f 66   If true, LHS of
dd90: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
dda0: 61 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20  a rowid */.){.  
ddb0: 69 6e 74 20 74 65 73 74 41 64 64 72 20 3d 20 2d  int testAddr = -
ddc0: 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
ddd0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74          /* One-t
dde0: 69 6d 65 20 74 65 73 74 20 61 64 64 72 65 73 73  ime test address
ddf0: 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67 20 3d   */.  int rReg =
de00: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
de20: 20 52 65 67 69 73 74 65 72 20 73 74 6f 72 69 6e   Register storin
de30: 67 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f 0a 20  g resulting */. 
de40: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
de50: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
de60: 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76  );.  if( NEVER(v
de70: 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ==0) ) return 0;
de80: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
de90: 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
dea0: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65  ..  /* This code
deb0: 20 6d 75 73 74 20 62 65 20 72 75 6e 20 69 6e 20   must be run in 
dec0: 69 74 73 20 65 6e 74 69 72 65 74 79 20 65 76 65  its entirety eve
ded0: 72 79 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e  ry time it is en
dee0: 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 69  countered.  ** i
def0: 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  f any of the fol
df00: 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a  lowing is true:.
df10: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20    **.  **    *  
df20: 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
df30: 69 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61  ide is a correla
df40: 74 65 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a  ted subquery.  *
df50: 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68  *    *  The righ
df60: 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61  t-hand side is a
df70: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
df80: 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72  t containing var
df90: 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a  iables.  **    *
dfa0: 20 20 57 65 20 61 72 65 20 69 6e 73 69 64 65 20    We are inside 
dfb0: 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20  a trigger.  **. 
dfc0: 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68   ** If all of th
dfd0: 65 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73  e above are fals
dfe0: 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72  e, then we can r
dff0: 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a 75 73  un this code jus
e000: 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65  t once.  ** save
e010: 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20 61 6e   the results, an
e020: 64 20 72 65 75 73 65 20 74 68 65 20 73 61 6d 65  d reuse the same
e030: 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65   result on subse
e040: 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e  quent invocation
e050: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 45  s..  */.  if( !E
e060: 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
e070: 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53  y(pExpr, EP_VarS
e080: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 74 65  elect) ){.    te
e090: 73 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33  stAddr = sqlite3
e0a0: 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29  CodeOnce(pParse)
e0b0: 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
e0c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
e0d0: 49 4e 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  IN.  if( pParse-
e0e0: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20  >explain==2 ){. 
e0f0: 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20     char *zMsg = 
e100: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 0a  sqlite3MPrintf(.
e110: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
e120: 64 62 2c 20 22 45 58 45 43 55 54 45 20 25 73 25  db, "EXECUTE %s%
e130: 73 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 20  s SUBQUERY %d", 
e140: 74 65 73 74 41 64 64 72 3e 3d 30 3f 22 22 3a 22  testAddr>=0?"":"
e150: 43 4f 52 52 45 4c 41 54 45 44 20 22 2c 0a 20 20  CORRELATED ",.  
e160: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d        pExpr->op=
e170: 3d 54 4b 5f 49 4e 3f 22 4c 49 53 54 22 3a 22 53  =TK_IN?"LIST":"S
e180: 43 41 4c 41 52 22 2c 20 70 50 61 72 73 65 2d 3e  CALAR", pParse->
e190: 69 4e 65 78 74 53 65 6c 65 63 74 49 64 0a 20 20  iNextSelectId.  
e1a0: 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
e1b0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
e1c0: 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65  _Explain, pParse
e1d0: 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20  ->iSelectId, 0, 
e1e0: 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41  0, zMsg, P4_DYNA
e1f0: 4d 49 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  MIC);.  }.#endif
e200: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
e210: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
e220: 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
e230: 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20   char affinity; 
e240: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e250: 41 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20  Affinity of the 
e260: 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 2a 2f  LHS of the IN */
e270: 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 6b  .      KeyInfo k
e280: 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  eyInfo;         
e290: 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f 20 66 6f     /* Keyinfo fo
e2a0: 72 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  r the generated 
e2b0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 73  table */.      s
e2c0: 74 61 74 69 63 20 75 38 20 73 6f 72 74 4f 72 64  tatic u8 sortOrd
e2d0: 65 72 20 3d 20 30 3b 20 20 20 20 2f 2a 20 46 61  er = 0;    /* Fa
e2e0: 6b 65 20 61 53 6f 72 74 4f 72 64 65 72 20 66 6f  ke aSortOrder fo
e2f0: 72 20 6b 65 79 49 6e 66 6f 20 2a 2f 0a 20 20 20  r keyInfo */.   
e300: 20 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20     int addr;    
e310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e320: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f  * Address of OP_
e330: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
e340: 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20  struction */.   
e350: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
e360: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 20 2f   pExpr->pLeft; /
e370: 2a 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65  * the LHS of the
e380: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
e390: 0a 20 20 20 20 20 20 69 66 28 20 72 4d 61 79 48  .      if( rMayH
e3a0: 61 76 65 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  aveNull ){.     
e3b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e3c0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
e3d0: 20 30 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c   0, rMayHaveNull
e3e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
e3f0: 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c    affinity = sql
e400: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
e410: 28 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20 20  (pLeft);..      
e420: 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69 73 20  /* Whether this 
e430: 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c 45  is an 'x IN(SELE
e440: 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78  CT...)' or an 'x
e450: 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29 27   IN(<exprlist>)'
e460: 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73  .      ** expres
e470: 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64 6c  sion it is handl
e480: 65 64 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e  ed the same way.
e490: 20 20 41 6e 20 65 70 68 65 6d 65 72 61 6c 20 74    An ephemeral t
e4a0: 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20 2a  able is .      *
e4b0: 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20 73 69  * filled with si
e4c0: 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65 78  ngle-field index
e4d0: 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74 69   keys representi
e4e0: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20  ng the results. 
e4f0: 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65       ** from the
e500: 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20 3c   SELECT or the <
e510: 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20  exprlist>..     
e520: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
e530: 74 68 65 20 27 78 27 20 65 78 70 72 65 73 73 69  the 'x' expressi
e540: 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76  on is a column v
e550: 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45 4c  alue, or the SEL
e560: 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20  ECT....      ** 
e570: 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e  statement return
e580: 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  s a column value
e590: 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e  , then the affin
e5a0: 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20 20  ity of that.    
e5b0: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75    ** column is u
e5c0: 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65  sed to build the
e5d0: 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20   index keys. If 
e5e0: 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68 65  both 'x' and the
e5f0: 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  .      ** SELECT
e600: 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72  ... statement ar
e610: 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  e columns, then 
e620: 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
e630: 20 69 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a   is used.      *
e640: 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75  * if either colu
e650: 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f  mn has NUMERIC o
e660: 72 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69  r INTEGER affini
e670: 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 20  ty. If neither. 
e680: 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20       ** 'x' nor 
e690: 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74  the SELECT... st
e6a0: 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75  atement are colu
e6b0: 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69  mns, then numeri
e6c0: 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20 20  c affinity.     
e6d0: 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20 20   ** is used..   
e6e0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70     */.      pExp
e6f0: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72  r->iTable = pPar
e700: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
e710: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
e720: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
e730: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
e740: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 21  pExpr->iTable, !
e750: 69 73 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  isRowid);.      
e760: 69 66 28 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c  if( rMayHaveNull
e770: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  ==0 ) sqlite3Vdb
e780: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52  eChangeP5(v, BTR
e790: 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20  EE_UNORDERED);. 
e7a0: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6b 65 79       memset(&key
e7b0: 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Info, 0, sizeof(
e7c0: 6b 65 79 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20  keyInfo));.     
e7d0: 20 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20   keyInfo.nField 
e7e0: 3d 20 31 3b 0a 20 20 20 20 20 20 6b 65 79 49 6e  = 1;.      keyIn
e7f0: 66 6f 2e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  fo.aSortOrder = 
e800: 26 73 6f 72 74 4f 72 64 65 72 3b 0a 0a 20 20 20  &sortOrder;..   
e810: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
e820: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
e830: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
e840: 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31         /* Case 1
e850: 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53  :     expr IN (S
e860: 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20  ELECT ...).     
e870: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
e880: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
e890: 6f 20 77 72 69 74 65 20 74 68 65 20 72 65 73 75  o write the resu
e8a0: 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  lts of the selec
e8b0: 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f  t into the tempo
e8c0: 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  rary.        ** 
e8d0: 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20  table allocated 
e8e0: 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f 76 65  and opened above
e8f0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
e900: 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
e910: 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20 45 78  dest;.        Ex
e920: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
e930: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
e940: 20 21 69 73 52 6f 77 69 64 20 29 3b 0a 20 20 20   !isRowid );.   
e950: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
e960: 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
e970: 2c 20 53 52 54 5f 53 65 74 2c 20 70 45 78 70 72  , SRT_Set, pExpr
e980: 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  ->iTable);.     
e990: 20 20 20 64 65 73 74 2e 61 66 66 53 64 73 74 20     dest.affSdst 
e9a0: 3d 20 28 75 38 29 61 66 66 69 6e 69 74 79 3b 0a  = (u8)affinity;.
e9b0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
e9c0: 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 26 30  (pExpr->iTable&0
e9d0: 78 30 30 30 30 46 46 46 46 29 3d 3d 70 45 78 70  x0000FFFF)==pExp
e9e0: 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20  r->iTable );.   
e9f0: 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 53       pExpr->x.pS
ea00: 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20  elect->iLimit = 
ea10: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  0;.        if( s
ea20: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
ea30: 72 73 65 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53  rse, pExpr->x.pS
ea40: 65 6c 65 63 74 2c 20 26 64 65 73 74 29 20 29 7b  elect, &dest) ){
ea50: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
ea60: 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 0;.        }. 
ea70: 20 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20         pEList = 
ea80: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
ea90: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20  ->pEList;.      
eaa0: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 4c    if( ALWAYS(pEL
eab0: 69 73 74 21 3d 30 20 26 26 20 70 45 4c 69 73 74  ist!=0 && pEList
eac0: 2d 3e 6e 45 78 70 72 3e 30 29 20 29 7b 20 0a 20  ->nExpr>0) ){ . 
ead0: 20 20 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f           keyInfo
eae0: 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69  .aColl[0] = sqli
eaf0: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
eb00: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
eb10: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20  pExpr->pLeft,.  
eb20: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 4c 69              pELi
eb30: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
eb40: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
eb50: 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
eb60: 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  S(pExpr->x.pList
eb70: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
eb80: 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20 65  /* Case 2:     e
eb90: 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74  xpr IN (exprlist
eba0: 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ).        **.   
ebb0: 20 20 20 20 20 2a 2a 20 46 6f 72 20 65 61 63 68       ** For each
ebc0: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69   expression, bui
ebd0: 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20  ld an index key 
ebe0: 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74  from the evaluat
ebf0: 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ion and.        
ec00: 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74  ** store it in t
ec10: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
ec20: 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73  le. If <expr> is
ec30: 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20   a column, then 
ec40: 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  use.        ** t
ec50: 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69  hat columns affi
ec60: 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69  nity when buildi
ec70: 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49  ng index keys. I
ec80: 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a  f <expr> is not.
ec90: 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c          ** a col
eca0: 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63  umn, use numeric
ecb0: 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20   affinity..     
ecc0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
ecd0: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70  t i;.        Exp
ece0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
ecf0: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
ed00: 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78         struct Ex
ed10: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
ed20: 65 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  em;.        int 
ed30: 72 31 2c 20 72 32 2c 20 72 33 3b 0a 0a 20 20 20  r1, r2, r3;..   
ed40: 20 20 20 20 20 69 66 28 20 21 61 66 66 69 6e 69       if( !affini
ed50: 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ty ){.          
ed60: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
ed70: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
ed80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6b 65      }.        ke
ed90: 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d  yInfo.aColl[0] =
eda0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
edb0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
edc0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
edd0: 20 20 20 6b 65 79 49 6e 66 6f 2e 61 53 6f 72 74     keyInfo.aSort
ede0: 4f 72 64 65 72 20 3d 20 26 73 6f 72 74 4f 72 64  Order = &sortOrd
edf0: 65 72 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  er;..        /* 
ee00: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63  Loop through eac
ee10: 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  h expression in 
ee20: 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20  <exprlist>. */. 
ee30: 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
ee40: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
ee50: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72  arse);.        r
ee60: 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
ee70: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
ee80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ee90: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
eea0: 75 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a 20 20 20  ull, 0, r2);.   
eeb0: 20 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74       for(i=pList
eec0: 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
eed0: 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  List->a; i>0; i-
eee0: 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
eef0: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 32         Expr *pE2
ef00: 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
ef10: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
ef20: 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20 20 20 20  ValToIns;..     
ef30: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65       /* If the e
ef40: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74  xpression is not
ef50: 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20 77   constant then w
ef60: 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20  e will need to. 
ef70: 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 73 61           ** disa
ef80: 62 6c 65 20 74 68 65 20 74 65 73 74 20 74 68 61  ble the test tha
ef90: 74 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20  t was generated 
efa0: 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b 65 73  above that makes
efb0: 20 73 75 72 65 0a 20 20 20 20 20 20 20 20 20 20   sure.          
efc0: 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c  ** this code onl
efd0: 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65 2e  y executes once.
efe0: 20 20 42 65 63 61 75 73 65 20 66 6f 72 20 61 20    Because for a 
eff0: 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20  non-constant.   
f000: 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73         ** expres
f010: 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f 20  sion we need to 
f020: 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20  rerun this code 
f030: 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20 20  each time..     
f040: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
f050: 20 20 69 66 28 20 74 65 73 74 41 64 64 72 3e 3d    if( testAddr>=
f060: 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70  0 && !sqlite3Exp
f070: 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29  rIsConstant(pE2)
f080: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
f090: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
f0a0: 65 54 6f 4e 6f 6f 70 28 76 2c 20 74 65 73 74 41  eToNoop(v, testA
f0b0: 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ddr);.          
f0c0: 20 20 74 65 73 74 41 64 64 72 20 3d 20 2d 31 3b    testAddr = -1;
f0d0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
f0e0: 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75          /* Evalu
f0f0: 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ate the expressi
f100: 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74  on and insert it
f110: 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74   into the temp t
f120: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
f130: 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 26 26    if( isRowid &&
f140: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
f150: 74 65 67 65 72 28 70 45 32 2c 20 26 69 56 61 6c  teger(pE2, &iVal
f160: 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20 20 20  ToIns) ){.      
f170: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f180: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
f190: 73 65 72 74 49 6e 74 2c 20 70 45 78 70 72 2d 3e  sertInt, pExpr->
f1a0: 69 54 61 62 6c 65 2c 20 72 32 2c 20 69 56 61 6c  iTable, r2, iVal
f1b0: 54 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20 20 20  ToIns);.        
f1c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f1d0: 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65       r3 = sqlite
f1e0: 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
f1f0: 70 50 61 72 73 65 2c 20 70 45 32 2c 20 72 31 29  pParse, pE2, r1)
f200: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
f210: 28 20 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20  ( isRowid ){.   
f220: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
f230: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f240: 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 33  OP_MustBeInt, r3
f250: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f270: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72    sqlite3VdbeCur
f280: 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a  rentAddr(v)+2);.
f290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
f2a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
f2b0: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 45  v, OP_Insert, pE
f2c0: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c  xpr->iTable, r2,
f2d0: 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r3);.          
f2e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f2f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
f300: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
f310: 61 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31  akeRecord, r3, 1
f320: 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c  , r2, &affinity,
f330: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   1);.           
f340: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
f350: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
f360: 65 28 70 50 61 72 73 65 2c 20 72 33 2c 20 31 29  e(pParse, r3, 1)
f370: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
f380: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f390: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
f3a0: 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
f3b0: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 20  , r2);.         
f3c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
f3d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f3e0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
f3f0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
f400: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r1);.        sq
f410: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
f420: 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
f430: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
f440: 66 28 20 21 69 73 52 6f 77 69 64 20 29 7b 0a 20  f( !isRowid ){. 
f450: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
f460: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64  beChangeP4(v, ad
f470: 64 72 2c 20 28 76 6f 69 64 20 2a 29 26 6b 65 79  dr, (void *)&key
f480: 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
f490: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
f4a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
f4b0: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
f4c0: 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
f4d0: 45 4c 45 43 54 3a 0a 20 20 20 20 64 65 66 61 75  ELECT:.    defau
f4e0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49  lt: {.      /* I
f4f0: 66 20 74 68 69 73 20 68 61 73 20 74 6f 20 62 65  f this has to be
f500: 20 61 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54   a scalar SELECT
f510: 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  .  Generate code
f520: 20 74 6f 20 70 75 74 20 74 68 65 0a 20 20 20 20   to put the.    
f530: 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68    ** value of th
f540: 69 73 20 73 65 6c 65 63 74 20 69 6e 20 61 20 6d  is select in a m
f550: 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72  emory cell and r
f560: 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72  ecord the number
f570: 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
f580: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20   memory cell in 
f590: 69 43 6f 6c 75 6d 6e 2e 20 20 49 66 20 74 68 69  iColumn.  If thi
f5a0: 73 20 69 73 20 61 6e 20 45 58 49 53 54 53 2c 20  s is an EXISTS, 
f5b0: 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 61  write.      ** a
f5c0: 6e 20 69 6e 74 65 67 65 72 20 30 20 28 6e 6f 74  n integer 0 (not
f5d0: 20 65 78 69 73 74 73 29 20 6f 72 20 31 20 28 65   exists) or 1 (e
f5e0: 78 69 73 74 73 29 20 69 6e 74 6f 20 61 20 6d 65  xists) into a me
f5f0: 6d 6f 72 79 20 63 65 6c 6c 0a 20 20 20 20 20 20  mory cell.      
f600: 2a 2a 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68  ** and record th
f610: 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69  at memory cell i
f620: 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20  n iColumn..     
f630: 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74   */.      Select
f640: 20 2a 70 53 65 6c 3b 20 20 20 20 20 20 20 20 20   *pSel;         
f650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f660: 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  /* SELECT statem
f670: 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f  ent to encode */
f680: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
f690: 74 20 64 65 73 74 3b 20 20 20 20 20 20 20 20 20  t dest;         
f6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f6b0: 48 6f 77 20 74 6f 20 64 65 61 6c 20 77 69 74 68  How to deal with
f6c0: 20 53 45 4c 45 43 74 20 72 65 73 75 6c 74 20 2a   SELECt result *
f6d0: 2f 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  /..      testcas
f6e0: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
f6f0: 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20  _EXISTS );.     
f700: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
f710: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
f720: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
f730: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
f740: 58 49 53 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e  XISTS || pExpr->
f750: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
f760: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
f770: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
f780: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
f790: 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 70 53  ect) );.      pS
f7a0: 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53  el = pExpr->x.pS
f7b0: 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 73 71 6c  elect;.      sql
f7c0: 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
f7d0: 69 74 28 26 64 65 73 74 2c 20 30 2c 20 2b 2b 70  it(&dest, 0, ++p
f7e0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  Parse->nMem);.  
f7f0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
f800: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
f810: 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65          dest.eDe
f820: 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20  st = SRT_Mem;.  
f830: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f840: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
f850: 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50  ll, 0, dest.iSDP
f860: 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64  arm);.        Vd
f870: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49  beComment((v, "I
f880: 6e 69 74 20 73 75 62 71 75 65 72 79 20 72 65 73  nit subquery res
f890: 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 65  ult"));.      }e
f8a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 65 73  lse{.        des
f8b0: 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 45 78  t.eDest = SRT_Ex
f8c0: 69 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71  ists;.        sq
f8d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f8e0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
f8f0: 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b  , dest.iSDParm);
f900: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
f910: 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 45  ment((v, "Init E
f920: 58 49 53 54 53 20 72 65 73 75 6c 74 22 29 29 3b  XISTS result"));
f930: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
f940: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
f950: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65  (pParse->db, pSe
f960: 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  l->pLimit);.    
f970: 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d    pSel->pLimit =
f980: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
f990: 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45 47 45 52  arse, TK_INTEGER
f9a0: 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
f9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9c0: 20 20 20 20 20 20 20 20 20 20 26 73 71 6c 69 74            &sqlit
f9d0: 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 29 3b  e3IntTokens[1]);
f9e0: 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 69 4c 69  .      pSel->iLi
f9f0: 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  mit = 0;.      i
fa00: 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
fa10: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 26  (pParse, pSel, &
fa20: 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  dest) ){.       
fa30: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
fa40: 20 7d 0a 20 20 20 20 20 20 72 52 65 67 20 3d 20   }.      rReg = 
fa50: 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20  dest.iSDParm;.  
fa60: 20 20 20 20 45 78 70 72 53 65 74 49 72 72 65 64      ExprSetIrred
fa70: 75 63 69 62 6c 65 28 70 45 78 70 72 29 3b 0a 20  ucible(pExpr);. 
fa80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
fa90: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 74 65 73  }.  }..  if( tes
faa0: 74 41 64 64 72 3e 3d 30 20 29 7b 0a 20 20 20 20  tAddr>=0 ){.    
fab0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
fac0: 65 72 65 28 76 2c 20 74 65 73 74 41 64 64 72 29  ere(v, testAddr)
fad0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
fae0: 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
faf0: 73 65 2c 20 31 29 3b 0a 0a 20 20 72 65 74 75 72  se, 1);..  retur
fb00: 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69 66  n rReg;.}.#endif
fb10: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
fb20: 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66  SUBQUERY */..#if
fb30: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
fb40: 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
fb50: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
fb60: 72 20 61 6e 20 49 4e 20 65 78 70 72 65 73 73 69  r an IN expressi
fb70: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78  on..**.**      x
fb80: 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
fb90: 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 76  .**      x IN (v
fba0: 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e  alue, value, ...
fbb0: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74  ).**.** The left
fbc0: 2d 68 61 6e 64 20 73 69 64 65 20 28 4c 48 53 29  -hand side (LHS)
fbd0: 20 69 73 20 61 20 73 63 61 6c 61 72 20 65 78 70   is a scalar exp
fbe0: 72 65 73 73 69 6f 6e 2e 20 20 54 68 65 20 72 69  ression.  The ri
fbf0: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52  ght-hand side (R
fc00: 48 53 29 0a 2a 2a 20 69 73 20 61 6e 20 61 72 72  HS).** is an arr
fc10: 61 79 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f  ay of zero or mo
fc20: 72 65 20 76 61 6c 75 65 73 2e 20 20 54 68 65 20  re values.  The 
fc30: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
fc40: 75 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73  ue if the LHS is
fc50: 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  .** contained wi
fc60: 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20 54  thin the RHS.  T
fc70: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
fc80: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e  expression is un
fc90: 6b 6e 6f 77 6e 20 28 4e 55 4c 4c 29 0a 2a 2a 20  known (NULL).** 
fca0: 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 4e 55  if the LHS is NU
fcb0: 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 4c 48 53  LL or if the LHS
fcc0: 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   is not containe
fcd0: 64 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53  d within the RHS
fce0: 20 61 6e 64 20 74 68 65 0a 2a 2a 20 52 48 53 20   and the.** RHS 
fcf0: 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
fd00: 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73  more NULL values
fd10: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
fd20: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
fd30: 6f 64 65 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f  ode will jump to
fd40: 20 64 65 73 74 49 66 46 61 6c 73 65 20 69 66 20   destIfFalse if 
fd50: 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a  the LHS is not .
fd60: 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  ** contained wit
fd70: 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66  hin the RHS.  If
fd80: 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65   due to NULLs we
fd90: 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e   cannot determin
fda0: 65 20 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20  e if the LHS.** 
fdb0: 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  is contained in 
fdc0: 74 68 65 20 52 48 53 20 74 68 65 6e 20 6a 75 6d  the RHS then jum
fdd0: 70 20 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e  p to destIfNull.
fde0: 20 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20    If the LHS is 
fdf0: 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74  contained.** wit
fe00: 68 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e  hin the RHS then
fe10: 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a   fall through..*
fe20: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
fe30: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
fe40: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
fe50: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
fe60: 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
fe70: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
fe80: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
fe90: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
fea0: 65 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 20  e IN expression 
feb0: 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66 46  */.  int destIfF
fec0: 61 6c 73 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75  alse,      /* Ju
fed0: 6d 70 20 68 65 72 65 20 69 66 20 4c 48 53 20 69  mp here if LHS i
fee0: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  s not contained 
fef0: 69 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20  in the RHS */.  
ff00: 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 20  int destIfNull  
ff10: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
ff20: 72 65 20 69 66 20 74 68 65 20 72 65 73 75 6c 74  re if the result
ff30: 73 20 61 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75  s are unknown du
ff40: 65 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b  e to NULLs */.){
ff50: 0a 20 20 69 6e 74 20 72 52 68 73 48 61 73 4e 75  .  int rRhsHasNu
ff60: 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69  ll = 0;  /* Regi
ff70: 73 74 65 72 20 74 68 61 74 20 69 73 20 74 72 75  ster that is tru
ff80: 65 20 69 66 20 52 48 53 20 63 6f 6e 74 61 69 6e  e if RHS contain
ff90: 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f  s NULL values */
ffa0: 0a 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79  .  char affinity
ffb0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70  ;        /* Comp
ffc0: 61 72 69 73 6f 6e 20 61 66 66 69 6e 69 74 79 20  arison affinity 
ffd0: 74 6f 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  to use */.  int 
ffe0: 65 54 79 70 65 3b 20 20 20 20 20 20 20 20 20 20  eType;          
fff0: 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 68 65    /* Type of the
10000 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 72 31   RHS */.  int r1
10010 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10020 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65  /* Temporary use
10030 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 56   register */.  V
10040 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
10050 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e       /* Statemen
10060 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  t under construc
10070 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f  tion */..  /* Co
10080 6d 70 75 74 65 20 74 68 65 20 52 48 53 2e 20 20  mpute the RHS.  
10090 20 41 66 74 65 72 20 74 68 69 73 20 73 74 65 70   After this step
100a0 2c 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  , the table with
100b0 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 70 45 78   cursor.  ** pEx
100c0 70 72 2d 3e 69 54 61 62 6c 65 20 77 69 6c 6c 20  pr->iTable will 
100d0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c  contains the val
100e0 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70  ues that make up
100f0 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20   the RHS..  */. 
10100 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
10110 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  be;.  assert( v!
10120 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f  =0 );       /* O
10130 4f 4d 20 64 65 74 65 63 74 65 64 20 70 72 69 6f  OM detected prio
10140 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  r to this routin
10150 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43  e */.  VdbeNoopC
10160 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69  omment((v, "begi
10170 6e 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 20 20  n IN expr"));.  
10180 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46  eType = sqlite3F
10190 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73  indInIndex(pPars
101a0 65 2c 20 70 45 78 70 72 2c 20 26 72 52 68 73 48  e, pExpr, &rRhsH
101b0 61 73 4e 75 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 46  asNull);..  /* F
101c0 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 61 66  igure out the af
101d0 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20 74 6f  finity to use to
101e0 20 63 72 65 61 74 65 20 61 20 6b 65 79 20 66 72   create a key fr
101f0 6f 6d 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20  om the results. 
10200 20 2a 2a 20 6f 66 20 74 68 65 20 65 78 70 72 65   ** of the expre
10210 73 73 69 6f 6e 2e 20 61 66 66 69 6e 69 74 79 53  ssion. affinityS
10220 74 72 20 73 74 6f 72 65 73 20 61 20 73 74 61 74  tr stores a stat
10230 69 63 20 73 74 72 69 6e 67 20 73 75 69 74 61 62  ic string suitab
10240 6c 65 20 66 6f 72 0a 20 20 2a 2a 20 50 34 20 6f  le for.  ** P4 o
10250 66 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e  f OP_MakeRecord.
10260 0a 20 20 2a 2f 0a 20 20 61 66 66 69 6e 69 74 79  .  */.  affinity
10270 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66   = comparisonAff
10280 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 0a 20  inity(pExpr);.. 
10290 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4c 48 53   /* Code the LHS
102a0 2c 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f  , the <expr> fro
102b0 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e  m "<expr> IN (..
102c0 2e 29 22 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  .)"..  */.  sqli
102d0 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
102e0 28 70 50 61 72 73 65 29 3b 0a 20 20 72 31 20 3d  (pParse);.  r1 =
102f0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
10300 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
10310 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
10320 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
10330 66 74 2c 20 72 31 29 3b 0a 0a 20 20 2f 2a 20 49  ft, r1);..  /* I
10340 66 20 74 68 65 20 4c 48 53 20 69 73 20 4e 55 4c  f the LHS is NUL
10350 4c 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  L, then the resu
10360 6c 74 20 69 73 20 65 69 74 68 65 72 20 66 61 6c  lt is either fal
10370 73 65 20 6f 72 20 4e 55 4c 4c 20 64 65 70 65 6e  se or NULL depen
10380 64 69 6e 67 0a 20 20 2a 2a 20 6f 6e 20 77 68 65  ding.  ** on whe
10390 74 68 65 72 20 74 68 65 20 52 48 53 20 69 73 20  ther the RHS is 
103a0 65 6d 70 74 79 20 6f 72 20 6e 6f 74 2c 20 72 65  empty or not, re
103b0 73 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 2a 2f  spectively..  */
103c0 0a 20 20 69 66 28 20 64 65 73 74 49 66 4e 75 6c  .  if( destIfNul
103d0 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29  l==destIfFalse )
103e0 7b 0a 20 20 20 20 2f 2a 20 53 68 6f 72 74 63 75  {.    /* Shortcu
103f0 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e  t for the common
10400 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
10410 66 61 6c 73 65 20 61 6e 64 20 4e 55 4c 4c 20 6f  false and NULL o
10420 75 74 63 6f 6d 65 73 20 61 72 65 0a 20 20 20 20  utcomes are.    
10430 2a 2a 20 74 68 65 20 73 61 6d 65 2e 20 2a 2f 0a  ** the same. */.
10440 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10450 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
10460 6c 6c 2c 20 72 31 2c 20 64 65 73 74 49 66 4e 75  ll, r1, destIfNu
10470 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ll);.  }else{.  
10480 20 20 69 6e 74 20 61 64 64 72 31 20 3d 20 73 71    int addr1 = sq
10490 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
104a0 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72  v, OP_NotNull, r
104b0 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
104c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
104d0 52 65 77 69 6e 64 2c 20 70 45 78 70 72 2d 3e 69  Rewind, pExpr->i
104e0 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c  Table, destIfFal
104f0 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  se);.    sqlite3
10500 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10510 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66  _Goto, 0, destIf
10520 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  Null);.    sqlit
10530 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
10540 2c 20 61 64 64 72 31 29 3b 0a 20 20 7d 0a 0a 20  , addr1);.  }.. 
10550 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49   if( eType==IN_I
10560 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20  NDEX_ROWID ){.  
10570 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
10580 65 2c 20 74 68 65 20 52 48 53 20 69 73 20 74 68  e, the RHS is th
10590 65 20 52 4f 57 49 44 20 6f 66 20 74 61 62 6c 65  e ROWID of table
105a0 20 62 2d 74 72 65 65 0a 20 20 20 20 2a 2f 0a 20   b-tree.    */. 
105b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
105c0 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp2(v, OP_MustB
105d0 65 49 6e 74 2c 20 72 31 2c 20 64 65 73 74 49 66  eInt, r1, destIf
105e0 46 61 6c 73 65 29 3b 0a 20 20 20 20 73 71 6c 69  False);.    sqli
105f0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
10600 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 70   OP_NotExists, p
10610 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65  Expr->iTable, de
10620 73 74 49 66 46 61 6c 73 65 2c 20 72 31 29 3b 0a  stIfFalse, r1);.
10630 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
10640 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68  In this case, th
10650 65 20 52 48 53 20 69 73 20 61 6e 20 69 6e 64 65  e RHS is an inde
10660 78 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2f  x b-tree..    */
10670 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10680 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66  AddOp4(v, OP_Aff
10690 69 6e 69 74 79 2c 20 72 31 2c 20 31 2c 20 30 2c  inity, r1, 1, 0,
106a0 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a   &affinity, 1);.
106b0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
106c0 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  et membership te
106d0 73 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74  st fails, then t
106e0 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
106f0 20 0a 20 20 20 20 2a 2a 20 22 78 20 49 4e 20 28   .    ** "x IN (
10700 2e 2e 2e 29 22 20 65 78 70 72 65 73 73 69 6f 6e  ...)" expression
10710 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
10720 30 20 6f 72 20 4e 55 4c 4c 2e 20 49 66 20 74 68  0 or NULL. If th
10730 65 20 73 65 74 0a 20 20 20 20 2a 2a 20 63 6f 6e  e set.    ** con
10740 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 20 76 61  tains no NULL va
10750 6c 75 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72  lues, then the r
10760 65 73 75 6c 74 20 69 73 20 30 2e 20 49 66 20 74  esult is 0. If t
10770 68 65 20 73 65 74 20 0a 20 20 20 20 2a 2a 20 63  he set .    ** c
10780 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
10790 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c  ore NULL values,
107a0 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
107b0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 65   of the.    ** e
107c0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6c 73  xpression is als
107d0 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20  o NULL..    */. 
107e0 20 20 20 69 66 28 20 72 52 68 73 48 61 73 4e 75     if( rRhsHasNu
107f0 6c 6c 3d 3d 30 20 7c 7c 20 64 65 73 74 49 66 46  ll==0 || destIfF
10800 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c  alse==destIfNull
10810 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
10820 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66  s branch runs if
10830 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 61 74 20   it is known at 
10840 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 74 68 61  compile time tha
10850 74 20 74 68 65 20 52 48 53 0a 20 20 20 20 20 20  t the RHS.      
10860 2a 2a 20 63 61 6e 6e 6f 74 20 63 6f 6e 74 61 69  ** cannot contai
10870 6e 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 20 54  n NULL values. T
10880 68 69 73 20 68 61 70 70 65 6e 73 20 61 73 20 74  his happens as t
10890 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  he result.      
108a0 2a 2a 20 6f 66 20 61 20 22 4e 4f 54 20 4e 55 4c  ** of a "NOT NUL
108b0 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e  L" constraint in
108c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
108d0 68 65 6d 61 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  hema..      **. 
108e0 20 20 20 20 20 2a 2a 20 41 6c 73 6f 20 72 75 6e       ** Also run
108f0 20 74 68 69 73 20 62 72 61 6e 63 68 20 69 66 20   this branch if 
10900 4e 55 4c 4c 20 69 73 20 65 71 75 69 76 61 6c 65  NULL is equivale
10910 6e 74 20 74 6f 20 46 41 4c 53 45 0a 20 20 20 20  nt to FALSE.    
10920 20 20 2a 2a 20 66 6f 72 20 74 68 69 73 20 70 61    ** for this pa
10930 72 74 69 63 75 6c 61 72 20 49 4e 20 6f 70 65 72  rticular IN oper
10940 61 74 6f 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ator..      */. 
10950 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10960 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
10970 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d  NotFound, pExpr-
10980 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46  >iTable, destIfF
10990 61 6c 73 65 2c 20 72 31 2c 20 31 29 3b 0a 0a 20  alse, r1, 1);.. 
109a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
109b0 2f 2a 20 49 6e 20 74 68 69 73 20 62 72 61 6e 63  /* In this branc
109c0 68 2c 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  h, the RHS of th
109d0 65 20 49 4e 20 6d 69 67 68 74 20 63 6f 6e 74 61  e IN might conta
109e0 69 6e 20 61 20 4e 55 4c 4c 20 61 6e 64 0a 20 20  in a NULL and.  
109f0 20 20 20 20 2a 2a 20 74 68 65 20 70 72 65 73 65      ** the prese
10a00 6e 63 65 20 6f 66 20 61 20 4e 55 4c 4c 20 6f 6e  nce of a NULL on
10a10 20 74 68 65 20 52 48 53 20 6d 61 6b 65 73 20 61   the RHS makes a
10a20 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74   difference in t
10a30 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 75 74 63  he.      ** outc
10a40 6f 6d 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ome..      */.  
10a50 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 2c 20      int j1, j2, 
10a60 6a 33 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69  j3;..      /* Fi
10a70 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65  rst check to see
10a80 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 63   if the LHS is c
10a90 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
10aa0 52 48 53 2e 20 20 49 66 20 73 6f 2c 0a 20 20 20  RHS.  If so,.   
10ab0 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 70     ** then the p
10ac0 72 65 73 65 6e 63 65 20 6f 66 20 4e 55 4c 4c 73  resence of NULLs
10ad0 20 69 6e 20 74 68 65 20 52 48 53 20 64 6f 65 73   in the RHS does
10ae0 20 6e 6f 74 20 6d 61 74 74 65 72 2c 20 73 6f 20   not matter, so 
10af0 6a 75 6d 70 0a 20 20 20 20 20 20 2a 2a 20 6f 76  jump.      ** ov
10b00 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f  er all of the co
10b10 64 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 2e  de that follows.
10b20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
10b30 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
10b40 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
10b50 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54  Found, pExpr->iT
10b60 61 62 6c 65 2c 20 30 2c 20 72 31 2c 20 31 29 3b  able, 0, r1, 1);
10b70 0a 0a 20 20 20 20 20 20 2f 2a 20 48 65 72 65 20  ..      /* Here 
10b80 77 65 20 62 65 67 69 6e 20 67 65 6e 65 72 61 74  we begin generat
10b90 69 6e 67 20 63 6f 64 65 20 74 68 61 74 20 72 75  ing code that ru
10ba0 6e 73 20 69 66 20 74 68 65 20 4c 48 53 20 69 73  ns if the LHS is
10bb0 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f   not.      ** co
10bc0 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74  ntained within t
10bd0 68 65 20 52 48 53 2e 20 20 47 65 6e 65 72 61 74  he RHS.  Generat
10be0 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 64  e additional cod
10bf0 65 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  e that.      ** 
10c00 74 65 73 74 73 20 74 68 65 20 52 48 53 20 66 6f  tests the RHS fo
10c10 72 20 4e 55 4c 4c 73 2e 20 20 49 66 20 74 68 65  r NULLs.  If the
10c20 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 61 20   RHS contains a 
10c30 4e 55 4c 4c 20 74 68 65 6e 0a 20 20 20 20 20 20  NULL then.      
10c40 2a 2a 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49  ** jump to destI
10c50 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 72 65  fNull.  If there
10c60 20 61 72 65 20 6e 6f 20 4e 55 4c 4c 73 20 69 6e   are no NULLs in
10c70 20 74 68 65 20 52 48 53 20 74 68 65 6e 0a 20 20   the RHS then.  
10c80 20 20 20 20 2a 2a 20 6a 75 6d 70 20 74 6f 20 64      ** jump to d
10c90 65 73 74 49 66 46 61 6c 73 65 2e 0a 20 20 20 20  estIfFalse..    
10ca0 20 20 2a 2f 0a 20 20 20 20 20 20 6a 32 20 3d 20    */.      j2 = 
10cb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10cc0 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  1(v, OP_NotNull,
10cd0 20 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20   rRhsHasNull);. 
10ce0 20 20 20 20 20 6a 33 20 3d 20 73 71 6c 69 74 65       j3 = sqlite
10cf0 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
10d00 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70  , OP_Found, pExp
10d10 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72 52  r->iTable, 0, rR
10d20 68 73 48 61 73 4e 75 6c 6c 2c 20 31 29 3b 0a 20  hsHasNull, 1);. 
10d30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10d40 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
10d50 65 67 65 72 2c 20 2d 31 2c 20 72 52 68 73 48 61  eger, -1, rRhsHa
10d60 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  sNull);.      sq
10d70 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
10d80 65 28 76 2c 20 6a 33 29 3b 0a 20 20 20 20 20 20  e(v, j3);.      
10d90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10da0 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
10db0 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 31 29 3b  rRhsHasNull, 1);
10dc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10dd0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 32  beJumpHere(v, j2
10de0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d  );..      /* Jum
10df0 70 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72  p to the appropr
10e00 69 61 74 65 20 74 61 72 67 65 74 20 64 65 70 65  iate target depe
10e10 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
10e20 20 6f 72 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a   or not.      **
10e30 20 74 68 65 20 52 48 53 20 63 6f 6e 74 61 69 6e   the RHS contain
10e40 73 20 61 20 4e 55 4c 4c 0a 20 20 20 20 20 20 2a  s a NULL.      *
10e50 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
10e60 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10e70 49 66 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c  If, rRhsHasNull,
10e80 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
10e90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10ea0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
10eb0 2c 20 30 2c 20 64 65 73 74 49 66 46 61 6c 73 65  , 0, destIfFalse
10ec0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  );..      /* The
10ed0 20 4f 50 5f 46 6f 75 6e 64 20 61 74 20 74 68 65   OP_Found at the
10ee0 20 74 6f 70 20 6f 66 20 74 68 69 73 20 62 72 61   top of this bra
10ef0 6e 63 68 20 6a 75 6d 70 73 20 68 65 72 65 20 77  nch jumps here w
10f00 68 65 6e 20 74 72 75 65 2c 20 0a 20 20 20 20 20  hen true, .     
10f10 20 2a 2a 20 63 61 75 73 69 6e 67 20 74 68 65 20   ** causing the 
10f20 6f 76 65 72 61 6c 6c 20 49 4e 20 65 78 70 72 65  overall IN expre
10f30 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 69 6f 6e  ssion evaluation
10f40 20 74 6f 20 66 61 6c 6c 20 74 68 72 6f 75 67 68   to fall through
10f50 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
10f60 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
10f70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20  Here(v, j1);.   
10f80 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
10f90 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
10fa0 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 73 71  Parse, r1);.  sq
10fb0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
10fc0 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20  p(pParse, 1);.  
10fd0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
10fe0 22 65 6e 64 20 49 4e 20 65 78 70 72 22 29 29 3b  "end IN expr"));
10ff0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
11000 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
11010 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 75 70 6c  Y */../*.** Dupl
11020 69 63 61 74 65 20 61 6e 20 38 2d 62 79 74 65 20  icate an 8-byte 
11030 76 61 6c 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20  value.*/.static 
11040 63 68 61 72 20 2a 64 75 70 38 62 79 74 65 73 28  char *dup8bytes(
11050 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63  Vdbe *v, const c
11060 68 61 72 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72  har *in){.  char
11070 20 2a 6f 75 74 20 3d 20 73 71 6c 69 74 65 33 44   *out = sqlite3D
11080 62 4d 61 6c 6c 6f 63 52 61 77 28 73 71 6c 69 74  bMallocRaw(sqlit
11090 65 33 56 64 62 65 44 62 28 76 29 2c 20 38 29 3b  e3VdbeDb(v), 8);
110a0 0a 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20  .  if( out ){.  
110b0 20 20 6d 65 6d 63 70 79 28 6f 75 74 2c 20 69 6e    memcpy(out, in
110c0 2c 20 38 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 8);.  }.  retu
110d0 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 23 69 66 6e 64  rn out;.}..#ifnd
110e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
110f0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a  LOATING_POINT./*
11100 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
11110 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
11120 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c   will put the fl
11130 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20  oating point.** 
11140 76 61 6c 75 65 20 64 65 73 63 72 69 62 65 64 20  value described 
11150 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74  by z[0..n-1] int
11160 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e  o register iMem.
11170 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73  .**.** The z[] s
11180 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61  tring will proba
11190 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d  bly not be zero-
111a0 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74  terminated.  But
111b0 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68   the .** z[n] ch
111c0 61 72 61 63 74 65 72 20 69 73 20 67 75 61 72 61  aracter is guara
111d0 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65  nteed to be some
111e0 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20  thing that does 
111f0 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65  not look.** like
11200 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f   the continuatio
11210 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e  n of the number.
11220 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11230 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76  codeReal(Vdbe *v
11240 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  , const char *z,
11250 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c   int negateFlag,
11260 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66   int iMem){.  if
11270 28 20 41 4c 57 41 59 53 28 7a 21 3d 30 29 20 29  ( ALWAYS(z!=0) )
11280 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c  {.    double val
11290 75 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 56  ue;.    char *zV
112a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f  ;.    sqlite3Ato
112b0 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c  F(z, &value, sql
112c0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c  ite3Strlen30(z),
112d0 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
112e0 20 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69     assert( !sqli
112f0 74 65 33 49 73 4e 61 4e 28 76 61 6c 75 65 29 20  te3IsNaN(value) 
11300 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20 41 74  ); /* The new At
11310 6f 46 20 6e 65 76 65 72 20 72 65 74 75 72 6e 73  oF never returns
11320 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20   NaN */.    if( 
11330 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76 61 6c  negateFlag ) val
11340 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20  ue = -value;.   
11350 20 7a 56 20 3d 20 64 75 70 38 62 79 74 65 73 28   zV = dup8bytes(
11360 76 2c 20 28 63 68 61 72 2a 29 26 76 61 6c 75 65  v, (char*)&value
11370 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
11380 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 52  beAddOp4(v, OP_R
11390 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c  eal, 0, iMem, 0,
113a0 20 7a 56 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20   zV, P4_REAL);. 
113b0 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
113c0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
113d0 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
113e0 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 69 6e   will put the in
113f0 74 65 67 65 72 20 64 65 73 63 72 69 62 65 20 62  teger describe b
11400 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e  y.** text z[0..n
11410 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65  -1] into registe
11420 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78  r iMem..**.** Ex
11430 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 69 73 20 61  pr.u.zToken is a
11440 6c 77 61 79 73 20 55 54 46 38 20 61 6e 64 20 7a  lways UTF8 and z
11450 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a  ero-terminated..
11460 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
11470 6f 64 65 49 6e 74 65 67 65 72 28 50 61 72 73 65  odeInteger(Parse
11480 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
11490 70 45 78 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c  pExpr, int negFl
114a0 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20  ag, int iMem){. 
114b0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
114c0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20  e->pVdbe;.  if( 
114d0 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
114e0 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20  P_IntValue ){.  
114f0 20 20 69 6e 74 20 69 20 3d 20 70 45 78 70 72 2d    int i = pExpr-
11500 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 61  >u.iValue;.    a
11510 73 73 65 72 74 28 20 69 3e 3d 30 20 29 3b 0a 20  ssert( i>=0 );. 
11520 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29     if( negFlag )
11530 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20 73 71 6c   i = -i;.    sql
11540 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11550 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c  , OP_Integer, i,
11560 20 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b   iMem);.  }else{
11570 0a 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20  .    int c;.    
11580 69 36 34 20 76 61 6c 75 65 3b 0a 20 20 20 20 63  i64 value;.    c
11590 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
115a0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
115b0 20 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30      assert( z!=0
115c0 20 29 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c 69   );.    c = sqli
115d0 74 65 33 41 74 6f 69 36 34 28 7a 2c 20 26 76 61  te3Atoi64(z, &va
115e0 6c 75 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  lue, sqlite3Strl
115f0 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f  en30(z), SQLITE_
11600 55 54 46 38 29 3b 0a 20 20 20 20 69 66 28 20 63  UTF8);.    if( c
11610 3d 3d 30 20 7c 7c 20 28 63 3d 3d 32 20 26 26 20  ==0 || (c==2 && 
11620 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20 20 20 20  negFlag) ){.    
11630 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20 20 20    char *zV;.    
11640 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 7b    if( negFlag ){
11650 20 76 61 6c 75 65 20 3d 20 63 3d 3d 32 20 3f 20   value = c==2 ? 
11660 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a  SMALLEST_INT64 :
11670 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20 20 20 20   -value; }.     
11680 20 7a 56 20 3d 20 64 75 70 38 62 79 74 65 73 28   zV = dup8bytes(
11690 76 2c 20 28 63 68 61 72 2a 29 26 76 61 6c 75 65  v, (char*)&value
116a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
116b0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
116c0 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c  _Int64, 0, iMem,
116d0 20 30 2c 20 7a 56 2c 20 50 34 5f 49 4e 54 36 34   0, zV, P4_INT64
116e0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69  );.    }else{.#i
116f0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
11700 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
11710 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
11720 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
11730 76 65 72 73 69 7a 65 64 20 69 6e 74 65 67 65 72  versized integer
11740 3a 20 25 73 25 73 22 2c 20 6e 65 67 46 6c 61 67  : %s%s", negFlag
11750 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a 29 3b   ? "-" : "", z);
11760 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 63 6f 64  .#else.      cod
11770 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46  eReal(v, z, negF
11780 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 23 65 6e 64  lag, iMem);.#end
11790 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  if.    }.  }.}..
117a0 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 63 61  /*.** Clear a ca
117b0 63 68 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74  che entry..*/.st
117c0 61 74 69 63 20 76 6f 69 64 20 63 61 63 68 65 45  atic void cacheE
117d0 6e 74 72 79 43 6c 65 61 72 28 50 61 72 73 65 20  ntryClear(Parse 
117e0 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20  *pParse, struct 
117f0 79 43 6f 6c 43 61 63 68 65 20 2a 70 29 7b 0a 20  yColCache *p){. 
11800 20 69 66 28 20 70 2d 3e 74 65 6d 70 52 65 67 20   if( p->tempReg 
11810 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  ){.    if( pPars
11820 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61  e->nTempReg<Arra
11830 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54  ySize(pParse->aT
11840 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20 20  empReg) ){.     
11850 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65   pParse->aTempRe
11860 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  g[pParse->nTempR
11870 65 67 2b 2b 5d 20 3d 20 70 2d 3e 69 52 65 67 3b  eg++] = p->iReg;
11880 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74 65  .    }.    p->te
11890 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d  mpReg = 0;.  }.}
118a0 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20  .../*.** Record 
118b0 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  in the column ca
118c0 63 68 65 20 74 68 61 74 20 61 20 70 61 72 74 69  che that a parti
118d0 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20 66 72 6f  cular column fro
118e0 6d 20 61 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61  m a.** particula
118f0 72 20 74 61 62 6c 65 20 69 73 20 73 74 6f 72 65  r table is store
11900 64 20 69 6e 20 61 20 70 61 72 74 69 63 75 6c 61  d in a particula
11910 72 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 76  r register..*/.v
11920 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
11930 61 63 68 65 53 74 6f 72 65 28 50 61 72 73 65 20  acheStore(Parse 
11940 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61  *pParse, int iTa
11950 62 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74  b, int iCol, int
11960 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b   iReg){.  int i;
11970 0a 20 20 69 6e 74 20 6d 69 6e 4c 72 75 3b 0a 20  .  int minLru;. 
11980 20 69 6e 74 20 69 64 78 4c 72 75 3b 0a 20 20 73   int idxLru;.  s
11990 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
119a0 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  *p;..  assert( i
119b0 52 65 67 3e 30 20 29 3b 20 20 2f 2a 20 52 65 67  Reg>0 );  /* Reg
119c0 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 61 72  ister numbers ar
119d0 65 20 61 6c 77 61 79 73 20 70 6f 73 69 74 69 76  e always positiv
119e0 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  e */.  assert( i
119f0 43 6f 6c 3e 3d 2d 31 20 26 26 20 69 43 6f 6c 3c  Col>=-1 && iCol<
11a00 33 32 37 36 38 20 29 3b 20 20 2f 2a 20 46 69 6e  32768 );  /* Fin
11a10 69 74 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  ite column numbe
11a20 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  rs */..  /* The 
11a30 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63  SQLITE_ColumnCac
11a40 68 65 20 66 6c 61 67 20 64 69 73 61 62 6c 65 73  he flag disables
11a50 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
11a60 65 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  e.  This is used
11a70 0a 20 20 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e  .  ** for testin
11a80 67 20 6f 6e 6c 79 20 2d 20 74 6f 20 76 65 72 69  g only - to veri
11a90 66 79 20 74 68 61 74 20 53 51 4c 69 74 65 20 61  fy that SQLite a
11aa0 6c 77 61 79 73 20 67 65 74 73 20 74 68 65 20 73  lways gets the s
11ab0 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 2a 2a 20  ame answer.  ** 
11ac0 77 69 74 68 20 61 6e 64 20 77 69 74 68 6f 75 74  with and without
11ad0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
11ae0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4f 70  e..  */.  if( Op
11af0 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c  timizationDisabl
11b00 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53  ed(pParse->db, S
11b10 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68  QLITE_ColumnCach
11b20 65 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  e) ) return;..  
11b30 2f 2a 20 46 69 72 73 74 20 72 65 70 6c 61 63 65  /* First replace
11b40 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6e   any existing en
11b50 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  try..  **.  ** A
11b60 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 77 61 79  ctually, the way
11b70 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
11b80 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75  e is currently u
11b90 73 65 64 2c 20 77 65 20 61 72 65 20 67 75 61 72  sed, we are guar
11ba0 61 6e 74 65 65 64 0a 20 20 2a 2a 20 74 68 61 74  anteed.  ** that
11bb0 20 74 68 65 20 6f 62 6a 65 63 74 20 77 69 6c 6c   the object will
11bc0 20 6e 65 76 65 72 20 61 6c 72 65 61 64 79 20 62   never already b
11bd0 65 20 69 6e 20 63 61 63 68 65 2e 20 20 56 65 72  e in cache.  Ver
11be0 69 66 79 20 74 68 69 73 20 67 75 61 72 61 6e 74  ify this guarant
11bf0 65 65 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ee..  */.#ifndef
11c00 20 4e 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d   NDEBUG.  for(i=
11c10 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
11c20 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
11c30 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
11c40 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  , p++){.    asse
11c50 72 74 28 20 70 2d 3e 69 52 65 67 3d 3d 30 20 7c  rt( p->iReg==0 |
11c60 7c 20 70 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61  | p->iTable!=iTa
11c70 62 20 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 21  b || p->iColumn!
11c80 3d 69 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e  =iCol );.  }.#en
11c90 64 69 66 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61  dif..  /* Find a
11ca0 6e 20 65 6d 70 74 79 20 73 6c 6f 74 20 61 6e 64  n empty slot and
11cb0 20 72 65 70 6c 61 63 65 20 69 74 20 2a 2f 0a 20   replace it */. 
11cc0 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
11cd0 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
11ce0 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
11cf0 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
11d00 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d     if( p->iReg==
11d10 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4c  0 ){.      p->iL
11d20 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69  evel = pParse->i
11d30 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20  CacheLevel;.    
11d40 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54    p->iTable = iT
11d50 61 62 3b 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f  ab;.      p->iCo
11d60 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  lumn = iCol;.   
11d70 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65     p->iReg = iRe
11d80 67 3b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70  g;.      p->temp
11d90 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Reg = 0;.      p
11da0 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e  ->lru = pParse->
11db0 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20  iCacheCnt++;.   
11dc0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
11dd0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6c 61  .  }..  /* Repla
11de0 63 65 20 74 68 65 20 6c 61 73 74 20 72 65 63 65  ce the last rece
11df0 6e 74 6c 79 20 75 73 65 64 20 2a 2f 0a 20 20 6d  ntly used */.  m
11e00 69 6e 4c 72 75 20 3d 20 30 78 37 66 66 66 66 66  inLru = 0x7fffff
11e10 66 66 3b 0a 20 20 69 64 78 4c 72 75 20 3d 20 2d  ff;.  idxLru = -
11e20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  1;.  for(i=0, p=
11e30 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
11e40 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
11e50 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
11e60 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6c 72  ){.    if( p->lr
11e70 75 3c 6d 69 6e 4c 72 75 20 29 7b 0a 20 20 20 20  u<minLru ){.    
11e80 20 20 69 64 78 4c 72 75 20 3d 20 69 3b 0a 20 20    idxLru = i;.  
11e90 20 20 20 20 6d 69 6e 4c 72 75 20 3d 20 70 2d 3e      minLru = p->
11ea0 6c 72 75 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  lru;.    }.  }. 
11eb0 20 69 66 28 20 41 4c 57 41 59 53 28 69 64 78 4c   if( ALWAYS(idxL
11ec0 72 75 3e 3d 30 29 20 29 7b 0a 20 20 20 20 70 20  ru>=0) ){.    p 
11ed0 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43  = &pParse->aColC
11ee0 61 63 68 65 5b 69 64 78 4c 72 75 5d 3b 0a 20 20  ache[idxLru];.  
11ef0 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50    p->iLevel = pP
11f00 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
11f10 6c 3b 0a 20 20 20 20 70 2d 3e 69 54 61 62 6c 65  l;.    p->iTable
11f20 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 2d 3e   = iTab;.    p->
11f30 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a  iColumn = iCol;.
11f40 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52      p->iReg = iR
11f50 65 67 3b 0a 20 20 20 20 70 2d 3e 74 65 6d 70 52  eg;.    p->tempR
11f60 65 67 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c  eg = 0;.    p->l
11f70 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  ru = pParse->iCa
11f80 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 72 65  cheCnt++;.    re
11f90 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  turn;.  }.}../*.
11fa0 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74  ** Indicate that
11fb0 20 72 65 67 69 73 74 65 72 73 20 62 65 74 77 65   registers betwe
11fc0 65 6e 20 69 52 65 67 2e 2e 69 52 65 67 2b 6e 52  en iReg..iReg+nR
11fd0 65 67 2d 31 20 61 72 65 20 62 65 69 6e 67 20 6f  eg-1 are being o
11fe0 76 65 72 77 72 69 74 74 65 6e 2e 0a 2a 2a 20 50  verwritten..** P
11ff0 75 72 67 65 20 74 68 65 20 72 61 6e 67 65 20 6f  urge the range o
12000 66 20 72 65 67 69 73 74 65 72 73 20 66 72 6f 6d  f registers from
12010 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
12020 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
12030 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
12040 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
12050 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e   int iReg, int n
12060 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Reg){.  int i;. 
12070 20 69 6e 74 20 69 4c 61 73 74 20 3d 20 69 52 65   int iLast = iRe
12080 67 20 2b 20 6e 52 65 67 20 2d 20 31 3b 0a 20 20  g + nReg - 1;.  
12090 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
120a0 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20   *p;.  for(i=0, 
120b0 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
120c0 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
120d0 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
120e0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d  ++){.    int r =
120f0 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66   p->iReg;.    if
12100 28 20 72 3e 3d 69 52 65 67 20 26 26 20 72 3c 3d  ( r>=iReg && r<=
12110 69 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 63  iLast ){.      c
12120 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70  acheEntryClear(p
12130 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20  Parse, p);.     
12140 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20   p->iReg = 0;.  
12150 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
12160 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 63 75   Remember the cu
12170 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 63 61 63  rrent column cac
12180 68 65 20 63 6f 6e 74 65 78 74 2e 20 20 41 6e 79  he context.  Any
12190 20 6e 65 77 20 65 6e 74 72 69 65 73 20 61 64 64   new entries add
121a0 65 64 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 74  ed.** added to t
121b0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
121c0 61 66 74 65 72 20 74 68 69 73 20 63 61 6c 6c 20  after this call 
121d0 61 72 65 20 72 65 6d 6f 76 65 64 20 77 68 65 6e  are removed when
121e0 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f   the.** correspo
121f0 6e 64 69 6e 67 20 70 6f 70 20 6f 63 63 75 72 73  nding pop occurs
12200 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
12210 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 50  3ExprCachePush(P
12220 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
12230 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
12240 65 76 65 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  evel++;.}../*.**
12250 20 52 65 6d 6f 76 65 20 66 72 6f 6d 20 74 68 65   Remove from the
12260 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 6e   column cache an
12270 79 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 77  y entries that w
12280 65 72 65 20 61 64 64 65 64 20 73 69 6e 63 65 20  ere added since 
12290 74 68 65 0a 2a 2a 20 74 68 65 20 70 72 65 76 69  the.** the previ
122a0 6f 75 73 20 4e 20 50 75 73 68 20 6f 70 65 72 61  ous N Push opera
122b0 74 69 6f 6e 73 2e 20 20 49 6e 20 6f 74 68 65 72  tions.  In other
122c0 20 77 6f 72 64 73 2c 20 72 65 73 74 6f 72 65 20   words, restore 
122d0 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 74 6f 20  the cache.** to 
122e0 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73  the state it was
122f0 20 69 6e 20 4e 20 50 75 73 68 65 73 20 61 67 6f   in N Pushes ago
12300 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
12310 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 50 61  3ExprCachePop(Pa
12320 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
12330 20 4e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   N){.  int i;.  
12340 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
12350 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 4e   *p;.  assert( N
12360 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
12370 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
12380 76 65 6c 3e 3d 4e 20 29 3b 0a 20 20 70 50 61 72  vel>=N );.  pPar
12390 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20  se->iCacheLevel 
123a0 2d 3d 20 4e 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  -= N;.  for(i=0,
123b0 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
123c0 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
123d0 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
123e0 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
123f0 3e 69 52 65 67 20 26 26 20 70 2d 3e 69 4c 65 76  >iReg && p->iLev
12400 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43 61 63 68  el>pParse->iCach
12410 65 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20 20 20  eLevel ){.      
12420 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28  cacheEntryClear(
12430 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
12440 20 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20    p->iReg = 0;. 
12450 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
12460 2a 20 57 68 65 6e 20 61 20 63 61 63 68 65 64 20  * When a cached 
12470 63 6f 6c 75 6d 6e 20 69 73 20 72 65 75 73 65 64  column is reused
12480 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  , make sure that
12490 20 69 74 73 20 72 65 67 69 73 74 65 72 20 69 73   its register is
124a0 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 76  .** no longer av
124b0 61 69 6c 61 62 6c 65 20 61 73 20 61 20 74 65 6d  ailable as a tem
124c0 70 20 72 65 67 69 73 74 65 72 2e 20 20 74 69 63  p register.  tic
124d0 6b 65 74 20 23 33 38 37 39 3a 20 20 74 68 61 74  ket #3879:  that
124e0 20 73 61 6d 65 0a 2a 2a 20 72 65 67 69 73 74 65   same.** registe
124f0 72 20 6d 69 67 68 74 20 62 65 20 69 6e 20 74 68  r might be in th
12500 65 20 63 61 63 68 65 20 69 6e 20 6d 75 6c 74 69  e cache in multi
12510 70 6c 65 20 70 6c 61 63 65 73 2c 20 73 6f 20 62  ple places, so b
12520 65 20 73 75 72 65 20 74 6f 0a 2a 2a 20 67 65 74  e sure to.** get
12530 20 74 68 65 6d 20 61 6c 6c 2e 0a 2a 2f 0a 73 74   them all..*/.st
12540 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
12550 33 45 78 70 72 43 61 63 68 65 50 69 6e 52 65 67  3ExprCachePinReg
12560 69 73 74 65 72 28 50 61 72 73 65 20 2a 70 50 61  ister(Parse *pPa
12570 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a  rse, int iReg){.
12580 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
12590 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
125a0 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
125b0 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
125c0 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
125d0 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
125e0 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d      if( p->iReg=
125f0 3d 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20 70  =iReg ){.      p
12600 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20  ->tempReg = 0;. 
12610 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
12620 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
12630 74 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 76  to extract the v
12640 61 6c 75 65 20 6f 66 20 74 68 65 20 69 43 6f 6c  alue of the iCol
12650 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20  -th column of a 
12660 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  table..*/.void s
12670 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
12680 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 0a  tColumnOfTable(.
12690 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
126a0 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 75 6e    /* The VDBE un
126b0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
126c0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
126d0 62 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62  b,    /* The tab
126e0 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
126f0 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  e value */.  int
12700 20 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20   iTabCur,    /* 
12710 54 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20 74  The cursor for t
12720 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  his table */.  i
12730 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 2f  nt iCol,       /
12740 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63  * Index of the c
12750 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61 63 74  olumn to extract
12760 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74   */.  int regOut
12770 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74        /* Extract
12780 20 74 68 65 20 76 61 6c 75 64 20 69 6e 74 6f 20   the valud into 
12790 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f  this register */
127a0 0a 29 7b 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30  .){.  if( iCol<0
127b0 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e   || iCol==pTab->
127c0 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c  iPKey ){.    sql
127d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
127e0 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62  , OP_Rowid, iTab
127f0 43 75 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  Cur, regOut);.  
12800 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6f  }else{.    int o
12810 70 20 3d 20 49 73 56 69 72 74 75 61 6c 28 70 54  p = IsVirtual(pT
12820 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e  ab) ? OP_VColumn
12830 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20   : OP_Column;.  
12840 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12850 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54 61 62 43  Op3(v, op, iTabC
12860 75 72 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74  ur, iCol, regOut
12870 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f  );.  }.  if( iCo
12880 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  l>=0 ){.    sqli
12890 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74  te3ColumnDefault
128a0 28 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20  (v, pTab, iCol, 
128b0 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  regOut);.  }.}..
128c0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
128d0 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 78  ode that will ex
128e0 74 72 61 63 74 20 74 68 65 20 69 43 6f 6c 75 6d  tract the iColum
128f0 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d  n-th column from
12900 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61 62 20 61  .** table pTab a
12910 6e 64 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c  nd store the col
12920 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 61 20 72  umn value in a r
12930 65 67 69 73 74 65 72 2e 20 20 41 6e 20 65 66 66  egister.  An eff
12940 6f 72 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74  ort.** is made t
12950 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75  o store the colu
12960 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  mn value in regi
12970 73 74 65 72 20 69 52 65 67 2c 20 62 75 74 20 74  ster iReg, but t
12980 68 69 73 20 69 73 0a 2a 2a 20 6e 6f 74 20 67 75  his is.** not gu
12990 61 72 61 6e 74 65 65 64 2e 20 20 54 68 65 20 6c  aranteed.  The l
129a0 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63  ocation of the c
129b0 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 72  olumn value is r
129c0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
129d0 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20  here must be an 
129e0 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 6f 20 70  open cursor to p
129f0 54 61 62 20 69 6e 20 69 54 61 62 6c 65 20 77 68  Tab in iTable wh
12a00 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
12a10 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 49  ** is called.  I
12a20 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e  f iColumn<0 then
12a30 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74   code is generat
12a40 65 64 20 74 68 61 74 20 65 78 74 72 61 63 74 73  ed that extracts
12a50 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69   the rowid..*/.i
12a60 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
12a70 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50  deGetColumn(.  P
12a80 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
12a90 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
12aa0 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
12ab0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c  ontext */.  Tabl
12ac0 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20  e *pTab,     /* 
12ad0 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  Description of t
12ae0 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20  he table we are 
12af0 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a  reading from */.
12b00 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
12b10 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
12b20 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20  he table column 
12b30 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
12b40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
12b50 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
12b60 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  the table */.  i
12b70 6e 74 20 69 52 65 67 2c 20 20 20 20 20 20 20 20  nt iReg,        
12b80 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73  /* Store results
12b90 20 68 65 72 65 20 2a 2f 0a 20 20 75 38 20 70 35   here */.  u8 p5
12ba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
12bb0 35 20 76 61 6c 75 65 20 66 6f 72 20 4f 50 5f 43  5 value for OP_C
12bc0 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 56 64  olumn */.){.  Vd
12bd0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
12be0 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
12bf0 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
12c00 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28 69 3d  he *p;..  for(i=
12c10 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
12c20 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
12c30 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
12c40 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , p++){.    if( 
12c50 70 2d 3e 69 52 65 67 3e 30 20 26 26 20 70 2d 3e  p->iReg>0 && p->
12c60 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26  iTable==iTable &
12c70 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43  & p->iColumn==iC
12c80 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70  olumn ){.      p
12c90 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e  ->lru = pParse->
12ca0 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20  iCacheCnt++;.   
12cb0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
12cc0 63 68 65 50 69 6e 52 65 67 69 73 74 65 72 28 70  chePinRegister(p
12cd0 50 61 72 73 65 2c 20 70 2d 3e 69 52 65 67 29 3b  Parse, p->iReg);
12ce0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d  .      return p-
12cf0 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d  >iReg;.    }.  }
12d00 20 20 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d    .  assert( v!=
12d10 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  0 );.  sqlite3Ex
12d20 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f  prCodeGetColumnO
12d30 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20  fTable(v, pTab, 
12d40 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c  iTable, iColumn,
12d50 20 69 52 65 67 29 3b 0a 20 20 69 66 28 20 70 35   iReg);.  if( p5
12d60 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
12d70 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70  dbeChangeP5(v, p
12d80 35 29 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 20 0a  5);.  }else{   .
12d90 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
12da0 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65  acheStore(pParse
12db0 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d  , iTable, iColum
12dc0 6e 2c 20 69 52 65 67 29 3b 0a 20 20 7d 0a 20 20  n, iReg);.  }.  
12dd0 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a  return iReg;.}..
12de0 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 6c 6c 20  /*.** Clear all 
12df0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 65 6e 74  column cache ent
12e00 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ries..*/.void sq
12e10 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
12e20 65 61 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ear(Parse *pPars
12e30 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  e){.  int i;.  s
12e40 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
12e50 2a 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20  *p;..  for(i=0, 
12e60 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
12e70 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
12e80 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
12e90 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
12ea0 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20 63 61  iReg ){.      ca
12eb0 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50  cheEntryClear(pP
12ec0 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20  arse, p);.      
12ed0 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20  p->iReg = 0;.   
12ee0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
12ef0 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
12f00 74 68 61 74 20 61 6e 20 61 66 66 69 6e 69 74 79  that an affinity
12f10 20 63 68 61 6e 67 65 20 68 61 73 20 6f 63 63 75   change has occu
12f20 72 72 65 64 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a  rred on iCount.*
12f30 2a 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  * registers star
12f40 74 69 6e 67 20 77 69 74 68 20 69 53 74 61 72 74  ting with iStart
12f50 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
12f60 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
12f70 74 79 43 68 61 6e 67 65 28 50 61 72 73 65 20 2a  tyChange(Parse *
12f80 70 50 61 72 73 65 2c 20 69 6e 74 20 69 53 74 61  pParse, int iSta
12f90 72 74 2c 20 69 6e 74 20 69 43 6f 75 6e 74 29 7b  rt, int iCount){
12fa0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
12fb0 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65  cheRemove(pParse
12fc0 2c 20 69 53 74 61 72 74 2c 20 69 43 6f 75 6e 74  , iStart, iCount
12fd0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
12fe0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76  rate code to mov
12ff0 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72  e content from r
13000 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e  egisters iFrom..
13010 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a  .iFrom+nReg-1.**
13020 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54   over to iTo..iT
13030 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70 20 74  o+nReg-1. Keep t
13040 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
13050 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76  up-to-date..*/.v
13060 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
13070 6f 64 65 4d 6f 76 65 28 50 61 72 73 65 20 2a 70  odeMove(Parse *p
13080 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d  Parse, int iFrom
13090 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e  , int iTo, int n
130a0 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Reg){.  int i;. 
130b0 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
130c0 65 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  e *p;.  assert( 
130d0 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52 65 67 20  iFrom>=iTo+nReg 
130e0 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65 67 3c 3d 69  || iFrom+nReg<=i
130f0 54 6f 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  To );.  sqlite3V
13100 64 62 65 41 64 64 4f 70 33 28 70 50 61 72 73 65  dbeAddOp3(pParse
13110 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65  ->pVdbe, OP_Move
13120 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52  , iFrom, iTo, nR
13130 65 67 2d 31 29 3b 0a 20 20 66 6f 72 28 69 3d 30  eg-1);.  for(i=0
13140 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
13150 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
13160 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
13170 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 78   p++){.    int x
13180 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20   = p->iReg;.    
13190 69 66 28 20 78 3e 3d 69 46 72 6f 6d 20 26 26 20  if( x>=iFrom && 
131a0 78 3c 69 46 72 6f 6d 2b 6e 52 65 67 20 29 7b 0a  x<iFrom+nReg ){.
131b0 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 2b 3d        p->iReg +=
131c0 20 69 54 6f 2d 69 46 72 6f 6d 3b 0a 20 20 20 20   iTo-iFrom;.    
131d0 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66  }.  }.}..#if def
131e0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
131f0 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
13200 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45  LITE_COVERAGE_TE
13210 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ST)./*.** Return
13220 20 74 72 75 65 20 69 66 20 61 6e 79 20 72 65 67   true if any reg
13230 69 73 74 65 72 20 69 6e 20 74 68 65 20 72 61 6e  ister in the ran
13240 67 65 20 69 46 72 6f 6d 2e 2e 69 54 6f 20 28 69  ge iFrom..iTo (i
13250 6e 63 6c 75 73 69 76 65 29 0a 2a 2a 20 69 73 20  nclusive).** is 
13260 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
13270 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
13280 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
13290 74 69 6e 65 20 69 73 20 75 73 65 64 20 77 69 74  tine is used wit
132a0 68 69 6e 20 61 73 73 65 72 74 28 29 20 61 6e 64  hin assert() and
132b0 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72   testcase() macr
132c0 6f 73 20 6f 6e 6c 79 0a 2a 2a 20 61 6e 64 20 64  os only.** and d
132d0 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69  oes not appear i
132e0 6e 20 61 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64  n a normal build
132f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13300 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68  usedAsColumnCach
13310 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
13320 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20   int iFrom, int 
13330 69 54 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  iTo){.  int i;. 
13340 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
13350 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  e *p;.  for(i=0,
13360 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
13370 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
13380 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
13390 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20  p++){.    int r 
133a0 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69  = p->iReg;.    i
133b0 66 28 20 72 3e 3d 69 46 72 6f 6d 20 26 26 20 72  f( r>=iFrom && r
133c0 3c 3d 69 54 6f 20 29 20 72 65 74 75 72 6e 20 31  <=iTo ) return 1
133d0 3b 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f  ;    /*NO_TEST*/
133e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
133f0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
13400 49 54 45 5f 44 45 42 55 47 20 7c 7c 20 53 51 4c  ITE_DEBUG || SQL
13410 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53  ITE_COVERAGE_TES
13420 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  T */../*.** Gene
13430 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
13440 68 65 20 63 75 72 72 65 6e 74 20 56 64 62 65 20  he current Vdbe 
13450 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
13460 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73  given.** express
13470 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f  ion.  Attempt to
13480 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
13490 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 22  ts in register "
134a0 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75  target"..** Retu
134b0 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20  rn the register 
134c0 77 68 65 72 65 20 72 65 73 75 6c 74 73 20 61 72  where results ar
134d0 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  e stored..**.** 
134e0 57 69 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  With this routin
134f0 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67  e, there is no g
13500 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 72 65  uarantee that re
13510 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65  sults will.** be
13520 20 73 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65   stored in targe
13530 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d  t.  The result m
13540 69 67 68 74 20 62 65 20 73 74 6f 72 65 64 20 69  ight be stored i
13550 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  n some other.** 
13560 72 65 67 69 73 74 65 72 20 69 66 20 69 74 20 69  register if it i
13570 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20  s convenient to 
13580 64 6f 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c  do so.  The call
13590 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ing function.** 
135a0 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 72  must check the r
135b0 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d  eturn code and m
135c0 6f 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ove the results 
135d0 74 6f 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a  to the desired.*
135e0 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69  * register..*/.i
135f0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
13600 64 65 54 61 72 67 65 74 28 50 61 72 73 65 20 2a  deTarget(Parse *
13610 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
13620 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
13630 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
13640 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a  arse->pVdbe;  /*
13650 20 54 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f   The VM under co
13660 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
13670 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
13680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
13690 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f   opcode being co
136a0 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52  ded */.  int inR
136b0 65 67 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20  eg = target;    
136c0 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74     /* Results st
136d0 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ored in register
136e0 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20   inReg */.  int 
136f0 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20  regFree1 = 0;   
13700 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d        /* If non-
13710 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74  zero free this t
13720 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
13730 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72  r */.  int regFr
13740 65 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ee2 = 0;        
13750 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20   /* If non-zero 
13760 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72  free this tempor
13770 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ary register */.
13780 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33    int r1, r2, r3
13790 2c 20 72 34 3b 20 20 20 20 20 20 20 2f 2a 20 56  , r4;       /* V
137a0 61 72 69 6f 75 73 20 72 65 67 69 73 74 65 72 20  arious register 
137b0 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 73 71 6c  numbers */.  sql
137c0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
137d0 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64 61  e->db; /* The da
137e0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
137f0 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  n */..  assert( 
13800 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67  target>0 && targ
13810 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  et<=pParse->nMem
13820 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29   );.  if( v==0 )
13830 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
13840 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
13850 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65  Failed );.    re
13860 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69  turn 0;.  }..  i
13870 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20  f( pExpr==0 ){. 
13880 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b     op = TK_NULL;
13890 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70  .  }else{.    op
138a0 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
138b0 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  }.  switch( op )
138c0 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
138d0 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  G_COLUMN: {.    
138e0 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49    AggInfo *pAggI
138f0 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67  nfo = pExpr->pAg
13900 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72  gInfo;.      str
13910 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
13920 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66  *pCol = &pAggInf
13930 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  o->aCol[pExpr->i
13940 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  Agg];.      if( 
13950 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63  !pAggInfo->direc
13960 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  tMode ){.       
13970 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69   assert( pCol->i
13980 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  Mem>0 );.       
13990 20 69 6e 52 65 67 20 3d 20 70 43 6f 6c 2d 3e 69   inReg = pCol->i
139a0 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 62 72 65  Mem;.        bre
139b0 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ak;.      }else 
139c0 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73  if( pAggInfo->us
139d0 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20  eSortingIdx ){. 
139e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
139f0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
13a00 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d  olumn, pAggInfo-
13a10 3e 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62 2c  >sortingIdxPTab,
13a20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
13a40 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
13a50 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  mn, target);.   
13a60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13a70 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68    }.      /* Oth
13a80 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72  erwise, fall thr
13a90 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f  u into the TK_CO
13aa0 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20  LUMN case */.   
13ab0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
13ac0 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69  OLUMN: {.      i
13ad0 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
13ae0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  <0 ){.        /*
13af0 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65   This only happe
13b00 6e 73 20 77 68 65 6e 20 63 6f 64 69 6e 67 20 63  ns when coding c
13b10 68 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74 73  heck constraints
13b20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
13b30 72 74 28 20 70 50 61 72 73 65 2d 3e 63 6b 42 61  rt( pParse->ckBa
13b40 73 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  se>0 );.        
13b50 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69  inReg = pExpr->i
13b60 43 6f 6c 75 6d 6e 20 2b 20 70 50 61 72 73 65 2d  Column + pParse-
13b70 3e 63 6b 42 61 73 65 3b 0a 20 20 20 20 20 20 7d  >ckBase;.      }
13b80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
13b90 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
13ba0 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70  rCodeGetColumn(p
13bb0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 54  Parse, pExpr->pT
13bc0 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab,.            
13bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13be0 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
13bf0 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  umn, pExpr->iTab
13c00 6c 65 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20  le, target,.    
13c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
13c30 70 72 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 20 20  pr->op2);.      
13c40 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
13c50 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
13c60 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
13c70 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50    codeInteger(pP
13c80 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20  arse, pExpr, 0, 
13c90 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62  target);.      b
13ca0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
13cb0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13cc0 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
13cd0 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
13ce0 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
13cf0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
13d00 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
13d10 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
13d20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 45 78 70  codeReal(v, pExp
13d30 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20  r->u.zToken, 0, 
13d40 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62  target);.      b
13d50 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
13d60 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  if.    case TK_S
13d70 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61  TRING: {.      a
13d80 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
13d90 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
13da0 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
13db0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13dc0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72  AddOp4(v, OP_Str
13dd0 69 6e 67 38 2c 20 30 2c 20 74 61 72 67 65 74 2c  ing8, 0, target,
13de0 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f   0, pExpr->u.zTo
13df0 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  ken, 0);.      b
13e00 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
13e10 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a  case TK_NULL: {.
13e20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13e30 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
13e40 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
13e50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13e60 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
13e70 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45  E_OMIT_BLOB_LITE
13e80 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  RAL.    case TK_
13e90 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e  BLOB: {.      in
13ea0 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  t n;.      const
13eb0 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20   char *z;.      
13ec0 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20  char *zBlob;.   
13ed0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
13ee0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
13ef0 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
13f00 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
13f10 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
13f20 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70  [0]=='x' || pExp
13f30 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  r->u.zToken[0]==
13f40 27 58 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73  'X' );.      ass
13f50 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
13f60 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b  oken[1]=='\'' );
13f70 0a 20 20 20 20 20 20 7a 20 3d 20 26 70 45 78 70  .      z = &pExp
13f80 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a  r->u.zToken[2];.
13f90 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65        n = sqlite
13fa0 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31  3Strlen30(z) - 1
13fb0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13fc0 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20  z[n]=='\'' );.  
13fd0 20 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69      zBlob = sqli
13fe0 74 65 33 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c  te3HexToBlob(sql
13ff0 69 74 65 33 56 64 62 65 44 62 28 76 29 2c 20 7a  ite3VdbeDb(v), z
14000 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , n);.      sqli
14010 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
14020 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74   OP_Blob, n/2, t
14030 61 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c  arget, 0, zBlob,
14040 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
14050 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
14060 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
14070 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a   TK_VARIABLE: {.
14080 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
14090 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
140a0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
140b0 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  e) );.      asse
140c0 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
140d0 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ken!=0 );.      
140e0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
140f0 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b  .zToken[0]!=0 );
14100 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
14110 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56  beAddOp2(v, OP_V
14120 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e  ariable, pExpr->
14130 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29  iColumn, target)
14140 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
14150 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d  r->u.zToken[1]!=
14160 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
14170 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
14180 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20 0a 20 20  oken[0]=='?' .  
14190 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74             || st
141a0 72 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  rcmp(pExpr->u.zT
141b0 6f 6b 65 6e 2c 20 70 50 61 72 73 65 2d 3e 61 7a  oken, pParse->az
141c0 56 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  Var[pExpr->iColu
141d0 6d 6e 2d 31 5d 29 3d 3d 30 20 29 3b 0a 20 20 20  mn-1])==0 );.   
141e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
141f0 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
14200 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 70 45  pParse->azVar[pE
14210 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 2c  xpr->iColumn-1],
14220 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
14230 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
14240 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
14250 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a   TK_REGISTER: {.
14260 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45        inReg = pE
14270 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  xpr->iTable;.   
14280 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
14290 20 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 20      case TK_AS: 
142a0 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  {.      inReg = 
142b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
142c0 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
142d0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67  xpr->pLeft, targ
142e0 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  et);.      break
142f0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
14300 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
14310 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53  .    case TK_CAS
14320 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78  T: {.      /* Ex
14330 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
14340 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c   form:   CAST(pL
14350 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f  eft AS token) */
14360 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66 2c 20  .      int aff, 
14370 74 6f 5f 6f 70 3b 0a 20 20 20 20 20 20 69 6e 52  to_op;.      inR
14380 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
14390 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
143a0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
143b0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
143c0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
143d0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
143e0 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
143f0 20 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69        aff = sqli
14400 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
14410 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
14420 3b 0a 20 20 20 20 20 20 74 6f 5f 6f 70 20 3d 20  ;.      to_op = 
14430 61 66 66 20 2d 20 53 51 4c 49 54 45 5f 41 46 46  aff - SQLITE_AFF
14440 5f 54 45 58 54 20 2b 20 4f 50 5f 54 6f 54 65 78  _TEXT + OP_ToTex
14450 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
14460 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78   to_op==OP_ToTex
14470 74 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c  t    || aff!=SQL
14480 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20  ITE_AFF_TEXT    
14490 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
144a0 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f   to_op==OP_ToBlo
144b0 62 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c  b    || aff!=SQL
144c0 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 20 20 20  ITE_AFF_NONE    
144d0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
144e0 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d   to_op==OP_ToNum
144f0 65 72 69 63 20 7c 7c 20 61 66 66 21 3d 53 51 4c  eric || aff!=SQL
14500 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
14510 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14520 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74   to_op==OP_ToInt
14530 20 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c       || aff!=SQL
14540 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
14550 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14560 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61   to_op==OP_ToRea
14570 6c 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c  l    || aff!=SQL
14580 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 20 20 20  ITE_AFF_REAL    
14590 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
145a0 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54  e( to_op==OP_ToT
145b0 65 78 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ext );.      tes
145c0 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50  tcase( to_op==OP
145d0 5f 54 6f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20  _ToBlob );.     
145e0 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70   testcase( to_op
145f0 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 20 29  ==OP_ToNumeric )
14600 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14610 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e  ( to_op==OP_ToIn
14620 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
14630 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ase( to_op==OP_T
14640 6f 52 65 61 6c 20 29 3b 0a 20 20 20 20 20 20 69  oReal );.      i
14650 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74  f( inReg!=target
14660 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
14670 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14680 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67   OP_SCopy, inReg
14690 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
146a0 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65     inReg = targe
146b0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
146c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
146d0 70 31 28 76 2c 20 74 6f 5f 6f 70 2c 20 69 6e 52  p1(v, to_op, inR
146e0 65 67 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  eg);.      testc
146f0 61 73 65 28 20 75 73 65 64 41 73 43 6f 6c 75 6d  ase( usedAsColum
14700 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 69  nCache(pParse, i
14710 6e 52 65 67 2c 20 69 6e 52 65 67 29 20 29 3b 0a  nReg, inReg) );.
14720 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
14730 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
14740 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 6e 52  ange(pParse, inR
14750 65 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72  eg, 1);.      br
14760 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
14770 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
14780 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73  _CAST */.    cas
14790 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
147a0 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
147b0 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
147c0 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
147d0 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
147e0 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
147f0 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d   assert( TK_LT==
14800 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61  OP_Lt );.      a
14810 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50  ssert( TK_LE==OP
14820 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Le );.      ass
14830 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47  ert( TK_GT==OP_G
14840 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
14850 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20  t( TK_GE==OP_Ge 
14860 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14870 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b   TK_EQ==OP_Eq );
14880 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
14890 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20  K_NE==OP_Ne );. 
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 54 20 29 3b 0a 20 20 20 20  p==TK_LT );.    
148c0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
148d0 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_LE );.      t
148e0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
148f0 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GT );.      test
14900 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45 20  case( op==TK_GE 
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 45 51 20 29 3b 0a  e( op==TK_EQ );.
14930 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14940 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20  op==TK_NE );.   
14950 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
14960 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
14970 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
14980 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
14990 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
149a0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
149b0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
149c0 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
149d0 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
149e0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
149f0 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
14a00 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
14a10 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
14a20 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49   r2, inReg, SQLI
14a30 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20  TE_STOREP2);.   
14a40 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
14a50 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
14a60 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
14a70 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
14a80 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
14a90 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20    case TK_IS:.  
14aa0 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a    case TK_ISNOT:
14ab0 20 7b 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 20 29 3b 0a  e( op==TK_IS );.
14ad0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14ae0 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a  op==TK_ISNOT );.
14af0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
14b00 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
14b10 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
14b20 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
14b30 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
14b40 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
14b50 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
14b60 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
14b70 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f  );.      op = (o
14b80 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45  p==TK_IS) ? TK_E
14b90 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20  Q : TK_NE;.     
14ba0 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
14bb0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
14bc0 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
14bd0 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
14be0 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
14bf0 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54  inReg, SQLITE_ST
14c00 4f 52 45 50 32 20 7c 20 53 51 4c 49 54 45 5f 4e  OREP2 | SQLITE_N
14c10 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65  ULLEQ);.      te
14c20 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
14c30 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
14c40 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
14c50 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
14c60 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
14c70 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61  e TK_AND:.    ca
14c80 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61  se TK_OR:.    ca
14c90 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20  se TK_PLUS:.    
14ca0 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20  case TK_STAR:.  
14cb0 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a    case TK_MINUS:
14cc0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d  .    case TK_REM
14cd0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  :.    case TK_BI
14ce0 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54  TAND:.    case T
14cf0 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73  K_BITOR:.    cas
14d00 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20  e TK_SLASH:.    
14d10 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a  case TK_LSHIFT:.
14d20 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49      case TK_RSHI
14d30 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b  FT: .    case TK
14d40 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20  _CONCAT: {.     
14d50 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d   assert( TK_AND=
14d60 3d 4f 50 5f 41 6e 64 20 29 3b 0a 20 20 20 20 20  =OP_And );.     
14d70 20 61 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d   assert( TK_OR==
14d80 4f 50 5f 4f 72 20 29 3b 0a 20 20 20 20 20 20 61  OP_Or );.      a
14d90 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d  ssert( TK_PLUS==
14da0 4f 50 5f 41 64 64 20 29 3b 0a 20 20 20 20 20 20  OP_Add );.      
14db0 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53  assert( TK_MINUS
14dc0 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b  ==OP_Subtract );
14dd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
14de0 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e  K_REM==OP_Remain
14df0 64 65 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  der );.      ass
14e00 65 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d  ert( TK_BITAND==
14e10 4f 50 5f 42 69 74 41 6e 64 20 29 3b 0a 20 20 20  OP_BitAnd );.   
14e20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
14e30 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b  TOR==OP_BitOr );
14e40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
14e50 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69  K_SLASH==OP_Divi
14e60 64 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  de );.      asse
14e70 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f  rt( TK_LSHIFT==O
14e80 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 0a 20  P_ShiftLeft );. 
14e90 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
14ea0 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74  RSHIFT==OP_Shift
14eb0 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20 61  Right );.      a
14ec0 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54  ssert( TK_CONCAT
14ed0 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 0a 20  ==OP_Concat );. 
14ee0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
14ef0 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20  p==TK_AND );.   
14f00 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
14f10 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20  =TK_OR );.      
14f20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
14f30 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20 20 20 74  _PLUS );.      t
14f40 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
14f50 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20 20 20 74  MINUS );.      t
14f60 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
14f70 52 45 4d 20 29 3b 0a 20 20 20 20 20 20 74 65 73  REM );.      tes
14f80 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49  tcase( op==TK_BI
14f90 54 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 74 65  TAND );.      te
14fa0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42  stcase( op==TK_B
14fb0 49 54 4f 52 20 29 3b 0a 20 20 20 20 20 20 74 65  ITOR );.      te
14fc0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53  stcase( op==TK_S
14fd0 4c 41 53 48 20 29 3b 0a 20 20 20 20 20 20 74 65  LASH );.      te
14fe0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c  stcase( op==TK_L
14ff0 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 74  SHIFT );.      t
15000 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
15010 52 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20  RSHIFT );.      
15020 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
15030 5f 43 4f 4e 43 41 54 20 29 3b 0a 20 20 20 20 20  _CONCAT );.     
15040 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
15050 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
15060 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
15070 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
15080 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
15090 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
150a0 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
150b0 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
150c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
150d0 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c  ddOp3(v, op, r2,
150e0 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   r1, target);.  
150f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
15100 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
15110 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
15120 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
15130 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
15140 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
15150 53 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20  S: {.      Expr 
15160 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
15170 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 61 73 73  pLeft;.      ass
15180 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20  ert( pLeft );.  
15190 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f      if( pLeft->o
151a0 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b  p==TK_INTEGER ){
151b0 0a 20 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74  .        codeInt
151c0 65 67 65 72 28 70 50 61 72 73 65 2c 20 70 4c 65  eger(pParse, pLe
151d0 66 74 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a  ft, 1, target);.
151e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
151f0 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
15200 4e 54 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  NT.      }else i
15210 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  f( pLeft->op==TK
15220 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20  _FLOAT ){.      
15230 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
15240 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
15250 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
15260 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65  ;.        codeRe
15270 61 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a  al(v, pLeft->u.z
15280 54 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67 65 74  Token, 1, target
15290 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
152a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
152b0 65 67 46 72 65 65 31 20 3d 20 72 31 20 3d 20 73  egFree1 = r1 = s
152c0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
152d0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
152e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
152f0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
15300 72 2c 20 30 2c 20 72 31 29 3b 0a 20 20 20 20 20  r, 0, r1);.     
15310 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
15320 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
15330 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
15340 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
15350 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15360 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75  eAddOp3(v, OP_Su
15370 62 74 72 61 63 74 2c 20 72 32 2c 20 72 31 2c 20  btract, r2, r1, 
15380 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
15390 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
153a0 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
153b0 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  }.      inReg = 
153c0 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 62 72  target;.      br
153d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
153e0 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20  ase TK_BITNOT:. 
153f0 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
15400 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
15410 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69  TK_BITNOT==OP_Bi
15420 74 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 61 73  tNot );.      as
15430 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50  sert( TK_NOT==OP
15440 5f 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 74 65  _Not );.      te
15450 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42  stcase( op==TK_B
15460 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 74  ITNOT );.      t
15470 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
15480 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20  NOT );.      r1 
15490 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
154a0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
154b0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
154c0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65  Free1);.      te
154d0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
154e0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 6e 52  ==0 );.      inR
154f0 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20  eg = target;.   
15500 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15510 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20  dOp2(v, op, r1, 
15520 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72  inReg);.      br
15530 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
15540 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
15550 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
15560 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  LL: {.      int 
15570 61 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65  addr;.      asse
15580 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f  rt( TK_ISNULL==O
15590 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20  P_IsNull );.    
155a0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
155b0 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  NULL==OP_NotNull
155c0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
155d0 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  se( op==TK_ISNUL
155e0 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  L );.      testc
155f0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  ase( op==TK_NOTN
15600 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ULL );.      sql
15610 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15620 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
15630 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
15640 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
15650 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
15660 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
15670 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
15680 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
15690 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
156a0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
156b0 62 65 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20  beAddOp1(v, op, 
156c0 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
156d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
156e0 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65  OP_AddImm, targe
156f0 74 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 73 71  t, -1);.      sq
15700 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
15710 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
15720 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
15730 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
15740 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
15750 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20   AggInfo *pInfo 
15760 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66  = pExpr->pAggInf
15770 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  o;.      if( pIn
15780 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  fo==0 ){.       
15790 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
157a0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
157b0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
157c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
157d0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
157e0 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72   "misuse of aggr
157f0 65 67 61 74 65 3a 20 25 73 28 29 22 2c 20 70 45  egate: %s()", pE
15800 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
15810 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15820 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 49 6e       inReg = pIn
15830 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d  fo->aFunc[pExpr-
15840 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20  >iAgg].iMem;.   
15850 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
15860 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
15870 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a   TK_CONST_FUNC:.
15880 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
15890 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  TION: {.      Ex
158a0 70 72 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20  prList *pFarg;  
158b0 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
158c0 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
158d0 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
158e0 6e 46 61 72 67 3b 20 20 20 20 20 20 20 20 20 20  nFarg;          
158f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
15900 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
15910 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63  ts */.      Func
15920 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20 20 20  Def *pDef;      
15930 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69     /* The functi
15940 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 62  on definition ob
15950 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ject */.      in
15960 74 20 6e 49 64 3b 20 20 20 20 20 20 20 20 20 20  t nId;          
15970 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
15980 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e  f the function n
15990 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ame in bytes */.
159a0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
159b0 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a 20   *zId;       /* 
159c0 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  The function nam
159d0 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63  e */.      int c
159e0 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20  onstMask = 0;   
159f0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e    /* Mask of fun
15a00 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
15a10 74 68 61 74 20 61 72 65 20 63 6f 6e 73 74 61 6e  that are constan
15a20 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  t */.      int i
15a30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15a40 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
15a50 72 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 6e  r */.      u8 en
15a60 63 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20  c = ENC(db);    
15a70 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65 6e    /* The text en
15a80 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20 74  coding used by t
15a90 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
15aa0 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
15ab0 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Coll = 0;    /* 
15ac0 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  A collating sequ
15ad0 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61  ence */..      a
15ae0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
15af0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
15b00 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
15b10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15b20 6f 70 3d 3d 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e  op==TK_CONST_FUN
15b30 43 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  C );.      testc
15b40 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 46 55 4e 43  ase( op==TK_FUNC
15b50 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 69 66  TION );.      if
15b60 28 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70  ( ExprHasAnyProp
15b70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54  erty(pExpr, EP_T
15b80 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  okenOnly) ){.   
15b90 20 20 20 20 20 70 46 61 72 67 20 3d 20 30 3b 0a       pFarg = 0;.
15ba0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15bb0 20 20 20 20 20 70 46 61 72 67 20 3d 20 70 45 78       pFarg = pEx
15bc0 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
15bd0 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 61 72 67     }.      nFarg
15be0 20 3d 20 70 46 61 72 67 20 3f 20 70 46 61 72 67   = pFarg ? pFarg
15bf0 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20  ->nExpr : 0;.   
15c00 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
15c10 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
15c20 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
15c30 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 70  );.      zId = p
15c40 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
15c50 20 20 20 20 20 20 6e 49 64 20 3d 20 73 71 6c 69        nId = sqli
15c60 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49 64 29  te3Strlen30(zId)
15c70 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73  ;.      pDef = s
15c80 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
15c90 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c  on(db, zId, nId,
15ca0 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b   nFarg, enc, 0);
15cb0 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d  .      if( pDef=
15cc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
15cd0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
15ce0 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66  arse, "unknown f
15cf0 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73 28 29 22  unction: %.*s()"
15d00 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20  , nId, zId);.   
15d10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15d20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74    }..      /* At
15d30 74 65 6d 70 74 20 61 20 64 69 72 65 63 74 20 69  tempt a direct i
15d40 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
15d50 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 43 4f   the built-in CO
15d60 41 4c 45 53 43 45 28 29 20 61 6e 64 0a 20 20 20  ALESCE() and.   
15d70 20 20 20 2a 2a 20 49 46 4e 55 4c 4c 28 29 20 66     ** IFNULL() f
15d80 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20  unctions.  This 
15d90 61 76 6f 69 64 73 20 75 6e 6e 65 63 65 73 73 61  avoids unnecessa
15da0 72 79 20 65 76 61 6c 61 74 69 6f 6e 20 6f 66 0a  ry evalation of.
15db0 20 20 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e        ** argumen
15dc0 74 73 20 70 61 73 74 20 74 68 65 20 66 69 72 73  ts past the firs
15dd0 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d  t non-NULL argum
15de0 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
15df0 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 6c      if( pDef->fl
15e00 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
15e10 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a 20 20  C_COALESCE ){.  
15e20 20 20 20 20 20 20 69 6e 74 20 65 6e 64 43 6f 61        int endCoa
15e30 6c 65 73 63 65 20 3d 20 73 71 6c 69 74 65 33 56  lesce = sqlite3V
15e40 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
15e50 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
15e60 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20 20   nFarg>=2 );.   
15e70 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
15e80 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61  Code(pParse, pFa
15e90 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  rg->a[0].pExpr, 
15ea0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
15eb0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61 72   for(i=1; i<nFar
15ec0 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
15ed0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15ee0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  dOp2(v, OP_NotNu
15ef0 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e 64 43  ll, target, endC
15f00 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20  oalesce);.      
15f10 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
15f20 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73  acheRemove(pPars
15f30 65 2c 20 74 61 72 67 65 74 2c 20 31 29 3b 0a 20  e, target, 1);. 
15f40 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15f50 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
15f60 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  arse);.         
15f70 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
15f80 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
15f90 61 5b 69 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  a[i].pExpr, targ
15fa0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  et);.          s
15fb0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
15fc0 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20  op(pParse, 1);. 
15fd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15fe0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
15ff0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43  lveLabel(v, endC
16000 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20  oalesce);.      
16010 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
16020 0a 0a 0a 20 20 20 20 20 20 69 66 28 20 70 46 61  ...      if( pFa
16030 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72 31  rg ){.        r1
16040 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
16050 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
16060 46 61 72 67 29 3b 0a 0a 20 20 20 20 20 20 20 20  Farg);..        
16070 2f 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28 29 20  /* For length() 
16080 61 6e 64 20 74 79 70 65 6f 66 28 29 20 66 75 6e  and typeof() fun
16090 63 74 69 6f 6e 73 20 77 69 74 68 20 61 20 63 6f  ctions with a co
160a0 6c 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a 20  lumn argument,. 
160b0 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68         ** set th
160c0 65 20 50 35 20 70 61 72 61 6d 65 74 65 72 20 74  e P5 parameter t
160d0 6f 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20  o the OP_Column 
160e0 6f 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41 47  opcode to OPFLAG
160f0 5f 4c 45 4e 47 54 48 41 52 47 0a 20 20 20 20 20  _LENGTHARG.     
16100 20 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47 5f     ** or OPFLAG_
16110 54 59 50 45 4f 46 41 52 47 20 72 65 73 70 65 63  TYPEOFARG respec
16120 74 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69 64  tively, to avoid
16130 20 75 6e 6e 65 63 65 73 73 61 72 79 20 64 61 74   unnecessary dat
16140 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 61  a.        ** loa
16150 64 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ding..        */
16160 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44  .        if( (pD
16170 65 66 2d 3e 66 6c 61 67 73 20 26 20 28 53 51 4c  ef->flags & (SQL
16180 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 7c  ITE_FUNC_LENGTH|
16190 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45  SQLITE_FUNC_TYPE
161a0 4f 46 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  OF))!=0 ){.     
161b0 20 20 20 20 20 75 38 20 65 78 70 72 4f 70 3b 0a       u8 exprOp;.
161c0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
161d0 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20  ( nFarg==1 );.  
161e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
161f0 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
16200 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r!=0 );.        
16210 20 20 65 78 70 72 4f 70 20 3d 20 70 46 61 72 67    exprOp = pFarg
16220 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
16230 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
16240 65 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  exprOp==TK_COLUM
16250 4e 20 7c 7c 20 65 78 70 72 4f 70 3d 3d 54 4b 5f  N || exprOp==TK_
16260 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  AGG_COLUMN ){.  
16270 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
16280 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45  ( SQLITE_FUNC_LE
16290 4e 47 54 48 3d 3d 4f 50 46 4c 41 47 5f 4c 45 4e  NGTH==OPFLAG_LEN
162a0 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20  GTHARG );.      
162b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51        assert( SQ
162c0 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46  LITE_FUNC_TYPEOF
162d0 3d 3d 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41  ==OPFLAG_TYPEOFA
162e0 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  RG );.          
162f0 20 20 74 65 73 74 63 61 73 65 28 20 70 44 65 66    testcase( pDef
16300 2d 3e 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  ->flags==SQLITE_
16310 46 55 4e 43 5f 4c 45 4e 47 54 48 20 29 3b 0a 20  FUNC_LENGTH );. 
16320 20 20 20 20 20 20 20 20 20 20 20 70 46 61 72 67             pFarg
16330 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
16340 32 20 3d 20 70 44 65 66 2d 3e 66 6c 61 67 73 3b  2 = pDef->flags;
16350 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
16360 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
16370 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
16380 50 75 73 68 28 70 50 61 72 73 65 29 3b 20 20 20  Push(pParse);   
16390 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65 61 32    /* Ticket 2ea2
163a0 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20 20 20  425d34be */.    
163b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
163c0 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
163d0 73 65 2c 20 70 46 61 72 67 2c 20 72 31 2c 20 31  se, pFarg, r1, 1
163e0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
163f0 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
16400 50 61 72 73 65 2c 20 31 29 3b 20 20 20 2f 2a 20  Parse, 1);   /* 
16410 54 69 63 6b 65 74 20 32 65 61 32 34 32 35 64 33  Ticket 2ea2425d3
16420 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c  4be */.      }el
16430 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d  se{.        r1 =
16440 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e   0;.      }.#ifn
16450 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16460 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
16470 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f     /* Possibly o
16480 76 65 72 6c 6f 61 64 20 74 68 65 20 66 75 6e 63  verload the func
16490 74 69 6f 6e 20 69 66 20 74 68 65 20 66 69 72 73  tion if the firs
164a0 74 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 20 20  t argument is.  
164b0 20 20 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c      ** a virtual
164c0 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20   table column.. 
164d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
164e0 20 46 6f 72 20 69 6e 66 69 78 20 66 75 6e 63 74   For infix funct
164f0 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42  ions (LIKE, GLOB
16500 2c 20 52 45 47 45 58 50 2c 20 61 6e 64 20 4d 41  , REGEXP, and MA
16510 54 43 48 29 20 75 73 65 20 74 68 65 0a 20 20 20  TCH) use the.   
16520 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67     ** second arg
16530 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66  ument, not the f
16540 69 72 73 74 2c 20 61 73 20 74 68 65 20 61 72 67  irst, as the arg
16550 75 6d 65 6e 74 20 74 6f 20 74 65 73 74 20 74 6f  ument to test to
16560 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66  .      ** see if
16570 20 69 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20   it is a column 
16580 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  in a virtual tab
16590 6c 65 2e 20 20 54 68 69 73 20 69 73 20 64 6f 6e  le.  This is don
165a0 65 20 62 65 63 61 75 73 65 0a 20 20 20 20 20 20  e because.      
165b0 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72  ** the left oper
165c0 61 6e 64 20 6f 66 20 69 6e 66 69 78 20 66 75 6e  and of infix fun
165d0 63 74 69 6f 6e 73 20 28 74 68 65 20 6f 70 65 72  ctions (the oper
165e0 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 0a 20  and we want to. 
165f0 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20       ** control 
16600 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64  overloading) end
16610 73 20 75 70 20 61 73 20 74 68 65 20 73 65 63 6f  s up as the seco
16620 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
16630 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  he.      ** func
16640 74 69 6f 6e 2e 20 20 54 68 65 20 65 78 70 72 65  tion.  The expre
16650 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22  ssion "A glob B"
16660 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
16670 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f  o .      ** "glo
16680 62 28 42 2c 41 29 2e 20 20 57 65 20 77 61 6e 74  b(B,A).  We want
16690 20 74 6f 20 75 73 65 20 74 68 65 20 41 20 69 6e   to use the A in
166a0 20 22 41 20 67 6c 6f 62 20 42 22 20 74 6f 20 74   "A glob B" to t
166b0 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  est.      ** for
166c0 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f   function overlo
166d0 61 64 69 6e 67 2e 20 20 42 75 74 20 77 65 20 75  ading.  But we u
166e0 73 65 20 74 68 65 20 42 20 74 65 72 6d 20 69 6e  se the B term in
166f0 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20   "glob(B,A)"..  
16700 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
16710 20 6e 46 61 72 67 3e 3d 32 20 26 26 20 28 70 45   nFarg>=2 && (pE
16720 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
16730 49 6e 66 69 78 46 75 6e 63 29 20 29 7b 0a 20 20  InfixFunc) ){.  
16740 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
16750 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64  ite3VtabOverload
16760 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65  Function(db, pDe
16770 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d  f, nFarg, pFarg-
16780 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[1].pExpr);.  
16790 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46      }else if( nF
167a0 61 72 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  arg>0 ){.       
167b0 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56   pDef = sqlite3V
167c0 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74  tabOverloadFunct
167d0 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46  ion(db, pDef, nF
167e0 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d  arg, pFarg->a[0]
167f0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  .pExpr);.      }
16800 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f  .#endif.      fo
16810 72 28 69 3d 30 3b 20 69 3c 6e 46 61 72 67 3b 20  r(i=0; i<nFarg; 
16820 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
16830 28 20 69 3c 33 32 20 26 26 20 73 71 6c 69 74 65  ( i<32 && sqlite
16840 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
16850 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70  pFarg->a[i].pExp
16860 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
16870 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 28 31 3c  constMask |= (1<
16880 3c 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  <i);.        }. 
16890 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65 66         if( (pDef
168a0 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
168b0 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 21  _FUNC_NEEDCOLL)!
168c0 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a  =0 && !pColl ){.
168d0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20            pColl 
168e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
168f0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 46 61  lSeq(pParse, pFa
16900 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  rg->a[i].pExpr);
16910 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16920 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 65   }.      if( pDe
16930 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f->flags & SQLIT
16940 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20  E_FUNC_NEEDCOLL 
16950 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ){.        if( !
16960 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
16970 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a  db->pDfltColl; .
16980 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16990 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
169a0 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30  CollSeq, 0, 0, 0
169b0 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  , (char *)pColl,
169c0 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
169d0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
169e0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
169f0 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 63 6f   OP_Function, co
16a00 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74 61 72  nstMask, r1, tar
16a10 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  get,.           
16a20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
16a30 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46 55 4e  ar*)pDef, P4_FUN
16a40 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73 71 6c  CDEF);.      sql
16a50 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
16a60 28 76 2c 20 28 75 38 29 6e 46 61 72 67 29 3b 0a  (v, (u8)nFarg);.
16a70 20 20 20 20 20 20 69 66 28 20 6e 46 61 72 67 20        if( nFarg 
16a80 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
16a90 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
16aa0 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e  ge(pParse, r1, n
16ab0 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Farg);.      }. 
16ac0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16ad0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
16ae0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
16af0 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
16b00 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
16b10 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 74  ELECT: {.      t
16b20 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
16b30 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20  EXISTS );.      
16b40 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
16b50 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20  _SELECT );.     
16b60 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
16b70 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
16b80 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20  arse, pExpr, 0, 
16b90 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
16ba0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
16bb0 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
16bc0 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d  nt destIfFalse =
16bd0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
16be0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
16bf0 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d  int destIfNull =
16c00 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
16c10 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
16c20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16c30 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
16c40 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
16c50 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
16c60 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  N(pParse, pExpr,
16c70 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65   destIfFalse, de
16c80 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
16c90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16ca0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
16cb0 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 1, target);.  
16cc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
16cd0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
16ce0 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20  estIfFalse);.   
16cf0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16d00 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
16d10 6d 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a 20  m, target, 0);. 
16d20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16d30 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
16d40 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
16d50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16d60 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
16d70 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
16d80 2f 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  /...    /*.    *
16d90 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79  *    x BETWEEN y
16da0 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20   AND z.    **.  
16db0 20 20 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75    ** This is equ
16dc0 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a  ivalent to.    *
16dd0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79  *.    **    x>=y
16de0 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a   AND x<=z.    **
16df0 0a 20 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f  .    ** X is sto
16e00 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
16e10 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73  eft..    ** Y is
16e20 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
16e30 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
16e40 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73  xpr..    ** Z is
16e50 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
16e60 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ->pList->a[1].pE
16e70 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xpr..    */.    
16e80 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
16e90 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70   {.      Expr *p
16ea0 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
16eb0 65 66 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63  eft;.      struc
16ec0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
16ed0 2a 70 4c 49 74 65 6d 20 3d 20 70 45 78 70 72 2d  *pLItem = pExpr-
16ee0 3e 78 2e 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  >x.pList->a;.   
16ef0 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
16f00 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b  = pLItem->pExpr;
16f10 0a 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ..      r1 = sql
16f20 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
16f30 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
16f40 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
16f50 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
16f60 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
16f70 65 2c 20 70 52 69 67 68 74 2c 20 26 72 65 67 46  e, pRight, &regF
16f80 72 65 65 32 29 3b 0a 20 20 20 20 20 20 74 65 73  ree2);.      tes
16f90 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
16fa0 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
16fb0 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
16fc0 30 20 29 3b 0a 20 20 20 20 20 20 72 33 20 3d 20  0 );.      r3 = 
16fd0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
16fe0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
16ff0 20 72 34 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r4 = sqlite3Get
17000 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
17010 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
17020 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
17030 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c  , pRight, OP_Ge,
17040 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17050 20 20 20 72 31 2c 20 72 32 2c 20 72 33 2c 20 53     r1, r2, r3, S
17060 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a  QLITE_STOREP2);.
17070 20 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a        pLItem++;.
17080 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70        pRight = p
17090 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  LItem->pExpr;.  
170a0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
170b0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
170c0 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20  , regFree2);.   
170d0 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
170e0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
170f0 73 65 2c 20 70 52 69 67 68 74 2c 20 26 72 65 67  se, pRight, &reg
17100 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 74 65  Free2);.      te
17110 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
17120 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64  ==0 );.      cod
17130 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
17140 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
17150 4f 50 5f 4c 65 2c 20 72 31 2c 20 72 32 2c 20 72  OP_Le, r1, r2, r
17160 34 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50  4, SQLITE_STOREP
17170 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
17180 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
17190 50 5f 41 6e 64 2c 20 72 33 2c 20 72 34 2c 20 74  P_And, r3, r4, t
171a0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
171b0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
171c0 52 65 67 28 70 50 61 72 73 65 2c 20 72 33 29 3b  Reg(pParse, r3);
171d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
171e0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
171f0 72 73 65 2c 20 72 34 29 3b 0a 20 20 20 20 20 20  rse, r4);.      
17200 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
17210 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45   case TK_COLLATE
17220 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  : .    case TK_U
17230 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e  PLUS: {.      in
17240 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
17250 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
17260 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
17270 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
17280 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
17290 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47     case TK_TRIGG
172a0 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ER: {.      /* I
172b0 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20  f the opcode is 
172c0 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e  TK_TRIGGER, then
172d0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
172e0 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20  is a reference. 
172f0 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c       ** to a col
17300 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a  umn in the new.*
17310 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f   or old.* pseudo
17320 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c  -tables availabl
17330 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72  e to.      ** tr
17340 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20  igger programs. 
17350 49 6e 20 74 68 69 73 20 63 61 73 65 20 45 78 70  In this case Exp
17360 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20  r.iTable is set 
17370 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20  to 1 for the.   
17380 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75     ** new.* pseu
17390 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66  do-table, or 0 f
173a0 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65  or the old.* pse
173b0 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e  udo-table. Expr.
173c0 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a  iColumn.      **
173d0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63   is set to the c
173e0 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65  olumn of the pse
173f0 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61  udo-table to rea
17400 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20  d, or to -1 to. 
17410 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65       ** read the
17420 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20   rowid field..  
17430 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
17440 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
17450 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73  s implemented us
17460 69 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20  ing an OP_Param 
17470 6f 70 63 6f 64 65 2e 20 54 68 65 20 70 31 0a 20  opcode. The p1. 
17480 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65       ** paramete
17490 72 20 69 73 20 73 65 74 20 74 6f 20 30 20 66 6f  r is set to 0 fo
174a0 72 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72  r an old.rowid r
174b0 65 66 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20  eference, or to 
174c0 28 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20 74  (i+1).      ** t
174d0 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e 6f 74  o reference anot
174e0 68 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  her column of th
174f0 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  e old.* pseudo-t
17500 61 62 6c 65 2c 20 77 68 65 72 65 20 0a 20 20 20  able, where .   
17510 20 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69     ** i is the i
17520 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75  ndex of the colu
17530 6d 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f  mn. For a new.ro
17540 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 70  wid reference, p
17550 31 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 73 65  1 is.      ** se
17560 74 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72  t to (n+1), wher
17570 65 20 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e n is the numbe
17580 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
17590 65 61 63 68 20 70 73 65 75 64 6f 2d 74 61 62 6c  each pseudo-tabl
175a0 65 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  e..      ** For 
175b0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
175c0 6e 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20  ny other column 
175d0 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70 73 65  in the new.* pse
175e0 75 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20  udo-table, p1.  
175f0 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f      ** is set to
17600 20 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65 20   (n+2+i), where 
17610 6e 20 61 6e 64 20 69 20 61 72 65 20 61 73 20 64  n and i are as d
17620 65 66 69 6e 65 64 20 70 72 65 76 69 6f 75 73 6c  efined previousl
17630 79 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20  y. For.      ** 
17640 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
17650 74 61 62 6c 65 20 6f 6e 20 77 68 69 63 68 20 74  table on which t
17660 72 69 67 67 65 72 73 20 61 72 65 20 62 65 69 6e  riggers are bein
17670 67 20 66 69 72 65 64 20 69 73 0a 20 20 20 20 20  g fired is.     
17680 20 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73 3a   ** declared as:
17690 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
176a0 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
176b0 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
176c0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
176d0 65 6e 20 70 31 20 69 73 20 69 6e 74 65 72 70 72  en p1 is interpr
176e0 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  eted as follows:
176f0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
17700 2a 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20  **   p1==0   -> 
17710 20 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20     old.rowid    
17720 20 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e   p1==3   ->    n
17730 65 77 2e 72 6f 77 69 64 0a 20 20 20 20 20 20 2a  ew.rowid.      *
17740 2a 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20  *   p1==1   ->  
17750 20 20 6f 6c 64 2e 61 20 20 20 20 20 20 20 20 20    old.a         
17760 70 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65  p1==4   ->    ne
17770 77 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20 20 70  w.a.      **   p
17780 31 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64  1==2   ->    old
17790 2e 62 20 20 20 20 20 20 20 20 20 70 31 3d 3d 35  .b         p1==5
177a0 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20     ->    new.b  
177b0 20 20 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20       .      */. 
177c0 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
177d0 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a   = pExpr->pTab;.
177e0 20 20 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70        int p1 = p
177f0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28  Expr->iTable * (
17800 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20  pTab->nCol+1) + 
17810 31 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  1 + pExpr->iColu
17820 6d 6e 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  mn;..      asser
17830 74 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t( pExpr->iTable
17840 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54  ==0 || pExpr->iT
17850 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20  able==1 );.     
17860 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
17870 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70  iColumn>=-1 && p
17880 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54  Expr->iColumn<pT
17890 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  ab->nCol );.    
178a0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
178b0 69 50 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70 72  iPKey<0 || pExpr
178c0 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d  ->iColumn!=pTab-
178d0 3e 69 50 4b 65 79 20 29 3b 0a 20 20 20 20 20 20  >iPKey );.      
178e0 61 73 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26  assert( p1>=0 &&
178f0 20 70 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a   p1<(pTab->nCol*
17900 32 2b 32 29 20 29 3b 0a 0a 20 20 20 20 20 20 73  2+2) );..      s
17910 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17920 28 76 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31  (v, OP_Param, p1
17930 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
17940 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
17950 20 22 25 73 2e 25 73 20 2d 3e 20 24 25 64 22 2c   "%s.%s -> $%d",
17960 0a 20 20 20 20 20 20 20 20 28 70 45 78 70 72 2d  .        (pExpr-
17970 3e 69 54 61 62 6c 65 20 3f 20 22 6e 65 77 22 20  >iTable ? "new" 
17980 3a 20 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20 20  : "old"),.      
17990 20 20 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d    (pExpr->iColum
179a0 6e 3c 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20  n<0 ? "rowid" : 
179b0 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f  pExpr->pTab->aCo
179c0 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  l[pExpr->iColumn
179d0 5d 2e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20  ].zName),.      
179e0 20 20 74 61 72 67 65 74 0a 20 20 20 20 20 20 29    target.      )
179f0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
17a00 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
17a10 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20  _POINT.      /* 
17a20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61  If the column ha
17a30 73 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2c  s REAL affinity,
17a40 20 69 74 20 6d 61 79 20 63 75 72 72 65 6e 74 6c   it may currentl
17a50 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61  y be stored as a
17a60 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67  n.      ** integ
17a70 65 72 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c 41  er. Use OP_RealA
17a80 66 66 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20  ffinity to make 
17a90 73 75 72 65 20 69 74 20 69 73 20 72 65 61 6c 6c  sure it is reall
17aa0 79 20 72 65 61 6c 2e 20 20 2a 2f 0a 20 20 20 20  y real.  */.    
17ab0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
17ac0 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20 20  lumn>=0 .       
17ad0 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45  && pTab->aCol[pE
17ae0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66  xpr->iColumn].af
17af0 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
17b00 46 46 5f 52 45 41 4c 0a 20 20 20 20 20 20 29 7b  FF_REAL.      ){
17b10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17b20 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
17b30 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20 74  _RealAffinity, t
17b40 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  arget);.      }.
17b50 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65  #endif.      bre
17b60 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20  ak;.    }...    
17b70 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41  /*.    ** Form A
17b80 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20  :.    **   CASE 
17b90 78 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72  x WHEN e1 THEN r
17ba0 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72  1 WHEN e2 THEN r
17bb0 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48  2 ... WHEN eN TH
17bc0 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44  EN rN ELSE y END
17bd0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
17be0 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20  orm B:.    **   
17bf0 43 41 53 45 20 57 48 45 4e 20 65 31 20 54 48 45  CASE WHEN e1 THE
17c00 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45  N r1 WHEN e2 THE
17c10 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e  N r2 ... WHEN eN
17c20 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20   THEN rN ELSE y 
17c30 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  END.    **.    *
17c40 2a 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20  * Form A is can 
17c50 62 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69  be transformed i
17c60 6e 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65  nto the equivale
17c70 6e 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c  nt form B as fol
17c80 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43  lows:.    **   C
17c90 41 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48  ASE WHEN x=e1 TH
17ca0 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20  EN r1 WHEN x=e2 
17cb0 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20  THEN r2 ....    
17cc0 2a 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20 78  **        WHEN x
17cd0 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45  =eN THEN rN ELSE
17ce0 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20   y END.    **.  
17cf0 20 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78    ** X (if it ex
17d00 69 73 74 73 29 20 69 73 20 69 6e 20 70 45 78 70  ists) is in pExp
17d10 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a  r->pLeft..    **
17d20 20 59 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e   Y is in pExpr->
17d30 70 52 69 67 68 74 2e 20 20 54 68 65 20 59 20 69  pRight.  The Y i
17d40 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e  s also optional.
17d50 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f    If there is no
17d60 0a 20 20 20 20 2a 2a 20 45 4c 53 45 20 63 6c 61  .    ** ELSE cla
17d70 75 73 65 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72  use and no other
17d80 20 74 65 72 6d 20 6d 61 74 63 68 65 73 2c 20 74   term matches, t
17d90 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f  hen the result o
17da0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 78 70  f the.    ** exp
17db0 72 73 73 69 6f 6e 20 69 73 20 4e 55 4c 4c 2e 0a  rssion is NULL..
17dc0 20 20 20 20 2a 2a 20 45 69 20 69 73 20 69 6e 20      ** Ei is in 
17dd0 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
17de0 69 2a 32 5d 20 61 6e 64 20 52 69 20 69 73 20 70  i*2] and Ri is p
17df0 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
17e00 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20  *2+1]..    **.  
17e10 20 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20    ** The result 
17e20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
17e30 6e 20 69 73 20 74 68 65 20 52 69 20 66 6f 72 20  n is the Ri for 
17e40 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69  the first matchi
17e50 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72  ng Ei,.    ** or
17e60 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
17e70 6d 61 74 63 68 69 6e 67 20 45 69 2c 20 74 68 65  matching Ei, the
17e80 20 45 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f 72   ELSE term Y, or
17e90 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 20   if there is.   
17ea0 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d   ** no ELSE term
17eb0 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20  , NULL..    */. 
17ec0 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65     default: asse
17ed0 72 74 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45 20  rt( op==TK_CASE 
17ee0 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  ); {.      int e
17ef0 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20  ndLabel;        
17f00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17f10 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65  GOTO label for e
17f20 6e 64 20 6f 66 20 43 41 53 45 20 73 74 6d 74 20  nd of CASE stmt 
17f30 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 78  */.      int nex
17f40 74 43 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  tCase;          
17f50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f             /* GO
17f60 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78  TO label for nex
17f70 74 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f  t WHEN clause */
17f80 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72  .      int nExpr
17f90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17fa0 20 20 20 20 20 20 20 20 20 2f 2a 20 32 78 20 6e           /* 2x n
17fb0 75 6d 62 65 72 20 6f 66 20 57 48 45 4e 20 74 65  umber of WHEN te
17fc0 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  rms */.      int
17fd0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
17fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17ff0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
18000 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
18010 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20   *pEList;       
18020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
18030 74 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20  t of WHEN terms 
18040 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
18050 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
18060 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72  Listelem;  /* Ar
18070 72 61 79 20 6f 66 20 57 48 45 4e 20 74 65 72 6d  ray of WHEN term
18080 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  s */.      Expr 
18090 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20 20 20 20  opCompare;      
180a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
180b0 54 68 65 20 58 3d 3d 45 69 20 65 78 70 72 65 73  The X==Ei expres
180c0 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78  sion */.      Ex
180d0 70 72 20 63 61 63 68 65 58 3b 20 20 20 20 20 20  pr cacheX;      
180e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180f0 2f 2a 20 43 61 63 68 65 64 20 65 78 70 72 65 73  /* Cached expres
18100 73 69 6f 6e 20 58 20 2a 2f 0a 20 20 20 20 20 20  sion X */.      
18110 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20  Expr *pX;       
18120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18130 20 20 2f 2a 20 54 68 65 20 58 20 65 78 70 72 65    /* The X expre
18140 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ssion */.      E
18150 78 70 72 20 2a 70 54 65 73 74 20 3d 20 30 3b 20  xpr *pTest = 0; 
18160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18170 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20   /* X==Ei (form 
18180 41 29 20 6f 72 20 6a 75 73 74 20 45 69 20 28 66  A) or just Ei (f
18190 6f 72 6d 20 42 29 20 2a 2f 0a 20 20 20 20 20 20  orm B) */.      
181a0 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 69 43  VVA_ONLY( int iC
181b0 61 63 68 65 4c 65 76 65 6c 20 3d 20 70 50 61 72  acheLevel = pPar
181c0 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b  se->iCacheLevel;
181d0 20 29 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   )..      assert
181e0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
181f0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
18200 53 65 6c 65 63 74 29 20 26 26 20 70 45 78 70 72  Select) && pExpr
18210 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20  ->x.pList );.   
18220 20 20 20 61 73 73 65 72 74 28 28 70 45 78 70 72     assert((pExpr
18230 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
18240 20 25 20 32 29 20 3d 3d 20 30 29 3b 0a 20 20 20   % 2) == 0);.   
18250 20 20 20 61 73 73 65 72 74 28 70 45 78 70 72 2d     assert(pExpr-
18260 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  >x.pList->nExpr 
18270 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69  > 0);.      pELi
18280 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
18290 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74  ist;.      aList
182a0 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61  elem = pEList->a
182b0 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20  ;.      nExpr = 
182c0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
182d0 20 20 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20       endLabel = 
182e0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
182f0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
18300 66 28 20 28 70 58 20 3d 20 70 45 78 70 72 2d 3e  f( (pX = pExpr->
18310 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20  pLeft)!=0 ){.   
18320 20 20 20 20 20 63 61 63 68 65 58 20 3d 20 2a 70       cacheX = *p
18330 58 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  X;.        testc
18340 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ase( pX->op==TK_
18350 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
18360 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
18370 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
18380 29 3b 0a 20 20 20 20 20 20 20 20 63 61 63 68 65  );.        cache
18390 58 2e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74  X.iTable = sqlit
183a0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
183b0 50 61 72 73 65 2c 20 70 58 2c 20 26 72 65 67 46  Parse, pX, &regF
183c0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 74  ree1);.        t
183d0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
183e0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1==0 );.        
183f0 63 61 63 68 65 58 2e 6f 70 20 3d 20 54 4b 5f 52  cacheX.op = TK_R
18400 45 47 49 53 54 45 52 3b 0a 20 20 20 20 20 20 20  EGISTER;.       
18410 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20   opCompare.op = 
18420 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20 6f  TK_EQ;.        o
18430 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d  pCompare.pLeft =
18440 20 26 63 61 63 68 65 58 3b 0a 20 20 20 20 20 20   &cacheX;.      
18450 20 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d    pTest = &opCom
18460 70 61 72 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a  pare;.        /*
18470 20 54 69 63 6b 65 74 20 62 33 35 31 64 39 35 66   Ticket b351d95f
18480 39 63 64 35 65 66 31 37 65 39 64 39 64 62 61 65  9cd5ef17e9d9dbae
18490 31 38 66 35 63 61 38 36 31 31 31 39 30 30 30 31  18f5ca8611190001
184a0 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65  :.        ** The
184b0 20 76 61 6c 75 65 20 69 6e 20 72 65 67 46 72 65   value in regFre
184c0 65 31 20 6d 69 67 68 74 20 67 65 74 20 53 43 6f  e1 might get SCo
184d0 70 79 2d 65 64 20 69 6e 74 6f 20 74 68 65 20 66  py-ed into the f
184e0 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20 20 20 20  ile result..    
184f0 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20 73      ** So make s
18500 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65 67  ure that the reg
18510 46 72 65 65 31 20 72 65 67 69 73 74 65 72 20 69  Free1 register i
18520 73 20 6e 6f 74 20 72 65 75 73 65 64 20 66 6f 72  s not reused for
18530 20 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20 2a   other.        *
18540 2a 20 70 75 72 70 6f 73 65 73 20 61 6e 64 20 70  * purposes and p
18550 6f 73 73 69 62 6c 79 20 6f 76 65 72 77 72 69 74  ossibly overwrit
18560 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ten.  */.       
18570 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20   regFree1 = 0;. 
18580 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
18590 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
185a0 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 73  =i+2){.        s
185b0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
185c0 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
185d0 20 20 20 20 20 69 66 28 20 70 58 20 29 7b 0a 20       if( pX ){. 
185e0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
185f0 20 70 54 65 73 74 21 3d 30 20 29 3b 0a 20 20 20   pTest!=0 );.   
18600 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65         opCompare
18610 2e 70 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65  .pRight = aListe
18620 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  lem[i].pExpr;.  
18630 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
18640 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 61         pTest = a
18650 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70  Listelem[i].pExp
18660 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  r;.        }.   
18670 20 20 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20       nextCase = 
18680 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
18690 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
186a0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 73 74   testcase( pTest
186b0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
186c0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
186d0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
186e0 61 72 73 65 2c 20 70 54 65 73 74 2c 20 6e 65 78  arse, pTest, nex
186f0 74 43 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55  tCase, SQLITE_JU
18700 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
18710 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4c 69     testcase( aLi
18720 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70  stelem[i+1].pExp
18730 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
18740 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
18750 63 61 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b  case( aListelem[
18760 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d  i+1].pExpr->op==
18770 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20  TK_REGISTER );. 
18780 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
18790 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61  prCode(pParse, a
187a0 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45  Listelem[i+1].pE
187b0 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
187c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
187d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
187e0 74 6f 2c 20 30 2c 20 65 6e 64 4c 61 62 65 6c 29  to, 0, endLabel)
187f0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18800 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
18810 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20  arse, 1);.      
18820 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
18830 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65 78  olveLabel(v, nex
18840 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  tCase);.      }.
18850 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
18860 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  >pRight ){.     
18870 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
18880 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
18890 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
188a0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
188b0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
188c0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
188d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
188e0 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b  ePop(pParse, 1);
188f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
18900 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18910 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
18920 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
18930 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
18940 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
18950 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  Failed || pParse
18960 2d 3e 6e 45 72 72 3e 30 20 0a 20 20 20 20 20 20  ->nErr>0 .      
18970 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e       || pParse->
18980 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 69 43 61  iCacheLevel==iCa
18990 63 68 65 4c 65 76 65 6c 20 29 3b 0a 20 20 20 20  cheLevel );.    
189a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
189b0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
189c0 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 62 72  Label);.      br
189d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
189e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
189f0 52 49 47 47 45 52 0a 20 20 20 20 63 61 73 65 20  RIGGER.    case 
18a00 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20  TK_RAISE: {.    
18a10 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
18a20 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f  >affinity==OE_Ro
18a30 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20 20 20 20  llback .        
18a40 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66     || pExpr->aff
18a50 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a  inity==OE_Abort.
18a60 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45             || pE
18a70 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
18a80 45 5f 46 61 69 6c 0a 20 20 20 20 20 20 20 20 20  E_Fail.         
18a90 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69    || pExpr->affi
18aa0 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a  nity==OE_Ignore.
18ab0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69        );.      i
18ac0 66 28 20 21 70 50 61 72 73 65 2d 3e 70 54 72 69  f( !pParse->pTri
18ad0 67 67 65 72 54 61 62 20 29 7b 0a 20 20 20 20 20  ggerTab ){.     
18ae0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
18af0 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
18b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b10 20 20 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f    "RAISE() may o
18b20 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68  nly be used with
18b30 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f  in a trigger-pro
18b40 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20 20  gram");.        
18b50 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
18b60 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
18b70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
18b80 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  Abort ){.       
18b90 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
18ba0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
18bb0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
18bc0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
18bd0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
18be0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 69 66  lue) );.      if
18bf0 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  ( pExpr->affinit
18c00 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a  y==OE_Ignore ){.
18c10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18c20 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20  dbeAddOp4(.     
18c30 20 20 20 20 20 20 20 76 2c 20 4f 50 5f 48 61 6c         v, OP_Hal
18c40 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45  t, SQLITE_OK, OE
18c50 5f 49 67 6e 6f 72 65 2c 20 30 2c 20 70 45 78 70  _Ignore, 0, pExp
18c60 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a  r->u.zToken,0);.
18c70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
18c80 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c 74       sqlite3Halt
18c90 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73  Constraint(pPars
18ca0 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  e, SQLITE_CONSTR
18cb0 41 49 4e 54 5f 54 52 49 47 47 45 52 2c 0a 20 20  AINT_TRIGGER,.  
18cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cd0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
18ce0 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20 70 45 78  r->affinity, pEx
18cf0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29  pr->u.zToken, 0)
18d00 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
18d10 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
18d20 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ndif.  }.  sqlit
18d30 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
18d40 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
18d50 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
18d60 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
18d70 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20  se, regFree2);. 
18d80 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d   return inReg;.}
18d90 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
18da0 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74   code to evaluat
18db0 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
18dc0 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
18dd0 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20  sults.** into a 
18de0 72 65 67 69 73 74 65 72 2e 20 20 52 65 74 75 72  register.  Retur
18df0 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e  n the register n
18e00 75 6d 62 65 72 20 77 68 65 72 65 20 74 68 65 20  umber where the 
18e10 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73  results.** are s
18e20 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tored..**.** If 
18e30 74 68 65 20 72 65 67 69 73 74 65 72 20 69 73 20  the register is 
18e40 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  a temporary regi
18e50 73 74 65 72 20 74 68 61 74 20 63 61 6e 20 62 65  ster that can be
18e60 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a   deallocated,.**
18e70 20 74 68 65 6e 20 77 72 69 74 65 20 69 74 73 20   then write its 
18e80 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52 65  number into *pRe
18e90 67 2e 20 20 49 66 20 74 68 65 20 72 65 73 75 6c  g.  If the resul
18ea0 74 20 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f  t register is no
18eb0 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79  t.** a temporary
18ec0 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 67  , then set *pReg
18ed0 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e 74   to zero..*/.int
18ee0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
18ef0 54 65 6d 70 28 50 61 72 73 65 20 2a 70 50 61 72  Temp(Parse *pPar
18f00 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
18f10 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20 69   int *pReg){.  i
18f20 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
18f30 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
18f40 29 3b 0a 20 20 69 6e 74 20 72 32 20 3d 20 73 71  );.  int r2 = sq
18f50 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
18f60 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
18f70 72 2c 20 72 31 29 3b 0a 20 20 69 66 28 20 72 32  r, r1);.  if( r2
18f80 3d 3d 72 31 20 29 7b 0a 20 20 20 20 2a 70 52 65  ==r1 ){.    *pRe
18f90 67 20 3d 20 72 31 3b 0a 20 20 7d 65 6c 73 65 7b  g = r1;.  }else{
18fa0 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
18fb0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
18fc0 65 2c 20 72 31 29 3b 0a 20 20 20 20 2a 70 52 65  e, r1);.    *pRe
18fd0 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  g = 0;.  }.  ret
18fe0 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn r2;.}../*.**
18ff0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
19000 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74  hat will evaluat
19010 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
19020 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  pr and store the
19030 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72  .** results in r
19040 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20  egister target. 
19050 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
19060 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61   guaranteed to a
19070 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69  ppear.** in regi
19080 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a  ster target..*/.
19090 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
190a0 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ode(Parse *pPars
190b0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
190c0 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69  int target){.  i
190d0 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73 73  nt inReg;..  ass
190e0 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 26 26  ert( target>0 &&
190f0 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d   target<=pParse-
19100 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 70  >nMem );.  if( p
19110 45 78 70 72 20 26 26 20 70 45 78 70 72 2d 3e 6f  Expr && pExpr->o
19120 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
19130 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
19140 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e  eAddOp2(pParse->
19150 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c 20  pVdbe, OP_Copy, 
19160 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74  pExpr->iTable, t
19170 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  arget);.  }else{
19180 0a 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c  .    inReg = sql
19190 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
191a0 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
191b0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 61  , target);.    a
191c0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
191d0 56 64 62 65 20 7c 7c 20 70 50 61 72 73 65 2d 3e  Vdbe || pParse->
191e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
191f0 20 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 52 65   );.    if( inRe
19200 67 21 3d 74 61 72 67 65 74 20 26 26 20 70 50 61  g!=target && pPa
19210 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20  rse->pVdbe ){.  
19220 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19230 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56  ddOp2(pParse->pV
19240 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69  dbe, OP_SCopy, i
19250 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20  nReg, target);. 
19260 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
19270 6e 20 74 61 72 67 65 74 3b 0a 7d 0a 0a 2f 2a 0a  n target;.}../*.
19280 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
19290 20 74 68 61 74 20 65 76 61 6c 75 74 65 73 20 74   that evalutes t
192a0 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
192b0 69 6f 6e 20 61 6e 64 20 70 75 74 73 20 74 68 65  ion and puts the
192c0 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65   result.** in re
192d0 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a  gister target..*
192e0 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61  *.** Also make a
192f0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70   copy of the exp
19300 72 65 73 73 69 6f 6e 20 72 65 73 75 6c 74 73 20  ression results 
19310 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22 63 61  into another "ca
19320 63 68 65 22 20 72 65 67 69 73 74 65 72 0a 2a 2a  che" register.**
19330 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20   and modify the 
19340 65 78 70 72 65 73 73 69 6f 6e 20 73 6f 20 74 68  expression so th
19350 61 74 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  at the next time
19360 20 69 74 20 69 73 20 65 76 61 6c 75 61 74 65 64   it is evaluated
19370 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  ,.** the result 
19380 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
19390 20 63 61 63 68 65 20 72 65 67 69 73 74 65 72 2e   cache register.
193a0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
193b0 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
193c0 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
193d0 20 61 72 65 20 75 73 65 64 20 6d 75 6c 74 69 70   are used multip
193e0 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54  le .** times.  T
193f0 68 65 79 20 61 72 65 20 65 76 61 6c 75 61 74 65  hey are evaluate
19400 64 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20 72  d once and the r
19410 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 65 78  esults of the ex
19420 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20  pression.** are 
19430 72 65 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  reused..*/.int s
19440 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 6e  qlite3ExprCodeAn
19450 64 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50  dCache(Parse *pP
19460 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
19470 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
19480 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
19490 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
194a0 20 69 6e 52 65 67 3b 0a 20 20 69 6e 52 65 67 20   inReg;.  inReg 
194b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
194c0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  e(pParse, pExpr,
194d0 20 74 61 72 67 65 74 29 3b 0a 20 20 61 73 73 65   target);.  asse
194e0 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a  rt( target>0 );.
194f0 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
19500 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  e is called for 
19510 74 65 72 6d 73 20 74 6f 20 49 4e 53 45 52 54 20  terms to INSERT 
19520 6f 72 20 55 50 44 41 54 45 2e 20 20 41 6e 64 20  or UPDATE.  And 
19530 74 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74  the only.  ** ot
19540 68 65 72 20 70 6c 61 63 65 20 77 68 65 72 65 20  her place where 
19550 65 78 70 72 65 73 73 69 6f 6e 73 20 63 61 6e 20  expressions can 
19560 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  be converted int
19570 6f 20 54 4b 5f 52 45 47 49 53 54 45 52 20 69 73  o TK_REGISTER is
19580 0a 20 20 2a 2a 20 69 6e 20 57 48 45 52 45 20 63  .  ** in WHERE c
19590 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
195a0 2e 20 20 53 6f 20 61 73 20 63 75 72 72 65 6e 74  .  So as current
195b0 6c 79 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2c 20  ly implemented, 
195c0 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6e 6f  there is.  ** no
195d0 20 77 61 79 20 66 6f 72 20 61 20 54 4b 5f 52 45   way for a TK_RE
195e0 47 49 53 54 45 52 20 74 6f 20 65 78 69 73 74 20  GISTER to exist 
195f0 68 65 72 65 2e 20 20 42 75 74 20 69 74 20 73 65  here.  But it se
19600 65 6d 73 20 70 72 75 64 65 6e 74 20 74 6f 0a 20  ems prudent to. 
19610 20 2a 2a 20 6b 65 65 70 20 74 68 65 20 41 4c 57   ** keep the ALW
19620 41 59 53 28 29 20 69 6e 20 63 61 73 65 20 74 68  AYS() in case th
19630 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f  e conditions abo
19640 76 65 20 63 68 61 6e 67 65 20 77 69 74 68 20 66  ve change with f
19650 75 74 75 72 65 0a 20 20 2a 2a 20 6d 6f 64 69 66  uture.  ** modif
19660 69 63 61 74 69 6f 6e 73 20 6f 72 20 65 6e 68 61  ications or enha
19670 6e 63 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69  ncements. */.  i
19680 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d  f( ALWAYS(pExpr-
19690 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op!=TK_REGISTER
196a0 29 20 29 7b 20 20 0a 20 20 20 20 69 6e 74 20 69  ) ){  .    int i
196b0 4d 65 6d 3b 0a 20 20 20 20 69 4d 65 6d 20 3d 20  Mem;.    iMem = 
196c0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
196d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
196e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp2(v, OP_Copy
196f0 2c 20 69 6e 52 65 67 2c 20 69 4d 65 6d 29 3b 0a  , inReg, iMem);.
19700 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
19710 65 20 3d 20 69 4d 65 6d 3b 0a 20 20 20 20 70 45  e = iMem;.    pE
19720 78 70 72 2d 3e 6f 70 32 20 3d 20 70 45 78 70 72  xpr->op2 = pExpr
19730 2d 3e 6f 70 3b 0a 20 20 20 20 70 45 78 70 72 2d  ->op;.    pExpr-
19740 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45  >op = TK_REGISTE
19750 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
19760 69 6e 52 65 67 3b 0a 7d 0a 0a 23 69 66 20 64 65  inReg;.}..#if de
19770 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
19780 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e  BLE_TREE_EXPLAIN
19790 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  )./*.** Generate
197a0 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c   a human-readabl
197b0 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  e explanation of
197c0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
197d0 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ree..*/.void sql
197e0 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
197f0 56 64 62 65 20 2a 70 4f 75 74 2c 20 45 78 70 72  Vdbe *pOut, Expr
19800 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
19810 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
19820 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63        /* The opc
19830 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ode being coded 
19840 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
19850 2a 7a 42 69 6e 4f 70 20 3d 20 30 3b 20 20 20 2f  *zBinOp = 0;   /
19860 2a 20 42 69 6e 61 72 79 20 6f 70 65 72 61 74 6f  * Binary operato
19870 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  r */.  const cha
19880 72 20 2a 7a 55 6e 69 4f 70 20 3d 20 30 3b 20 20  r *zUniOp = 0;  
19890 20 2f 2a 20 55 6e 61 72 79 20 6f 70 65 72 61 74   /* Unary operat
198a0 6f 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  or */.  if( pExp
198b0 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d  r==0 ){.    op =
198c0 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73   TK_NULL;.  }els
198d0 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78 70  e{.    op = pExp
198e0 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69  r->op;.  }.  swi
198f0 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
19900 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  ase TK_AGG_COLUM
19910 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  N: {.      sqlit
19920 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
19930 70 4f 75 74 2c 20 22 41 47 47 7b 25 64 3a 25 64  pOut, "AGG{%d:%d
19940 7d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  }",.            
19950 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70  pExpr->iTable, p
19960 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  Expr->iColumn);.
19970 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19980 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
19990 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69  OLUMN: {.      i
199a0 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
199b0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  <0 ){.        /*
199c0 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65   This only happe
199d0 6e 73 20 77 68 65 6e 20 63 6f 64 69 6e 67 20 63  ns when coding c
199e0 68 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74 73  heck constraints
199f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
19a00 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
19a10 28 70 4f 75 74 2c 20 22 43 4f 4c 55 4d 4e 28 25  (pOut, "COLUMN(%
19a20 64 29 22 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  d)", pExpr->iCol
19a30 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  umn);.      }els
19a40 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
19a50 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
19a60 70 4f 75 74 2c 20 22 7b 25 64 3a 25 64 7d 22 2c  pOut, "{%d:%d}",
19a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
19a90 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78  xpr->iTable, pEx
19aa0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  pr->iColumn);.  
19ab0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
19ac0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
19ad0 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  e TK_INTEGER: {.
19ae0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
19af0 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  >flags & EP_IntV
19b00 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20  alue ){.        
19b10 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
19b20 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 64 22 2c  intf(pOut, "%d",
19b30 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65   pExpr->u.iValue
19b40 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
19b50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
19b60 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
19b70 74 2c 20 22 25 73 22 2c 20 70 45 78 70 72 2d 3e  t, "%s", pExpr->
19b80 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
19b90 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
19ba0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
19bb0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
19bc0 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61 73  NG_POINT.    cas
19bd0 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  e TK_FLOAT: {.  
19be0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
19bf0 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 25  inPrintf(pOut,"%
19c00 73 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  s", pExpr->u.zTo
19c10 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ken);.      brea
19c20 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
19c30 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
19c40 4e 47 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  NG: {.      sqli
19c50 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
19c60 28 70 4f 75 74 2c 22 25 51 22 2c 20 70 45 78 70  (pOut,"%Q", pExp
19c70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
19c80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19c90 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c  .    case TK_NUL
19ca0 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
19cb0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
19cc0 70 4f 75 74 2c 22 4e 55 4c 4c 22 29 3b 0a 20 20  pOut,"NULL");.  
19cd0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19ce0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19cf0 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41  OMIT_BLOB_LITERA
19d00 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  L.    case TK_BL
19d10 4f 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  OB: {.      sqli
19d20 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
19d30 28 70 4f 75 74 2c 22 25 73 22 2c 20 70 45 78 70  (pOut,"%s", pExp
19d40 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
19d50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19d60 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
19d70 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a   TK_VARIABLE: {.
19d80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
19d90 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
19da0 22 56 41 52 49 41 42 4c 45 28 25 73 2c 25 64 29  "VARIABLE(%s,%d)
19db0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
19dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
19dd0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70  xpr->u.zToken, p
19de0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  Expr->iColumn);.
19df0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19e00 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52   }.    case TK_R
19e10 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20  EGISTER: {.     
19e20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
19e30 72 69 6e 74 66 28 70 4f 75 74 2c 22 52 45 47 49  rintf(pOut,"REGI
19e40 53 54 45 52 28 25 64 29 22 2c 20 70 45 78 70 72  STER(%d)", pExpr
19e50 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  ->iTable);.     
19e60 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
19e70 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a    case TK_AS: {.
19e80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
19e90 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70  lainExpr(pOut, p
19ea0 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
19eb0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19ec0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19ed0 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61  OMIT_CAST.    ca
19ee0 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20  se TK_CAST: {.  
19ef0 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
19f00 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20  ns of the form: 
19f10 20 20 43 41 53 54 28 70 4c 65 66 74 20 41 53 20    CAST(pLeft AS 
19f20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20  token) */.      
19f30 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 66 66  const char *zAff
19f40 20 3d 20 22 75 6e 6b 22 3b 0a 20 20 20 20 20 20   = "unk";.      
19f50 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 41  switch( sqlite3A
19f60 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70  ffinityType(pExp
19f70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 29 7b 0a  r->u.zToken) ){.
19f80 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
19f90 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 20 20 20  ITE_AFF_TEXT:   
19fa0 20 7a 41 66 66 20 3d 20 22 54 45 58 54 22 3b 20   zAff = "TEXT"; 
19fb0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
19fc0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
19fd0 46 46 5f 4e 4f 4e 45 3a 20 20 20 20 7a 41 66 66  FF_NONE:    zAff
19fe0 20 3d 20 22 4e 4f 4e 45 22 3b 20 20 20 20 20 62   = "NONE";     b
19ff0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
1a000 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  se SQLITE_AFF_NU
1a010 4d 45 52 49 43 3a 20 7a 41 66 66 20 3d 20 22 4e  MERIC: zAff = "N
1a020 55 4d 45 52 49 43 22 3b 20 20 62 72 65 61 6b 3b  UMERIC";  break;
1a030 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
1a040 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
1a050 3a 20 7a 41 66 66 20 3d 20 22 49 4e 54 45 47 45  : zAff = "INTEGE
1a060 52 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  R";  break;.    
1a070 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1a080 41 46 46 5f 52 45 41 4c 3a 20 20 20 20 7a 41 66  AFF_REAL:    zAf
1a090 66 20 3d 20 22 52 45 41 4c 22 3b 20 20 20 20 20  f = "REAL";     
1a0a0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1a0b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1a0c0 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1a0d0 22 43 41 53 54 2d 25 73 28 22 2c 20 7a 41 66 66  "CAST-%s(", zAff
1a0e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1a0f0 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74  ExplainExpr(pOut
1a100 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
1a110 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1a120 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1a130 2c 20 22 29 22 29 3b 0a 20 20 20 20 20 20 62 72  , ")");.      br
1a140 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
1a150 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1a160 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73  _CAST */.    cas
1a170 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 7a 42  e TK_LT:      zB
1a180 69 6e 4f 70 20 3d 20 22 4c 54 22 3b 20 20 20 20  inOp = "LT";    
1a190 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1a1a0 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 42 69   TK_LE:      zBi
1a1b0 6e 4f 70 20 3d 20 22 4c 45 22 3b 20 20 20 20 20  nOp = "LE";     
1a1c0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1a1d0 54 4b 5f 47 54 3a 20 20 20 20 20 20 7a 42 69 6e  TK_GT:      zBin
1a1e0 4f 70 20 3d 20 22 47 54 22 3b 20 20 20 20 20 62  Op = "GT";     b
1a1f0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1a200 4b 5f 47 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f  K_GE:      zBinO
1a210 70 20 3d 20 22 47 45 22 3b 20 20 20 20 20 62 72  p = "GE";     br
1a220 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1a230 5f 4e 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70  _NE:      zBinOp
1a240 20 3d 20 22 4e 45 22 3b 20 20 20 20 20 62 72 65   = "NE";     bre
1a250 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1a260 45 51 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20  EQ:      zBinOp 
1a270 3d 20 22 45 51 22 3b 20 20 20 20 20 62 72 65 61  = "EQ";     brea
1a280 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
1a290 53 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d  S:      zBinOp =
1a2a0 20 22 49 53 22 3b 20 20 20 20 20 62 72 65 61 6b   "IS";     break
1a2b0 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  ;.    case TK_IS
1a2c0 4e 4f 54 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20  NOT:   zBinOp = 
1a2d0 22 49 53 4e 4f 54 22 3b 20 20 62 72 65 61 6b 3b  "ISNOT";  break;
1a2e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
1a2f0 3a 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22  :     zBinOp = "
1a300 41 4e 44 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  AND";    break;.
1a310 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
1a320 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4f       zBinOp = "O
1a330 52 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  R";     break;. 
1a340 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a     case TK_PLUS:
1a350 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 41 44      zBinOp = "AD
1a360 44 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  D";    break;.  
1a370 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 20    case TK_STAR: 
1a380 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4d 55 4c     zBinOp = "MUL
1a390 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
1a3a0 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 20   case TK_MINUS: 
1a3b0 20 20 7a 42 69 6e 4f 70 20 3d 20 22 53 55 42 22    zBinOp = "SUB"
1a3c0 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
1a3d0 63 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20  case TK_REM:    
1a3e0 20 7a 42 69 6e 4f 70 20 3d 20 22 52 45 4d 22 3b   zBinOp = "REM";
1a3f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1a400 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20  ase TK_BITAND:  
1a410 7a 42 69 6e 4f 70 20 3d 20 22 42 49 54 41 4e 44  zBinOp = "BITAND
1a420 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
1a430 73 65 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20 7a  se TK_BITOR:   z
1a440 42 69 6e 4f 70 20 3d 20 22 42 49 54 4f 52 22 3b  BinOp = "BITOR";
1a450 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1a460 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20 7a 42  e TK_SLASH:   zB
1a470 69 6e 4f 70 20 3d 20 22 44 49 56 22 3b 20 20 20  inOp = "DIV";   
1a480 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1a490 20 54 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 42 69   TK_LSHIFT:  zBi
1a4a0 6e 4f 70 20 3d 20 22 4c 53 48 49 46 54 22 3b 20  nOp = "LSHIFT"; 
1a4b0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1a4c0 54 4b 5f 52 53 48 49 46 54 3a 20 20 7a 42 69 6e  TK_RSHIFT:  zBin
1a4d0 4f 70 20 3d 20 22 52 53 48 49 46 54 22 3b 20 62  Op = "RSHIFT"; b
1a4e0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1a4f0 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a 42 69 6e 4f  K_CONCAT:  zBinO
1a500 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b 20 62 72  p = "CONCAT"; br
1a510 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 54  eak;..    case T
1a520 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 55 6e 69 4f  K_UMINUS:  zUniO
1a530 70 20 3d 20 22 55 4d 49 4e 55 53 22 3b 20 62 72  p = "UMINUS"; br
1a540 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1a550 5f 55 50 4c 55 53 3a 20 20 20 7a 55 6e 69 4f 70  _UPLUS:   zUniOp
1a560 20 3d 20 22 55 50 4c 55 53 22 3b 20 20 62 72 65   = "UPLUS";  bre
1a570 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1a580 42 49 54 4e 4f 54 3a 20 20 7a 55 6e 69 4f 70 20  BITNOT:  zUniOp 
1a590 3d 20 22 42 49 54 4e 4f 54 22 3b 20 62 72 65 61  = "BITNOT"; brea
1a5a0 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  k;.    case TK_N
1a5b0 4f 54 3a 20 20 20 20 20 7a 55 6e 69 4f 70 20 3d  OT:     zUniOp =
1a5c0 20 22 4e 4f 54 22 3b 20 20 20 20 62 72 65 61 6b   "NOT";    break
1a5d0 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  ;.    case TK_IS
1a5e0 4e 55 4c 4c 3a 20 20 7a 55 6e 69 4f 70 20 3d 20  NULL:  zUniOp = 
1a5f0 22 49 53 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b  "ISNULL"; break;
1a600 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
1a610 4e 55 4c 4c 3a 20 7a 55 6e 69 4f 70 20 3d 20 22  NULL: zUniOp = "
1a620 4e 4f 54 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b  NOTNULL"; break;
1a630 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  ..    case TK_CO
1a640 4c 4c 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 73  LLATE: {.      s
1a650 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
1a660 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70  r(pOut, pExpr->p
1a670 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
1a680 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1a690 66 28 70 4f 75 74 2c 22 2e 43 4f 4c 4c 41 54 45  f(pOut,".COLLATE
1a6a0 28 25 73 29 22 2c 70 45 78 70 72 2d 3e 75 2e 7a  (%s)",pExpr->u.z
1a6b0 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72  Token);.      br
1a6c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1a6d0 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
1a6e0 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  TION:.    case T
1a6f0 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20  K_CONST_FUNC:.  
1a700 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
1a710 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  ON: {.      Expr
1a720 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20 20  List *pFarg;    
1a730 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75     /* List of fu
1a740 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
1a750 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78   */.      if( Ex
1a760 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
1a770 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e  (pExpr, EP_Token
1a780 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20  Only) ){.       
1a790 20 70 46 61 72 67 20 3d 20 30 3b 0a 20 20 20 20   pFarg = 0;.    
1a7a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1a7b0 20 70 46 61 72 67 20 3d 20 70 45 78 70 72 2d 3e   pFarg = pExpr->
1a7c0 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d  x.pList;.      }
1a7d0 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 54  .      if( op==T
1a7e0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
1a7f0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1a800 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1a810 4f 75 74 2c 20 22 41 47 47 5f 46 55 4e 43 54 49  Out, "AGG_FUNCTI
1a820 4f 4e 25 64 3a 25 73 28 22 2c 0a 20 20 20 20 20  ON%d:%s(",.     
1a830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a840 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
1a850 70 32 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  p2, pExpr->u.zTo
1a860 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ken);.      }els
1a870 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
1a880 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1a890 70 4f 75 74 2c 20 22 46 55 4e 43 54 49 4f 4e 3a  pOut, "FUNCTION:
1a8a0 25 73 28 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  %s(", pExpr->u.z
1a8b0 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  Token);.      }.
1a8c0 20 20 20 20 20 20 69 66 28 20 70 46 61 72 67 20        if( pFarg 
1a8d0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1a8e0 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73  e3ExplainExprLis
1a8f0 74 28 70 4f 75 74 2c 20 70 46 61 72 67 29 3b 0a  t(pOut, pFarg);.
1a900 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1a910 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1a920 74 66 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20  tf(pOut, ")");. 
1a930 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a940 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1a950 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
1a960 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
1a970 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  S: {.      sqlit
1a980 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1a990 70 4f 75 74 2c 20 22 45 58 49 53 54 53 28 22 29  pOut, "EXISTS(")
1a9a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1a9b0 78 70 6c 61 69 6e 53 65 6c 65 63 74 28 70 4f 75  xplainSelect(pOu
1a9c0 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  t, pExpr->x.pSel
1a9d0 65 63 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ect);.      sqli
1a9e0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1a9f0 28 70 4f 75 74 2c 22 29 22 29 3b 0a 20 20 20 20  (pOut,")");.    
1aa00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1aa10 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
1aa20 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
1aa30 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1aa40 70 4f 75 74 2c 20 22 28 22 29 3b 0a 20 20 20 20  pOut, "(");.    
1aa50 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1aa60 53 65 6c 65 63 74 28 70 4f 75 74 2c 20 70 45 78  Select(pOut, pEx
1aa70 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a  pr->x.pSelect);.
1aa80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1aa90 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1aaa0 20 22 29 22 29 3b 0a 20 20 20 20 20 20 62 72 65   ")");.      bre
1aab0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1aac0 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
1aad0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1aae0 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 49 4e  Printf(pOut, "IN
1aaf0 28 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (");.      sqlit
1ab00 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f  e3ExplainExpr(pO
1ab10 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  ut, pExpr->pLeft
1ab20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ab30 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1ab40 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20  ut, ",");.      
1ab50 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
1ab60 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
1ab70 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
1ab80 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1ab90 69 6e 53 65 6c 65 63 74 28 70 4f 75 74 2c 20 70  inSelect(pOut, p
1aba0 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29  Expr->x.pSelect)
1abb0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1abc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1abd0 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70 4f  plainExprList(pO
1abe0 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  ut, pExpr->x.pLi
1abf0 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
1ac00 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1ac10 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 29  nPrintf(pOut, ")
1ac20 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
1ac30 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
1ac40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
1ac50 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a  QUERY */..    /*
1ac60 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54  .    **    x BET
1ac70 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20  WEEN y AND z.   
1ac80 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
1ac90 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
1aca0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1acb0 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a    x>=y AND x<=z.
1acc0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20      **.    ** X 
1acd0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
1ace0 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a  pr->pLeft..    *
1acf0 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Y is stored in
1ad00 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
1ad10 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [0].pExpr..    *
1ad20 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Z is stored in
1ad30 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
1ad40 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [1].pExpr..    *
1ad50 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  /.    case TK_BE
1ad60 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45  TWEEN: {.      E
1ad70 78 70 72 20 2a 70 58 20 3d 20 70 45 78 70 72 2d  xpr *pX = pExpr-
1ad80 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 45 78  >pLeft;.      Ex
1ad90 70 72 20 2a 70 59 20 3d 20 70 45 78 70 72 2d 3e  pr *pY = pExpr->
1ada0 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  x.pList->a[0].pE
1adb0 78 70 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20  xpr;.      Expr 
1adc0 2a 70 5a 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  *pZ = pExpr->x.p
1add0 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
1ade0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1adf0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1ae00 74 2c 20 22 42 45 54 57 45 45 4e 28 22 29 3b 0a  t, "BETWEEN(");.
1ae10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1ae20 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70  lainExpr(pOut, p
1ae30 58 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  X);.      sqlite
1ae40 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1ae50 4f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20  Out, ",");.     
1ae60 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
1ae70 78 70 72 28 70 4f 75 74 2c 20 70 59 29 3b 0a 20  xpr(pOut, pY);. 
1ae80 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1ae90 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1aea0 22 2c 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ",");.      sqli
1aeb0 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70  te3ExplainExpr(p
1aec0 4f 75 74 2c 20 70 5a 29 3b 0a 20 20 20 20 20 20  Out, pZ);.      
1aed0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1aee0 69 6e 74 66 28 70 4f 75 74 2c 20 22 29 22 29 3b  intf(pOut, ")");
1aef0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1af00 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1af10 54 52 49 47 47 45 52 3a 20 7b 0a 20 20 20 20 20  TRIGGER: {.     
1af20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 63 6f 64   /* If the opcod
1af30 65 20 69 73 20 54 4b 5f 54 52 49 47 47 45 52 2c  e is TK_TRIGGER,
1af40 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
1af50 73 69 6f 6e 20 69 73 20 61 20 72 65 66 65 72 65  sion is a refere
1af60 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  nce.      ** to 
1af70 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  a column in the 
1af80 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70  new.* or old.* p
1af90 73 65 75 64 6f 2d 74 61 62 6c 65 73 20 61 76 61  seudo-tables ava
1afa0 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20  ilable to.      
1afb0 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  ** trigger progr
1afc0 61 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ams. In this cas
1afd0 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20 69 73  e Expr.iTable is
1afe0 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20 74 68   set to 1 for th
1aff0 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a  e.      ** new.*
1b000 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f   pseudo-table, o
1b010 72 20 30 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e  r 0 for the old.
1b020 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20  * pseudo-table. 
1b030 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20  Expr.iColumn.   
1b040 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20     ** is set to 
1b050 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  the column of th
1b060 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 74  e pseudo-table t
1b070 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31  o read, or to -1
1b080 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61   to.      ** rea
1b090 64 20 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c  d the rowid fiel
1b0a0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
1b0b0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1b0c0 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 73  Printf(pOut, "%s
1b0d0 28 25 64 29 22 2c 20 0a 20 20 20 20 20 20 20 20  (%d)", .        
1b0e0 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
1b0f0 3f 20 22 4e 45 57 22 20 3a 20 22 4f 4c 44 22 2c  ? "NEW" : "OLD",
1b100 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29   pExpr->iColumn)
1b110 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1b120 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1b130 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20 20 20 73  _CASE: {.      s
1b140 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1b150 6e 74 66 28 70 4f 75 74 2c 20 22 43 41 53 45 28  ntf(pOut, "CASE(
1b160 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ");.      sqlite
1b170 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75  3ExplainExpr(pOu
1b180 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  t, pExpr->pLeft)
1b190 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1b1a0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1b1b0 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 73  t, ",");.      s
1b1c0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
1b1d0 72 4c 69 73 74 28 70 4f 75 74 2c 20 70 45 78 70  rList(pOut, pExp
1b1e0 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  r->x.pList);.   
1b1f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1b200 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1b210 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20  MIT_TRIGGER.    
1b220 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b  case TK_RAISE: {
1b230 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
1b240 72 20 2a 7a 54 79 70 65 20 3d 20 22 75 6e 6b 22  r *zType = "unk"
1b250 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20  ;.      switch( 
1b260 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20  pExpr->affinity 
1b270 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ){.        case 
1b280 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3a 20 20 20 7a  OE_Rollback:   z
1b290 54 79 70 65 20 3d 20 22 72 6f 6c 6c 62 61 63 6b  Type = "rollback
1b2a0 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ";  break;.     
1b2b0 20 20 20 63 61 73 65 20 4f 45 5f 41 62 6f 72 74     case OE_Abort
1b2c0 3a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  :      zType = "
1b2d0 61 62 6f 72 74 22 3b 20 20 20 20 20 62 72 65 61  abort";     brea
1b2e0 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
1b2f0 4f 45 5f 46 61 69 6c 3a 20 20 20 20 20 20 20 7a  OE_Fail:       z
1b300 54 79 70 65 20 3d 20 22 66 61 69 6c 22 3b 20 20  Type = "fail";  
1b310 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1b320 20 20 20 63 61 73 65 20 4f 45 5f 49 67 6e 6f 72     case OE_Ignor
1b330 65 3a 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  e:     zType = "
1b340 69 67 6e 6f 72 65 22 3b 20 20 20 20 62 72 65 61  ignore";    brea
1b350 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1b360 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1b370 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 52 41 49  rintf(pOut, "RAI
1b380 53 45 2d 25 73 28 25 73 29 22 2c 20 7a 54 79 70  SE-%s(%s)", zTyp
1b390 65 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  e, pExpr->u.zTok
1b3a0 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  en);.      break
1b3b0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1b3c0 20 7d 0a 20 20 69 66 28 20 7a 42 69 6e 4f 70 20   }.  if( zBinOp 
1b3d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
1b3e0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1b3f0 2c 22 25 73 28 22 2c 20 7a 42 69 6e 4f 70 29 3b  ,"%s(", zBinOp);
1b400 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
1b410 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45  ainExpr(pOut, pE
1b420 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
1b430 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1b440 72 69 6e 74 66 28 70 4f 75 74 2c 22 2c 22 29 3b  rintf(pOut,",");
1b450 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
1b460 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45  ainExpr(pOut, pE
1b470 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
1b480 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1b490 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 29 22 29  Printf(pOut,")")
1b4a0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 55  ;.  }else if( zU
1b4b0 6e 69 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  niOp ){.    sqli
1b4c0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1b4d0 28 70 4f 75 74 2c 22 25 73 28 22 2c 20 7a 55 6e  (pOut,"%s(", zUn
1b4e0 69 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iOp);.    sqlite
1b4f0 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75  3ExplainExpr(pOu
1b500 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  t, pExpr->pLeft)
1b510 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1b520 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1b530 22 29 22 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  ")");.  }.}.#end
1b540 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
1b550 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45  LITE_ENABLE_TREE
1b560 5f 45 58 50 4c 41 49 4e 29 20 2a 2f 0a 0a 23 69  _EXPLAIN) */..#i
1b570 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1b580 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50  _ENABLE_TREE_EXP
1b590 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  LAIN)./*.** Gene
1b5a0 72 61 74 65 20 61 20 68 75 6d 61 6e 2d 72 65 61  rate a human-rea
1b5b0 64 61 62 6c 65 20 65 78 70 6c 61 6e 61 74 69 6f  dable explanatio
1b5c0 6e 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  n of an expressi
1b5d0 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64  on list..*/.void
1b5e0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
1b5f0 78 70 72 4c 69 73 74 28 56 64 62 65 20 2a 70 4f  xprList(Vdbe *pO
1b600 75 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  ut, ExprList *pL
1b610 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
1b620 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 7c 7c   if( pList==0 ||
1b630 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30   pList->nExpr==0
1b640 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1b650 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1b660 74 2c 20 22 28 65 6d 70 74 79 2d 6c 69 73 74 29  t, "(empty-list)
1b670 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ");.    return;.
1b680 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 69 73    }else if( pLis
1b690 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 7b 0a 20  t->nExpr==1 ){. 
1b6a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1b6b0 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 4c 69 73  nExpr(pOut, pLis
1b6c0 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  t->a[0].pExpr);.
1b6d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
1b6e0 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28  ite3ExplainPush(
1b6f0 70 4f 75 74 29 3b 0a 20 20 20 20 66 6f 72 28 69  pOut);.    for(i
1b700 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
1b710 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
1b720 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1b730 69 6e 74 66 28 70 4f 75 74 2c 20 22 69 74 65 6d  intf(pOut, "item
1b740 5b 25 64 5d 20 3d 20 22 2c 20 69 29 3b 0a 20 20  [%d] = ", i);.  
1b750 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1b760 69 6e 50 75 73 68 28 70 4f 75 74 29 3b 0a 20 20  inPush(pOut);.  
1b770 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1b780 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 4c 69  inExpr(pOut, pLi
1b790 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
1b7a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1b7b0 70 6c 61 69 6e 50 6f 70 28 70 4f 75 74 29 3b 0a  plainPop(pOut);.
1b7c0 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
1b7d0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20  >a[i].zName ){. 
1b7e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1b7f0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1b800 2c 20 22 20 41 53 20 25 73 22 2c 20 70 4c 69 73  , " AS %s", pLis
1b810 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
1b820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1b830 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 62 53  ( pList->a[i].bS
1b840 70 61 6e 49 73 54 61 62 20 29 7b 0a 20 20 20 20  panIsTab ){.    
1b850 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1b860 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1b870 20 28 25 73 29 22 2c 20 70 4c 69 73 74 2d 3e 61   (%s)", pList->a
1b880 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  [i].zSpan);.    
1b890 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c    }.      if( i<
1b8a0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 29  pList->nExpr-1 )
1b8b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1b8c0 33 45 78 70 6c 61 69 6e 4e 4c 28 70 4f 75 74 29  3ExplainNL(pOut)
1b8d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1b8e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1b8f0 69 6e 50 6f 70 28 70 4f 75 74 29 3b 0a 20 20 7d  inPop(pOut);.  }
1b900 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
1b910 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a  ITE_DEBUG */../*
1b920 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
1b930 69 66 20 70 45 78 70 72 20 69 73 20 61 6e 20 63  if pExpr is an c
1b940 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69  onstant expressi
1b950 6f 6e 20 74 68 61 74 20 69 73 20 61 70 70 72 6f  on that is appro
1b960 70 72 69 61 74 65 0a 2a 2a 20 66 6f 72 20 66 61  priate.** for fa
1b970 63 74 6f 72 69 6e 67 20 6f 75 74 20 6f 66 20 61  ctoring out of a
1b980 20 6c 6f 6f 70 2e 20 20 41 70 70 72 6f 70 72 69   loop.  Appropri
1b990 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ate expressions 
1b9a0 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  are:.**.**    * 
1b9b0 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   Any expression 
1b9c0 74 68 61 74 20 65 76 61 6c 75 61 74 65 73 20 74  that evaluates t
1b9d0 6f 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 70  o two or more op
1b9e0 63 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  codes..**.**    
1b9f0 2a 20 20 41 6e 79 20 4f 50 5f 49 6e 74 65 67 65  *  Any OP_Intege
1ba00 72 2c 20 4f 50 5f 52 65 61 6c 2c 20 4f 50 5f 53  r, OP_Real, OP_S
1ba10 74 72 69 6e 67 2c 20 4f 50 5f 42 6c 6f 62 2c 20  tring, OP_Blob, 
1ba20 4f 50 5f 4e 75 6c 6c 2c 20 0a 2a 2a 20 20 20 20  OP_Null, .**    
1ba30 20 20 20 6f 72 20 4f 50 5f 56 61 72 69 61 62 6c     or OP_Variabl
1ba40 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
1ba50 6e 65 65 64 20 74 6f 20 62 65 20 70 6c 61 63 65  need to be place
1ba60 64 20 69 6e 20 61 20 0a 2a 2a 20 20 20 20 20 20  d in a .**      
1ba70 20 73 70 65 63 69 66 69 63 20 72 65 67 69 73 74   specific regist
1ba80 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  er..**.** There 
1ba90 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 66  is no point in f
1baa0 61 63 74 6f 72 69 6e 67 20 6f 75 74 20 73 69 6e  actoring out sin
1bab0 67 6c 65 2d 69 6e 73 74 72 75 63 74 69 6f 6e 20  gle-instruction 
1bac0 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 65 78 70 72  constant.** expr
1bad0 65 73 73 69 6f 6e 73 20 74 68 61 74 20 6e 65 65  essions that nee
1bae0 64 20 74 6f 20 62 65 20 70 6c 61 63 65 64 20 69  d to be placed i
1baf0 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 72  n a particular r
1bb00 65 67 69 73 74 65 72 2e 20 20 0a 2a 2a 20 57 65  egister.  .** We
1bb10 20 63 6f 75 6c 64 20 66 61 63 74 6f 72 20 74 68   could factor th
1bb20 65 6d 20 6f 75 74 2c 20 62 75 74 20 74 68 65 6e  em out, but then
1bb30 20 77 65 20 77 6f 75 6c 64 20 65 6e 64 20 75 70   we would end up
1bb40 20 61 64 64 69 6e 67 20 61 6e 0a 2a 2a 20 4f 50   adding an.** OP
1bb50 5f 53 43 6f 70 79 20 69 6e 73 74 72 75 63 74 69  _SCopy instructi
1bb60 6f 6e 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 76  on to move the v
1bb70 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 63 6f  alue into the co
1bb80 72 72 65 63 74 20 72 65 67 69 73 74 65 72 0a 2a  rrect register.*
1bb90 2a 20 6c 61 74 65 72 2e 20 20 57 65 20 6d 69 67  * later.  We mig
1bba0 68 74 20 61 73 20 77 65 6c 6c 20 6a 75 73 74 20  ht as well just 
1bbb0 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  use the original
1bbc0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64   instruction and
1bbd0 0a 2a 2a 20 61 76 6f 69 64 20 74 68 65 20 4f 50  .** avoid the OP
1bbe0 5f 53 43 6f 70 79 2e 0a 2a 2f 0a 73 74 61 74 69  _SCopy..*/.stati
1bbf0 63 20 69 6e 74 20 69 73 41 70 70 72 6f 70 72 69  c int isAppropri
1bc00 61 74 65 46 6f 72 46 61 63 74 6f 72 69 6e 67 28  ateForFactoring(
1bc10 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
1bc20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
1bc30 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 29  nstantNotJoin(p)
1bc40 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
1bc50 3b 20 20 2f 2a 20 4f 6e 6c 79 20 63 6f 6e 73 74  ;  /* Only const
1bc60 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ant expressions 
1bc70 61 72 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  are appropriate 
1bc80 66 6f 72 20 66 61 63 74 6f 72 69 6e 67 20 2a 2f  for factoring */
1bc90 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 66  .  }.  if( (p->f
1bca0 6c 61 67 73 20 26 20 45 50 5f 46 69 78 65 64 44  lags & EP_FixedD
1bcb0 65 73 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  est)==0 ){.    r
1bcc0 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6e 79  eturn 1;  /* Any
1bcd0 20 63 6f 6e 73 74 61 6e 74 20 77 69 74 68 6f 75   constant withou
1bce0 74 20 61 20 66 69 78 65 64 20 64 65 73 74 69 6e  t a fixed destin
1bcf0 61 74 69 6f 6e 20 69 73 20 61 70 70 72 6f 70 72  ation is appropr
1bd00 69 61 74 65 20 2a 2f 0a 20 20 7d 0a 20 20 77 68  iate */.  }.  wh
1bd10 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ile( p->op==TK_U
1bd20 50 4c 55 53 20 29 20 70 20 3d 20 70 2d 3e 70 4c  PLUS ) p = p->pL
1bd30 65 66 74 3b 0a 20 20 73 77 69 74 63 68 28 20 70  eft;.  switch( p
1bd40 2d 3e 6f 70 20 29 7b 0a 23 69 66 6e 64 65 66 20  ->op ){.#ifndef 
1bd50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42  SQLITE_OMIT_BLOB
1bd60 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73  _LITERAL.    cas
1bd70 65 20 54 4b 5f 42 4c 4f 42 3a 0a 23 65 6e 64 69  e TK_BLOB:.#endi
1bd80 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41  f.    case TK_VA
1bd90 52 49 41 42 4c 45 3a 0a 20 20 20 20 63 61 73 65  RIABLE:.    case
1bda0 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20   TK_INTEGER:.   
1bdb0 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a   case TK_FLOAT:.
1bdc0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c      case TK_NULL
1bdd0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
1bde0 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 74 65  RING: {.      te
1bdf0 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
1be00 4b 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 20 20  K_BLOB );.      
1be10 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
1be20 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 3b 0a  =TK_VARIABLE );.
1be30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1be40 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45  p->op==TK_INTEGE
1be50 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  R );.      testc
1be60 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46  ase( p->op==TK_F
1be70 4c 4f 41 54 20 29 3b 0a 20 20 20 20 20 20 74 65  LOAT );.      te
1be80 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
1be90 4b 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  K_NULL );.      
1bea0 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
1beb0 3d 54 4b 5f 53 54 52 49 4e 47 20 29 3b 0a 20 20  =TK_STRING );.  
1bec0 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 2d 69 6e      /* Single-in
1bed0 73 74 72 75 63 74 69 6f 6e 20 63 6f 6e 73 74 61  struction consta
1bee0 6e 74 73 20 77 69 74 68 20 61 20 66 69 78 65 64  nts with a fixed
1bef0 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 61 72 65   destination are
1bf00 0a 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72  .      ** better
1bf10 20 64 6f 6e 65 20 69 6e 2d 6c 69 6e 65 2e 20 20   done in-line.  
1bf20 49 66 20 77 65 20 66 61 63 74 6f 72 20 74 68 65  If we factor the
1bf30 6d 2c 20 74 68 65 79 20 77 69 6c 6c 20 6a 75 73  m, they will jus
1bf40 74 20 65 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75  t end.      ** u
1bf50 70 20 67 65 6e 65 72 61 74 69 6e 67 20 61 6e 20  p generating an 
1bf60 4f 50 5f 53 43 6f 70 79 20 74 6f 20 6d 6f 76 65  OP_SCopy to move
1bf70 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 74 68   the value to th
1bf80 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 20 20  e destination.  
1bf90 20 20 20 20 2a 2a 20 72 65 67 69 73 74 65 72 2e      ** register.
1bfa0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
1bfb0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   0;.    }.    ca
1bfc0 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a  se TK_UMINUS: {.
1bfd0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65        if( p->pLe
1bfe0 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54  ft->op==TK_FLOAT
1bff0 20 7c 7c 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70   || p->pLeft->op
1c000 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a  ==TK_INTEGER ){.
1c010 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
1c020 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c030 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1c040 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
1c050 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1c060 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
1c070 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ../*.** If pExpr
1c080 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 65   is a constant e
1c090 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69  xpression that i
1c0a0 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
1c0b0 72 0a 2a 2a 20 66 61 63 74 6f 72 69 6e 67 20 6f  r.** factoring o
1c0c0 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2c 20 74 68  ut of a loop, th
1c0d0 65 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  en evaluate the 
1c0e0 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 6e  expression.** in
1c0f0 74 6f 20 61 20 72 65 67 69 73 74 65 72 20 61 6e  to a register an
1c100 64 20 63 6f 6e 76 65 72 74 20 74 68 65 20 65 78  d convert the ex
1c110 70 72 65 73 73 69 6f 6e 20 69 6e 74 6f 20 61 20  pression into a 
1c120 54 4b 5f 52 45 47 49 53 54 45 52 0a 2a 2a 20 65  TK_REGISTER.** e
1c130 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74  xpression..*/.st
1c140 61 74 69 63 20 69 6e 74 20 65 76 61 6c 43 6f 6e  atic int evalCon
1c150 73 74 45 78 70 72 28 57 61 6c 6b 65 72 20 2a 70  stExpr(Walker *p
1c160 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
1c170 78 70 72 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  xpr){.  Parse *p
1c180 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
1c190 3e 70 50 61 72 73 65 3b 0a 20 20 73 77 69 74 63  >pParse;.  switc
1c1a0 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
1c1b0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a      case TK_IN:.
1c1c0 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49      case TK_REGI
1c1d0 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65  STER: {.      re
1c1e0 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
1c1f0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1c200 4b 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20 20  K_COLLATE: {.   
1c210 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
1c220 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
1c230 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
1c240 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ON:.    case TK_
1c250 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20  AGG_FUNCTION:.  
1c260 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f    case TK_CONST_
1c270 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  FUNC: {.      /*
1c280 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74   The arguments t
1c290 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 68 61 76  o a function hav
1c2a0 65 20 61 20 66 69 78 65 64 20 64 65 73 74 69 6e  e a fixed destin
1c2b0 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 20  ation..      ** 
1c2c0 4d 61 72 6b 20 74 68 65 6d 20 74 68 69 73 20 77  Mark them this w
1c2d0 61 79 20 74 6f 20 61 76 6f 69 64 20 67 65 6e 65  ay to avoid gene
1c2e0 72 61 74 65 64 20 75 6e 6e 65 65 64 65 64 20 4f  rated unneeded O
1c2f0 50 5f 53 43 6f 70 79 0a 20 20 20 20 20 20 2a 2a  P_SCopy.      **
1c300 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 0a   instructions. .
1c310 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45        */.      E
1c320 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
1c330 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
1c340 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1c350 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1c360 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
1c370 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66  ect) );.      if
1c380 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
1c390 20 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74     int i = pList
1c3a0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
1c3b0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1c3c0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70  _item *pItem = p
1c3d0 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20  List->a;.       
1c3e0 20 66 6f 72 28 3b 20 69 3e 30 3b 20 69 2d 2d 2c   for(; i>0; i--,
1c3f0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
1c400 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
1c410 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 20 29 20  pItem->pExpr) ) 
1c420 70 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 66 6c  pItem->pExpr->fl
1c430 61 67 73 20 7c 3d 20 45 50 5f 46 69 78 65 64 44  ags |= EP_FixedD
1c440 65 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  est;.        }. 
1c450 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
1c460 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
1c470 69 66 28 20 69 73 41 70 70 72 6f 70 72 69 61 74  if( isAppropriat
1c480 65 46 6f 72 46 61 63 74 6f 72 69 6e 67 28 70 45  eForFactoring(pE
1c490 78 70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  xpr) ){.    int 
1c4a0 72 31 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  r1 = ++pParse->n
1c4b0 4d 65 6d 3b 0a 20 20 20 20 69 6e 74 20 72 32 20  Mem;.    int r2 
1c4c0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1c4d0 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
1c4e0 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20  pExpr, r1);.    
1c4f0 2f 2a 20 49 66 20 72 32 21 3d 72 31 2c 20 69 74  /* If r2!=r1, it
1c500 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 67 69   means that regi
1c510 73 74 65 72 20 72 31 20 69 73 20 6e 65 76 65 72  ster r1 is never
1c520 20 75 73 65 64 2e 20 20 54 68 61 74 20 69 73 20   used.  That is 
1c530 68 61 72 6d 6c 65 73 73 0a 20 20 20 20 2a 2a 20  harmless.    ** 
1c540 62 75 74 20 73 75 62 6f 70 74 69 6d 61 6c 2c 20  but suboptimal, 
1c550 73 6f 20 77 65 20 77 61 6e 74 20 74 6f 20 6b 6e  so we want to kn
1c560 6f 77 20 61 62 6f 75 74 20 74 68 65 20 73 69 74  ow about the sit
1c570 75 61 74 69 6f 6e 20 74 6f 20 66 69 78 20 69 74  uation to fix it
1c580 2e 0a 20 20 20 20 2a 2a 20 48 65 6e 63 65 20 74  ..    ** Hence t
1c590 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
1c5a0 65 72 74 3a 20 2a 2f 0a 20 20 20 20 61 73 73 65  ert: */.    asse
1c5b0 72 74 28 20 72 32 3d 3d 72 31 20 29 3b 0a 20 20  rt( r2==r1 );.  
1c5c0 20 20 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 70    pExpr->op2 = p
1c5d0 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 70 45  Expr->op;.    pE
1c5e0 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47  xpr->op = TK_REG
1c5f0 49 53 54 45 52 3b 0a 20 20 20 20 70 45 78 70 72  ISTER;.    pExpr
1c600 2d 3e 69 54 61 62 6c 65 20 3d 20 72 32 3b 0a 20  ->iTable = r2;. 
1c610 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
1c620 75 6e 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  une;.  }.  retur
1c630 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
1c640 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 65 76 61 6c  }../*.** Preeval
1c650 75 61 74 65 20 63 6f 6e 73 74 61 6e 74 20 73 75  uate constant su
1c660 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77 69 74  bexpressions wit
1c670 68 69 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74  hin pExpr and st
1c680 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  ore the.** resul
1c690 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 73 2e  ts in registers.
1c6a0 20 20 4d 6f 64 69 66 79 20 70 45 78 70 72 20 73    Modify pExpr s
1c6b0 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74  o that the const
1c6c0 61 6e 74 20 73 75 62 65 78 70 72 65 73 69 6f 6e  ant subexpresion
1c6d0 73 0a 2a 2a 20 61 72 65 20 54 4b 5f 52 45 47 49  s.** are TK_REGI
1c6e0 53 54 45 52 20 6f 70 63 6f 64 65 73 20 74 68 61  STER opcodes tha
1c6f0 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 70  t refer to the p
1c700 72 65 63 6f 6d 70 75 74 65 64 20 76 61 6c 75 65  recomputed value
1c710 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
1c720 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
1c730 20 69 66 20 74 68 65 20 6a 75 6d 70 20 74 6f 20   if the jump to 
1c740 74 68 65 20 63 6f 6f 6b 69 65 2d 63 68 65 63 6b  the cookie-check
1c750 20 63 6f 64 65 20 68 61 73 0a 2a 2a 20 61 6c 72   code has.** alr
1c760 65 61 64 79 20 6f 63 63 75 72 2e 20 20 53 69 6e  eady occur.  Sin
1c770 63 65 20 74 68 65 20 63 6f 6f 6b 69 65 2d 63 68  ce the cookie-ch
1c780 65 63 6b 20 6a 75 6d 70 20 69 73 20 67 65 6e 65  eck jump is gene
1c790 72 61 74 65 64 20 70 72 69 6f 72 20 74 6f 0a 2a  rated prior to.*
1c7a0 2a 20 61 6e 79 20 6f 74 68 65 72 20 73 65 72 69  * any other seri
1c7b0 6f 75 73 20 70 72 6f 63 65 73 73 69 6e 67 2c 20  ous processing, 
1c7c0 74 68 69 73 20 63 68 65 63 6b 20 65 6e 73 75 72  this check ensur
1c7d0 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
1c7e0 20 6e 6f 0a 2a 2a 20 77 61 79 20 74 6f 20 61 63   no.** way to ac
1c7f0 63 69 64 65 6e 74 6c 79 20 62 79 70 61 73 73 20  cidently bypass 
1c800 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 69 6e 69  the constant ini
1c810 74 69 61 6c 69 7a 61 74 69 6f 6e 73 2e 0a 2a 2a  tializations..**
1c820 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1c830 20 69 73 20 61 6c 73 6f 20 61 20 6e 6f 2d 6f 70   is also a no-op
1c840 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 46   if the SQLITE_F
1c850 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 20 6f 70  actorOutConst op
1c860 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 69 73  timization.** is
1c870 20 64 69 73 61 62 6c 65 64 20 76 69 61 20 74 68   disabled via th
1c880 65 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  e sqlite3_test_c
1c890 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1c8a0 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54  STCTRL_OPTIMIZAT
1c8b0 49 4f 4e 53 29 0a 2a 2a 20 69 6e 74 65 72 66 61  IONS).** interfa
1c8c0 63 65 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73  ce.  This allows
1c8d0 20 74 65 73 74 20 6c 6f 67 69 63 20 74 6f 20 76   test logic to v
1c8e0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 73  erify that the s
1c8f0 61 6d 65 20 61 6e 73 77 65 72 20 69 73 0a 2a 2a  ame answer is.**
1c900 20 6f 62 74 61 69 6e 65 64 20 66 6f 72 20 71 75   obtained for qu
1c910 65 72 69 65 73 20 72 65 67 61 72 64 6c 65 73 73  eries regardless
1c920 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e   of whether or n
1c930 6f 74 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65  ot constants are
1c940 0a 2a 2a 20 70 72 65 63 6f 6d 70 75 74 65 64 20  .** precomputed 
1c950 69 6e 74 6f 20 72 65 67 69 73 74 65 72 73 20 6f  into registers o
1c960 72 20 69 66 20 74 68 65 79 20 61 72 65 20 69 6e  r if they are in
1c970 73 65 72 74 65 64 20 69 6e 2d 6c 69 6e 65 2e 0a  serted in-line..
1c980 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1c990 78 70 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74 73  xprCodeConstants
1c9a0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1c9b0 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
1c9c0 57 61 6c 6b 65 72 20 77 3b 0a 20 20 69 66 28 20  Walker w;.  if( 
1c9d0 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f  pParse->cookieGo
1c9e0 74 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  to ) return;.  i
1c9f0 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  f( OptimizationD
1ca00 69 73 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e  isabled(pParse->
1ca10 64 62 2c 20 53 51 4c 49 54 45 5f 46 61 63 74 6f  db, SQLITE_Facto
1ca20 72 4f 75 74 43 6f 6e 73 74 29 20 29 20 72 65 74  rOutConst) ) ret
1ca30 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77  urn;.  memset(&w
1ca40 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b  , 0, sizeof(w));
1ca50 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
1ca60 63 6b 20 3d 20 65 76 61 6c 43 6f 6e 73 74 45 78  ck = evalConstEx
1ca70 70 72 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d  pr;.  w.pParse =
1ca80 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74   pParse;.  sqlit
1ca90 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
1caa0 45 78 70 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  Expr);.}.../*.**
1cab0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1cac0 68 61 74 20 70 75 73 68 65 73 20 74 68 65 20 76  hat pushes the v
1cad0 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c  alue of every el
1cae0 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76  ement of the giv
1caf0 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  en.** expression
1cb00 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65 71   list into a seq
1cb10 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65  uence of registe
1cb20 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  rs beginning at 
1cb30 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65  target..**.** Re
1cb40 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
1cb50 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c  of elements eval
1cb60 75 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  uated..*/.int sq
1cb70 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
1cb80 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
1cb90 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50  pParse,     /* P
1cba0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1cbb0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
1cbc0 69 73 74 2c 20 20 20 2f 2a 20 54 68 65 20 65 78  ist,   /* The ex
1cbd0 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f  pression list to
1cbe0 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69   be coded */.  i
1cbf0 6e 74 20 74 61 72 67 65 74 2c 20 20 20 20 20 20  nt target,      
1cc00 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72    /* Where to wr
1cc10 69 74 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ite results */. 
1cc20 20 69 6e 74 20 64 6f 48 61 72 64 43 6f 70 79 20   int doHardCopy 
1cc30 20 20 20 20 2f 2a 20 4d 61 6b 65 20 61 20 68 61      /* Make a ha
1cc40 72 64 20 63 6f 70 79 20 6f 66 20 65 76 65 72 79  rd copy of every
1cc50 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20   element */.){. 
1cc60 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1cc70 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1cc80 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 61 73 73 65  int i, n;.  asse
1cc90 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a  rt( pList!=0 );.
1cca0 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
1ccb0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
1ccc0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30  pParse->pVdbe!=0
1ccd0 20 29 3b 20 20 2f 2a 20 4e 65 76 65 72 20 67 65   );  /* Never ge
1cce0 74 73 20 74 68 69 73 20 66 61 72 20 6f 74 68 65  ts this far othe
1ccf0 72 77 69 73 65 20 2a 2f 0a 20 20 6e 20 3d 20 70  rwise */.  n = p
1cd00 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 66  List->nExpr;.  f
1cd10 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
1cd20 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  a, i=0; i<n; i++
1cd30 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1cd40 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 49  Expr *pExpr = pI
1cd50 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
1cd60 69 6e 74 20 69 6e 52 65 67 20 3d 20 73 71 6c 69  int inReg = sqli
1cd70 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
1cd80 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
1cd90 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20   target+i);.    
1cda0 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65  if( inReg!=targe
1cdb0 74 2b 69 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  t+i ){.      sql
1cdc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70  ite3VdbeAddOp2(p
1cdd0 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 64 6f  Parse->pVdbe, do
1cde0 48 61 72 64 43 6f 70 79 20 3f 20 4f 50 5f 43 6f  HardCopy ? OP_Co
1cdf0 70 79 20 3a 20 4f 50 5f 53 43 6f 70 79 2c 0a 20  py : OP_SCopy,. 
1ce00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce10 20 20 20 20 20 20 20 69 6e 52 65 67 2c 20 74 61         inReg, ta
1ce20 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 7d 0a 20  rget+i);.    }. 
1ce30 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
1ce40 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1ce50 20 63 6f 64 65 20 66 6f 72 20 61 20 42 45 54 57   code for a BETW
1ce60 45 45 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  EEN operator..**
1ce70 0a 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e  .**    x BETWEEN
1ce80 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54   y AND z.**.** T
1ce90 68 65 20 61 62 6f 76 65 20 69 73 20 65 71 75 69  he above is equi
1cea0 76 61 6c 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a  valent to .**.**
1ceb0 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d      x>=y AND x<=
1cec0 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 69 74 20  z.**.** Code it 
1ced0 61 73 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20  as such, taking 
1cee0 63 61 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63  care to do the c
1cef0 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73  ommon subexpress
1cf00 69 6f 6e 0a 2a 2a 20 65 6c 65 6d 65 6e 74 61 74  ion.** elementat
1cf10 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2f 0a 73 74 61  ion of x..*/.sta
1cf20 74 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 64  tic void exprCod
1cf30 65 42 65 74 77 65 65 6e 28 0a 20 20 50 61 72 73  eBetween(.  Pars
1cf40 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
1cf50 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
1cf60 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
1cf70 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
1cf80 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54  pExpr,      /* T
1cf90 68 65 20 42 45 54 57 45 45 4e 20 65 78 70 72 65  he BETWEEN expre
1cfa0 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64  ssion */.  int d
1cfb0 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  est,         /* 
1cfc0 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65  Jump here if the
1cfd0 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 2a   jump is taken *
1cfe0 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 54 72  /.  int jumpIfTr
1cff0 75 65 2c 20 20 20 2f 2a 20 54 61 6b 65 20 74 68  ue,   /* Take th
1d000 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42 45  e jump if the BE
1d010 54 57 45 45 4e 20 69 73 20 74 72 75 65 20 2a 2f  TWEEN is true */
1d020 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  .  int jumpIfNul
1d030 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20 74 68 65  l    /* Take the
1d040 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42 45 54   jump if the BET
1d050 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a  WEEN is NULL */.
1d060 29 7b 0a 20 20 45 78 70 72 20 65 78 70 72 41 6e  ){.  Expr exprAn
1d070 64 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 41 4e  d;     /* The AN
1d080 44 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 20 78  D operator in  x
1d090 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f  >=y AND x<=z  */
1d0a0 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74  .  Expr compLeft
1d0b0 3b 20 20 20 20 2f 2a 20 54 68 65 20 20 78 3e 3d  ;    /* The  x>=
1d0c0 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70  y  term */.  Exp
1d0d0 72 20 63 6f 6d 70 52 69 67 68 74 3b 20 20 20 2f  r compRight;   /
1d0e0 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20 74 65 72  * The  x<=z  ter
1d0f0 6d 20 2a 2f 0a 20 20 45 78 70 72 20 65 78 70 72  m */.  Expr expr
1d100 58 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  X;       /* The 
1d110 20 78 20 20 73 75 62 65 78 70 72 65 73 73 69 6f   x  subexpressio
1d120 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72  n */.  int regFr
1d130 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54 65 6d 70  ee1 = 0; /* Temp
1d140 6f 72 61 72 79 20 75 73 65 20 72 65 67 69 73 74  orary use regist
1d150 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
1d160 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1d170 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
1d180 65 6c 65 63 74 29 20 29 3b 0a 20 20 65 78 70 72  elect) );.  expr
1d190 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66  X = *pExpr->pLef
1d1a0 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 6f 70 20  t;.  exprAnd.op 
1d1b0 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 65 78 70 72  = TK_AND;.  expr
1d1c0 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d  And.pLeft = &com
1d1d0 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64  pLeft;.  exprAnd
1d1e0 2e 70 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52  .pRight = &compR
1d1f0 69 67 68 74 3b 0a 20 20 63 6f 6d 70 4c 65 66 74  ight;.  compLeft
1d200 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 63  .op = TK_GE;.  c
1d210 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20  ompLeft.pLeft = 
1d220 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 4c 65  &exprX;.  compLe
1d230 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70  ft.pRight = pExp
1d240 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d  r->x.pList->a[0]
1d250 2e 70 45 78 70 72 3b 0a 20 20 63 6f 6d 70 52 69  .pExpr;.  compRi
1d260 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a  ght.op = TK_LE;.
1d270 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66    compRight.pLef
1d280 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f  t = &exprX;.  co
1d290 6d 70 52 69 67 68 74 2e 70 52 69 67 68 74 20 3d  mpRight.pRight =
1d2a0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
1d2b0 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 65  >a[1].pExpr;.  e
1d2c0 78 70 72 58 2e 69 54 61 62 6c 65 20 3d 20 73 71  xprX.iTable = sq
1d2d0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1d2e0 70 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 58  p(pParse, &exprX
1d2f0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1d300 65 78 70 72 58 2e 6f 70 20 3d 20 54 4b 5f 52 45  exprX.op = TK_RE
1d310 47 49 53 54 45 52 3b 0a 20 20 69 66 28 20 6a 75  GISTER;.  if( ju
1d320 6d 70 49 66 54 72 75 65 20 29 7b 0a 20 20 20 20  mpIfTrue ){.    
1d330 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
1d340 65 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41  e(pParse, &exprA
1d350 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  nd, dest, jumpIf
1d360 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Null);.  }else{.
1d370 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1d380 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 26  fFalse(pParse, &
1d390 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a  exprAnd, dest, j
1d3a0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a  umpIfNull);.  }.
1d3b0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1d3c0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1d3d0 72 65 67 46 72 65 65 31 29 3b 0a 0a 20 20 2f 2a  regFree1);..  /*
1d3e0 20 45 6e 73 75 72 65 20 61 64 65 71 75 61 74 65   Ensure adequate
1d3f0 20 74 65 73 74 20 63 6f 76 65 72 61 67 65 20 2a   test coverage *
1d400 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  /.  testcase( ju
1d410 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a  mpIfTrue==0 && j
1d420 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20  umpIfNull==0 && 
1d430 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1d440 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1d450 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70  fTrue==0 && jump
1d460 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67  IfNull==0 && reg
1d470 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65  Free1!=0 );.  te
1d480 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72  stcase( jumpIfTr
1d490 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e  ue==0 && jumpIfN
1d4a0 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65  ull!=0 && regFre
1d4b0 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
1d4c0 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d  ase( jumpIfTrue=
1d4d0 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  =0 && jumpIfNull
1d4e0 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21  !=0 && regFree1!
1d4f0 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
1d500 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20  ( jumpIfTrue!=0 
1d510 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
1d520 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20   && regFree1==0 
1d530 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a  );.  testcase( j
1d540 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26 20  umpIfTrue!=0 && 
1d550 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26  jumpIfNull==0 &&
1d560 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a   regFree1!=0 );.
1d570 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1d580 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d  IfTrue!=0 && jum
1d590 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65  pIfNull!=0 && re
1d5a0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74  gFree1==0 );.  t
1d5b0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54  estcase( jumpIfT
1d5c0 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66  rue!=0 && jumpIf
1d5d0 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72  Null!=0 && regFr
1d5e0 65 65 31 21 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a  ee1!=0 );.}../*.
1d5f0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1d600 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65   for a boolean e
1d610 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74  xpression such t
1d620 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  hat a jump is ma
1d630 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62  de.** to the lab
1d640 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65  el "dest" if the
1d650 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
1d660 72 75 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  rue but executio
1d670 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
1d680 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
1d690 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
1d6a0 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  s false..**.** I
1d6b0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1d6c0 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
1d6d0 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65  LL (neither true
1d6e0 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65   nor false), the
1d6f0 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75  n.** take the ju
1d700 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66  mp if the jumpIf
1d710 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51 4c  Null flag is SQL
1d720 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a  ITE_JUMPIFNULL..
1d730 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20  **.** This code 
1d740 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66  depends on the f
1d750 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e  act that certain
1d760 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65   token values (e
1d770 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65  x: TK_EQ).** are
1d780 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63   the same as opc
1d790 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ode values (ex: 
1d7a0 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c  OP_Eq) that impl
1d7b0 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73  ement the corres
1d7c0 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61  ponding.** opera
1d7d0 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63  tion.  Special c
1d7e0 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e  omments in vdbe.
1d7f0 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f  c and the mkopco
1d800 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69  deh.awk script i
1d810 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72  n.** the make pr
1d820 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73  ocess cause thes
1d830 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67  e values to alig
1d840 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e  n.  Assert()s in
1d850 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c   the code.** bel
1d860 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74  ow verify that t
1d870 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  he numbers are a
1d880 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79  ligned correctly
1d890 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1d8a0 33 45 78 70 72 49 66 54 72 75 65 28 50 61 72 73  3ExprIfTrue(Pars
1d8b0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1d8c0 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
1d8d0 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
1d8e0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1d8f0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1d900 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e  int op = 0;.  in
1d910 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a  t regFree1 = 0;.
1d920 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
1d930 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   0;.  int r1, r2
1d940 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d  ;..  assert( jum
1d950 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
1d960 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75  JUMPIFNULL || ju
1d970 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1d980 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
1d990 20 29 20 20 20 20 20 72 65 74 75 72 6e 3b 20 20   )     return;  
1d9a0 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20  /* Existence of 
1d9b0 56 44 42 45 20 63 68 65 63 6b 65 64 20 62 79 20  VDBE checked by 
1d9c0 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20  caller */.  if( 
1d9d0 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20  NEVER(pExpr==0) 
1d9e0 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f  ) return;  /* No
1d9f0 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68 61   way this can ha
1da00 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70  ppen */.  op = p
1da10 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74  Expr->op;.  swit
1da20 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
1da30 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20  se TK_AND: {.   
1da40 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
1da50 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1da60 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  (v);.      testc
1da70 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
1da80 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1da90 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
1daa0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1dab0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
1dac0 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
1dad0 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70  ->pLeft, d2,jump
1dae0 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55  IfNull^SQLITE_JU
1daf0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
1db00 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
1db10 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
1db20 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
1db30 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
1db40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1db50 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32  solveLabel(v, d2
1db60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1db70 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
1db80 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 62  rse, 1);.      b
1db90 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1dba0 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20  case TK_OR: {.  
1dbb0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1dbc0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1dbd0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1dbe0 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
1dbf0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
1dc00 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1dc10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1dc20 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
1dc30 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
1dc40 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1dc50 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1dc60 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1dc70 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  _NOT: {.      te
1dc80 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
1dc90 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
1dca0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
1dcb0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1dcc0 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
1dcd0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1dce0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1dcf0 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
1dd00 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
1dd10 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
1dd20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
1dd30 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
1dd40 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
1dd50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1dd60 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20  _LT==OP_Lt );.  
1dd70 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
1dd80 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20  E==OP_Le );.    
1dd90 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d    assert( TK_GT=
1dda0 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20  =OP_Gt );.      
1ddb0 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f  assert( TK_GE==O
1ddc0 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Ge );.      as
1ddd0 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f  sert( TK_EQ==OP_
1dde0 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Eq );.      asse
1ddf0 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65  rt( TK_NE==OP_Ne
1de00 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1de10 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b  se( op==TK_LT );
1de20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1de30 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20   op==TK_LE );.  
1de40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1de50 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20  ==TK_GT );.     
1de60 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1de70 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65  K_GE );.      te
1de80 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45  stcase( op==TK_E
1de90 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Q );.      testc
1dea0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29  ase( op==TK_NE )
1deb0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1dec0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1ded0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
1dee0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1def0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1df00 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1df10 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
1df20 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1df30 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1df40 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
1df50 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ee2);.      code
1df60 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
1df70 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
1df80 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
1df90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1dfa0 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c     r1, r2, dest,
1dfb0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1dfc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1dfd0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1dfe0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1dff0 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
1e000 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1e010 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20     case TK_IS:. 
1e020 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54     case TK_ISNOT
1e030 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1e040 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b  se( op==TK_IS );
1e050 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e060 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b   op==TK_ISNOT );
1e070 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
1e080 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1e090 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1e0a0 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1e0b0 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
1e0c0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1e0d0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1e0e0 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
1e0f0 32 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28  2);.      op = (
1e100 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f  op==TK_IS) ? TK_
1e110 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20  EQ : TK_NE;.    
1e120 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
1e130 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1e140 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
1e150 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
1e160 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
1e170 20 64 65 73 74 2c 20 53 51 4c 49 54 45 5f 4e 55   dest, SQLITE_NU
1e180 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73  LLEQ);.      tes
1e190 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1e1a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1e1b0 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
1e1c0 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1e1d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e1e0 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
1e1f0 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
1e200 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1e210 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
1e220 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61  sNull );.      a
1e230 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c  ssert( TK_NOTNUL
1e240 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  L==OP_NotNull );
1e250 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e260 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
1e270 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e280 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ( op==TK_NOTNULL
1e290 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
1e2a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1e2b0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1e2c0 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1e2d0 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e1);.      sqlit
1e2e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1e2f0 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20  op, r1, dest);. 
1e300 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1e310 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1e320 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1e330 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
1e340 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65  WEEN: {.      te
1e350 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
1e360 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65  ll==0 );.      e
1e370 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70  xprCodeBetween(p
1e380 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
1e390 73 74 2c 20 31 2c 20 6a 75 6d 70 49 66 4e 75 6c  st, 1, jumpIfNul
1e3a0 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
1e3b0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1e3c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1e3d0 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
1e3e0 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  IN: {.      int 
1e3f0 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71  destIfFalse = sq
1e400 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1e410 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74  el(v);.      int
1e420 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a 75   destIfNull = ju
1e430 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20  mpIfNull ? dest 
1e440 3a 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20  : destIfFalse;. 
1e450 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1e460 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
1e470 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73  Expr, destIfFals
1e480 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  e, destIfNull);.
1e490 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e4a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1e4b0 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20  to, 0, dest);.  
1e4c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1e4d0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
1e4e0 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20  estIfFalse);.   
1e4f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1e500 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75  #endif.    defau
1e510 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d  lt: {.      r1 =
1e520 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1e530 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1e540 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  pr, &regFree1);.
1e550 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e560 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
1e570 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r1, dest, jump
1e580 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20  IfNull!=0);.    
1e590 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1e5a0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1e5b0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1e5c0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1e5d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1e5e0 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
1e5f0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1e600 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20  e, regFree1);.  
1e610 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1e620 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
1e630 67 46 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a  gFree2);  .}../*
1e640 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1e650 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20  e for a boolean 
1e660 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20  expression such 
1e670 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d  that a jump is m
1e680 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61  ade.** to the la
1e690 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68  bel "dest" if th
1e6a0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1e6b0 66 61 6c 73 65 20 62 75 74 20 65 78 65 63 75 74  false but execut
1e6c0 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73  ion.** continues
1e6d0 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69   straight thru i
1e6e0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1e6f0 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20   is true..**.** 
1e700 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
1e710 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  n evaluates to N
1e720 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75  ULL (neither tru
1e730 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65  e nor false) the
1e740 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d  n.** jump if jum
1e750 70 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54  pIfNull is SQLIT
1e760 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20  E_JUMPIFNULL or 
1e770 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20  fall through if 
1e780 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73  jumpIfNull.** is
1e790 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69   0..*/.void sqli
1e7a0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 50  te3ExprIfFalse(P
1e7b0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
1e7c0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64  pr *pExpr, int d
1e7d0 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  est, int jumpIfN
1e7e0 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ull){.  Vdbe *v 
1e7f0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1e800 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20  .  int op = 0;. 
1e810 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
1e820 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
1e830 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c  2 = 0;.  int r1,
1e840 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   r2;..  assert( 
1e850 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
1e860 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c  TE_JUMPIFNULL ||
1e870 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1e880 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d  ;.  if( NEVER(v=
1e890 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a  =0) ) return; /*
1e8a0 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44   Existence of VD
1e8b0 42 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61  BE checked by ca
1e8c0 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 70 45  ller */.  if( pE
1e8d0 78 70 72 3d 3d 30 20 29 20 20 20 20 72 65 74 75  xpr==0 )    retu
1e8e0 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61  rn;..  /* The va
1e8f0 6c 75 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70  lue of pExpr->op
1e900 20 61 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61   and op are rela
1e910 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
1e920 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
1e930 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20  pExpr->op       
1e940 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20       op.  **    
1e950 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20     ---------    
1e960 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d        ----------
1e970 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49  .  **       TK_I
1e980 53 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f  SNULL          O
1e990 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20  P_NotNull.  **  
1e9a0 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20       TK_NOTNULL 
1e9b0 20 20 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c          OP_IsNul
1e9c0 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  l.  **       TK_
1e9d0 4e 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  NE              
1e9e0 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Eq.  **      
1e9f0 20 54 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20   TK_EQ          
1ea00 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20      OP_Ne.  **  
1ea10 20 20 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20       TK_GT      
1ea20 20 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20          OP_Le.  
1ea30 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20  **       TK_LE  
1ea40 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47              OP_G
1ea50 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  t.  **       TK_
1ea60 47 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  GE              
1ea70 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Lt.  **      
1ea80 20 54 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20   TK_LT          
1ea90 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20      OP_Ge.  **. 
1eaa0 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61   ** For other va
1eab0 6c 75 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f  lues of pExpr->o
1eac0 70 2c 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e  p, op is undefin
1ead0 65 64 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20  ed and unused.. 
1eae0 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   ** The value of
1eaf0 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e   TK_ and OP_ con
1eb00 73 74 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e  stants are arran
1eb10 67 65 64 20 73 75 63 68 20 74 68 61 74 20 77 65  ged such that we
1eb20 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74  .  ** can comput
1eb30 65 20 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62  e the mapping ab
1eb40 6f 76 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f  ove using the fo
1eb50 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69  llowing expressi
1eb60 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28  on..  ** Assert(
1eb70 29 73 20 76 65 72 69 66 79 20 74 68 61 74 20 74  )s verify that t
1eb80 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69  he computation i
1eb90 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a  s correct..  */.
1eba0 20 20 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e    op = ((pExpr->
1ebb0 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29  op+(TK_ISNULL&1)
1ebc0 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26  )^1)-(TK_ISNULL&
1ebd0 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79  1);..  /* Verify
1ebe0 20 63 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65   correct alignme
1ebf0 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50  nt of TK_ and OP
1ec00 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f  _ constants.  */
1ec10 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
1ec20 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ->op!=TK_ISNULL 
1ec30 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  || op==OP_NotNul
1ec40 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
1ec50 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54  Expr->op!=TK_NOT
1ec60 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49  NULL || op==OP_I
1ec70 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  sNull );.  asser
1ec80 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
1ec90 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71  _NE || op==OP_Eq
1eca0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1ecb0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c  xpr->op!=TK_EQ |
1ecc0 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20  | op==OP_Ne );. 
1ecd0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1ece0 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d  op!=TK_LT || op=
1ecf0 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Ge );.  asse
1ed00 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
1ed10 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47  K_LE || op==OP_G
1ed20 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
1ed30 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20  Expr->op!=TK_GT 
1ed40 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a  || op==OP_Le );.
1ed50 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1ed60 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70  >op!=TK_GE || op
1ed70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77  ==OP_Lt );..  sw
1ed80 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
1ed90 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
1eda0 4e 44 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  ND: {.      test
1edb0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1edc0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
1edd0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
1ede0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1edf0 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
1ee00 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
1ee10 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
1ee20 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1ee30 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
1ee40 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1ee50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1ee60 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b     case TK_OR: {
1ee70 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20  .      int d2 = 
1ee80 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1ee90 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74  abel(v);.      t
1eea0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1eeb0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1eec0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1eed0 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
1eee0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1eef0 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
1ef00 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20  xpr->pLeft, d2, 
1ef10 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54  jumpIfNull^SQLIT
1ef20 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
1ef30 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1ef40 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
1ef50 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
1ef60 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1ef70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1ef80 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1ef90 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71  v, d2);.      sq
1efa0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
1efb0 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20  p(pParse, 1);.  
1efc0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1efd0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
1efe0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1eff0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1f000 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
1f010 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
1f020 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1f030 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
1f040 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
1f050 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1f060 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
1f070 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
1f080 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
1f090 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
1f0a0 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
1f0b0 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
1f0c0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1f0d0 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65  K_LT );.      te
1f0e0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c  stcase( op==TK_L
1f0f0 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
1f100 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29  ase( op==TK_GT )
1f110 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1f120 28 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20  ( op==TK_GE );. 
1f130 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1f140 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20  p==TK_EQ );.    
1f150 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1f160 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_NE );.      t
1f170 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1f180 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1f190 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1f1a0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1f1b0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1f1c0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1f1d0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1f1e0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1f1f0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1f200 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
1f210 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
1f220 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1f230 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
1f240 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
1f250 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
1f260 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1f270 6c 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ll);.      testc
1f280 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1f290 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1f2a0 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
1f2b0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1f2c0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1f2d0 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IS:.    case T
1f2e0 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20  K_ISNOT: {.     
1f2f0 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
1f300 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ->op==TK_IS );. 
1f310 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1f320 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e  Expr->op==TK_ISN
1f330 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  OT );.      r1 =
1f340 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1f350 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1f360 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1f370 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
1f380 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1f390 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1f3a0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
1f3b0 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 6f  gFree2);.      o
1f3c0 70 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d  p = (pExpr->op==
1f3d0 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20 3a  TK_IS) ? TK_NE :
1f3e0 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 63 6f   TK_EQ;.      co
1f3f0 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
1f400 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1f410 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
1f420 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
1f430 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73       r1, r2, des
1f440 74 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  t, SQLITE_NULLEQ
1f450 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1f460 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1f470 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1f480 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
1f490 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1f4a0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1f4b0 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
1f4c0 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
1f4d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1f4e0 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a  p==TK_ISNULL );.
1f4f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f500 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29  op==TK_NOTNULL )
1f510 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
1f520 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1f530 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1f540 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
1f550 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f560 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
1f570 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20  , r1, dest);.   
1f580 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1f590 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1f5a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1f5b0 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
1f5c0 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  EN: {.      test
1f5d0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1f5e0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70  ==0 );.      exp
1f5f0 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61  rCodeBetween(pPa
1f600 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
1f610 2c 20 30 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  , 0, jumpIfNull)
1f620 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1f630 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1f640 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1f650 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  Y.    case TK_IN
1f660 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 75  : {.      if( ju
1f670 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  mpIfNull ){.    
1f680 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1f690 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
1f6a0 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 29  xpr, dest, dest)
1f6b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1f6c0 20 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49         int destI
1f6d0 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56  fNull = sqlite3V
1f6e0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1f6f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f700 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73  ExprCodeIN(pPars
1f710 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
1f720 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
1f730 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f740 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1f750 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
1f760 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
1f770 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1f780 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
1f790 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1f7a0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1f7b0 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67  rse, pExpr, &reg
1f7c0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71  Free1);.      sq
1f7d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1f7e0 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c  v, OP_IfNot, r1,
1f7f0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1f800 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 74 65 73  l!=0);.      tes
1f810 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1f820 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1f830 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1f840 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
1f850 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
1f860 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1f870 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
1f880 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
1f890 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1f8a0 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
1f8b0 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  2);.}../*.** Do 
1f8c0 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f  a deep compariso
1f8d0 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73  n of two express
1f8e0 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75  ion trees.  Retu
1f8f0 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 0a  rn 0 if the two.
1f900 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  ** expressions a
1f910 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64  re completely id
1f920 65 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72 6e  entical.  Return
1f930 20 31 20 69 66 20 74 68 65 79 20 64 69 66 66 65   1 if they diffe
1f940 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43  r only.** by a C
1f950 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20  OLLATE operator 
1f960 61 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65 6c  at the top level
1f970 2e 20 20 52 65 74 75 72 6e 20 32 20 69 66 20 74  .  Return 2 if t
1f980 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65  here are differe
1f990 6e 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68  nces.** other th
1f9a0 61 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  an the top-level
1f9b0 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
1f9c0 72 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  r..**.** Sometim
1f9d0 65 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  es this routine 
1f9e0 77 69 6c 6c 20 72 65 74 75 72 6e 20 32 20 65 76  will return 2 ev
1f9f0 65 6e 20 69 66 20 74 68 65 20 74 77 6f 20 65 78  en if the two ex
1fa00 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61  pressions.** rea
1fa10 6c 6c 79 20 61 72 65 20 65 71 75 69 76 61 6c 65  lly are equivale
1fa20 6e 74 2e 20 20 49 66 20 77 65 20 63 61 6e 6e 6f  nt.  If we canno
1fa30 74 20 70 72 6f 76 65 20 74 68 61 74 20 74 68 65  t prove that the
1fa40 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
1fa50 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 77  .** identical, w
1fa60 65 20 72 65 74 75 72 6e 20 32 20 6a 75 73 74 20  e return 2 just 
1fa70 74 6f 20 62 65 20 73 61 66 65 2e 20 20 53 6f 20  to be safe.  So 
1fa80 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  if this routine.
1fa90 2a 2a 20 72 65 74 75 72 6e 73 20 32 2c 20 74 68  ** returns 2, th
1faa0 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65  en you do not re
1fab0 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65  ally know for ce
1fac0 72 74 61 69 6e 20 69 66 20 74 68 65 20 74 77 6f  rtain if the two
1fad0 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
1fae0 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42  are the same.  B
1faf0 75 74 20 69 66 20 79 6f 75 20 67 65 74 20 61 20  ut if you get a 
1fb00 30 20 6f 72 20 31 20 72 65 74 75 72 6e 2c 20 74  0 or 1 return, t
1fb10 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62  hen you.** can b
1fb20 65 20 73 75 72 65 20 74 68 65 20 65 78 70 72 65  e sure the expre
1fb30 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73  ssions are the s
1fb40 61 6d 65 2e 20 20 49 6e 20 74 68 65 20 70 6c 61  ame.  In the pla
1fb50 63 65 73 20 77 68 65 72 65 0a 2a 2a 20 74 68 69  ces where.** thi
1fb60 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
1fb70 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 68  d, it does not h
1fb80 75 72 74 20 74 6f 20 67 65 74 20 61 6e 20 65 78  urt to get an ex
1fb90 74 72 61 20 32 20 2d 20 74 68 61 74 0a 2a 2a 20  tra 2 - that.** 
1fba0 6a 75 73 74 20 6d 69 67 68 74 20 72 65 73 75 6c  just might resul
1fbb0 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74  t in some slight
1fbc0 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20  ly slower code. 
1fbd0 20 42 75 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a   But returning.*
1fbe0 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 30  * an incorrect 0
1fbf0 20 6f 72 20 31 20 63 6f 75 6c 64 20 6c 65 61 64   or 1 could lead
1fc00 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f   to a malfunctio
1fc10 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
1fc20 33 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78 70  3ExprCompare(Exp
1fc30 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 29  r *pA, Expr *pB)
1fc40 7b 0a 20 20 69 66 28 20 70 41 3d 3d 30 7c 7c 70  {.  if( pA==0||p
1fc50 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  B==0 ){.    retu
1fc60 72 6e 20 70 42 3d 3d 70 41 20 3f 20 30 20 3a 20  rn pB==pA ? 0 : 
1fc70 32 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  2;.  }.  assert(
1fc80 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70   !ExprHasAnyProp
1fc90 65 72 74 79 28 70 41 2c 20 45 50 5f 54 6f 6b 65  erty(pA, EP_Toke
1fca0 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
1fcb0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ) );.  assert( !
1fcc0 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
1fcd0 74 79 28 70 42 2c 20 45 50 5f 54 6f 6b 65 6e 4f  ty(pB, EP_TokenO
1fce0 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
1fcf0 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  );.  if( ExprHas
1fd00 50 72 6f 70 65 72 74 79 28 70 41 2c 20 45 50 5f  Property(pA, EP_
1fd10 78 49 73 53 65 6c 65 63 74 29 20 7c 7c 20 45 78  xIsSelect) || Ex
1fd20 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 42  prHasProperty(pB
1fd30 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1fd40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b  ){.    return 2;
1fd50 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e  .  }.  if( (pA->
1fd60 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
1fd70 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73  nct)!=(pB->flags
1fd80 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20   & EP_Distinct) 
1fd90 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66  ) return 2;.  if
1fda0 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70  ( pA->op!=pB->op
1fdb0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e   ){.    if( pA->
1fdc0 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26  op==TK_COLLATE &
1fdd0 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  & sqlite3ExprCom
1fde0 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20  pare(pA->pLeft, 
1fdf0 70 42 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72  pB)<2 ){.      r
1fe00 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
1fe10 20 20 20 69 66 28 20 70 42 2d 3e 6f 70 3d 3d 54     if( pB->op==T
1fe20 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c  K_COLLATE && sql
1fe30 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
1fe40 70 41 2c 20 70 42 2d 3e 70 4c 65 66 74 29 3c 32  pA, pB->pLeft)<2
1fe50 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1fe60 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   1;.    }.    re
1fe70 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66  turn 2;.  }.  if
1fe80 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
1fe90 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20  pare(pA->pLeft, 
1fea0 70 42 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74  pB->pLeft) ) ret
1feb0 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 73 71 6c  urn 2;.  if( sql
1fec0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
1fed0 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e  pA->pRight, pB->
1fee0 70 52 69 67 68 74 29 20 29 20 72 65 74 75 72 6e  pRight) ) return
1fef0 20 32 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   2;.  if( sqlite
1ff00 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
1ff10 28 70 41 2d 3e 78 2e 70 4c 69 73 74 2c 20 70 42  (pA->x.pList, pB
1ff20 2d 3e 78 2e 70 4c 69 73 74 29 20 29 20 72 65 74  ->x.pList) ) ret
1ff30 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 70 41 2d  urn 2;.  if( pA-
1ff40 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61  >iTable!=pB->iTa
1ff50 62 6c 65 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c 75  ble || pA->iColu
1ff60 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20  mn!=pB->iColumn 
1ff70 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66  ) return 2;.  if
1ff80 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
1ff90 79 28 70 41 2c 20 45 50 5f 49 6e 74 56 61 6c 75  y(pA, EP_IntValu
1ffa0 65 29 20 29 7b 0a 20 20 20 20 69 66 28 20 21 45  e) ){.    if( !E
1ffb0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1ffc0 42 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  B, EP_IntValue) 
1ffd0 7c 7c 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65 21  || pA->u.iValue!
1ffe0 3d 70 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b  =pB->u.iValue ){
1fff0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b  .      return 2;
20000 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
20010 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  f( pA->op!=TK_CO
20020 4c 55 4d 4e 20 26 26 20 41 4c 57 41 59 53 28 70  LUMN && ALWAYS(p
20030 41 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f  A->op!=TK_AGG_CO
20040 4c 55 4d 4e 29 20 26 26 20 70 41 2d 3e 75 2e 7a  LUMN) && pA->u.z
20050 54 6f 6b 65 6e 29 7b 0a 20 20 20 20 69 66 28 20  Token){.    if( 
20060 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
20070 70 42 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pB, EP_IntValue)
20080 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e 75 2e   || NEVER(pB->u.
20090 7a 54 6f 6b 65 6e 3d 3d 30 29 20 29 20 72 65 74  zToken==0) ) ret
200a0 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73  urn 2;.    if( s
200b0 74 72 63 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b  trcmp(pA->u.zTok
200c0 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  en,pB->u.zToken)
200d0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=0 ){.      ret
200e0 75 72 6e 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43  urn pA->op==TK_C
200f0 4f 4c 4c 41 54 45 20 3f 20 31 20 3a 20 32 3b 0a  OLLATE ? 1 : 2;.
20100 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
20110 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
20120 6f 6d 70 61 72 65 20 74 77 6f 20 45 78 70 72 4c  ompare two ExprL
20130 69 73 74 20 6f 62 6a 65 63 74 73 2e 20 20 52 65  ist objects.  Re
20140 74 75 72 6e 20 30 20 69 66 20 74 68 65 79 20 61  turn 0 if they a
20150 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64  re identical and
20160 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66   .** non-zero if
20170 20 74 68 65 79 20 64 69 66 66 65 72 20 69 6e 20   they differ in 
20180 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 54  any way..**.** T
20190 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
201a0 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  t return non-zer
201b0 6f 20 66 6f 72 20 65 71 75 69 76 61 6c 65 6e 74  o for equivalent
201c0 20 45 78 70 72 4c 69 73 74 73 2e 20 20 54 68 65   ExprLists.  The
201d0 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65 71 75  .** only consequ
201e0 65 6e 63 65 20 77 69 6c 6c 20 62 65 20 64 69 73  ence will be dis
201f0 61 62 6c 65 64 20 6f 70 74 69 6d 69 7a 61 74 69  abled optimizati
20200 6f 6e 73 2e 20 20 42 75 74 20 74 68 69 73 20 72  ons.  But this r
20210 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e  outine.** must n
20220 65 76 65 72 20 72 65 74 75 72 6e 20 30 20 69 66  ever return 0 if
20230 20 74 68 65 20 74 77 6f 20 45 78 70 72 4c 69 73   the two ExprLis
20240 74 20 6f 62 6a 65 63 74 73 20 61 72 65 20 64 69  t objects are di
20250 66 66 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61  fferent, or.** a
20260 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 20 77 69 6c   malfunction wil
20270 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20  l result..**.** 
20280 54 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  Two NULL pointer
20290 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
202a0 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65 2e   to be the same.
202b0 20 20 42 75 74 20 61 20 4e 55 4c 4c 20 70 6f 69    But a NULL poi
202c0 6e 74 65 72 0a 2a 2a 20 61 6c 77 61 79 73 20 64  nter.** always d
202d0 69 66 66 65 72 73 20 66 72 6f 6d 20 61 20 6e 6f  iffers from a no
202e0 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a  n-NULL pointer..
202f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
20300 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 45 78  prListCompare(Ex
20310 70 72 4c 69 73 74 20 2a 70 41 2c 20 45 78 70 72  prList *pA, Expr
20320 4c 69 73 74 20 2a 70 42 29 7b 0a 20 20 69 6e 74  List *pB){.  int
20330 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20   i;.  if( pA==0 
20340 26 26 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72  && pB==0 ) retur
20350 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30  n 0;.  if( pA==0
20360 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72 65 74 75   || pB==0 ) retu
20370 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 41 2d 3e  rn 1;.  if( pA->
20380 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45 78 70 72  nExpr!=pB->nExpr
20390 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66   ) return 1;.  f
203a0 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 6e 45  or(i=0; i<pA->nE
203b0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
203c0 78 70 72 20 2a 70 45 78 70 72 41 20 3d 20 70 41  xpr *pExprA = pA
203d0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
203e0 20 20 45 78 70 72 20 2a 70 45 78 70 72 42 20 3d    Expr *pExprB =
203f0 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b   pB->a[i].pExpr;
20400 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 61 5b 69  .    if( pA->a[i
20410 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d 70 42 2d  ].sortOrder!=pB-
20420 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[i].sortOrder 
20430 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
20440 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
20450 6f 6d 70 61 72 65 28 70 45 78 70 72 41 2c 20 70  ompare(pExprA, p
20460 45 78 70 72 42 29 20 29 20 72 65 74 75 72 6e 20  ExprB) ) return 
20470 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
20480 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  0;.}../*.** An i
20490 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
204a0 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
204b0 72 65 20 69 73 20 75 73 65 64 20 62 79 20 74 68  re is used by th
204c0 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a  e tree walker.**
204d0 20 74 6f 20 63 6f 75 6e 74 20 72 65 66 65 72 65   to count refere
204e0 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 20 63 6f  nces to table co
204f0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 61 72 67  lumns in the arg
20500 75 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a 2a  uments of an .**
20510 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
20520 69 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f  ion, in order to
20530 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a   implement the.*
20540 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f  * sqlite3Functio
20550 6e 54 68 69 73 53 72 63 28 29 20 72 6f 75 74 69  nThisSrc() routi
20560 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 72  ne..*/.struct Sr
20570 63 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c 69  cCount {.  SrcLi
20580 73 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 4f  st *pSrc;   /* O
20590 6e 65 20 70 61 72 74 69 63 75 6c 61 72 20 46 52  ne particular FR
205a0 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 61 20 6e  OM clause in a n
205b0 65 73 74 65 64 20 71 75 65 72 79 20 2a 2f 0a 20  ested query */. 
205c0 20 69 6e 74 20 6e 54 68 69 73 3b 20 20 20 20 20   int nThis;     
205d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
205e0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
205f0 75 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69 73 74  umns in pSrcList
20600 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65 72   */.  int nOther
20610 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
20620 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
20630 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74 68  o columns in oth
20640 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 73 20  er FROM clauses 
20650 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75  */.};../*.** Cou
20660 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
20670 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63   references to c
20680 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  olumns..*/.stati
20690 63 20 69 6e 74 20 65 78 70 72 53 72 63 43 6f 75  c int exprSrcCou
206a0 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  nt(Walker *pWalk
206b0 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
206c0 7b 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56 45 52  {.  /* The NEVER
206d0 28 29 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64  () on the second
206e0 20 74 65 72 6d 20 69 73 20 62 65 63 61 75 73 65   term is because
206f0 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e   sqlite3Function
20700 55 73 65 73 54 68 69 73 53 72 63 28 29 0a 20 20  UsesThisSrc().  
20710 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 63 61 6c  ** is always cal
20720 6c 65 64 20 62 65 66 6f 72 65 20 73 71 6c 69 74  led before sqlit
20730 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
20740 72 65 67 61 74 65 73 28 29 20 61 6e 64 20 73 6f  regates() and so
20750 20 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c   the.  ** TK_COL
20760 55 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20 79 65  UMNs have not ye
20770 74 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64  t been converted
20780 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c   into TK_AGG_COL
20790 55 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73 71  UMN.  If.  ** sq
207a0 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65  lite3FunctionUse
207b0 73 54 68 69 73 53 72 63 28 29 20 69 73 20 75 73  sThisSrc() is us
207c0 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 69  ed differently i
207d0 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68  n the future, th
207e0 65 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29 20 77  e.  ** NEVER() w
207f0 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 72  ill need to be r
20800 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66 28  emoved. */.  if(
20810 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
20820 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28 70  OLUMN || NEVER(p
20830 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
20840 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20 20  _COLUMN) ){.    
20850 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63  int i;.    struc
20860 74 20 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d 20  t SrcCount *p = 
20870 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 43  pWalker->u.pSrcC
20880 6f 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69 73  ount;.    SrcLis
20890 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  t *pSrc = p->pSr
208a0 63 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  c;.    for(i=0; 
208b0 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  i<pSrc->nSrc; i+
208c0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  +){.      if( pE
208d0 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72  xpr->iTable==pSr
208e0 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20  c->a[i].iCursor 
208f0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
20900 20 20 20 69 66 28 20 69 3c 70 53 72 63 2d 3e 6e     if( i<pSrc->n
20910 53 72 63 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Src ){.      p->
20920 6e 54 68 69 73 2b 2b 3b 0a 20 20 20 20 7d 65 6c  nThis++;.    }el
20930 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 74  se{.      p->nOt
20940 68 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  her++;.    }.  }
20950 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
20960 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
20970 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e   Determine if an
20980 79 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e  y of the argumen
20990 74 73 20 74 6f 20 74 68 65 20 70 45 78 70 72 20  ts to the pExpr 
209a0 46 75 6e 63 74 69 6f 6e 20 72 65 66 65 72 65 6e  Function referen
209b0 63 65 0a 2a 2a 20 70 53 72 63 4c 69 73 74 2e 20  ce.** pSrcList. 
209c0 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
209d0 74 68 65 79 20 64 6f 2e 20 20 41 6c 73 6f 20 72  they do.  Also r
209e0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
209f0 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61  e function.** ha
20a00 73 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 6f  s no arguments o
20a10 72 20 68 61 73 20 6f 6e 6c 79 20 63 6f 6e 73 74  r has only const
20a20 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  ant arguments.  
20a30 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20  Return false if 
20a40 70 45 78 70 72 0a 2a 2a 20 72 65 66 65 72 65 6e  pExpr.** referen
20a50 63 65 73 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20  ces columns but 
20a60 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  not columns of t
20a70 61 62 6c 65 73 20 66 6f 75 6e 64 20 69 6e 20 70  ables found in p
20a80 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20  SrcList..*/.int 
20a90 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55  sqlite3FunctionU
20aa0 73 65 73 54 68 69 73 53 72 63 28 45 78 70 72 20  sesThisSrc(Expr 
20ab0 2a 70 45 78 70 72 2c 20 53 72 63 4c 69 73 74 20  *pExpr, SrcList 
20ac0 2a 70 53 72 63 4c 69 73 74 29 7b 0a 20 20 57 61  *pSrcList){.  Wa
20ad0 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63 74  lker w;.  struct
20ae0 20 53 72 63 43 6f 75 6e 74 20 63 6e 74 3b 0a 20   SrcCount cnt;. 
20af0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
20b00 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
20b10 49 4f 4e 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28  ION );.  memset(
20b20 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
20b30 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  );.  w.xExprCall
20b40 62 61 63 6b 20 3d 20 65 78 70 72 53 72 63 43 6f  back = exprSrcCo
20b50 75 6e 74 3b 0a 20 20 77 2e 75 2e 70 53 72 63 43  unt;.  w.u.pSrcC
20b60 6f 75 6e 74 20 3d 20 26 63 6e 74 3b 0a 20 20 63  ount = &cnt;.  c
20b70 6e 74 2e 70 53 72 63 20 3d 20 70 53 72 63 4c 69  nt.pSrc = pSrcLi
20b80 73 74 3b 0a 20 20 63 6e 74 2e 6e 54 68 69 73 20  st;.  cnt.nThis 
20b90 3d 20 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68 65  = 0;.  cnt.nOthe
20ba0 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  r = 0;.  sqlite3
20bb0 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 26 77 2c  WalkExprList(&w,
20bc0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29   pExpr->x.pList)
20bd0 3b 0a 20 20 72 65 74 75 72 6e 20 63 6e 74 2e 6e  ;.  return cnt.n
20be0 54 68 69 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f  This>0 || cnt.nO
20bf0 74 68 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ther==0;.}../*.*
20c00 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d  * Add a new elem
20c10 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49  ent to the pAggI
20c20 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61  nfo->aCol[] arra
20c30 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69  y.  Return the i
20c40 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ndex of.** the n
20c50 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74  ew element.  Ret
20c60 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e  urn a negative n
20c70 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20  umber if malloc 
20c80 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
20c90 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 43   int addAggInfoC
20ca0 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64  olumn(sqlite3 *d
20cb0 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66  b, AggInfo *pInf
20cc0 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70  o){.  int i;.  p
20cd0 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c  Info->aCol = sql
20ce0 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
20cf0 65 28 0a 20 20 20 20 20 20 20 64 62 2c 0a 20 20  e(.       db,.  
20d00 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c       pInfo->aCol
20d10 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28  ,.       sizeof(
20d20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c  pInfo->aCol[0]),
20d30 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e  .       &pInfo->
20d40 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  nColumn,.       
20d50 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  &i.  );.  return
20d60 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a   i;.}    ../*.**
20d70 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
20d80 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e  nt to the pAggIn
20d90 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61  fo->aFunc[] arra
20da0 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69  y.  Return the i
20db0 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ndex of.** the n
20dc0 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74  ew element.  Ret
20dd0 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e  urn a negative n
20de0 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20  umber if malloc 
20df0 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
20e00 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 46   int addAggInfoF
20e10 75 6e 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  unc(sqlite3 *db,
20e20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29   AggInfo *pInfo)
20e30 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e  {.  int i;.  pIn
20e40 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69  fo->aFunc = sqli
20e50 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
20e60 28 0a 20 20 20 20 20 20 20 64 62 2c 20 0a 20 20  (.       db, .  
20e70 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e       pInfo->aFun
20e80 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66  c,.       sizeof
20e90 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d  (pInfo->aFunc[0]
20ea0 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f  ),.       &pInfo
20eb0 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20 20  ->nFunc,.       
20ec0 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  &i.  );.  return
20ed0 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a   i;.}    ../*.**
20ee0 20 54 68 69 73 20 69 73 20 74 68 65 20 78 45 78   This is the xEx
20ef0 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  prCallback for a
20f00 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 20 20 49   tree walker.  I
20f10 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20  t is used to.** 
20f20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65  implement sqlite
20f30 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
20f40 65 67 61 74 65 73 28 29 2e 20 20 53 65 65 20 73  egates().  See s
20f50 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
20f60 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66  eAggregates.** f
20f70 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
20f80 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  formation..*/.st
20f90 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65  atic int analyze
20fa0 41 67 67 72 65 67 61 74 65 28 57 61 6c 6b 65 72  Aggregate(Walker
20fb0 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
20fc0 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69  *pExpr){.  int i
20fd0 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
20fe0 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  *pNC = pWalker->
20ff0 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a  u.pNC;.  Parse *
21000 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
21010 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20  arse;.  SrcList 
21020 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d  *pSrcList = pNC-
21030 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67  >pSrcList;.  Agg
21040 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d  Info *pAggInfo =
21050 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a   pNC->pAggInfo;.
21060 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
21070 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
21080 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a   TK_AGG_COLUMN:.
21090 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
210a0 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  MN: {.      test
210b0 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
210c0 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
210d0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
210e0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
210f0 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
21100 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
21110 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  if the column is
21120 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   in one of the t
21130 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
21140 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73  M.      ** claus
21150 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61  e of the aggrega
21160 74 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  te query */.    
21170 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 72    if( ALWAYS(pSr
21180 63 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20  cList!=0) ){.   
21190 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
211a0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
211b0 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20  = pSrcList->a;. 
211c0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
211d0 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63  i<pSrcList->nSrc
211e0 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
211f0 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
21200 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
21210 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 61  Col;.          a
21220 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 41  ssert( !ExprHasA
21230 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  nyProperty(pExpr
21240 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
21250 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
21260 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
21270 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d  r->iTable==pItem
21280 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->iCursor ){.   
21290 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
212a0 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
212b0 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  nt, it means tha
212c0 74 20 70 45 78 70 72 20 72 65 66 65 72 73 20 74  t pExpr refers t
212d0 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20 20  o a table.      
212e0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73        ** that is
212f0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
21300 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65  use of the aggre
21310 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20 20  gate query.  .  
21320 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
21330 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65           ** Make
21340 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   an entry for th
21350 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67  e column in pAgg
21360 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20  Info->aCol[] if 
21370 74 68 65 72 65 0a 20 20 20 20 20 20 20 20 20 20  there.          
21380 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65    ** is not an e
21390 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72 65 61  ntry there alrea
213a0 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  dy..            
213b0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
213c0 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt k;.          
213d0 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66    pCol = pAggInf
213e0 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20  o->aCol;.       
213f0 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
21400 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
21410 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  n; k++, pCol++){
21420 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
21430 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d  f( pCol->iTable=
21440 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26  =pExpr->iTable &
21450 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
21460 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d      pCol->iColum
21470 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n==pExpr->iColum
21480 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
21490 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
214a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
214b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
214c0 20 20 20 20 20 20 69 66 28 20 28 6b 3e 3d 70 41        if( (k>=pA
214d0 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29  ggInfo->nColumn)
214e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
214f0 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e 66 6f   (k = addAggInfo
21500 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e 64  Column(pParse->d
21510 62 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30  b, pAggInfo))>=0
21520 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b   .            ){
21530 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
21540 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  Col = &pAggInfo-
21550 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20  >aCol[k];.      
21560 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54          pCol->pT
21570 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62  ab = pExpr->pTab
21580 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
21590 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70  pCol->iTable = p
215a0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
215b0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
215c0 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70  ->iColumn = pExp
215d0 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
215e0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
215f0 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
21600 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20  >nMem;.         
21610 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
21620 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20  erColumn = -1;. 
21630 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
21640 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  l->pExpr = pExpr
21650 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
21660 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47  if( pAggInfo->pG
21670 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
21680 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c            int j,
21690 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   n;.            
216a0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47      ExprList *pG
216b0 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47  B = pAggInfo->pG
216c0 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20  roupBy;.        
216d0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
216e0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  xprList_item *pT
216f0 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20  erm = pGB->a;.  
21700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 20                n 
21710 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20  = pGB->nExpr;.  
21720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
21730 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c  r(j=0; j<n; j++,
21740 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
21750 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
21760 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pE = pTerm->p
21770 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
21780 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e          if( pE->
21790 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
217a0 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78   pE->iTable==pEx
217b0 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20  pr->iTable &&.  
217c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217d0 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d      pE->iColumn=
217e0 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20  =pExpr->iColumn 
217f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
21800 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
21810 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a  rterColumn = j;.
21820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21830 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
21840 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
21850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
21860 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
21870 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
21880 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72  f( pCol->iSorter
21890 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
218a0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
218b0 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20  ->iSorterColumn 
218c0 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72  = pAggInfo->nSor
218d0 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20  tingColumn++;.  
218e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
218f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
21900 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65          /* There
21910 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79   is now an entry
21920 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20 70 41   for pExpr in pA
21930 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28  ggInfo->aCol[] (
21940 65 69 74 68 65 72 0a 20 20 20 20 20 20 20 20 20  either.         
21950 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74     ** because it
21960 20 77 61 73 20 74 68 65 72 65 20 62 65 66 6f 72   was there befor
21970 65 20 6f 72 20 62 65 63 61 75 73 65 20 77 65 20  e or because we 
21980 6a 75 73 74 20 63 72 65 61 74 65 64 20 69 74 29  just created it)
21990 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ..            **
219a0 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70 45 78   Convert the pEx
219b0 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f 41 47  pr to be a TK_AG
219c0 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69  G_COLUMN referri
219d0 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20 20 20  ng to that.     
219e0 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67 49 6e         ** pAggIn
219f0 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79  fo->aCol[] entry
21a00 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
21a10 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70  .            Exp
21a20 72 53 65 74 49 72 72 65 64 75 63 69 62 6c 65 28  rSetIrreducible(
21a30 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
21a40 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49      pExpr->pAggI
21a50 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a  nfo = pAggInfo;.
21a60 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
21a70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43  r->op = TK_AGG_C
21a80 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20  OLUMN;.         
21a90 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
21aa0 20 28 69 31 36 29 6b 3b 0a 20 20 20 20 20 20 20   (i16)k;.       
21ab0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
21ac0 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66        } /* endif
21ad0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
21ae0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a  pItem->iCursor *
21af0 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65  /.        } /* e
21b00 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72  nd loop over pSr
21b10 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d  cList */.      }
21b20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
21b30 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20  C_Prune;.    }. 
21b40 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
21b50 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
21b60 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61   if( (pNC->ncFla
21b70 67 73 20 26 20 4e 43 5f 49 6e 41 67 67 46 75 6e  gs & NC_InAggFun
21b80 63 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20  c)==0.       && 
21b90 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44  pWalker->walkerD
21ba0 65 70 74 68 3d 3d 70 45 78 70 72 2d 3e 6f 70 32  epth==pExpr->op2
21bb0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
21bc0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
21bd0 65 20 69 66 20 70 45 78 70 72 20 69 73 20 61 20  e if pExpr is a 
21be0 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f  duplicate of ano
21bf0 74 68 65 72 20 61 67 67 72 65 67 61 74 65 20 0a  ther aggregate .
21c00 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
21c10 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65  ion that is alre
21c20 61 64 79 20 69 6e 20 74 68 65 20 70 41 67 67 49  ady in the pAggI
21c30 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20  nfo structure.  
21c40 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
21c50 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
21c60 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41  func *pItem = pA
21c70 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20  ggInfo->aFunc;. 
21c80 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
21c90 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
21ca0 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
21cb0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
21cc0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
21cd0 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c  re(pItem->pExpr,
21ce0 20 70 45 78 70 72 29 3d 3d 30 20 29 7b 0a 20 20   pExpr)==0 ){.  
21cf0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
21d00 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
21d10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
21d20 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  f( i>=pAggInfo->
21d30 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  nFunc ){.       
21d40 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20 6f     /* pExpr is o
21d50 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61  riginal.  Make a
21d60 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 41   new entry in pA
21d70 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a  ggInfo->aFunc[].
21d80 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
21d90 20 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20         u8 enc = 
21da0 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  ENC(pParse->db);
21db0 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 61  .          i = a
21dc0 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70 50  ddAggInfoFunc(pP
21dd0 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e  arse->db, pAggIn
21de0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  fo);.          i
21df0 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20  f( i>=0 ){.     
21e00 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
21e10 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
21e20 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
21e30 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ect) );.        
21e40 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41 67      pItem = &pAg
21e50 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b  gInfo->aFunc[i];
21e60 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
21e70 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  em->pExpr = pExp
21e80 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  r;.            p
21e90 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70  Item->iMem = ++p
21ea0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
21eb0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
21ec0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
21ed0 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
21ee0 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
21ef0 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e       pItem->pFun
21f00 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  c = sqlite3FindF
21f10 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e  unction(pParse->
21f20 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
21f30 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e         pExpr->u.
21f40 7a 54 6f 6b 65 6e 2c 20 73 71 6c 69 74 65 33 53  zToken, sqlite3S
21f50 74 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e 75  trlen30(pExpr->u
21f60 2e 7a 54 6f 6b 65 6e 29 2c 0a 20 20 20 20 20 20  .zToken),.      
21f70 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
21f80 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45  pr->x.pList ? pE
21f90 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
21fa0 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29  xpr : 0, enc, 0)
21fb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
21fc0 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ( pExpr->flags &
21fd0 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a   EP_Distinct ){.
21fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
21ff0 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  tem->iDistinct =
22000 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
22010 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
22020 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
22030 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e    pItem->iDistin
22040 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  ct = -1;.       
22050 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
22060 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
22070 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78       /* Make pEx
22080 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  pr point to the 
22090 61 70 70 72 6f 70 72 69 61 74 65 20 70 41 67 67  appropriate pAgg
220a0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e  Info->aFunc[] en
220b0 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  try.        */. 
220c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
220d0 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
220e0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b  ty(pExpr, EP_Tok
220f0 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
22100 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78  d) );.        Ex
22110 70 72 53 65 74 49 72 72 65 64 75 63 69 62 6c 65  prSetIrreducible
22120 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  (pExpr);.       
22130 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28   pExpr->iAgg = (
22140 69 31 36 29 69 3b 0a 20 20 20 20 20 20 20 20 70  i16)i;.        p
22150 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d  Expr->pAggInfo =
22160 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20   pAggInfo;.     
22170 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
22180 75 6e 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  une;.      }else
22190 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
221a0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
221b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
221c0 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
221d0 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63  ntinue;.}.static
221e0 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72   int analyzeAggr
221f0 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 28 57  egatesInSelect(W
22200 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
22210 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
22220 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
22230 45 54 45 52 28 70 57 61 6c 6b 65 72 29 3b 0a 20  ETER(pWalker);. 
22240 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
22250 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65  R(pSelect);.  re
22260 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
22270 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  e;.}../*.** Anal
22280 79 7a 65 20 74 68 65 20 70 45 78 70 72 20 65 78  yze the pExpr ex
22290 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67  pression looking
222a0 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66   for aggregate f
222b0 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20  unctions and.** 
222c0 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74 68  for variables th
222d0 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64  at need to be ad
222e0 64 65 64 20 74 6f 20 41 67 67 49 6e 66 6f 20 6f  ded to AggInfo o
222f0 62 6a 65 63 74 20 74 68 61 74 20 70 4e 43 2d 3e  bject that pNC->
22300 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e  pAggInfo.** poin
22310 74 73 20 74 6f 2e 20 20 41 64 64 69 74 69 6f 6e  ts to.  Addition
22320 61 6c 20 65 6e 74 72 69 65 73 20 61 72 65 20 6d  al entries are m
22330 61 64 65 20 6f 6e 20 74 68 65 20 41 67 67 49 6e  ade on the AggIn
22340 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a 2a 2a 20  fo object as.** 
22350 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a  necessary..**.**
22360 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
22370 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
22380 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65 78  led after the ex
22390 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65  pression has bee
223a0 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79  n.** analyzed by
223b0 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
223c0 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76  xprNames()..*/.v
223d0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
223e0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
223f0 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e  (NameContext *pN
22400 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  C, Expr *pExpr){
22410 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d  .  Walker w;.  m
22420 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
22430 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78  eof(w));.  w.xEx
22440 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61  prCallback = ana
22450 6c 79 7a 65 41 67 67 72 65 67 61 74 65 3b 0a 20  lyzeAggregate;. 
22460 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
22470 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72  ck = analyzeAggr
22480 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a  egatesInSelect;.
22490 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b    w.u.pNC = pNC;
224a0 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e  .  assert( pNC->
224b0 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20  pSrcList!=0 );. 
224c0 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
224d0 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a  (&w, pExpr);.}..
224e0 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74  /*.** Call sqlit
224f0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
22500 72 65 67 61 74 65 73 28 29 20 66 6f 72 20 65 76  regates() for ev
22510 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
22520 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  n an.** expressi
22530 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  on list.  Return
22540 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
22550 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rrors..**.** If 
22560 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e  an error is foun
22570 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20  d, the analysis 
22580 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f  is cut short..*/
22590 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
225a0 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
225b0 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
225c0 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
225d0 74 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70  t){.  struct Exp
225e0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
225f0 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  m;.  int i;.  if
22600 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
22610 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
22620 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  a, i=0; i<pList-
22630 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
22640 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c  em++){.      sql
22650 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
22660 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70  ggregates(pNC, p
22670 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
22680 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
22690 20 41 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e 67   Allocate a sing
226a0 6c 65 20 6e 65 77 20 72 65 67 69 73 74 65 72 20  le new register 
226b0 66 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c 64 20  for use to hold 
226c0 73 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69 61 74  some intermediat
226d0 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74  e result..*/.int
226e0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
226f0 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eg(Parse *pParse
22700 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
22710 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a  >nTempReg==0 ){.
22720 20 20 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61      return ++pPa
22730 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20  rse->nMem;.  }. 
22740 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e   return pParse->
22750 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73  aTempReg[--pPars
22760 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a  e->nTempReg];.}.
22770 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
22780 65 20 61 20 72 65 67 69 73 74 65 72 2c 20 6d 61  e a register, ma
22790 6b 69 6e 67 20 61 76 61 69 6c 61 62 6c 65 20 66  king available f
227a0 6f 72 20 72 65 75 73 65 20 66 6f 72 20 73 6f 6d  or reuse for som
227b0 65 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f  e other.** purpo
227c0 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72  se..**.** If a r
227d0 65 67 69 73 74 65 72 20 69 73 20 63 75 72 72 65  egister is curre
227e0 6e 74 6c 79 20 62 65 69 6e 67 20 75 73 65 64 20  ntly being used 
227f0 62 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  by the column ca
22800 63 68 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  che, then.** the
22810 20 64 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20   dallocation is 
22820 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74  deferred until t
22830 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
22840 6c 69 6e 65 20 74 68 61 74 20 75 73 65 73 0a 2a  line that uses.*
22850 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 20 62  * the register b
22860 65 63 6f 6d 65 73 20 73 74 61 6c 65 2e 0a 2a 2f  ecomes stale..*/
22870 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c  .void sqlite3Rel
22880 65 61 73 65 54 65 6d 70 52 65 67 28 50 61 72 73  easeTempReg(Pars
22890 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
228a0 52 65 67 29 7b 0a 20 20 69 66 28 20 69 52 65 67  Reg){.  if( iReg
228b0 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d   && pParse->nTem
228c0 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70  pReg<ArraySize(p
228d0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29  Parse->aTempReg)
228e0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
228f0 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61     struct yColCa
22900 63 68 65 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  che *p;.    for(
22910 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
22920 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
22930 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
22940 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20  ++, p++){.      
22950 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65  if( p->iReg==iRe
22960 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  g ){.        p->
22970 74 65 6d 70 52 65 67 20 3d 20 31 3b 0a 20 20 20  tempReg = 1;.   
22980 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
22990 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
229a0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
229b0 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
229c0 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a  ++] = iReg;.  }.
229d0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
229e0 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 20  e or deallocate 
229f0 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20  a block of nReg 
22a00 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69  consecutive regi
22a10 73 74 65 72 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sters.*/.int sql
22a20 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
22a30 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
22a40 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74  int nReg){.  int
22a50 20 69 2c 20 6e 3b 0a 20 20 69 20 3d 20 70 50 61   i, n;.  i = pPa
22a60 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a  rse->iRangeReg;.
22a70 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52    n = pParse->nR
22a80 61 6e 67 65 52 65 67 3b 0a 20 20 69 66 28 20 6e  angeReg;.  if( n
22a90 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20 61 73  Reg<=n ){.    as
22aa0 73 65 72 74 28 20 21 75 73 65 64 41 73 43 6f 6c  sert( !usedAsCol
22ab0 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c  umnCache(pParse,
22ac0 20 69 2c 20 69 2b 6e 2d 31 29 20 29 3b 0a 20 20   i, i+n-1) );.  
22ad0 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65    pParse->iRange
22ae0 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20  Reg += nReg;.   
22af0 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
22b00 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65  eg -= nReg;.  }e
22b10 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20 70 50 61  lse{.    i = pPa
22b20 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
22b30 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
22b40 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74   nReg;.  }.  ret
22b50 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71  urn i;.}.void sq
22b60 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
22b70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  Range(Parse *pPa
22b80 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69  rse, int iReg, i
22b90 6e 74 20 6e 52 65 67 29 7b 0a 20 20 73 71 6c 69  nt nReg){.  sqli
22ba0 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
22bb0 76 65 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c  ve(pParse, iReg,
22bc0 20 6e 52 65 67 29 3b 0a 20 20 69 66 28 20 6e 52   nReg);.  if( nR
22bd0 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67  eg>pParse->nRang
22be0 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50 61 72  eReg ){.    pPar
22bf0 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20  se->nRangeReg = 
22c00 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65  nReg;.    pParse
22c10 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20 69 52  ->iRangeReg = iR
22c20 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  eg;.  }.}../*.**
22c30 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f 72   Mark all tempor
22c40 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61 73  ary registers as
22c50 20 62 65 69 6e 67 20 75 6e 61 76 61 69 6c 61 62   being unavailab
22c60 6c 65 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f  le for reuse..*/
22c70 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65  .void sqlite3Cle
22c80 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 50  arTempRegCache(P
22c90 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
22ca0 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
22cb0 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  g = 0;.  pParse-
22cc0 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a  >nRangeReg = 0;.
22cd0 7d 0a                                            }.