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

Artifact d488bb60e54c9305d9fca1fa6fcc7bfbd23b13a2:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t.h"../*.** Retu
0220: 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74 79  rn the 'affinity
0230: 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  ' of the express
0240: 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e 79  ion pExpr if any
0250: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
0260: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61 20   is a column, a 
0270: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 63  reference to a c
0280: 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41 53  olumn via an 'AS
0290: 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20 61  ' alias,.** or a
02a0: 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74 68   sub-select with
02b0: 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65   a column as the
02c0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 74   return value, t
02d0: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66 69  hen the .** affi
02e0: 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f 6c  nity of that col
02f0: 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  umn is returned.
0300: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30 30   Otherwise, 0x00
0310: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
0320: 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 61   indicating no a
0330: 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65 20  ffinity for the 
0340: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
0350: 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52 45  * i.e. the WHERE
0360: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 73   clause expresss
0370: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0380: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0390: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
03a0: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
03b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
03c0: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
03d0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
03e0: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
03f0: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0400: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
0410: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
0420: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
0430: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
0440: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
0450: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
0460: 20 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   op;.  pExpr = s
0470: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0480: 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
0490: 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
04a0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c    if( op==TK_SEL
04b0: 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ECT ){.    asser
04c0: 74 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 26  t( pExpr->flags&
04d0: 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b 0a  EP_xIsSelect );.
04e0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
04f0: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
0500: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  Expr->x.pSelect-
0510: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
0520: 78 70 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  xpr);.  }.#ifnde
0530: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41  f SQLITE_OMIT_CA
0540: 53 54 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  ST.  if( op==TK_
0550: 43 41 53 54 20 29 7b 0a 20 20 20 20 61 73 73 65  CAST ){.    asse
0560: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
0570: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
0580: 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
0590: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41 66  return sqlite3Af
05a0: 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70 72  finityType(pExpr
05b0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 7d  ->u.zToken);.  }
05c0: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 28 6f  .#endif.  if( (o
05d0: 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
05e0: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   || op==TK_COLUM
05f0: 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49  N || op==TK_REGI
0600: 53 54 45 52 29 20 0a 20 20 20 26 26 20 70 45 78  STER) .   && pEx
0610: 70 72 2d 3e 70 54 61 62 21 3d 30 0a 20 20 29 7b  pr->pTab!=0.  ){
0620: 0a 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52  .    /* op==TK_R
0630: 45 47 49 53 54 45 52 20 26 26 20 70 45 78 70 72  EGISTER && pExpr
0640: 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e  ->pTab!=0 happen
0650: 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61 73  s when pExpr was
0660: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20   originally.    
0670: 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62  ** a TK_COLUMN b
0680: 75 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  ut was previousl
0690: 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  y evaluated and 
06a0: 63 61 63 68 65 64 20 69 6e 20 61 20 72 65 67 69  cached in a regi
06b0: 73 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ster */.    int 
06c0: 6a 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  j = pExpr->iColu
06d0: 6d 6e 3b 0a 20 20 20 20 69 66 28 20 6a 3c 30 20  mn;.    if( j<0 
06e0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
06f0: 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  AFF_INTEGER;.   
0700: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
0710: 70 54 61 62 20 26 26 20 6a 3c 70 45 78 70 72 2d  pTab && j<pExpr-
0720: 3e 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  >pTab->nCol );. 
0730: 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d     return pExpr-
0740: 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61  >pTab->aCol[j].a
0750: 66 66 69 6e 69 74 79 3b 0a 20 20 7d 0a 20 20 72  ffinity;.  }.  r
0760: 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61 66 66  eturn pExpr->aff
0770: 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  inity;.}../*.** 
0780: 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  Set the collatin
0790: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65  g sequence for e
07a0: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
07b0: 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c 61 74  to be the collat
07c0: 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20  ing.** sequence 
07d0: 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e 2e  named by pToken.
07e0: 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e     Return a poin
07f0: 74 65 72 20 74 6f 20 61 20 6e 65 77 20 45 78 70  ter to a new Exp
0800: 72 20 6e 6f 64 65 20 74 68 61 74 0a 2a 2a 20 69  r node that.** i
0810: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 43 4f  mplements the CO
0820: 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a  LLATE operator..
0830: 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72  **.** If a memor
0840: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
0850: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 61 74 20  or occurs, that 
0860: 66 61 63 74 20 69 73 20 72 65 63 6f 72 64 65 64  fact is recorded
0870: 20 69 6e 20 70 50 61 72 73 65 2d 3e 64 62 0a 2a   in pParse->db.*
0880: 2a 20 61 6e 64 20 74 68 65 20 70 45 78 70 72 20  * and the pExpr 
0890: 70 61 72 61 6d 65 74 65 72 20 69 73 20 72 65 74  parameter is ret
08a0: 75 72 6e 65 64 20 75 6e 63 68 61 6e 67 65 64 2e  urned unchanged.
08b0: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
08c0: 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54  3ExprAddCollateT
08d0: 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72  oken(Parse *pPar
08e0: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
08f0: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d   Token *pCollNam
0900: 65 29 7b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 4e  e){.  if( pCollN
0910: 61 6d 65 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20  ame->n>0 ){.    
0920: 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c  Expr *pNew = sql
0930: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50  ite3ExprAlloc(pP
0940: 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c  arse->db, TK_COL
0950: 4c 41 54 45 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c  LATE, pCollName,
0960: 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65   1);.    if( pNe
0970: 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  w ){.      pNew-
0980: 3e 70 4c 65 66 74 20 3d 20 70 45 78 70 72 3b 0a  >pLeft = pExpr;.
0990: 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67        pNew->flag
09a0: 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 3b  s |= EP_Collate;
09b0: 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70  .      pExpr = p
09c0: 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  New;.    }.  }. 
09d0: 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d   return pExpr;.}
09e0: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
09f0: 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69  prAddCollateStri
0a00: 6e 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ng(Parse *pParse
0a10: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63  , Expr *pExpr, c
0a20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 29 7b 0a  onst char *zC){.
0a30: 20 20 54 6f 6b 65 6e 20 73 3b 0a 20 20 61 73 73    Token s;.  ass
0a40: 65 72 74 28 20 7a 43 21 3d 30 20 29 3b 0a 20 20  ert( zC!=0 );.  
0a50: 73 2e 7a 20 3d 20 7a 43 3b 0a 20 20 73 2e 6e 20  s.z = zC;.  s.n 
0a60: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
0a70: 30 28 73 2e 7a 29 3b 0a 20 20 72 65 74 75 72 6e  0(s.z);.  return
0a80: 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43   sqlite3ExprAddC
0a90: 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72  ollateToken(pPar
0aa0: 73 65 2c 20 70 45 78 70 72 2c 20 26 73 29 3b 0a  se, pExpr, &s);.
0ab0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6b 69 70 20 6f 76  }../*.** Skip ov
0ac0: 65 72 20 61 6e 79 20 54 4b 5f 43 4f 4c 4c 41 54  er any TK_COLLAT
0ad0: 45 20 61 6e 64 2f 6f 72 20 54 4b 5f 41 53 20 6f  E and/or TK_AS o
0ae0: 70 65 72 61 74 6f 72 73 20 61 74 20 74 68 65 20  perators at the 
0af0: 72 6f 6f 74 20 6f 66 0a 2a 2a 20 61 6e 20 65 78  root of.** an ex
0b00: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45 78 70  pression..*/.Exp
0b10: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 53 6b  r *sqlite3ExprSk
0b20: 69 70 43 6f 6c 6c 61 74 65 28 45 78 70 72 20 2a  ipCollate(Expr *
0b30: 70 45 78 70 72 29 7b 0a 20 20 77 68 69 6c 65 28  pExpr){.  while(
0b40: 20 70 45 78 70 72 20 26 26 20 28 70 45 78 70 72   pExpr && (pExpr
0b50: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
0b60: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
0b70: 4b 5f 41 53 29 20 29 7b 0a 20 20 20 20 70 45 78  K_AS) ){.    pEx
0b80: 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  pr = pExpr->pLef
0b90: 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
0ba0: 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pExpr;.}../*.** 
0bb0: 52 65 74 75 72 6e 20 74 68 65 20 63 6f 6c 6c 61  Return the colla
0bc0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
0bd0: 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
0be0: 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a 20 74 68   pExpr. If.** th
0bf0: 65 72 65 20 69 73 20 6e 6f 20 64 65 66 69 6e 65  ere is no define
0c00: 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
0c10: 65 6e 63 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c  ence, return NUL
0c20: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c  L..**.** The col
0c30: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
0c40: 6d 69 67 68 74 20 62 65 20 64 65 74 65 72 6d 69  might be determi
0c50: 6e 65 64 20 62 79 20 61 20 43 4f 4c 4c 41 54 45  ned by a COLLATE
0c60: 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 6f 72 20   operator.** or 
0c70: 62 79 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  by the presence 
0c80: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 77 69 74 68  of a column with
0c90: 20 61 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61   a defined colla
0ca0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
0cb0: 2a 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  * COLLATE operat
0cc0: 6f 72 73 20 74 61 6b 65 20 66 69 72 73 74 20 70  ors take first p
0cd0: 72 65 63 65 64 65 6e 63 65 2e 20 20 4c 65 66 74  recedence.  Left
0ce0: 20 6f 70 65 72 61 6e 64 73 20 74 61 6b 65 0a 2a   operands take.*
0cf0: 2a 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65  * precedence ove
0d00: 72 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 73  r right operands
0d10: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
0d20: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
0d30: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
0d40: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
0d50: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
0d60: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 43 6f 6c 6c  arse->db;.  Coll
0d70: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
0d80: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 78 70    Expr *p = pExp
0d90: 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  r;.  while( p ){
0da0: 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 2d  .    int op = p-
0db0: 3e 6f 70 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d  >op;.    if( op=
0dc0: 3d 54 4b 5f 43 41 53 54 20 7c 7c 20 6f 70 3d 3d  =TK_CAST || op==
0dd0: 54 4b 5f 55 50 4c 55 53 20 29 7b 0a 20 20 20 20  TK_UPLUS ){.    
0de0: 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a    p = p->pLeft;.
0df0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
0e00: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
0e10: 28 20 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45  ( op!=TK_REGISTE
0e20: 52 20 7c 7c 20 70 2d 3e 6f 70 32 21 3d 54 4b 5f  R || p->op2!=TK_
0e30: 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20 69  COLLATE );.    i
0e40: 66 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  f( op==TK_COLLAT
0e50: 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64  E ){.      if( d
0e60: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
0e70: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
0e80: 74 20 72 65 70 6f 72 74 20 65 72 72 6f 72 73 20  t report errors 
0e90: 77 68 65 6e 20 70 61 72 73 69 6e 67 20 77 68 69  when parsing whi
0ea0: 6c 65 20 74 68 65 20 73 63 68 65 6d 61 20 2a 2f  le the schema */
0eb0: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
0ec0: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
0ed0: 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c  Seq(db, ENC(db),
0ee0: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29   p->u.zToken, 0)
0ef0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
0f00: 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
0f10: 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71  qlite3GetCollSeq
0f20: 28 70 50 61 72 73 65 2c 20 45 4e 43 28 64 62 29  (pParse, ENC(db)
0f30: 2c 20 30 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  , 0, p->u.zToken
0f40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
0f50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
0f60: 20 20 69 66 28 20 70 2d 3e 70 54 61 62 21 3d 30    if( p->pTab!=0
0f70: 0a 20 20 20 20 20 26 26 20 28 6f 70 3d 3d 54 4b  .     && (op==TK
0f80: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f  _AGG_COLUMN || o
0f90: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20  p==TK_COLUMN.   
0fa0: 20 20 20 20 20 20 20 7c 7c 20 6f 70 3d 3d 54 4b         || op==TK
0fb0: 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f 70 3d  _REGISTER || op=
0fc0: 3d 54 4b 5f 54 52 49 47 47 45 52 29 0a 20 20 20  =TK_TRIGGER).   
0fd0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d   ){.      /* op=
0fe0: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20  =TK_REGISTER && 
0ff0: 70 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65  p->pTab!=0 happe
1000: 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61  ns when pExpr wa
1010: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20  s originally.   
1020: 20 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d     ** a TK_COLUM
1030: 4e 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f  N but was previo
1040: 75 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61  usly evaluated a
1050: 6e 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72  nd cached in a r
1060: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20  egister */.     
1070: 20 69 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c   int j = p->iCol
1080: 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  umn;.      if( j
1090: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >=0 ){.        c
10a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
10b0: 20 3d 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c   = p->pTab->aCol
10c0: 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  [j].zColl;.     
10d0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
10e0: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
10f0: 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c  , ENC(db), zColl
1100: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
1110: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1120: 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  .    if( p->flag
1130: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29  s & EP_Collate )
1140: 7b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  {.      if( ALWA
1150: 59 53 28 70 2d 3e 70 4c 65 66 74 29 20 26 26 20  YS(p->pLeft) && 
1160: 28 70 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73  (p->pLeft->flags
1170: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21 3d   & EP_Collate)!=
1180: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 20 3d  0 ){.        p =
1190: 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20   p->pLeft;.     
11a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11b0: 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20  p = p->pRight;. 
11c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
11d0: 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
11e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 73     }.  }.  if( s
11f0: 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53  qlite3CheckCollS
1200: 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c  eq(pParse, pColl
1210: 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c 6c 20  ) ){ .    pColl 
1220: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1230: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pColl;.}../*.*
1240: 2a 20 70 45 78 70 72 20 69 73 20 61 6e 20 6f 70  * pExpr is an op
1250: 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61  erand of a compa
1260: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20  rison operator. 
1270: 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a 2a 20   aff2 is the.** 
1280: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66  type affinity of
1290: 20 74 68 65 20 6f 74 68 65 72 20 6f 70 65 72 61   the other opera
12a0: 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  nd.  This routin
12b0: 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  e returns the.**
12c0: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
12d0: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
12e0: 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61  ed for the compa
12f0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a  rison operator..
1300: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 43  */.char sqlite3C
1310: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 45  ompareAffinity(E
1320: 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72  xpr *pExpr, char
1330: 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72 20 61   aff2){.  char a
1340: 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ff1 = sqlite3Exp
1350: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  rAffinity(pExpr)
1360: 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26 26 20  ;.  if( aff1 && 
1370: 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42  aff2 ){.    /* B
1380: 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74 68 65  oth sides of the
1390: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20   comparison are 
13a0: 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20  columns. If one 
13b0: 68 61 73 20 6e 75 6d 65 72 69 63 0a 20 20 20 20  has numeric.    
13c0: 2a 2a 20 61 66 66 69 6e 69 74 79 2c 20 75 73 65  ** affinity, use
13d0: 20 74 68 61 74 2e 20 4f 74 68 65 72 77 69 73 65   that. Otherwise
13e0: 20 75 73 65 20 6e 6f 20 61 66 66 69 6e 69 74 79   use no affinity
13f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1400: 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69   sqlite3IsNumeri
1410: 63 41 66 66 69 6e 69 74 79 28 61 66 66 31 29 20  cAffinity(aff1) 
1420: 7c 7c 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65  || sqlite3IsNume
1430: 72 69 63 41 66 66 69 6e 69 74 79 28 61 66 66 32  ricAffinity(aff2
1440: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
1450: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  n SQLITE_AFF_NUM
1460: 45 52 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ERIC;.    }else{
1470: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1480: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
1490: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
14a0: 20 21 61 66 66 31 20 26 26 20 21 61 66 66 32 20   !aff1 && !aff2 
14b0: 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68 65  ){.    /* Neithe
14c0: 72 20 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f  r side of the co
14d0: 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20 63 6f  mparison is a co
14e0: 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61 72 65 20 74  lumn.  Compare t
14f0: 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74  he.    ** result
1500: 73 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 20 20  s directly..    
1510: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
1520: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
1530: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f   }else{.    /* O
1540: 6e 65 20 73 69 64 65 20 69 73 20 61 20 63 6f 6c  ne side is a col
1550: 75 6d 6e 2c 20 74 68 65 20 6f 74 68 65 72 20 69  umn, the other i
1560: 73 20 6e 6f 74 2e 20 55 73 65 20 74 68 65 20 63  s not. Use the c
1570: 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 2e  olumns affinity.
1580: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1590: 61 66 66 31 3d 3d 30 20 7c 7c 20 61 66 66 32 3d  aff1==0 || aff2=
15a0: 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
15b0: 20 28 61 66 66 31 20 2b 20 61 66 66 32 29 3b 0a   (aff1 + aff2);.
15c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78    }.}../*.** pEx
15d0: 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73  pr is a comparis
15e0: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 52 65  on operator.  Re
15f0: 74 75 72 6e 20 74 68 65 20 74 79 70 65 20 61 66  turn the type af
1600: 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
1610: 6c 64 0a 2a 2a 20 62 65 20 61 70 70 6c 69 65 64  ld.** be applied
1620: 20 74 6f 20 62 6f 74 68 20 6f 70 65 72 61 6e 64   to both operand
1630: 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67  s prior to doing
1640: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   the comparison.
1650: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
1660: 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
1670: 74 79 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  ty(Expr *pExpr){
1680: 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 61  .  char aff;.  a
1690: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
16a0: 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72  ==TK_EQ || pExpr
16b0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70  ->op==TK_IN || p
16c0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20  Expr->op==TK_LT 
16d0: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  ||.          pEx
16e0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c  pr->op==TK_GT ||
16f0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
1700: 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  E || pExpr->op==
1710: 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20 20 20 20 20  TK_LE ||.       
1720: 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b     pExpr->op==TK
1730: 5f 4e 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _NE || pExpr->op
1740: 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72  ==TK_IS || pExpr
1750: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ->op==TK_ISNOT )
1760: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
1770: 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 61 66  r->pLeft );.  af
1780: 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  f = sqlite3ExprA
1790: 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70  ffinity(pExpr->p
17a0: 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78  Left);.  if( pEx
17b0: 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20  pr->pRight ){.  
17c0: 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43    aff = sqlite3C
17d0: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
17e0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66  Expr->pRight, af
17f0: 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  f);.  }else if( 
1800: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1810: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
1820: 65 63 74 29 20 29 7b 0a 20 20 20 20 61 66 66 20  ect) ){.    aff 
1830: 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
1840: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
1850: 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
1860: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61  t->a[0].pExpr, a
1870: 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ff);.  }else if(
1880: 20 21 61 66 66 20 29 7b 0a 20 20 20 20 61 66 66   !aff ){.    aff
1890: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
18a0: 4e 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  NE;.  }.  return
18b0: 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70   aff;.}../*.** p
18c0: 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72  Expr is a compar
18d0: 69 73 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  ison expression,
18e0: 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c 20 49   eg. '=', '<', I
18f0: 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20 69  N(...) etc..** i
1900: 64 78 5f 61 66 66 69 6e 69 74 79 20 69 73 20 74  dx_affinity is t
1910: 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 61  he affinity of a
1920: 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e  n indexed column
1930: 2e 20 52 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a  . Return true.**
1940: 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 77 69   if the index wi
1950: 74 68 20 61 66 66 69 6e 69 74 79 20 69 64 78 5f  th affinity idx_
1960: 61 66 66 69 6e 69 74 79 20 6d 61 79 20 62 65 20  affinity may be 
1970: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
1980: 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72 69  t.** the compari
1990: 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a 2a 2f  son in pExpr..*/
19a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65  .int sqlite3Inde
19b0: 78 41 66 66 69 6e 69 74 79 4f 6b 28 45 78 70 72  xAffinityOk(Expr
19c0: 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20 69 64   *pExpr, char id
19d0: 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20 20 63  x_affinity){.  c
19e0: 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70 61 72  har aff = compar
19f0: 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78  isonAffinity(pEx
1a00: 70 72 29 3b 0a 20 20 73 77 69 74 63 68 28 20 61  pr);.  switch( a
1a10: 66 66 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  ff ){.    case S
1a20: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3a 0a  QLITE_AFF_NONE:.
1a30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1a40: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1a50: 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20 20 20  AFF_TEXT:.      
1a60: 72 65 74 75 72 6e 20 69 64 78 5f 61 66 66 69 6e  return idx_affin
1a70: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
1a80: 54 45 58 54 3b 0a 20 20 20 20 64 65 66 61 75 6c  TEXT;.    defaul
1a90: 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
1aa0: 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63  sqlite3IsNumeric
1ab0: 41 66 66 69 6e 69 74 79 28 69 64 78 5f 61 66 66  Affinity(idx_aff
1ac0: 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  inity);.  }.}../
1ad0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1ae0: 50 35 20 76 61 6c 75 65 20 74 68 61 74 20 73 68  P5 value that sh
1af0: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72  ould be used for
1b00: 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72   a binary compar
1b10: 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65 20 28  ison.** opcode (
1b20: 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20 65 74 63  OP_Eq, OP_Ge etc
1b30: 2e 29 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61  .) used to compa
1b40: 72 65 20 70 45 78 70 72 31 20 61 6e 64 20 70 45  re pExpr1 and pE
1b50: 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  xpr2..*/.static 
1b60: 75 38 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65  u8 binaryCompare
1b70: 50 35 28 45 78 70 72 20 2a 70 45 78 70 72 31 2c  P5(Expr *pExpr1,
1b80: 20 45 78 70 72 20 2a 70 45 78 70 72 32 2c 20 69   Expr *pExpr2, i
1b90: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
1ba0: 20 20 75 38 20 61 66 66 20 3d 20 28 63 68 61 72    u8 aff = (char
1bb0: 29 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69  )sqlite3ExprAffi
1bc0: 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a 20 20  nity(pExpr2);.  
1bd0: 61 66 66 20 3d 20 28 75 38 29 73 71 6c 69 74 65  aff = (u8)sqlite
1be0: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
1bf0: 28 70 45 78 70 72 31 2c 20 61 66 66 29 20 7c 20  (pExpr1, aff) | 
1c00: 28 75 38 29 6a 75 6d 70 49 66 4e 75 6c 6c 3b 0a  (u8)jumpIfNull;.
1c10: 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a    return aff;.}.
1c20: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1c30: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
1c40: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1c50: 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
1c60: 20 75 73 65 64 20 62 79 0a 2a 2a 20 61 20 62 69   used by.** a bi
1c70: 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20  nary comparison 
1c80: 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70 61 72 69  operator compari
1c90: 6e 67 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69  ng pLeft and pRi
1ca0: 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ght..**.** If th
1cb0: 65 20 6c 65 66 74 20 68 61 6e 64 20 65 78 70 72  e left hand expr
1cc0: 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c  ession has a col
1cd0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1ce0: 74 79 70 65 2c 20 74 68 65 6e 20 69 74 20 69 73  type, then it is
1cf0: 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68 65 72 77  .** used. Otherw
1d00: 69 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ise the collatio
1d10: 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  n sequence for t
1d20: 68 65 20 72 69 67 68 74 20 68 61 6e 64 20 65 78  he right hand ex
1d30: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 75  pression.** is u
1d40: 73 65 64 2c 20 6f 72 20 74 68 65 20 64 65 66 61  sed, or the defa
1d50: 75 6c 74 20 28 42 49 4e 41 52 59 29 20 69 66 20  ult (BINARY) if 
1d60: 6e 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69  neither expressi
1d70: 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69  on has a collati
1d80: 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a 2a 0a 2a  ng.** type..**.*
1d90: 2a 20 41 72 67 75 6d 65 6e 74 20 70 52 69 67 68  * Argument pRigh
1da0: 74 20 28 62 75 74 20 6e 6f 74 20 70 4c 65 66 74  t (but not pLeft
1db0: 29 20 6d 61 79 20 62 65 20 61 20 6e 75 6c 6c 20  ) may be a null 
1dc0: 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74 68 69 73  pointer. In this
1dd0: 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20   case,.** it is 
1de0: 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a  not considered..
1df0: 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69  */.CollSeq *sqli
1e00: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
1e10: 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61 72 73 65  CollSeq(.  Parse
1e20: 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45 78 70   *pParse, .  Exp
1e30: 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20 45 78 70  r *pLeft, .  Exp
1e40: 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 43  r *pRight.){.  C
1e50: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
1e60: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29   assert( pLeft )
1e70: 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 66  ;.  if( pLeft->f
1e80: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
1e90: 65 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  e ){.    pColl =
1ea0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
1eb0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66  Seq(pParse, pLef
1ec0: 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  t);.  }else if( 
1ed0: 70 52 69 67 68 74 20 26 26 20 28 70 52 69 67 68  pRight && (pRigh
1ee0: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  t->flags & EP_Co
1ef0: 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20 20 20  llate)!=0 ){.   
1f00: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
1f10: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
1f20: 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d  se, pRight);.  }
1f30: 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  else{.    pColl 
1f40: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
1f50: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65  lSeq(pParse, pLe
1f60: 66 74 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43  ft);.    if( !pC
1f70: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  oll ){.      pCo
1f80: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
1f90: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1fa0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20  pRight);.    }. 
1fb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c   }.  return pCol
1fc0: 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  l;.}../*.** Gene
1fd0: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
1fe0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
1ff0: 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tor..*/.static i
2000: 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 0a  nt codeCompare(.
2010: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2020: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
2030: 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67 65 6e  ng (and code gen
2040: 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65 78 74  erating) context
2050: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
2060: 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  t,      /* The l
2070: 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  eft operand */. 
2080: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20   Expr *pRight,  
2090: 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20     /* The right 
20a0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
20b0: 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20 20 2f   opcode,       /
20c0: 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * The comparison
20d0: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74   opcode */.  int
20e0: 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32 2c 20 2f   in1, int in2, /
20f0: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
2100: 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 20  ng operands */. 
2110: 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20   int dest,      
2120: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
2130: 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20 69  if true.  */.  i
2140: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20  nt jumpIfNull   
2150: 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a 75 6d   /* If true, jum
2160: 70 20 69 66 20 65 69 74 68 65 72 20 6f 70 65 72  p if either oper
2170: 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29  and is NULL */.)
2180: 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20 20 69 6e  {.  int p5;.  in
2190: 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c 6c 53 65  t addr;.  CollSe
21a0: 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20 3d 20 73  q *p4;..  p4 = s
21b0: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
21c0: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
21d0: 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
21e0: 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e 61 72 79  );.  p5 = binary
21f0: 43 6f 6d 70 61 72 65 50 35 28 70 4c 65 66 74 2c  CompareP5(pLeft,
2200: 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49 66 4e   pRight, jumpIfN
2210: 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20 3d 20 73  ull);.  addr = s
2220: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2230: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
2240: 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20 64 65 73  opcode, in2, des
2250: 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20 20 20 20  t, in1,.        
2260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2270: 20 20 20 28 76 6f 69 64 2a 29 70 34 2c 20 50 34     (void*)p4, P4
2280: 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 73 71 6c  _COLLSEQ);.  sql
2290: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
22a0: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
22b0: 28 75 38 29 70 35 29 3b 0a 20 20 72 65 74 75 72  (u8)p5);.  retur
22c0: 6e 20 61 64 64 72 3b 0a 7d 0a 0a 23 69 66 20 53  n addr;.}..#if S
22d0: 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
22e0: 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 65  EPTH>0./*.** Che
22f0: 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65 6e 74  ck that argument
2300: 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65 73 73   nHeight is less
2310: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
2320: 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a  o the maximum.**
2330: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74   expression dept
2340: 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20 69 74  h allowed. If it
2350: 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65 20 61   is not, leave a
2360: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
2370: 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f  in.** pParse..*/
2380: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
2390: 43 68 65 63 6b 48 65 69 67 68 74 28 50 61 72 73  CheckHeight(Pars
23a0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e  e *pParse, int n
23b0: 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74 20 72  Height){.  int r
23c0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
23d0: 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20 3d 20   int mxHeight = 
23e0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d  pParse->db->aLim
23f0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
2400: 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20 20 69  EXPR_DEPTH];.  i
2410: 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48 65 69  f( nHeight>mxHei
2420: 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ght ){.    sqlit
2430: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2440: 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78 70 72  e, .       "Expr
2450: 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20 74  ession tree is t
2460: 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69 6d 75  oo large (maximu
2470: 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20 6d 78  m depth %d)", mx
2480: 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a 20 20  Height.    );.  
2490: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
24a0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
24b0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  n rc;.}../* The 
24c0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20  following three 
24d0: 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69 67 68  functions, heigh
24e0: 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69 67 68  tOfExpr(), heigh
24f0: 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a  tOfExprList().**
2500: 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53 65 6c   and heightOfSel
2510: 65 63 74 28 29 2c 20 61 72 65 20 75 73 65 64 20  ect(), are used 
2520: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
2530: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 0a   maximum height.
2540: 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73  ** of any expres
2550: 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65  sion tree refere
2560: 6e 63 65 64 20 62 79 20 74 68 65 20 73 74 72 75  nced by the stru
2570: 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20  cture passed as 
2580: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61 72 67  the.** first arg
2590: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ument..**.** If 
25a0: 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68 65 69  this maximum hei
25b0: 67 68 74 20 69 73 20 67 72 65 61 74 65 72 20 74  ght is greater t
25c0: 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
25d0: 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a 2a 2a  value pointed.**
25e0: 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68 74 2c   to by pnHeight,
25f0: 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
2600: 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65 74 20  meter, then set 
2610: 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74 68 61  *pnHeight to tha
2620: 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73  t.** value..*/.s
2630: 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68  tatic void heigh
2640: 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a 70 2c  tOfExpr(Expr *p,
2650: 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b   int *pnHeight){
2660: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
2670: 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74 3e 2a  if( p->nHeight>*
2680: 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20  pnHeight ){.    
2690: 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20 70 2d    *pnHeight = p-
26a0: 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20 7d 0a  >nHeight;.    }.
26b0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
26c0: 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69  d heightOfExprLi
26d0: 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20  st(ExprList *p, 
26e0: 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a  int *pnHeight){.
26f0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
2700: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
2710: 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69  0; i<p->nExpr; i
2720: 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69 67 68  ++){.      heigh
2730: 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69 5d 2e  tOfExpr(p->a[i].
2740: 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68 74 29  pExpr, pnHeight)
2750: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74  ;.    }.  }.}.st
2760: 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74  atic void height
2770: 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20  OfSelect(Select 
2780: 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68  *p, int *pnHeigh
2790: 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  t){.  if( p ){. 
27a0: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28     heightOfExpr(
27b0: 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48 65 69  p->pWhere, pnHei
27c0: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
27d0: 4f 66 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e  OfExpr(p->pHavin
27e0: 67 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  g, pnHeight);.  
27f0: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
2800: 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65 69 67  ->pLimit, pnHeig
2810: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
2820: 66 45 78 70 72 28 70 2d 3e 70 4f 66 66 73 65 74  fExpr(p->pOffset
2830: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
2840: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
2850: 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 70 6e 48  t(p->pEList, pnH
2860: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
2870: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
2880: 70 47 72 6f 75 70 42 79 2c 20 70 6e 48 65 69 67  pGroupBy, pnHeig
2890: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
28a0: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72  fExprList(p->pOr
28b0: 64 65 72 42 79 2c 20 70 6e 48 65 69 67 68 74 29  derBy, pnHeight)
28c0: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53 65  ;.    heightOfSe
28d0: 6c 65 63 74 28 70 2d 3e 70 50 72 69 6f 72 2c 20  lect(p->pPrior, 
28e0: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 7d  pnHeight);.  }.}
28f0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
2900: 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72  Expr.nHeight var
2910: 69 61 62 6c 65 20 69 6e 20 74 68 65 20 73 74 72  iable in the str
2920: 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73  ucture passed as
2930: 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   an .** argument
2940: 2e 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  . An expression 
2950: 77 69 74 68 20 6e 6f 20 63 68 69 6c 64 72 65 6e  with no children
2960: 2c 20 45 78 70 72 2e 70 4c 69 73 74 20 6f 72 20  , Expr.pList or 
2970: 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c 65 63 74  .** Expr.pSelect
2980: 20 6d 65 6d 62 65 72 20 68 61 73 20 61 20 68 65   member has a he
2990: 69 67 68 74 20 6f 66 20 31 2e 20 41 6e 79 20 6f  ight of 1. Any o
29a0: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 0a  ther expression.
29b0: 2a 2a 20 68 61 73 20 61 20 68 65 69 67 68 74 20  ** has a height 
29c0: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78  equal to the max
29d0: 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61  imum height of a
29e0: 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20 72 65 66  ny other .** ref
29f0: 65 72 65 6e 63 65 64 20 45 78 70 72 20 70 6c 75  erenced Expr plu
2a00: 73 20 6f 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  s one..*/.static
2a10: 20 76 6f 69 64 20 65 78 70 72 53 65 74 48 65 69   void exprSetHei
2a20: 67 68 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ght(Expr *p){.  
2a30: 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b  int nHeight = 0;
2a40: 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  .  heightOfExpr(
2a50: 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65 69 67  p->pLeft, &nHeig
2a60: 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f 66 45  ht);.  heightOfE
2a70: 78 70 72 28 70 2d 3e 70 52 69 67 68 74 2c 20 26  xpr(p->pRight, &
2a80: 6e 48 65 69 67 68 74 29 3b 0a 20 20 69 66 28 20  nHeight);.  if( 
2a90: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2aa0: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
2ab0: 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66   ){.    heightOf
2ac0: 53 65 6c 65 63 74 28 70 2d 3e 78 2e 70 53 65 6c  Select(p->x.pSel
2ad0: 65 63 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  ect, &nHeight);.
2ae0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 68 65 69    }else{.    hei
2af0: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
2b00: 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 48 65 69 67  >x.pList, &nHeig
2b10: 68 74 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48  ht);.  }.  p->nH
2b20: 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68 74 20  eight = nHeight 
2b30: 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  + 1;.}../*.** Se
2b40: 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67  t the Expr.nHeig
2b50: 68 74 20 76 61 72 69 61 62 6c 65 20 75 73 69 6e  ht variable usin
2b60: 67 20 74 68 65 20 65 78 70 72 53 65 74 48 65 69  g the exprSetHei
2b70: 67 68 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20  ght() function. 
2b80: 49 66 0a 2a 2a 20 74 68 65 20 68 65 69 67 68 74  If.** the height
2b90: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
2ba0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c   the maximum all
2bb0: 6f 77 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20  owed expression 
2bc0: 64 65 70 74 68 2c 0a 2a 2a 20 6c 65 61 76 65 20  depth,.** leave 
2bd0: 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72  an error in pPar
2be0: 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
2bf0: 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74  te3ExprSetHeight
2c00: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2c10: 45 78 70 72 20 2a 70 29 7b 0a 20 20 65 78 70 72  Expr *p){.  expr
2c20: 53 65 74 48 65 69 67 68 74 28 70 29 3b 0a 20 20  SetHeight(p);.  
2c30: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
2c40: 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70  Height(pParse, p
2c50: 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f  ->nHeight);.}../
2c60: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2c70: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f  maximum height o
2c80: 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  f any expression
2c90: 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64   tree referenced
2ca0: 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c 65 63  .** by the selec
2cb0: 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  t statement pass
2cc0: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
2cd0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
2ce0: 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68  3SelectExprHeigh
2cf0: 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  t(Select *p){.  
2d00: 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b  int nHeight = 0;
2d10: 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63  .  heightOfSelec
2d20: 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  t(p, &nHeight);.
2d30: 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67 68 74    return nHeight
2d40: 3b 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66  ;.}.#else.  #def
2d50: 69 6e 65 20 65 78 70 72 53 65 74 48 65 69 67 68  ine exprSetHeigh
2d60: 74 28 79 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53  t(y).#endif /* S
2d70: 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
2d80: 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  EPTH>0 */../*.**
2d90: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2da0: 20 74 68 65 20 63 6f 72 65 20 61 6c 6c 6f 63 61   the core alloca
2db0: 74 6f 72 20 66 6f 72 20 45 78 70 72 20 6e 6f 64  tor for Expr nod
2dc0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 72  es..**.** Constr
2dd0: 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65 73  uct a new expres
2de0: 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20 72 65  sion node and re
2df0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
2e00: 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a  o it.  Memory.**
2e10: 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65 20 61   for this node a
2e20: 6e 64 20 66 6f 72 20 74 68 65 20 70 54 6f 6b 65  nd for the pToke
2e30: 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  n argument is a 
2e40: 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f  single allocatio
2e50: 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72  n.** obtained fr
2e60: 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  om sqlite3DbMall
2e70: 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c 6c 69  oc().  The calli
2e80: 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  ng function.** i
2e90: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
2ea0: 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 74 68  r making sure th
2eb0: 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c  e node eventuall
2ec0: 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a 2a 2a  y gets freed..**
2ed0: 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74 65 20 69  .** If dequote i
2ee0: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
2ef0: 20 74 6f 6b 65 6e 20 28 69 66 20 69 74 20 65 78   token (if it ex
2f00: 69 73 74 73 29 20 69 73 20 64 65 71 75 6f 74 65  ists) is dequote
2f10: 64 2e 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74 65  d..** If dequote
2f20: 20 69 73 20 66 61 6c 73 65 2c 20 6e 6f 20 64 65   is false, no de
2f30: 71 75 6f 74 69 6e 67 20 69 73 20 70 65 72 66 6f  quoting is perfo
2f40: 72 6d 61 6e 63 65 2e 20 20 54 68 65 20 64 65 51  rmance.  The deQ
2f50: 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65  uote.** paramete
2f60: 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20  r is ignored if 
2f70: 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20 6f  pToken is NULL o
2f80: 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e 20 64  r if the token d
2f90: 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70 65 61  oes not.** appea
2fa0: 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e 20  r to be quoted. 
2fb0: 20 49 66 20 74 68 65 20 71 75 6f 74 65 73 20 77   If the quotes w
2fc0: 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ere of the form 
2fd0: 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d 71 75  "..." (double-qu
2fe0: 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20 74 68  otes).** then th
2ff0: 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64 20 66  e EP_DblQuoted f
3000: 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68  lag is set on th
3010: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  e expression nod
3020: 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 61 6c  e..**.** Special
3030: 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d 3d 54   case:  If op==T
3040: 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20 70 54  K_INTEGER and pT
3050: 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f 20 61  oken points to a
3060: 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a 2a 20   string that.** 
3070: 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61 74 65  can be translate
3080: 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69 74 20  d into a 32-bit 
3090: 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74 68  integer, then th
30a0: 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74 0a 2a  e token is not.*
30b0: 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e 7a 54  * stored in u.zT
30c0: 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64 2c 20  oken.  Instead, 
30d0: 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75  the integer valu
30e0: 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  es is written.**
30f0: 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65 20 61   into u.iValue a
3100: 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56 61 6c  nd the EP_IntVal
3110: 75 65 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20  ue flag is set. 
3120: 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72 61 67   No extra storag
3130: 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65  e.** is allocate
3140: 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 69 6e  d to hold the in
3150: 74 65 67 65 72 20 74 65 78 74 20 61 6e 64 20 74  teger text and t
3160: 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61 67 20  he dequote flag 
3170: 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 45  is ignored..*/.E
3180: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
3190: 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74 65 33  Alloc(.  sqlite3
31a0: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
31b0: 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 73   /* Handle for s
31c0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
31d0: 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e 75 6c  ro() (may be nul
31e0: 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  l) */.  int op, 
31f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3200: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70  /* Expression op
3210: 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  code */.  const 
3220: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20 20  Token *pToken,  
3230: 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d    /* Token argum
3240: 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65 20 4e  ent.  Might be N
3250: 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71  ULL */.  int deq
3260: 75 6f 74 65 20 20 20 20 20 20 20 20 20 20 20 20  uote            
3270: 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 71 75   /* True to dequ
3280: 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ote */.){.  Expr
3290: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 45   *pNew;.  int nE
32a0: 78 74 72 61 20 3d 20 30 3b 0a 20 20 69 6e 74 20  xtra = 0;.  int 
32b0: 69 56 61 6c 75 65 20 3d 20 30 3b 0a 0a 20 20 69  iValue = 0;..  i
32c0: 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  f( pToken ){.   
32d0: 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 54 45   if( op!=TK_INTE
32e0: 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 7a  GER || pToken->z
32f0: 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  ==0.          ||
3300: 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
3310: 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56 61  (pToken->z, &iVa
3320: 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lue)==0 ){.     
3330: 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b 65 6e   nExtra = pToken
3340: 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20 20 61 73 73  ->n+1;.      ass
3350: 65 72 74 28 20 69 56 61 6c 75 65 3e 3d 30 20 29  ert( iValue>=0 )
3360: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e  ;.    }.  }.  pN
3370: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
3380: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
3390: 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74 72 61  eof(Expr)+nExtra
33a0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b  );.  if( pNew ){
33b0: 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20  .    pNew->op = 
33c0: 28 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e 65 77  (u8)op;.    pNew
33d0: 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20  ->iAgg = -1;.   
33e0: 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20   if( pToken ){. 
33f0: 20 20 20 20 20 69 66 28 20 6e 45 78 74 72 61 3d       if( nExtra=
3400: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e  =0 ){.        pN
3410: 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ew->flags |= EP_
3420: 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20  IntValue;.      
3430: 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65    pNew->u.iValue
3440: 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20 20 20   = iValue;.     
3450: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3460: 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20 70  int c;.        p
3470: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20  New->u.zToken = 
3480: 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b  (char*)&pNew[1];
3490: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
34a0: 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 7c 7c   pToken->z!=0 ||
34b0: 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20 29 3b   pToken->n==0 );
34c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f  .        if( pTo
34d0: 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70 79 28  ken->n ) memcpy(
34e0: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  pNew->u.zToken, 
34f0: 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65  pToken->z, pToke
3500: 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 70  n->n);.        p
3510: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54  New->u.zToken[pT
3520: 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20  oken->n] = 0;.  
3530: 20 20 20 20 20 20 69 66 28 20 64 65 71 75 6f 74        if( dequot
3540: 65 20 26 26 20 6e 45 78 74 72 61 3e 3d 33 20 0a  e && nExtra>=3 .
3550: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
3560: 28 28 63 20 3d 20 70 54 6f 6b 65 6e 2d 3e 7a 5b  ((c = pToken->z[
3570: 30 5d 29 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d  0])=='\'' || c==
3580: 27 22 27 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c  '"' || c=='[' ||
3590: 20 63 3d 3d 27 60 27 29 20 29 7b 0a 20 20 20 20   c=='`') ){.    
35a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71        sqlite3Deq
35b0: 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f  uote(pNew->u.zTo
35c0: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ken);.          
35d0: 69 66 28 20 63 3d 3d 27 22 27 20 29 20 70 4e 65  if( c=='"' ) pNe
35e0: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 44  w->flags |= EP_D
35f0: 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20 20 20  blQuoted;.      
3600: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
3610: 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  }.#if SQLITE_MAX
3620: 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20  _EXPR_DEPTH>0.  
3630: 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68 74 20    pNew->nHeight 
3640: 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a 20 20  = 1;.#endif  .  
3650: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
3660: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
3670: 74 65 20 61 20 6e 65 77 20 65 78 70 72 65 73 73  te a new express
3680: 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20 61 20  ion node from a 
3690: 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 20  zero-terminated 
36a0: 74 6f 6b 65 6e 20 74 68 61 74 20 68 61 73 0a 2a  token that has.*
36b0: 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 64  * already been d
36c0: 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78 70 72  equoted..*/.Expr
36d0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28 0a 20   *sqlite3Expr(. 
36e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
36f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
3700: 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62  le for sqlite3Db
3710: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61  MallocZero() (ma
3720: 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20  y be null) */.  
3730: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
3740: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
3750: 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a  ssion opcode */.
3760: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
3770: 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54 6f 6b  oken      /* Tok
3780: 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69  en argument.  Mi
3790: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29  ght be NULL */.)
37a0: 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20 20 78  {.  Token x;.  x
37b0: 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78  .z = zToken;.  x
37c0: 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20 73 71  .n = zToken ? sq
37d0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
37e0: 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20 20 72 65 74  oken) : 0;.  ret
37f0: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41  urn sqlite3ExprA
3800: 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26 78 2c  lloc(db, op, &x,
3810: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74   0);.}../*.** At
3820: 74 61 63 68 20 73 75 62 74 72 65 65 73 20 70 4c  tach subtrees pL
3830: 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 20 74  eft and pRight t
3840: 6f 20 74 68 65 20 45 78 70 72 20 6e 6f 64 65 20  o the Expr node 
3850: 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pRoot..**.** If 
3860: 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61 74  pRoot==NULL that
3870: 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20 6d 65   means that a me
3880: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
3890: 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
38a0: 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63  ed..** In that c
38b0: 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20  ase, delete the 
38c0: 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20 61  subtrees pLeft a
38d0: 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f  nd pRight..*/.vo
38e0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 74  id sqlite3ExprAt
38f0: 74 61 63 68 53 75 62 74 72 65 65 73 28 0a 20 20  tachSubtrees(.  
3900: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 45  sqlite3 *db,.  E
3910: 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20 45 78  xpr *pRoot,.  Ex
3920: 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45 78 70  pr *pLeft,.  Exp
3930: 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 69  r *pRight.){.  i
3940: 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20  f( pRoot==0 ){. 
3950: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
3960: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
3970: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
3980: 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b  lete(db, pLeft);
3990: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
39a0: 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68  Delete(db, pRigh
39b0: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
39c0: 20 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a 20   if( pRight ){. 
39d0: 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52 69 67       pRoot->pRig
39e0: 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20  ht = pRight;.   
39f0: 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20     pRoot->flags 
3a00: 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 20 26 20  |= EP_Collate & 
3a10: 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 3b 0a 20  pRight->flags;. 
3a20: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65     }.    if( pLe
3a30: 66 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f  ft ){.      pRoo
3a40: 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66 74  t->pLeft = pLeft
3a50: 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66  ;.      pRoot->f
3a60: 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61  lags |= EP_Colla
3a70: 74 65 20 26 20 70 4c 65 66 74 2d 3e 66 6c 61 67  te & pLeft->flag
3a80: 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 70  s;.    }.    exp
3a90: 72 53 65 74 48 65 69 67 68 74 28 70 52 6f 6f 74  rSetHeight(pRoot
3aa0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
3ab0: 41 6c 6c 6f 63 61 74 65 20 61 20 45 78 70 72 20  Allocate a Expr 
3ac0: 6e 6f 64 65 20 77 68 69 63 68 20 6a 6f 69 6e 73  node which joins
3ad0: 20 61 73 20 6d 61 6e 79 20 61 73 20 74 77 6f 20   as many as two 
3ae0: 73 75 62 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20  subtrees..**.** 
3af0: 4f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74  One or both of t
3b00: 68 65 20 73 75 62 74 72 65 65 73 20 63 61 6e 20  he subtrees can 
3b10: 62 65 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e  be NULL.  Return
3b20: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
3b30: 65 20 6e 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f  e new.** Expr no
3b40: 64 65 2e 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f  de.  Or, if an O
3b50: 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  OM error occurs,
3b60: 20 73 65 74 20 70 50 61 72 73 65 2d 3e 64 62 2d   set pParse->db-
3b70: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a  >mallocFailed,.*
3b80: 2a 20 66 72 65 65 20 74 68 65 20 73 75 62 74 72  * free the subtr
3b90: 65 65 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  ees and return N
3ba0: 55 4c 4c 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ULL..*/.Expr *sq
3bb0: 6c 69 74 65 33 50 45 78 70 72 28 0a 20 20 50 61  lite3PExpr(.  Pa
3bc0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
3bd0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
3be0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
3bf0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
3c00: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
3c10: 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ion opcode */.  
3c20: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20  Expr *pLeft,    
3c30: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20          /* Left 
3c40: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70  operand */.  Exp
3c50: 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 20  r *pRight,      
3c60: 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70       /* Right op
3c70: 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  erand */.  const
3c80: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20   Token *pToken  
3c90: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
3ca0: 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  oken */.){.  Exp
3cb0: 72 20 2a 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  r *p;.  if( op==
3cc0: 54 4b 5f 41 4e 44 20 26 26 20 70 4c 65 66 74 20  TK_AND && pLeft 
3cd0: 26 26 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20  && pRight ){.   
3ce0: 20 2f 2a 20 54 61 6b 65 20 61 64 76 61 6e 74 61   /* Take advanta
3cf0: 67 65 20 6f 66 20 73 68 6f 72 74 2d 63 69 72 63  ge of short-circ
3d00: 75 69 74 20 66 61 6c 73 65 20 6f 70 74 69 6d 69  uit false optimi
3d10: 7a 61 74 69 6f 6e 20 66 6f 72 20 41 4e 44 20 2a  zation for AND *
3d20: 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  /.    p = sqlite
3d30: 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
3d40: 3e 64 62 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  >db, pLeft, pRig
3d50: 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ht);.  }else{.  
3d60: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70    p = sqlite3Exp
3d70: 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64  rAlloc(pParse->d
3d80: 62 2c 20 6f 70 2c 20 70 54 6f 6b 65 6e 2c 20 31  b, op, pToken, 1
3d90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
3da0: 70 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73  prAttachSubtrees
3db0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20  (pParse->db, p, 
3dc0: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a  pLeft, pRight);.
3dd0: 20 20 7d 0a 20 20 69 66 28 20 70 20 29 20 7b 0a    }.  if( p ) {.
3de0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
3df0: 68 65 63 6b 48 65 69 67 68 74 28 70 50 61 72 73  heckHeight(pPars
3e00: 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a  e, p->nHeight);.
3e10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
3e20: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
3e30: 31 20 69 66 20 61 6e 20 65 78 70 72 65 73 73 69  1 if an expressi
3e40: 6f 6e 20 6d 75 73 74 20 62 65 20 46 41 4c 53 45  on must be FALSE
3e50: 20 69 6e 20 61 6c 6c 20 63 61 73 65 73 20 61 6e   in all cases an
3e60: 64 20 30 20 69 66 20 74 68 65 0a 2a 2a 20 65 78  d 0 if the.** ex
3e70: 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 62  pression might b
3e80: 65 20 74 72 75 65 2e 20 20 54 68 69 73 20 69 73  e true.  This is
3e90: 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
3ea0: 2e 20 20 49 66 20 69 73 20 4f 4b 20 74 6f 0a 2a  .  If is OK to.*
3eb0: 2a 20 72 65 74 75 72 6e 20 30 20 68 65 72 65 20  * return 0 here 
3ec0: 65 76 65 6e 20 69 66 20 74 68 65 20 65 78 70 72  even if the expr
3ed0: 65 73 73 69 6f 6e 20 72 65 61 6c 6c 79 20 69 73  ession really is
3ee0: 20 61 6c 77 61 79 73 20 66 61 6c 73 65 20 28 61   always false (a
3ef0: 20 0a 2a 2a 20 66 61 6c 73 65 20 6e 65 67 61 74   .** false negat
3f00: 69 76 65 29 2e 20 20 42 75 74 20 69 74 20 69 73  ive).  But it is
3f10: 20 61 20 62 75 67 20 74 6f 20 72 65 74 75 72 6e   a bug to return
3f20: 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73   1 if the expres
3f30: 73 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20 62 65  sion.** might be
3f40: 20 74 72 75 65 20 69 6e 20 73 6f 6d 65 20 72 61   true in some ra
3f50: 72 65 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  re circumstances
3f60: 20 28 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69   (a false positi
3f70: 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ve.).**.** Note 
3f80: 74 68 61 74 20 69 66 20 74 68 65 20 65 78 70 72  that if the expr
3f90: 65 73 73 69 6f 6e 20 69 73 20 70 61 72 74 20 6f  ession is part o
3fa0: 66 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 66 6f  f conditional fo
3fb0: 72 20 61 0a 2a 2a 20 4c 45 46 54 20 4a 4f 49 4e  r a.** LEFT JOIN
3fc0: 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74  , then we cannot
3fd0: 20 64 65 74 65 72 6d 69 6e 65 20 61 74 20 63 6f   determine at co
3fe0: 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68  mpile-time wheth
3ff0: 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 69 73 20  er or not.** is 
4000: 69 74 20 74 72 75 65 20 6f 72 20 66 61 6c 73 65  it true or false
4010: 2c 20 73 6f 20 61 6c 77 61 79 73 20 72 65 74 75  , so always retu
4020: 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rn 0..*/.static 
4030: 69 6e 74 20 65 78 70 72 41 6c 77 61 79 73 46 61  int exprAlwaysFa
4040: 6c 73 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  lse(Expr *p){.  
4050: 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69 66 28  int v = 0;.  if(
4060: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
4070: 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  (p, EP_FromJoin)
4080: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
4090: 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  f( !sqlite3ExprI
40a0: 73 49 6e 74 65 67 65 72 28 70 2c 20 26 76 29 20  sInteger(p, &v) 
40b0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65  ) return 0;.  re
40c0: 74 75 72 6e 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a  turn v==0;.}../*
40d0: 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70  .** Join two exp
40e0: 72 65 73 73 69 6f 6e 73 20 75 73 69 6e 67 20 61  ressions using a
40f0: 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20  n AND operator. 
4100: 20 49 66 20 65 69 74 68 65 72 20 65 78 70 72 65   If either expre
4110: 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c  ssion is.** NULL
4120: 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75  , then just retu
4130: 72 6e 20 74 68 65 20 6f 74 68 65 72 20 65 78 70  rn the other exp
4140: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  ression..**.** I
4150: 66 20 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68  f one side or th
4160: 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 41  e other of the A
4170: 4e 44 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62  ND is known to b
4180: 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e  e false, then in
4190: 73 74 65 61 64 0a 2a 2a 20 6f 66 20 72 65 74 75  stead.** of retu
41a0: 72 6e 69 6e 67 20 61 6e 20 41 4e 44 20 65 78 70  rning an AND exp
41b0: 72 65 73 73 69 6f 6e 2c 20 6a 75 73 74 20 72 65  ression, just re
41c0: 74 75 72 6e 20 61 20 63 6f 6e 73 74 61 6e 74 20  turn a constant 
41d0: 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 0a  expression with.
41e0: 2a 2a 20 61 20 76 61 6c 75 65 20 6f 66 20 66 61  ** a value of fa
41f0: 6c 73 65 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  lse..*/.Expr *sq
4200: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 73 71 6c  lite3ExprAnd(sql
4210: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
4220: 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69  pLeft, Expr *pRi
4230: 67 68 74 29 7b 0a 20 20 69 66 28 20 70 4c 65 66  ght){.  if( pLef
4240: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t==0 ){.    retu
4250: 72 6e 20 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c  rn pRight;.  }el
4260: 73 65 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30  se if( pRight==0
4270: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
4280: 4c 65 66 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Left;.  }else if
4290: 28 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73  ( exprAlwaysFals
42a0: 65 28 70 4c 65 66 74 29 20 7c 7c 20 65 78 70 72  e(pLeft) || expr
42b0: 41 6c 77 61 79 73 46 61 6c 73 65 28 70 52 69 67  AlwaysFalse(pRig
42c0: 68 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ht) ){.    sqlit
42d0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
42e0: 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c   pLeft);.    sql
42f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
4300: 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  b, pRight);.    
4310: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
4320: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49  prAlloc(db, TK_I
4330: 4e 54 45 47 45 52 2c 20 26 73 71 6c 69 74 65 33  NTEGER, &sqlite3
4340: 49 6e 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29  IntTokens[0], 0)
4350: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45  ;.  }else{.    E
4360: 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  xpr *pNew = sqli
4370: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
4380: 20 54 4b 5f 41 4e 44 2c 20 30 2c 20 30 29 3b 0a   TK_AND, 0, 0);.
4390: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
43a0: 74 74 61 63 68 53 75 62 74 72 65 65 73 28 64 62  ttachSubtrees(db
43b0: 2c 20 70 4e 65 77 2c 20 70 4c 65 66 74 2c 20 70  , pNew, pLeft, p
43c0: 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75  Right);.    retu
43d0: 72 6e 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a  rn pNew;.  }.}..
43e0: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
43f0: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
4400: 20 6e 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63   node for a func
4410: 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70  tion with multip
4420: 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e  le.** arguments.
4430: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
4440: 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 50 61  3ExprFunction(Pa
4450: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
4460: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  rList *pList, To
4470: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
4480: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71  Expr *pNew;.  sq
4490: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
44a0: 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
44b0: 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e  ( pToken );.  pN
44c0: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
44d0: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 46 55 4e  Alloc(db, TK_FUN
44e0: 43 54 49 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31  CTION, pToken, 1
44f0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
4500: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
4510: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
4520: 2c 20 70 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f  , pList); /* Avo
4530: 69 64 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 77  id memory leak w
4540: 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73  hen malloc fails
4550: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30   */.    return 0
4560: 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e  ;.  }.  pNew->x.
4570: 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20  pList = pList;. 
4580: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
4590: 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20  sProperty(pNew, 
45a0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
45b0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 65  .  sqlite3ExprSe
45c0: 74 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20  tHeight(pParse, 
45d0: 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20  pNew);.  return 
45e0: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  pNew;.}../*.** A
45f0: 73 73 69 67 6e 20 61 20 76 61 72 69 61 62 6c 65  ssign a variable
4600: 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20 65 78   number to an ex
4610: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65 6e  pression that en
4620: 63 6f 64 65 73 20 61 20 77 69 6c 64 63 61 72 64  codes a wildcard
4630: 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69 67 69  .** in the origi
4640: 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  nal SQL statemen
4650: 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63  t.  .**.** Wildc
4660: 61 72 64 73 20 63 6f 6e 73 69 73 74 69 6e 67 20  ards consisting 
4670: 6f 66 20 61 20 73 69 6e 67 6c 65 20 22 3f 22 20  of a single "?" 
4680: 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65  are assigned the
4690: 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c   next sequential
46a0: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  .** variable num
46b0: 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63  ber..**.** Wildc
46c0: 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ards of the form
46d0: 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73 69   "?nnn" are assi
46e0: 67 6e 65 64 20 74 68 65 20 6e 75 6d 62 65 72 20  gned the number 
46f0: 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a  "nnn".  We make.
4700: 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20 69 73  ** sure "nnn" is
4710: 20 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f 20 61   not too be to a
4720: 76 6f 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66  void a denial of
4730: 20 73 65 72 76 69 63 65 20 61 74 74 61 63 6b 20   service attack 
4740: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20  when.** the SQL 
4750: 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20  statement comes 
4760: 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c  from an external
4770: 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57   source..**.** W
4780: 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20  ildcards of the 
4790: 66 6f 72 6d 20 22 3a 61 61 61 22 2c 20 22 40 61  form ":aaa", "@a
47a0: 61 61 22 2c 20 6f 72 20 22 24 61 61 61 22 20 61  aa", or "$aaa" a
47b0: 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20  re assigned the 
47c0: 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61  same number.** a
47d0: 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 69  s the previous i
47e0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73  nstance of the s
47f0: 61 6d 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f  ame wildcard.  O
4800: 72 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  r if this is the
4810: 20 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e   first.** instan
4820: 63 65 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61  ce of the wildca
4830: 72 64 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71  rd, the next seq
4840: 75 65 6e 69 61 6c 20 76 61 72 69 61 62 6c 65 20  uenial variable 
4850: 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73  number is.** ass
4860: 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  igned..*/.void s
4870: 71 6c 69 74 65 33 45 78 70 72 41 73 73 69 67 6e  qlite3ExprAssign
4880: 56 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20  VarNumber(Parse 
4890: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
48a0: 45 78 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  Expr){.  sqlite3
48b0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
48c0: 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
48d0: 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72  *z;..  if( pExpr
48e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
48f0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
4900: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70  AnyProperty(pExp
4910: 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45  r, EP_IntValue|E
4920: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
4930: 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d  enOnly) );.  z =
4940: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
4950: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30  ;.  assert( z!=0
4960: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 5b   );.  assert( z[
4970: 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a  0]!=0 );.  if( z
4980: 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  [1]==0 ){.    /*
4990: 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65   Wildcard of the
49a0: 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73 69   form "?".  Assi
49b0: 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72 69  gn the next vari
49c0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  able number */. 
49d0: 20 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d     assert( z[0]=
49e0: 3d 27 3f 27 20 29 3b 0a 20 20 20 20 70 45 78 70  ='?' );.    pExp
49f0: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e  r->iColumn = (yn
4a00: 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e  Var)(++pParse->n
4a10: 56 61 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Var);.  }else{. 
4a20: 20 20 20 79 6e 56 61 72 20 78 20 3d 20 30 3b 0a     ynVar x = 0;.
4a30: 20 20 20 20 75 33 32 20 6e 20 3d 20 73 71 6c 69      u32 n = sqli
4a40: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a  te3Strlen30(z);.
4a50: 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f      if( z[0]=='?
4a60: 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69  ' ){.      /* Wi
4a70: 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f  ldcard of the fo
4a80: 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76  rm "?nnn".  Conv
4a90: 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20  ert "nnn" to an 
4aa0: 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20 20 20  integer and.    
4ab0: 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20 74    ** use it as t
4ac0: 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  he variable numb
4ad0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20  er */.      i64 
4ae0: 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f 6b  i;.      int bOk
4af0: 20 3d 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f   = 0==sqlite3Ato
4b00: 69 36 34 28 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e  i64(&z[1], &i, n
4b10: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  -1, SQLITE_UTF8)
4b20: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ;.      pExpr->i
4b30: 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e  Column = x = (yn
4b40: 56 61 72 29 69 3b 0a 20 20 20 20 20 20 74 65 73  Var)i;.      tes
4b50: 74 63 61 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20  tcase( i==0 );. 
4b60: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
4b70: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==1 );.      tes
4b80: 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c  tcase( i==db->aL
4b90: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
4ba0: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
4bb0: 52 5d 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65  R]-1 );.      te
4bc0: 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61  stcase( i==db->a
4bd0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
4be0: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
4bf0: 45 52 5d 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ER] );.      if(
4c00: 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c   bOk==0 || i<1 |
4c10: 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  | i>db->aLimit[S
4c20: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
4c30: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a  ABLE_NUMBER] ){.
4c40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
4c50: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
4c60: 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72  "variable number
4c70: 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
4c80: 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20   ?1 and ?%d",.  
4c90: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 4c            db->aL
4ca0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
4cb0: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
4cc0: 52 5d 29 3b 0a 20 20 20 20 20 20 20 20 78 20 3d  R]);.        x =
4cd0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
4ce0: 20 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d 3e    if( i>pParse->
4cf0: 6e 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20  nVar ){.        
4d00: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 28  pParse->nVar = (
4d10: 69 6e 74 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20  int)i;.      }. 
4d20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4d30: 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6c 69 6b  /* Wildcards lik
4d40: 65 20 22 3a 61 61 61 22 2c 20 22 24 61 61 61 22  e ":aaa", "$aaa"
4d50: 20 6f 72 20 22 40 61 61 61 22 2e 20 20 52 65 75   or "@aaa".  Reu
4d60: 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69  se the same vari
4d70: 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75  able.      ** nu
4d80: 6d 62 65 72 20 61 73 20 74 68 65 20 70 72 69 6f  mber as the prio
4d90: 72 20 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20  r appearance of 
4da0: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f  the same name, o
4db0: 72 20 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20  r if the name.  
4dc0: 20 20 20 20 2a 2a 20 68 61 73 20 6e 65 76 65 72      ** has never
4dd0: 20 61 70 70 65 61 72 65 64 20 62 65 66 6f 72 65   appeared before
4de0: 2c 20 72 65 75 73 65 20 74 68 65 20 73 61 6d 65  , reuse the same
4df0: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
4e00: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
4e10: 79 6e 56 61 72 20 69 3b 0a 20 20 20 20 20 20 66  ynVar i;.      f
4e20: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
4e30: 2d 3e 6e 7a 56 61 72 3b 20 69 2b 2b 29 7b 0a 20  ->nzVar; i++){. 
4e40: 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73         if( pPars
4e50: 65 2d 3e 61 7a 56 61 72 5b 69 5d 20 26 26 20 73  e->azVar[i] && s
4e60: 74 72 63 6d 70 28 70 50 61 72 73 65 2d 3e 61 7a  trcmp(pParse->az
4e70: 56 61 72 5b 69 5d 2c 7a 29 3d 3d 30 20 29 7b 0a  Var[i],z)==0 ){.
4e80: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
4e90: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20 28  >iColumn = x = (
4ea0: 79 6e 56 61 72 29 69 2b 31 3b 0a 20 20 20 20 20  ynVar)i+1;.     
4eb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4ec0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
4ed0: 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 20 78      if( x==0 ) x
4ee0: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
4ef0: 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50  n = (ynVar)(++pP
4f00: 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 20  arse->nVar);.   
4f10: 20 7d 0a 20 20 20 20 69 66 28 20 78 3e 30 20 29   }.    if( x>0 )
4f20: 7b 0a 20 20 20 20 20 20 69 66 28 20 78 3e 70 50  {.      if( x>pP
4f30: 61 72 73 65 2d 3e 6e 7a 56 61 72 20 29 7b 0a 20  arse->nzVar ){. 
4f40: 20 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61 3b         char **a;
4f50: 0a 20 20 20 20 20 20 20 20 61 20 3d 20 73 71 6c  .        a = sql
4f60: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
4f70: 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c  , pParse->azVar,
4f80: 20 78 2a 73 69 7a 65 6f 66 28 61 5b 30 5d 29 29   x*sizeof(a[0]))
4f90: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 3d  ;.        if( a=
4fa0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  =0 ) return;  /*
4fb0: 20 45 72 72 6f 72 20 72 65 70 6f 72 74 65 64 20   Error reported 
4fc0: 74 68 72 6f 75 67 68 20 64 62 2d 3e 6d 61 6c 6c  through db->mall
4fd0: 6f 63 46 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20  ocFailed */.    
4fe0: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 7a 56 61      pParse->azVa
4ff0: 72 20 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 6d  r = a;.        m
5000: 65 6d 73 65 74 28 26 61 5b 70 50 61 72 73 65 2d  emset(&a[pParse-
5010: 3e 6e 7a 56 61 72 5d 2c 20 30 2c 20 28 78 2d 70  >nzVar], 0, (x-p
5020: 50 61 72 73 65 2d 3e 6e 7a 56 61 72 29 2a 73 69  Parse->nzVar)*si
5030: 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20  zeof(a[0]));.   
5040: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 7a 56       pParse->nzV
5050: 61 72 20 3d 20 78 3b 0a 20 20 20 20 20 20 7d 0a  ar = x;.      }.
5060: 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d        if( z[0]!=
5070: 27 3f 27 20 7c 7c 20 70 50 61 72 73 65 2d 3e 61  '?' || pParse->a
5080: 7a 56 61 72 5b 78 2d 31 5d 3d 3d 30 20 29 7b 0a  zVar[x-1]==0 ){.
5090: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
50a0: 62 46 72 65 65 28 64 62 2c 20 70 50 61 72 73 65  bFree(db, pParse
50b0: 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 29 3b 0a 20  ->azVar[x-1]);. 
50c0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
50d0: 7a 56 61 72 5b 78 2d 31 5d 20 3d 20 73 71 6c 69  zVar[x-1] = sqli
50e0: 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
50f0: 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a   z, n);.      }.
5100: 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66 28      }.  } .  if(
5110: 20 21 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 26   !pParse->nErr &
5120: 26 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 64  & pParse->nVar>d
5130: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
5140: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
5150: 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 73  NUMBER] ){.    s
5160: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
5170: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
5180: 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 22 29   SQL variables")
5190: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
51a0: 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74  ecursively delet
51b0: 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
51c0: 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tree..*/.void sq
51d0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
51e0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
51f0: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d  r *p){.  if( p==
5200: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 2f 2a  0 ) return;.  /*
5210: 20 53 61 6e 69 74 79 20 63 68 65 63 6b 3a 20 41   Sanity check: A
5220: 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 49  ssert that the I
5230: 6e 74 56 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e  ntValue is non-n
5240: 65 67 61 74 69 76 65 20 69 66 20 69 74 20 65 78  egative if it ex
5250: 69 73 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  ists */.  assert
5260: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
5270: 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75  ty(p, EP_IntValu
5280: 65 29 20 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c 75  e) || p->u.iValu
5290: 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 45  e>=0 );.  if( !E
52a0: 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
52b0: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
52c0: 79 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  y) ){.    sqlite
52d0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
52e0: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  p->pLeft);.    s
52f0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
5300: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b  (db, p->pRight);
5310: 0a 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61  .    if( !ExprHa
5320: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
5330: 52 65 64 75 63 65 64 29 20 26 26 20 28 70 2d 3e  Reduced) && (p->
5340: 66 6c 61 67 73 32 20 26 20 45 50 32 5f 4d 61 6c  flags2 & EP2_Mal
5350: 6c 6f 63 65 64 54 6f 6b 65 6e 29 21 3d 30 20 29  locedToken)!=0 )
5360: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
5370: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 7a  bFree(db, p->u.z
5380: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  Token);.    }.  
5390: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
53a0: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
53b0: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
53c0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
53d0: 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65  ete(db, p->x.pSe
53e0: 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lect);.    }else
53f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
5400: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
5410: 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  , p->x.pList);. 
5420: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21     }.  }.  if( !
5430: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
5440: 70 2c 20 45 50 5f 53 74 61 74 69 63 29 20 29 7b  p, EP_Static) ){
5450: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
5460: 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d  ee(db, p);.  }.}
5470: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
5480: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
5490: 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  es allocated for
54a0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
54b0: 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 70 61  structure .** pa
54c0: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
54d0: 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73  t argument. This
54e0: 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f   is always one o
54f0: 66 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c  f EXPR_FULLSIZE,
5500: 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55 43 45 44  .** EXPR_REDUCED
5510: 53 49 5a 45 20 6f 72 20 45 58 50 52 5f 54 4f 4b  SIZE or EXPR_TOK
5520: 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73  ENONLYSIZE..*/.s
5530: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53 74  tatic int exprSt
5540: 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70  ructSize(Expr *p
5550: 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  ){.  if( ExprHas
5560: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
5570: 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65 74 75  okenOnly) ) retu
5580: 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c  rn EXPR_TOKENONL
5590: 59 53 49 5a 45 3b 0a 20 20 69 66 28 20 45 78 70  YSIZE;.  if( Exp
55a0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
55b0: 45 50 5f 52 65 64 75 63 65 64 29 20 29 20 72 65  EP_Reduced) ) re
55c0: 74 75 72 6e 20 45 58 50 52 5f 52 45 44 55 43 45  turn EXPR_REDUCE
55d0: 44 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20  DSIZE;.  return 
55e0: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d  EXPR_FULLSIZE;.}
55f0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65  ../*.** The dupe
5600: 64 45 78 70 72 2a 53 69 7a 65 28 29 20 72 6f 75  dExpr*Size() rou
5610: 74 69 6e 65 73 20 65 61 63 68 20 72 65 74 75 72  tines each retur
5620: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
5630: 62 79 74 65 73 20 72 65 71 75 69 72 65 64 0a 2a  bytes required.*
5640: 2a 20 74 6f 20 73 74 6f 72 65 20 61 20 63 6f 70  * to store a cop
5650: 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  y of an expressi
5660: 6f 6e 20 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  on or expression
5670: 20 74 72 65 65 2e 20 20 54 68 65 79 20 64 69 66   tree.  They dif
5680: 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75  fer in.** how mu
5690: 63 68 20 6f 66 20 74 68 65 20 74 72 65 65 20 69  ch of the tree i
56a0: 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a  s measured..**.*
56b0: 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72 53  *     dupedExprS
56c0: 74 72 75 63 74 53 69 7a 65 28 29 20 20 20 20 20  tructSize()     
56d0: 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74 68 65  Size of only the
56e0: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20   Expr structure 
56f0: 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70  .**     dupedExp
5700: 72 4e 6f 64 65 53 69 7a 65 28 29 20 20 20 20 20  rNodeSize()     
5710: 20 20 53 69 7a 65 20 6f 66 20 45 78 70 72 20 2b    Size of Expr +
5720: 20 73 70 61 63 65 20 66 6f 72 20 74 6f 6b 65 6e   space for token
5730: 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70  .**     dupedExp
5740: 72 53 69 7a 65 28 29 20 20 20 20 20 20 20 20 20  rSize()         
5750: 20 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e 20 2b    Expr + token +
5760: 20 73 75 62 74 72 65 65 20 63 6f 6d 70 6f 6e 65   subtree compone
5770: 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  nts.**.*********
5780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57c0: 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 75 70  **.**.** The dup
57d0: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
57e0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  () function retu
57f0: 72 6e 73 20 74 77 6f 20 76 61 6c 75 65 73 20 4f  rns two values O
5800: 52 2d 65 64 20 74 6f 67 65 74 68 65 72 3a 20 20  R-ed together:  
5810: 0a 2a 2a 20 28 31 29 20 74 68 65 20 73 70 61 63  .** (1) the spac
5820: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  e required for a
5830: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70   copy of the Exp
5840: 72 20 73 74 72 75 63 74 75 72 65 20 6f 6e 6c 79  r structure only
5850: 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74 68 65   and .** (2) the
5860: 20 45 50 5f 78 78 78 20 66 6c 61 67 73 20 74 68   EP_xxx flags th
5870: 61 74 20 69 6e 64 69 63 61 74 65 20 77 68 61 74  at indicate what
5880: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 73   the structure s
5890: 69 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e 0a 2a  ize should be..*
58a0: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
58b0: 75 65 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e  ues is always on
58c0: 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  e of:.**.**     
58d0: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a   EXPR_FULLSIZE.*
58e0: 2a 20 20 20 20 20 20 45 58 50 52 5f 52 45 44 55  *      EXPR_REDU
58f0: 43 45 44 53 49 5a 45 20 20 20 7c 20 45 50 5f 52  CEDSIZE   | EP_R
5900: 65 64 75 63 65 64 0a 2a 2a 20 20 20 20 20 20 45  educed.**      E
5910: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
5920: 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  E | EP_TokenOnly
5930: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20  .**.** The size 
5940: 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65  of the structure
5950: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79   can be found by
5960: 20 6d 61 73 6b 69 6e 67 20 74 68 65 20 72 65 74   masking the ret
5970: 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  urn value.** of 
5980: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74  this routine wit
5990: 68 20 30 78 66 66 66 2e 20 20 54 68 65 20 66 6c  h 0xfff.  The fl
59a0: 61 67 73 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ags can be found
59b0: 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 0a   by masking the.
59c0: 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
59d0: 77 69 74 68 20 45 50 5f 52 65 64 75 63 65 64 7c  with EP_Reduced|
59e0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a  EP_TokenOnly..**
59f0: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 69  .** Note that wi
5a00: 74 68 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55  th flags==EXPRDU
5a10: 50 5f 52 45 44 55 43 45 2c 20 74 68 69 73 20 72  P_REDUCE, this r
5a20: 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73 20 6f 6e  outines works on
5a30: 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75   full-size.** (u
5a40: 6e 72 65 64 75 63 65 64 29 20 45 78 70 72 20 6f  nreduced) Expr o
5a50: 62 6a 65 63 74 73 20 61 73 20 74 68 65 79 20 6f  bjects as they o
5a60: 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e  r originally con
5a70: 73 74 72 75 63 74 65 64 20 62 79 20 74 68 65 20  structed by the 
5a80: 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72 69 6e  parser..** Durin
5a90: 67 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61  g expression ana
5aa0: 6c 79 73 69 73 2c 20 65 78 74 72 61 20 69 6e 66  lysis, extra inf
5ab0: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70  ormation is comp
5ac0: 75 74 65 64 20 61 6e 64 20 6d 6f 76 65 64 20 69  uted and moved i
5ad0: 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70 61 72  nto.** later par
5ae0: 74 73 20 6f 66 20 74 65 68 20 45 78 70 72 20 6f  ts of teh Expr o
5af0: 62 6a 65 63 74 20 61 6e 64 20 74 68 61 74 20 65  bject and that e
5b00: 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  xtra information
5b10: 20 6d 69 67 68 74 20 67 65 74 20 63 68 6f 70 70   might get chopp
5b20: 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74 68 65  ed.** off if the
5b30: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72   expression is r
5b40: 65 64 75 63 65 64 2e 20 20 4e 6f 74 65 20 61 6c  educed.  Note al
5b50: 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  so that it does 
5b60: 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d  not work to.** m
5b70: 61 6b 65 20 61 20 45 58 50 52 44 55 50 5f 52 45  ake a EXPRDUP_RE
5b80: 44 55 43 45 20 63 6f 70 79 20 6f 66 20 61 20 72  DUCE copy of a r
5b90: 65 64 75 63 65 64 20 65 78 70 72 65 73 73 69 6f  educed expressio
5ba0: 6e 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 6c  n.  It is only l
5bb0: 65 67 61 6c 0a 2a 2a 20 74 6f 20 72 65 64 75 63  egal.** to reduc
5bc0: 65 20 61 20 70 72 69 73 74 69 6e 65 20 65 78 70  e a pristine exp
5bd0: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 66 72 6f  ression tree fro
5be0: 6d 20 74 68 65 20 70 61 72 73 65 72 2e 20 20 54  m the parser.  T
5bf0: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
5c00: 6e 0a 2a 2a 20 6f 66 20 64 75 70 65 64 45 78 70  n.** of dupedExp
5c10: 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 63 6f  rStructSize() co
5c20: 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65 20 61  ntain multiple a
5c30: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
5c40: 74 73 20 74 68 61 74 20 61 74 74 65 6d 70 74 0a  ts that attempt.
5c50: 2a 2a 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68  ** to enforce th
5c60: 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a  is constraint..*
5c70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70  /.static int dup
5c80: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
5c90: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c  (Expr *p, int fl
5ca0: 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a  ags){.  int nSiz
5cb0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  e;.  assert( fla
5cc0: 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55  gs==EXPRDUP_REDU
5cd0: 43 45 20 7c 7c 20 66 6c 61 67 73 3d 3d 30 20 29  CE || flags==0 )
5ce0: 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c  ; /* Only one fl
5cf0: 61 67 20 76 61 6c 75 65 20 61 6c 6c 6f 77 65 64  ag value allowed
5d00: 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 28 66 6c   */.  if( 0==(fl
5d10: 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55  ags&EXPRDUP_REDU
5d20: 43 45 29 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  CE) ){.    nSize
5d30: 20 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45   = EXPR_FULLSIZE
5d40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
5d50: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 41  ssert( !ExprHasA
5d60: 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  nyProperty(p, EP
5d70: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
5d80: 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 61 73  duced) );.    as
5d90: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
5da0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
5db0: 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20 61  mJoin) ); .    a
5dc0: 73 73 65 72 74 28 20 28 70 2d 3e 66 6c 61 67 73  ssert( (p->flags
5dd0: 32 20 26 20 45 50 32 5f 4d 61 6c 6c 6f 63 65 64  2 & EP2_Malloced
5de0: 54 6f 6b 65 6e 29 3d 3d 30 20 29 3b 0a 20 20 20  Token)==0 );.   
5df0: 20 61 73 73 65 72 74 28 20 28 70 2d 3e 66 6c 61   assert( (p->fla
5e00: 67 73 32 20 26 20 45 50 32 5f 49 72 72 65 64 75  gs2 & EP2_Irredu
5e10: 63 69 62 6c 65 29 3d 3d 30 20 29 3b 0a 20 20 20  cible)==0 );.   
5e20: 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c 7c   if( p->pLeft ||
5e30: 20 70 2d 3e 70 52 69 67 68 74 20 7c 7c 20 70 2d   p->pRight || p-
5e40: 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  >x.pList ){.    
5e50: 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 52    nSize = EXPR_R
5e60: 45 44 55 43 45 44 53 49 5a 45 20 7c 20 45 50 5f  EDUCEDSIZE | EP_
5e70: 52 65 64 75 63 65 64 3b 0a 20 20 20 20 7d 65 6c  Reduced;.    }el
5e80: 73 65 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20  se{.      nSize 
5e90: 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59  = EXPR_TOKENONLY
5ea0: 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f  SIZE | EP_TokenO
5eb0: 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  nly;.    }.  }. 
5ec0: 20 72 65 74 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d   return nSize;.}
5ed0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
5ee0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
5ef0: 65 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73  e space in bytes
5f00: 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f   required to sto
5f10: 72 65 20 74 68 65 20 63 6f 70 79 20 0a 2a 2a 20  re the copy .** 
5f20: 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75  of the Expr stru
5f30: 63 74 75 72 65 20 61 6e 64 20 61 20 63 6f 70 79  cture and a copy
5f40: 20 6f 66 20 74 68 65 20 45 78 70 72 2e 75 2e 7a   of the Expr.u.z
5f50: 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66  Token string (if
5f60: 20 74 68 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20   that.** string 
5f70: 69 73 20 64 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a  is defined.).*/.
5f80: 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64  static int duped
5f90: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 45 78 70  ExprNodeSize(Exp
5fa0: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
5fb0: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20  {.  int nByte = 
5fc0: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
5fd0: 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 20 26 20  ize(p, flags) & 
5fe0: 30 78 66 66 66 3b 0a 20 20 69 66 28 20 21 45 78  0xfff;.  if( !Ex
5ff0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
6000: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26   EP_IntValue) &&
6010: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a   p->u.zToken ){.
6020: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c      nByte += sql
6030: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e  ite3Strlen30(p->
6040: 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d  u.zToken)+1;.  }
6050: 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38  .  return ROUND8
6060: 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (nByte);.}../*.*
6070: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
6080: 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71  ber of bytes req
6090: 75 69 72 65 64 20 74 6f 20 63 72 65 61 74 65 20  uired to create 
60a0: 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 74  a duplicate of t
60b0: 68 65 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  he .** expressio
60c0: 6e 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  n passed as the 
60d0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
60e0: 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
60f0: 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d 61 73 6b  ent is a.** mask
6100: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45 58 50 52   containing EXPR
6110: 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a  DUP_XXX flags..*
6120: 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72  *.** The value r
6130: 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73  eturned includes
6140: 20 73 70 61 63 65 20 74 6f 20 63 72 65 61 74 65   space to create
6150: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45   a copy of the E
6160: 78 70 72 20 73 74 72 75 63 74 0a 2a 2a 20 69 74  xpr struct.** it
6170: 73 65 6c 66 20 61 6e 64 20 74 68 65 20 62 75 66  self and the buf
6180: 66 65 72 20 72 65 66 65 72 72 65 64 20 74 6f 20  fer referred to 
6190: 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e  by Expr.u.zToken
61a0: 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20  , if any..**.** 
61b0: 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52  If the EXPRDUP_R
61c0: 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65  EDUCE flag is se
61d0: 74 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75  t, then the retu
61e0: 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c 75 64 65  rn value include
61f0: 73 20 0a 2a 2a 20 73 70 61 63 65 20 74 6f 20 64  s .** space to d
6200: 75 70 6c 69 63 61 74 65 20 61 6c 6c 20 45 78 70  uplicate all Exp
6210: 72 20 6e 6f 64 65 73 20 69 6e 20 74 68 65 20 74  r nodes in the t
6220: 72 65 65 20 66 6f 72 6d 65 64 20 62 79 20 45 78  ree formed by Ex
6230: 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64  pr.pLeft .** and
6240: 20 45 78 70 72 2e 70 52 69 67 68 74 20 76 61 72   Expr.pRight var
6250: 69 61 62 6c 65 73 20 28 62 75 74 20 6e 6f 74 20  iables (but not 
6260: 66 6f 72 20 61 6e 79 20 73 74 72 75 63 74 75 72  for any structur
6270: 65 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72  es pointed to or
6280: 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65 64 20 66   .** descended f
6290: 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70  rom the Expr.x.p
62a0: 4c 69 73 74 20 6f 72 20 45 78 70 72 2e 78 2e 70  List or Expr.x.p
62b0: 53 65 6c 65 63 74 20 76 61 72 69 61 62 6c 65 73  Select variables
62c0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
62d0: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 45   dupedExprSize(E
62e0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
62f0: 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20  s){.  int nByte 
6300: 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  = 0;.  if( p ){.
6310: 20 20 20 20 6e 42 79 74 65 20 3d 20 64 75 70 65      nByte = dupe
6320: 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c  dExprNodeSize(p,
6330: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28   flags);.    if(
6340: 20 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52   flags&EXPRDUP_R
6350: 45 44 55 43 45 20 29 7b 0a 20 20 20 20 20 20 6e  EDUCE ){.      n
6360: 42 79 74 65 20 2b 3d 20 64 75 70 65 64 45 78 70  Byte += dupedExp
6370: 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66 74 2c 20  rSize(p->pLeft, 
6380: 66 6c 61 67 73 29 20 2b 20 64 75 70 65 64 45 78  flags) + dupedEx
6390: 70 72 53 69 7a 65 28 70 2d 3e 70 52 69 67 68 74  prSize(p->pRight
63a0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a  , flags);.    }.
63b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 42 79    }.  return nBy
63c0: 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  te;.}../*.** Thi
63d0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69  s function is si
63e0: 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33  milar to sqlite3
63f0: 45 78 70 72 44 75 70 28 29 2c 20 65 78 63 65 70  ExprDup(), excep
6400: 74 20 74 68 61 74 20 69 66 20 70 7a 42 75 66 66  t that if pzBuff
6410: 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e 55  er .** is not NU
6420: 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75 66 66 65  LL then *pzBuffe
6430: 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  r is assumed to 
6440: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
6450: 72 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 0a  r large enough .
6460: 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ** to store the 
6470: 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73 69  copy of expressi
6480: 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70 69 65 73  on p, the copies
6490: 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a   of p->u.zToken.
64a0: 2a 2a 20 28 69 66 20 61 70 70 6c 69 63 61 62 6c  ** (if applicabl
64b0: 65 29 2c 20 61 6e 64 20 74 68 65 20 63 6f 70 69  e), and the copi
64c0: 65 73 20 6f 66 20 74 68 65 20 70 2d 3e 70 4c 65  es of the p->pLe
64d0: 66 74 20 61 6e 64 20 70 2d 3e 70 52 69 67 68 74  ft and p->pRight
64e0: 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a   expressions,.**
64f0: 20 69 66 20 61 6e 79 2e 20 42 65 66 6f 72 65 20   if any. Before 
6500: 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 42 75  returning, *pzBu
6510: 66 66 65 72 20 69 73 20 73 65 74 20 74 6f 20 74  ffer is set to t
6520: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61  he first byte pa
6530: 73 73 65 64 20 74 68 65 0a 2a 2a 20 70 6f 72 74  ssed the.** port
6540: 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 66 66 65  ion of the buffe
6550: 72 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 62 79  r copied into by
6560: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
6570: 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a  */.static Expr *
6580: 65 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20  exprDup(sqlite3 
6590: 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e  *db, Expr *p, in
65a0: 74 20 66 6c 61 67 73 2c 20 75 38 20 2a 2a 70 7a  t flags, u8 **pz
65b0: 42 75 66 66 65 72 29 7b 0a 20 20 45 78 70 72 20  Buffer){.  Expr 
65c0: 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20  *pNew = 0;      
65d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65e0: 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
65f0: 72 6e 20 2a 2f 0a 20 20 69 66 28 20 70 20 29 7b  rn */.  if( p ){
6600: 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  .    const int i
6610: 73 52 65 64 75 63 65 64 20 3d 20 28 66 6c 61 67  sReduced = (flag
6620: 73 26 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  s&EXPRDUP_REDUCE
6630: 29 3b 0a 20 20 20 20 75 38 20 2a 7a 41 6c 6c 6f  );.    u8 *zAllo
6640: 63 3b 0a 20 20 20 20 75 33 32 20 73 74 61 74 69  c;.    u32 stati
6650: 63 46 6c 61 67 20 3d 20 30 3b 0a 0a 20 20 20 20  cFlag = 0;..    
6660: 61 73 73 65 72 74 28 20 70 7a 42 75 66 66 65 72  assert( pzBuffer
6670: 3d 3d 30 20 7c 7c 20 69 73 52 65 64 75 63 65 64  ==0 || isReduced
6680: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75   );..    /* Figu
6690: 72 65 20 6f 75 74 20 77 68 65 72 65 20 74 6f 20  re out where to 
66a0: 77 72 69 74 65 20 74 68 65 20 6e 65 77 20 45 78  write the new Ex
66b0: 70 72 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f  pr structure. */
66c0: 0a 20 20 20 20 69 66 28 20 70 7a 42 75 66 66 65  .    if( pzBuffe
66d0: 72 20 29 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f  r ){.      zAllo
66e0: 63 20 3d 20 2a 70 7a 42 75 66 66 65 72 3b 0a 20  c = *pzBuffer;. 
66f0: 20 20 20 20 20 73 74 61 74 69 63 46 6c 61 67 20       staticFlag 
6700: 3d 20 45 50 5f 53 74 61 74 69 63 3b 0a 20 20 20  = EP_Static;.   
6710: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 41   }else{.      zA
6720: 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62  lloc = sqlite3Db
6730: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 64 75  MallocRaw(db, du
6740: 70 65 64 45 78 70 72 53 69 7a 65 28 70 2c 20 66  pedExprSize(p, f
6750: 6c 61 67 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20  lags));.    }.  
6760: 20 20 70 4e 65 77 20 3d 20 28 45 78 70 72 20 2a    pNew = (Expr *
6770: 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 20 20 69 66  )zAlloc;..    if
6780: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
6790: 2f 2a 20 53 65 74 20 6e 4e 65 77 53 69 7a 65 20  /* Set nNewSize 
67a0: 74 6f 20 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f  to the size allo
67b0: 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 74  cated for the st
67c0: 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20  ructure pointed 
67d0: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 70  to.      ** by p
67e0: 4e 65 77 2e 20 54 68 69 73 20 69 73 20 65 69 74  New. This is eit
67f0: 68 65 72 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a  her EXPR_FULLSIZ
6800: 45 2c 20 45 58 50 52 5f 52 45 44 55 43 45 44 53  E, EXPR_REDUCEDS
6810: 49 5a 45 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20  IZE or.      ** 
6820: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
6830: 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69 73 20 73 65  ZE. nToken is se
6840: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
6850: 6f 66 20 62 79 74 65 73 20 63 6f 6e 73 75 6d 65  of bytes consume
6860: 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 74 68  d.      ** by th
6870: 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 2d  e copy of the p-
6880: 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67  >u.zToken string
6890: 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 20   (if any)..     
68a0: 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
68b0: 75 6e 73 69 67 6e 65 64 20 6e 53 74 72 75 63 74  unsigned nStruct
68c0: 53 69 7a 65 20 3d 20 64 75 70 65 64 45 78 70 72  Size = dupedExpr
68d0: 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20 66 6c  StructSize(p, fl
68e0: 61 67 73 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73  ags);.      cons
68f0: 74 20 69 6e 74 20 6e 4e 65 77 53 69 7a 65 20 3d  t int nNewSize =
6900: 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20 30   nStructSize & 0
6910: 78 66 66 66 3b 0a 20 20 20 20 20 20 69 6e 74 20  xfff;.      int 
6920: 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 69 66  nToken;.      if
6930: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
6940: 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75  ty(p, EP_IntValu
6950: 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65  e) && p->u.zToke
6960: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 54 6f  n ){.        nTo
6970: 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ken = sqlite3Str
6980: 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65  len30(p->u.zToke
6990: 6e 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 7d 65  n) + 1;.      }e
69a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 54 6f  lse{.        nTo
69b0: 6b 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ken = 0;.      }
69c0: 0a 20 20 20 20 20 20 69 66 28 20 69 73 52 65 64  .      if( isRed
69d0: 75 63 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  uced ){.        
69e0: 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50  assert( ExprHasP
69f0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65  roperty(p, EP_Re
6a00: 64 75 63 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20  duced)==0 );.   
6a10: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c       memcpy(zAll
6a20: 6f 63 2c 20 70 2c 20 6e 4e 65 77 53 69 7a 65 29  oc, p, nNewSize)
6a30: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6a40: 20 20 20 20 20 20 20 69 6e 74 20 6e 53 69 7a 65         int nSize
6a50: 20 3d 20 65 78 70 72 53 74 72 75 63 74 53 69 7a   = exprStructSiz
6a60: 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  e(p);.        me
6a70: 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20  mcpy(zAlloc, p, 
6a80: 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  nSize);.        
6a90: 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e  memset(&zAlloc[n
6aa0: 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50 52 5f 46  Size], 0, EXPR_F
6ab0: 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a  ULLSIZE-nSize);.
6ac0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
6ad0: 2a 20 53 65 74 20 74 68 65 20 45 50 5f 52 65 64  * Set the EP_Red
6ae0: 75 63 65 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  uced, EP_TokenOn
6af0: 6c 79 2c 20 61 6e 64 20 45 50 5f 53 74 61 74 69  ly, and EP_Stati
6b00: 63 20 66 6c 61 67 73 20 61 70 70 72 6f 70 72 69  c flags appropri
6b10: 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20  ately. */.      
6b20: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 26 3d 20 7e  pNew->flags &= ~
6b30: 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54  (EP_Reduced|EP_T
6b40: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61 74  okenOnly|EP_Stat
6b50: 69 63 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ic);.      pNew-
6b60: 3e 66 6c 61 67 73 20 7c 3d 20 6e 53 74 72 75 63  >flags |= nStruc
6b70: 74 53 69 7a 65 20 26 20 28 45 50 5f 52 65 64 75  tSize & (EP_Redu
6b80: 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ced|EP_TokenOnly
6b90: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  );.      pNew->f
6ba0: 6c 61 67 73 20 7c 3d 20 73 74 61 74 69 63 46 6c  lags |= staticFl
6bb0: 61 67 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f  ag;..      /* Co
6bc0: 70 79 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b  py the p->u.zTok
6bd0: 65 6e 20 73 74 72 69 6e 67 2c 20 69 66 20 61 6e  en string, if an
6be0: 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  y. */.      if( 
6bf0: 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20  nToken ){.      
6c00: 20 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d    char *zToken =
6c10: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   pNew->u.zToken 
6c20: 3d 20 28 63 68 61 72 2a 29 26 7a 41 6c 6c 6f 63  = (char*)&zAlloc
6c30: 5b 6e 4e 65 77 53 69 7a 65 5d 3b 0a 20 20 20 20  [nNewSize];.    
6c40: 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 6f 6b 65      memcpy(zToke
6c50: 6e 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  n, p->u.zToken, 
6c60: 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d  nToken);.      }
6c70: 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  ..      if( 0==(
6c80: 28 70 2d 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e  (p->flags|pNew->
6c90: 66 6c 61 67 73 29 20 26 20 45 50 5f 54 6f 6b 65  flags) & EP_Toke
6ca0: 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  nOnly) ){.      
6cb0: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
6cc0: 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74   pNew->x.pSelect
6cd0: 20 6f 72 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73   or pNew->x.pLis
6ce0: 74 20 6d 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20  t member. */.   
6cf0: 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
6d00: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
6d10: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
6d20: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70         pNew->x.p
6d30: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
6d40: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d  SelectDup(db, p-
6d50: 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69 73 52 65  >x.pSelect, isRe
6d60: 64 75 63 65 64 29 3b 0a 20 20 20 20 20 20 20 20  duced);.        
6d70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
6d80: 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d   pNew->x.pList =
6d90: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
6da0: 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69  Dup(db, p->x.pLi
6db0: 73 74 2c 20 69 73 52 65 64 75 63 65 64 29 3b 0a  st, isReduced);.
6dc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6dd0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c  }..      /* Fill
6de0: 20 69 6e 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20   in pNew->pLeft 
6df0: 61 6e 64 20 70 4e 65 77 2d 3e 70 52 69 67 68 74  and pNew->pRight
6e00: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45  . */.      if( E
6e10: 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
6e20: 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75 63  y(pNew, EP_Reduc
6e30: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  ed|EP_TokenOnly)
6e40: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 41 6c 6c   ){.        zAll
6e50: 6f 63 20 2b 3d 20 64 75 70 65 64 45 78 70 72 4e  oc += dupedExprN
6e60: 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  odeSize(p, flags
6e70: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 45  );.        if( E
6e80: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
6e90: 4e 65 77 2c 20 45 50 5f 52 65 64 75 63 65 64 29  New, EP_Reduced)
6ea0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
6eb0: 65 77 2d 3e 70 4c 65 66 74 20 3d 20 65 78 70 72  ew->pLeft = expr
6ec0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74  Dup(db, p->pLeft
6ed0: 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
6ee0: 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20 20  , &zAlloc);.    
6ef0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67        pNew->pRig
6f00: 68 74 20 3d 20 65 78 70 72 44 75 70 28 64 62 2c  ht = exprDup(db,
6f10: 20 70 2d 3e 70 52 69 67 68 74 2c 20 45 58 50 52   p->pRight, EXPR
6f20: 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c  DUP_REDUCE, &zAl
6f30: 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  loc);.        }.
6f40: 20 20 20 20 20 20 20 20 69 66 28 20 70 7a 42 75          if( pzBu
6f50: 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ffer ){.        
6f60: 20 20 2a 70 7a 42 75 66 66 65 72 20 3d 20 7a 41    *pzBuffer = zA
6f70: 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lloc;.        }.
6f80: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6f90: 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73       pNew->flags
6fa0: 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  2 = 0;.        i
6fb0: 66 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72  f( !ExprHasAnyPr
6fc0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
6fd0: 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  enOnly) ){.     
6fe0: 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74       pNew->pLeft
6ff0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
7000: 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20  p(db, p->pLeft, 
7010: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  0);.          pN
7020: 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c  ew->pRight = sql
7030: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
7040: 70 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20  p->pRight, 0);. 
7050: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7060: 0a 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ..    }.  }.  re
7070: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
7080: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
7090: 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69  g group of routi
70a0: 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f  nes make deep co
70b0: 70 69 65 73 20 6f 66 20 65 78 70 72 65 73 73 69  pies of expressi
70c0: 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69  ons,.** expressi
70d0: 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73  on lists, ID lis
70e0: 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73  ts, and select s
70f0: 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20  tatements.  The 
7100: 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65  copies can.** be
7110: 20 64 65 6c 65 74 65 64 20 28 62 79 20 62 65 69   deleted (by bei
7120: 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  ng passed to the
7130: 69 72 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e  ir respective ..
7140: 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e  .Delete() routin
7150: 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65  es).** without e
7160: 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69  ffecting the ori
7170: 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ginals..**.** Th
7180: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
7190: 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63  t, ID, and sourc
71a0: 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62  e lists return b
71b0: 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  y sqlite3ExprLis
71c0: 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74  tDup(),.** sqlit
71d0: 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61  e3IdListDup(), a
71e0: 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  nd sqlite3SrcLis
71f0: 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62  tDup() can not b
7200: 65 20 66 75 72 74 68 65 72 20 65 78 70 61 6e 64  e further expand
7210: 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71  ed .** by subseq
7220: 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71  uent calls to sq
7230: 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28  lite*ListAppend(
7240: 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a  ) routines..**.*
7250: 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61  * Any tables tha
7260: 74 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69  t the SrcList mi
7270: 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65  ght point to are
7280: 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e   not duplicated.
7290: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73  .**.** The flags
72a0: 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61   parameter conta
72b0: 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f  ins a combinatio
72c0: 6e 20 6f 66 20 74 68 65 20 45 58 50 52 44 55 50  n of the EXPRDUP
72d0: 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20 49  _XXX flags..** I
72e0: 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52 45  f the EXPRDUP_RE
72f0: 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65 74  DUCE flag is set
7300: 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72 75 63  , then the struc
7310: 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 69 73  ture returned is
7320: 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64 20   a.** truncated 
7330: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 75  version of the u
7340: 73 75 61 6c 20 45 78 70 72 20 73 74 72 75 63 74  sual Expr struct
7350: 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ure that will be
7360: 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70 61   stored as.** pa
7370: 72 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d  rt of the in-mem
7380: 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
7390: 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  on of the databa
73a0: 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78  se schema..*/.Ex
73b0: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44  pr *sqlite3ExprD
73c0: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
73d0: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61  Expr *p, int fla
73e0: 67 73 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  gs){.  return ex
73f0: 70 72 44 75 70 28 64 62 2c 20 70 2c 20 66 6c 61  prDup(db, p, fla
7400: 67 73 2c 20 30 29 3b 0a 7d 0a 45 78 70 72 4c 69  gs, 0);.}.ExprLi
7410: 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c  st *sqlite3ExprL
7420: 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  istDup(sqlite3 *
7430: 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 2c  db, ExprList *p,
7440: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 45   int flags){.  E
7450: 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  xprList *pNew;. 
7460: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
7470: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70  _item *pItem, *p
7480: 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69  OldItem;.  int i
7490: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
74a0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
74b0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
74c0: 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
74d0: 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20  *pNew) );.  if( 
74e0: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
74f0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 45 43 75   0;.  pNew->iECu
7500: 72 73 6f 72 20 3d 20 30 3b 0a 20 20 70 4e 65 77  rsor = 0;.  pNew
7510: 2d 3e 6e 45 78 70 72 20 3d 20 69 20 3d 20 70 2d  ->nExpr = i = p-
7520: 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 28 66  >nExpr;.  if( (f
7530: 6c 61 67 73 20 26 20 45 58 50 52 44 55 50 5f 52  lags & EXPRDUP_R
7540: 45 44 55 43 45 29 3d 3d 30 20 29 20 66 6f 72 28  EDUCE)==0 ) for(
7550: 69 3d 31 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=1; i<p->nExpr;
7560: 20 69 2b 3d 69 29 7b 7d 0a 20 20 70 4e 65 77 2d   i+=i){}.  pNew-
7570: 3e 61 20 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c  >a = pItem = sql
7580: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
7590: 64 62 2c 20 20 69 2a 73 69 7a 65 6f 66 28 70 2d  db,  i*sizeof(p-
75a0: 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  >a[0]) );.  if( 
75b0: 70 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  pItem==0 ){.    
75c0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
75d0: 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74  , pNew);.    ret
75e0: 75 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f  urn 0;.  } .  pO
75f0: 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20  ldItem = p->a;. 
7600: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
7610: 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
7620: 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b  ++, pOldItem++){
7630: 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 6c 64 45  .    Expr *pOldE
7640: 78 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  xpr = pOldItem->
7650: 70 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d  pExpr;.    pItem
7660: 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  ->pExpr = sqlite
7670: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c  3ExprDup(db, pOl
7680: 64 45 78 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20  dExpr, flags);. 
7690: 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20     pItem->zName 
76a0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
76b0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
76c0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65  zName);.    pIte
76d0: 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74  m->zSpan = sqlit
76e0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
76f0: 4f 6c 64 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b  OldItem->zSpan);
7700: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74  .    pItem->sort
7710: 4f 72 64 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d  Order = pOldItem
7720: 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ->sortOrder;.   
7730: 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30   pItem->done = 0
7740: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69 4f 72  ;.    pItem->iOr
7750: 64 65 72 42 79 43 6f 6c 20 3d 20 70 4f 6c 64 49  derByCol = pOldI
7760: 74 65 6d 2d 3e 69 4f 72 64 65 72 42 79 43 6f 6c  tem->iOrderByCol
7770: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c  ;.    pItem->iAl
7780: 69 61 73 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  ias = pOldItem->
7790: 69 41 6c 69 61 73 3b 0a 20 20 7d 0a 20 20 72 65  iAlias;.  }.  re
77a0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
77b0: 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 73 2c 20  .** If cursors, 
77c0: 74 72 69 67 67 65 72 73 2c 20 76 69 65 77 73 20  triggers, views 
77d0: 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 61  and subqueries a
77e0: 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66  re all omitted f
77f0: 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64  rom.** the build
7800: 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74  , then none of t
7810: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
7820: 74 69 6e 65 73 2c 20 65 78 63 65 70 74 20 66 6f  tines, except fo
7830: 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c  r .** sqlite3Sel
7840: 65 63 74 44 75 70 28 29 2c 20 63 61 6e 20 62 65  ectDup(), can be
7850: 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33   called. sqlite3
7860: 53 65 6c 65 63 74 44 75 70 28 29 20 69 73 20 73  SelectDup() is s
7870: 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c  ometimes.** call
7880: 65 64 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 61  ed with a NULL a
7890: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20  rgument..*/.#if 
78a0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
78b0: 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
78c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
78d0: 49 54 5f 54 52 49 47 47 45 52 29 20 5c 0a 20 7c  IT_TRIGGER) \. |
78e0: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
78f0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
7900: 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65  .SrcList *sqlite
7910: 33 53 72 63 4c 69 73 74 44 75 70 28 73 71 6c 69  3SrcListDup(sqli
7920: 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74  te3 *db, SrcList
7930: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
7940: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77  .  SrcList *pNew
7950: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
7960: 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70 3d   nByte;.  if( p=
7970: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
7980: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
7990: 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30  *p) + (p->nSrc>0
79a0: 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30   ? sizeof(p->a[0
79b0: 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29  ]) * (p->nSrc-1)
79c0: 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20   : 0);.  pNew = 
79d0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
79e0: 61 77 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a  aw(db, nByte );.
79f0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
7a00: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
7a10: 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e  ->nSrc = pNew->n
7a20: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b  Alloc = p->nSrc;
7a30: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
7a40: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
7a50: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
7a60: 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d  item *pNewItem =
7a70: 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20   &pNew->a[i];.  
7a80: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
7a90: 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20  _item *pOldItem 
7aa0: 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  = &p->a[i];.    
7ab0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
7ac0: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 63 68 65   pNewItem->pSche
7ad0: 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  ma = pOldItem->p
7ae0: 53 63 68 65 6d 61 3b 0a 20 20 20 20 70 4e 65 77  Schema;.    pNew
7af0: 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  Item->zDatabase 
7b00: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
7b10: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
7b20: 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
7b30: 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  pNewItem->zName 
7b40: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
7b50: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
7b60: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77  zName);.    pNew
7b70: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73  Item->zAlias = s
7b80: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
7b90: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c  b, pOldItem->zAl
7ba0: 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ias);.    pNewIt
7bb0: 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 3d 20 70  em->jointype = p
7bc0: 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  OldItem->jointyp
7bd0: 65 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  e;.    pNewItem-
7be0: 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49  >iCursor = pOldI
7bf0: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
7c00: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 61 64 64 72    pNewItem->addr
7c10: 46 69 6c 6c 53 75 62 20 3d 20 70 4f 6c 64 49 74  FillSub = pOldIt
7c20: 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3b  em->addrFillSub;
7c30: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 72  .    pNewItem->r
7c40: 65 67 52 65 74 75 72 6e 20 3d 20 70 4f 6c 64 49  egReturn = pOldI
7c50: 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a  tem->regReturn;.
7c60: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73      pNewItem->is
7c70: 43 6f 72 72 65 6c 61 74 65 64 20 3d 20 70 4f 6c  Correlated = pOl
7c80: 64 49 74 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61  dItem->isCorrela
7c90: 74 65 64 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ted;.    pNewIte
7ca0: 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  m->viaCoroutine 
7cb0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 76 69 61 43  = pOldItem->viaC
7cc0: 6f 72 6f 75 74 69 6e 65 3b 0a 20 20 20 20 70 4e  oroutine;.    pN
7cd0: 65 77 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 3d  ewItem->zIndex =
7ce0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
7cf0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
7d00: 49 6e 64 65 78 29 3b 0a 20 20 20 20 70 4e 65 77  Index);.    pNew
7d10: 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64  Item->notIndexed
7d20: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6e 6f 74   = pOldItem->not
7d30: 49 6e 64 65 78 65 64 3b 0a 20 20 20 20 70 4e 65  Indexed;.    pNe
7d40: 77 49 74 65 6d 2d 3e 70 49 6e 64 65 78 20 3d 20  wItem->pIndex = 
7d50: 70 4f 6c 64 49 74 65 6d 2d 3e 70 49 6e 64 65 78  pOldItem->pIndex
7d60: 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65  ;.    pTab = pNe
7d70: 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f  wItem->pTab = pO
7d80: 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  ldItem->pTab;.  
7d90: 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
7da0: 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b      pTab->nRef++
7db0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
7dc0: 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  Item->pSelect = 
7dd0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
7de0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  (db, pOldItem->p
7df0: 53 65 6c 65 63 74 2c 20 66 6c 61 67 73 29 3b 0a  Select, flags);.
7e00: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f      pNewItem->pO
7e10: 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  n = sqlite3ExprD
7e20: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
7e30: 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20  >pOn, flags);.  
7e40: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69    pNewItem->pUsi
7e50: 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69  ng = sqlite3IdLi
7e60: 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  stDup(db, pOldIt
7e70: 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20  em->pUsing);.   
7e80: 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73   pNewItem->colUs
7e90: 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63  ed = pOldItem->c
7ea0: 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65  olUsed;.  }.  re
7eb0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c  turn pNew;.}.IdL
7ec0: 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69  ist *sqlite3IdLi
7ed0: 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  stDup(sqlite3 *d
7ee0: 62 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20  b, IdList *p){. 
7ef0: 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20   IdList *pNew;. 
7f00: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d   int i;.  if( p=
7f10: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
7f20: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
7f30: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
7f40: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a  izeof(*pNew) );.
7f50: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
7f60: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
7f70: 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49 64 3b 0a  ->nId = p->nId;.
7f80: 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69    pNew->a = sqli
7f90: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
7fa0: 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66  b, p->nId*sizeof
7fb0: 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69  (p->a[0]) );.  i
7fc0: 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b  f( pNew->a==0 ){
7fd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
7fe0: 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20  ee(db, pNew);.  
7ff0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
8000: 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20 62    /* Note that b
8010: 65 63 61 75 73 65 20 74 68 65 20 73 69 7a 65 20  ecause the size 
8020: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  of the allocatio
8030: 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d 20 69 73 20  n for p->a[] is 
8040: 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73 73 61  not.  ** necessa
8050: 72 69 6c 79 20 61 20 70 6f 77 65 72 20 6f 66 20  rily a power of 
8060: 74 77 6f 2c 20 73 71 6c 69 74 65 33 49 64 4c 69  two, sqlite3IdLi
8070: 73 74 41 70 70 65 6e 64 28 29 20 6d 61 79 20 6e  stAppend() may n
8080: 6f 74 20 62 65 20 63 61 6c 6c 65 64 0a 20 20 2a  ot be called.  *
8090: 2a 20 6f 6e 20 74 68 65 20 64 75 70 6c 69 63 61  * on the duplica
80a0: 74 65 20 63 72 65 61 74 65 64 20 62 79 20 74 68  te created by th
80b0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a  is function. */.
80c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
80d0: 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nId; i++){.    s
80e0: 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65  truct IdList_ite
80f0: 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70  m *pNewItem = &p
8100: 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  New->a[i];.    s
8110: 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65  truct IdList_ite
8120: 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70  m *pOldItem = &p
8130: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77  ->a[i];.    pNew
8140: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
8150: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
8160: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  , pOldItem->zNam
8170: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
8180: 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d  ->idx = pOldItem
8190: 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74  ->idx;.  }.  ret
81a0: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65  urn pNew;.}.Sele
81b0: 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63  ct *sqlite3Selec
81c0: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
81d0: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
81e0: 20 66 6c 61 67 73 29 7b 0a 20 20 53 65 6c 65 63   flags){.  Selec
81f0: 74 20 2a 70 4e 65 77 2c 20 2a 70 50 72 69 6f 72  t *pNew, *pPrior
8200: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
8210: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
8220: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
8230: 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
8240: 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  *p) );.  if( pNe
8250: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
8260: 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20  .  pNew->pEList 
8270: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
8280: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69  tDup(db, p->pELi
8290: 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  st, flags);.  pN
82a0: 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74  ew->pSrc = sqlit
82b0: 65 33 53 72 63 4c 69 73 74 44 75 70 28 64 62 2c  e3SrcListDup(db,
82c0: 20 70 2d 3e 70 53 72 63 2c 20 66 6c 61 67 73 29   p->pSrc, flags)
82d0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65  ;.  pNew->pWhere
82e0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
82f0: 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c  p(db, p->pWhere,
8300: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
8310: 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
8320: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
8330: 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20  b, p->pGroupBy, 
8340: 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e  flags);.  pNew->
8350: 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
8360: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
8370: 70 48 61 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b  pHaving, flags);
8380: 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
8390: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
83a0: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f  istDup(db, p->pO
83b0: 72 64 65 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a  rderBy, flags);.
83c0: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e    pNew->op = p->
83d0: 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69  op;.  pNew->pPri
83e0: 6f 72 20 3d 20 70 50 72 69 6f 72 20 3d 20 73 71  or = pPrior = sq
83f0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
8400: 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 66 6c  b, p->pPrior, fl
8410: 61 67 73 29 3b 0a 20 20 69 66 28 20 70 50 72 69  ags);.  if( pPri
8420: 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65  or ) pPrior->pNe
8430: 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65  xt = pNew;.  pNe
8440: 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  w->pNext = 0;.  
8450: 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73  pNew->pLimit = s
8460: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
8470: 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61  , p->pLimit, fla
8480: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66  gs);.  pNew->pOf
8490: 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  fset = sqlite3Ex
84a0: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66  prDup(db, p->pOf
84b0: 66 73 65 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  fset, flags);.  
84c0: 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30  pNew->iLimit = 0
84d0: 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65  ;.  pNew->iOffse
84e0: 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 73  t = 0;.  pNew->s
84f0: 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c  elFlags = p->sel
8500: 46 6c 61 67 73 20 26 20 7e 53 46 5f 55 73 65 73  Flags & ~SF_Uses
8510: 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 70 4e 65  Ephemeral;.  pNe
8520: 77 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20  w->pRightmost = 
8530: 30 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  0;.  pNew->addrO
8540: 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b  penEphm[0] = -1;
8550: 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65  .  pNew->addrOpe
8560: 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20  nEphm[1] = -1;. 
8570: 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45   pNew->addrOpenE
8580: 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 72  phm[2] = -1;.  r
8590: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65  eturn pNew;.}.#e
85a0: 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  lse.Select *sqli
85b0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c  te3SelectDup(sql
85c0: 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74  ite3 *db, Select
85d0: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
85e0: 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
85f0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
8600: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
8610: 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
8620: 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  t to the end of 
8630: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
8640: 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73  st.  If pList is
8650: 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55  .** initially NU
8660: 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  LL, then create 
8670: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
8680: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   list..**.** If 
8690: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
86a0: 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ion error occurs
86b0: 2c 20 74 68 65 20 65 6e 74 69 72 65 20 6c 69 73  , the entire lis
86c0: 74 20 69 73 20 66 72 65 65 64 20 61 6e 64 0a 2a  t is freed and.*
86d0: 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  * NULL is return
86e0: 65 64 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c  ed.  If non-NULL
86f0: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
8700: 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  en it is guarant
8710: 65 65 64 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  eed.** that the 
8720: 6e 65 77 20 65 6e 74 72 79 20 77 61 73 20 73 75  new entry was su
8730: 63 63 65 73 73 66 75 6c 6c 79 20 61 70 70 65 6e  ccessfully appen
8740: 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74  ded..*/.ExprList
8750: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   *sqlite3ExprLis
8760: 74 41 70 70 65 6e 64 28 0a 20 20 50 61 72 73 65  tAppend(.  Parse
8770: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
8780: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
8790: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
87a0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
87b0: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
87c0: 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d  ich to append. M
87d0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
87e0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20    Expr *pExpr   
87f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
8800: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70  ression to be ap
8810: 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65  pended. Might be
8820: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71   NULL */.){.  sq
8830: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
8840: 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 4c  se->db;.  if( pL
8850: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
8860: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ist = sqlite3DbM
8870: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
8880: 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29  zeof(ExprList) )
8890: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
88a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
88b0: 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20   no_mem;.    }. 
88c0: 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71     pList->a = sq
88d0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
88e0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73  (db, sizeof(pLis
88f0: 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69  t->a[0]));.    i
8900: 66 28 20 70 4c 69 73 74 2d 3e 61 3d 3d 30 20 29  f( pList->a==0 )
8910: 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
8920: 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 69 73 74  }else if( (pList
8930: 2d 3e 6e 45 78 70 72 20 26 20 28 70 4c 69 73 74  ->nExpr & (pList
8940: 2d 3e 6e 45 78 70 72 2d 31 29 29 3d 3d 30 20 29  ->nExpr-1))==0 )
8950: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
8960: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20  rList_item *a;. 
8970: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
8980: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
8990: 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65   a = sqlite3DbRe
89a0: 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74 2d  alloc(db, pList-
89b0: 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  >a, pList->nExpr
89c0: 2a 32 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  *2*sizeof(pList-
89d0: 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28  >a[0]));.    if(
89e0: 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67   a==0 ){.      g
89f0: 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20  oto no_mem;.    
8a00: 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d  }.    pList->a =
8a10: 20 61 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   a;.  }.  assert
8a20: 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b  ( pList->a!=0 );
8a30: 0a 20 20 69 66 28 20 31 20 29 7b 0a 20 20 20 20  .  if( 1 ){.    
8a40: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
8a50: 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
8a60: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
8a70: 45 78 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d  Expr++];.    mem
8a80: 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20 73 69  set(pItem, 0, si
8a90: 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b 0a 20  zeof(*pItem));. 
8aa0: 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
8ab0: 3d 20 70 45 78 70 72 3b 0a 20 20 7d 0a 20 20 72  = pExpr;.  }.  r
8ac0: 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f  eturn pList;..no
8ad0: 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20  _mem:     .  /* 
8ae0: 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65  Avoid leaking me
8af0: 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68  mory if malloc h
8b00: 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20  as failed. */.  
8b10: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
8b20: 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20  e(db, pExpr);.  
8b30: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
8b40: 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29  elete(db, pList)
8b50: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
8b60: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45  ./*.** Set the E
8b70: 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d  xprList.a[].zNam
8b80: 65 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  e element of the
8b90: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
8ba0: 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20  dded item.** on 
8bb0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
8bc0: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74  ist..**.** pList
8bd0: 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66   might be NULL f
8be0: 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20  ollowing an OOM 
8bf0: 65 72 72 6f 72 2e 20 20 42 75 74 20 70 4e 61 6d  error.  But pNam
8c00: 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  e should never b
8c10: 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61  e.** NULL.  If a
8c20: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
8c30: 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50  on fails, the pP
8c40: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
8c50: 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69  Failed flag.** i
8c60: 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  s set..*/.void s
8c70: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
8c80: 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a  tName(.  Parse *
8c90: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
8ca0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
8cb0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
8cc0: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
8cd0: 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63   /* List to whic
8ce0: 68 20 74 6f 20 61 64 64 20 74 68 65 20 73 70 61  h to add the spa
8cf0: 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  n. */.  Token *p
8d00: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Name,           
8d10: 2f 2a 20 4e 61 6d 65 20 74 6f 20 62 65 20 61 64  /* Name to be ad
8d20: 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71  ded */.  int deq
8d30: 75 6f 74 65 20 20 20 20 20 20 20 20 20 20 20 20  uote            
8d40: 20 2f 2a 20 54 72 75 65 20 74 6f 20 63 61 75 73   /* True to caus
8d50: 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 20 62 65  e the name to be
8d60: 20 64 65 71 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a   dequoted */.){.
8d70: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
8d80: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  =0 || pParse->db
8d90: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d  ->mallocFailed!=
8da0: 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  0 );.  if( pList
8db0: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
8dc0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
8dd0: 74 65 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  tem;.    assert(
8de0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20   pList->nExpr>0 
8df0: 29 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d 20 26  );.    pItem = &
8e00: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
8e10: 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73  nExpr-1];.    as
8e20: 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61  sert( pItem->zNa
8e30: 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74  me==0 );.    pIt
8e40: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
8e50: 74 65 33 44 62 53 74 72 4e 44 75 70 28 70 50 61  te3DbStrNDup(pPa
8e60: 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e  rse->db, pName->
8e70: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
8e80: 20 20 69 66 28 20 64 65 71 75 6f 74 65 20 26 26    if( dequote &&
8e90: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 20   pItem->zName ) 
8ea0: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70  sqlite3Dequote(p
8eb0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
8ec0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
8ed0: 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e  he ExprList.a[].
8ee0: 7a 53 70 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66  zSpan element of
8ef0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
8f00: 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a  ly added item.**
8f10: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
8f20: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70  on list..**.** p
8f30: 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55  List might be NU
8f40: 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20  LL following an 
8f50: 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20  OOM error.  But 
8f60: 70 53 70 61 6e 20 73 68 6f 75 6c 64 20 6e 65 76  pSpan should nev
8f70: 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20  er be.** NULL.  
8f80: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
8f90: 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68  cation fails, th
8fa0: 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  e pParse->db->ma
8fb0: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a  llocFailed flag.
8fc0: 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f  ** is set..*/.vo
8fd0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
8fe0: 73 74 53 65 74 53 70 61 6e 28 0a 20 20 50 61 72  stSetSpan(.  Par
8ff0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
9000: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
9010: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
9020: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
9030: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
9040: 77 68 69 63 68 20 74 6f 20 61 64 64 20 74 68 65  which to add the
9050: 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 45 78 70 72   span. */.  Expr
9060: 53 70 61 6e 20 2a 70 53 70 61 6e 20 20 20 20 20  Span *pSpan     
9070: 20 20 20 20 2f 2a 20 54 68 65 20 73 70 61 6e 20      /* The span 
9080: 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 29  to be added */.)
9090: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
90a0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
90b0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
90c0: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
90d0: 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28  iled!=0 );.  if(
90e0: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74   pList ){.    st
90f0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
9100: 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69  em *pItem = &pLi
9110: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78  st->a[pList->nEx
9120: 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72  pr-1];.    asser
9130: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  t( pList->nExpr>
9140: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
9150: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
9160: 64 20 7c 7c 20 70 49 74 65 6d 2d 3e 70 45 78 70  d || pItem->pExp
9170: 72 3d 3d 70 53 70 61 6e 2d 3e 70 45 78 70 72 20  r==pSpan->pExpr 
9180: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
9190: 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
91a0: 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65  zSpan);.    pIte
91b0: 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74  m->zSpan = sqlit
91c0: 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
91d0: 28 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53  (char*)pSpan->zS
91e0: 74 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20  tart,.          
91f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9200: 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28            (int)(
9210: 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53  pSpan->zEnd - pS
9220: 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20  pan->zStart));. 
9230: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74   }.}../*.** If t
9240: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
9250: 73 74 20 70 45 4c 69 73 74 20 63 6f 6e 74 61 69  st pEList contai
9260: 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69  ns more than iLi
9270: 6d 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a  mit elements,.**
9280: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
9290: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
92a0: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
92b0: 65 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c  e3ExprListCheckL
92c0: 65 6e 67 74 68 28 0a 20 20 50 61 72 73 65 20 2a  ength(.  Parse *
92d0: 70 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69  pParse,.  ExprLi
92e0: 73 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f  st *pEList,.  co
92f0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63  nst char *zObjec
9300: 74 0a 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20  t.){.  int mx = 
9310: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d  pParse->db->aLim
9320: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
9330: 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63  COLUMN];.  testc
9340: 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70  ase( pEList && p
9350: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78  EList->nExpr==mx
9360: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
9370: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
9380: 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b  ->nExpr==mx+1 );
9390: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26  .  if( pEList &&
93a0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d   pEList->nExpr>m
93b0: 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  x ){.    sqlite3
93c0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
93d0: 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d   "too many colum
93e0: 6e 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65  ns in %s", zObje
93f0: 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ct);.  }.}../*.*
9400: 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
9410: 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  re expression li
9420: 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
9430: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
9440: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  e(sqlite3 *db, E
9450: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
9460: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
9470: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
9480: 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70   *pItem;.  if( p
9490: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
94a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
94b0: 74 2d 3e 61 21 3d 30 20 7c 7c 20 70 4c 69 73 74  t->a!=0 || pList
94c0: 2d 3e 6e 45 78 70 72 3d 3d 30 20 29 3b 0a 20 20  ->nExpr==0 );.  
94d0: 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
94e0: 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74  >a, i=0; i<pList
94f0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  ->nExpr; i++, pI
9500: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  tem++){.    sqli
9510: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
9520: 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
9530: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
9540: 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e  ee(db, pItem->zN
9550: 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
9560: 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
9570: 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 7d 0a 20  m->zSpan);.  }. 
9580: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
9590: 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20  b, pList->a);.  
95a0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
95b0: 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  , pList);.}../*.
95c0: 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
95d0: 73 20 61 72 65 20 57 61 6c 6b 65 72 20 63 61 6c  s are Walker cal
95e0: 6c 62 61 63 6b 73 2e 20 20 57 61 6c 6b 65 72 2e  lbacks.  Walker.
95f0: 75 2e 70 69 20 69 73 20 61 20 70 6f 69 6e 74 65  u.pi is a pointe
9600: 72 0a 2a 2a 20 74 6f 20 61 6e 20 69 6e 74 65 67  r.** to an integ
9610: 65 72 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69  er.  These routi
9620: 6e 65 73 20 61 72 65 20 63 68 65 63 6b 69 6e 67  nes are checking
9630: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
9640: 6f 20 73 65 65 0a 2a 2a 20 69 66 20 69 74 20 69  o see.** if it i
9650: 73 20 61 20 63 6f 6e 73 74 61 6e 74 2e 20 20 53  s a constant.  S
9660: 65 74 20 2a 57 61 6c 6b 65 72 2e 75 2e 70 69 20  et *Walker.u.pi 
9670: 74 6f 20 30 20 69 66 20 74 68 65 20 65 78 70 72  to 0 if the expr
9680: 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 6e 6f 74  ession is.** not
9690: 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a   constant..**.**
96a0: 20 54 68 65 73 65 20 63 61 6c 6c 62 61 63 6b 20   These callback 
96b0: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
96c0: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
96d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
96e0: 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45  .**     sqlite3E
96f0: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 0a  xprIsConstant().
9700: 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  **     sqlite3Ex
9710: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a  prIsConstantNotJ
9720: 6f 69 6e 28 29 0a 2a 2a 20 20 20 20 20 73 71 6c  oin().**     sql
9730: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
9740: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 0a 2a  ntOrFunction().*
9750: 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  *.*/.static int 
9760: 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
9770: 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  nt(Walker *pWalk
9780: 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
9790: 7b 0a 0a 20 20 2f 2a 20 49 66 20 70 57 61 6c 6b  {..  /* If pWalk
97a0: 65 72 2d 3e 75 2e 69 20 69 73 20 33 20 74 68 65  er->u.i is 3 the
97b0: 6e 20 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68  n any term of th
97c0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
97d0: 74 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a  t comes from.  *
97e0: 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  * the ON or USIN
97f0: 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a  G clauses of a j
9800: 6f 69 6e 20 64 69 73 71 75 61 6c 69 66 69 65 73  oin disqualifies
9810: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
9820: 20 20 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20    ** from being 
9830: 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 6e 73 74  considered const
9840: 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57  ant. */.  if( pW
9850: 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 33 20 26 26  alker->u.i==3 &&
9860: 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65   ExprHasAnyPrope
9870: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
9880: 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70  omJoin) ){.    p
9890: 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b  Walker->u.i = 0;
98a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
98b0: 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77  Abort;.  }..  sw
98c0: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
98d0: 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64  ){.    /* Consid
98e0: 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  er functions to 
98f0: 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61  be constant if a
9900: 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e  ll their argumen
9910: 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a  ts are constant.
9920: 20 20 20 20 2a 2a 20 61 6e 64 20 70 57 61 6c 6b      ** and pWalk
9930: 65 72 2d 3e 75 2e 69 3d 3d 32 20 2a 2f 0a 20 20  er->u.i==2 */.  
9940: 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
9950: 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57  ON:.      if( pW
9960: 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 32 20 29 20  alker->u.i==2 ) 
9970: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
9980: 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20  /* Fall through 
9990: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  */.    case TK_I
99a0: 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  D:.    case TK_C
99b0: 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20  OLUMN:.    case 
99c0: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
99d0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
99e0: 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 74  _COLUMN:.      t
99f0: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
9a00: 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20  op==TK_ID );.   
9a10: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
9a20: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
9a30: 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
9a40: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
9a50: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
9a60: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
9a70: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
9a80: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _AGG_COLUMN );. 
9a90: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e       pWalker->u.
9aa0: 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  i = 0;.      ret
9ab0: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
9ac0: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
9ad0: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
9ae0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
9af0: 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64   ); /* selectNod
9b00: 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c  eIsConstant will
9b10: 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20   disallow */.   
9b20: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
9b30: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54  pr->op==TK_EXIST
9b40: 53 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f  S ); /* selectNo
9b50: 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c  deIsConstant wil
9b60: 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20  l disallow */.  
9b70: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
9b80: 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73  ontinue;.  }.}.s
9b90: 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74  tatic int select
9ba0: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57  NodeIsConstant(W
9bb0: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
9bc0: 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 29  Select *NotUsed)
9bd0: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
9be0: 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
9bf0: 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20   pWalker->u.i = 
9c00: 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  0;.  return WRC_
9c10: 41 62 6f 72 74 3b 0a 7d 0a 73 74 61 74 69 63 20  Abort;.}.static 
9c20: 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74 28  int exprIsConst(
9c30: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e 69  Expr *p, int ini
9c40: 74 46 6c 61 67 29 7b 0a 20 20 57 61 6c 6b 65 72  tFlag){.  Walker
9c50: 20 77 3b 0a 20 20 77 2e 75 2e 69 20 3d 20 69 6e   w;.  w.u.i = in
9c60: 69 74 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70  itFlag;.  w.xExp
9c70: 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
9c80: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a  NodeIsConstant;.
9c90: 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
9ca0: 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65  ack = selectNode
9cb0: 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 73 71  IsConstant;.  sq
9cc0: 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
9cd0: 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77  , p);.  return w
9ce0: 2e 75 2e 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  .u.i;.}../*.** W
9cf0: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
9d00: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
9d10: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
9d20: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
9d30: 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20 69  ** and 0 if it i
9d40: 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65  nvolves variable
9d50: 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61  s or function ca
9d60: 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  lls..**.** For t
9d70: 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
9d80: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
9d90: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  double-quoted st
9da0: 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29  ring (ex: "abc")
9db0: 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
9dc0: 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74  d a variable but
9dd0: 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64   a single-quoted
9de0: 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62   string (ex: 'ab
9df0: 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73  c') is.** a cons
9e00: 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tant..*/.int sql
9e10: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
9e20: 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72  nt(Expr *p){.  r
9e30: 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73  eturn exprIsCons
9e40: 74 28 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  t(p, 1);.}../*.*
9e50: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
9e60: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
9e70: 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72  rn 1 if the expr
9e80: 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
9e90: 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73 20  nt.** that does 
9ea0: 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20 66 72 6f  no originate fro
9eb0: 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  m the ON or USIN
9ec0: 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a  G clauses of a j
9ed0: 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30  oin..** Return 0
9ee0: 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20   if it involves 
9ef0: 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e  variables or fun
9f00: 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74  ction calls or t
9f10: 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20  erms from.** an 
9f20: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
9f30: 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
9f40: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
9f50: 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29  NotJoin(Expr *p)
9f60: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  {.  return exprI
9f70: 73 43 6f 6e 73 74 28 70 2c 20 33 29 3b 0a 7d 0a  sConst(p, 3);.}.
9f80: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
9f90: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
9fa0: 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
9fb0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
9fc0: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20  onstant.** or a 
9fd0: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69  function call wi
9fe0: 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75  th constant argu
9ff0: 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61  ments.  Return a
a000: 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a  nd 0 if there.**
a010: 20 61 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c   are any variabl
a020: 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  es..**.** For th
a030: 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
a040: 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64  is function, a d
a050: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
a060: 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a  ing (ex: "abc").
a070: 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
a080: 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20   a variable but 
a090: 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20  a single-quoted 
a0a0: 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63  string (ex: 'abc
a0b0: 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74  ') is.** a const
a0c0: 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ant..*/.int sqli
a0d0: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
a0e0: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72  tOrFunction(Expr
a0f0: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65   *p){.  return e
a100: 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 32 29  xprIsConst(p, 2)
a110: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
a120: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63  e expression p c
a130: 6f 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  odes a constant 
a140: 69 6e 74 65 67 65 72 20 74 68 61 74 20 69 73 20  integer that is 
a150: 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20  small enough.** 
a160: 74 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62  to fit in a 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 31 20 61 6e 64 20 70 75 74 20 74 68 65  rn 1 and put the
a190: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e   value of the in
a1a0: 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61  teger.** in *pVa
a1b0: 6c 75 65 2e 20 20 49 66 20 74 68 65 20 65 78 70  lue.  If the exp
a1c0: 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61  ression is not a
a1d0: 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20  n integer or if 
a1e0: 69 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a  it is too big.**
a1f0: 20 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67   to fit in a sig
a200: 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67  ned 32-bit integ
a210: 65 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64  er, return 0 and
a220: 20 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75   leave *pValue u
a230: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74  nchanged..*/.int
a240: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
a250: 74 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69  teger(Expr *p, i
a260: 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69  nt *pValue){.  i
a270: 6e 74 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a  nt rc = 0;..  /*
a280: 20 49 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   If an expressio
a290: 6e 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  n is an integer 
a2a0: 6c 69 74 65 72 61 6c 20 74 68 61 74 20 66 69 74  literal that fit
a2b0: 73 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32  s in a signed 32
a2c0: 2d 62 69 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65  -bit.  ** intege
a2d0: 72 2c 20 74 68 65 6e 20 74 68 65 20 45 50 5f 49  r, then the EP_I
a2e0: 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 77 69 6c  ntValue flag wil
a2f0: 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  l have already b
a300: 65 65 6e 20 73 65 74 20 2a 2f 0a 20 20 61 73 73  een set */.  ass
a310: 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49  ert( p->op!=TK_I
a320: 4e 54 45 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c  NTEGER || (p->fl
a330: 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75  ags & EP_IntValu
a340: 65 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  e)!=0.          
a350: 20 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e   || sqlite3GetIn
a360: 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  t32(p->u.zToken,
a370: 20 26 72 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69   &rc)==0 );..  i
a380: 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  f( p->flags & EP
a390: 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20  _IntValue ){.   
a3a0: 20 2a 70 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e   *pValue = p->u.
a3b0: 69 56 61 6c 75 65 3b 0a 20 20 20 20 72 65 74 75  iValue;.    retu
a3c0: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74  rn 1;.  }.  swit
a3d0: 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
a3e0: 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20   case TK_UPLUS: 
a3f0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
a400: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
a410: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c  r(p->pLeft, pVal
a420: 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ue);.      break
a430: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
a440: 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20   TK_UMINUS: {.  
a450: 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20      int v;.     
a460: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
a470: 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65  IsInteger(p->pLe
a480: 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20  ft, &v) ){.     
a490: 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b     *pValue = -v;
a4a0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
a4b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
a4c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
a4d0: 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a  default: break;.
a4e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
a4f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
a500: 20 46 41 4c 53 45 20 69 66 20 74 68 65 72 65 20   FALSE if there 
a510: 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61  is no chance tha
a520: 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
a530: 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a   can be NULL..**
a540: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
a550: 73 73 69 6f 6e 20 6d 69 67 68 74 20 62 65 20 4e  ssion might be N
a560: 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 65 78  ULL or if the ex
a570: 70 72 65 73 73 69 6f 6e 20 69 73 20 74 6f 6f 20  pression is too 
a580: 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f 20 74 65  complex.** to te
a590: 6c 6c 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20  ll return TRUE. 
a5a0: 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75   .**.** This rou
a5b0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 61 73 20  tine is used as 
a5c0: 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  an optimization,
a5d0: 20 74 6f 20 73 6b 69 70 20 4f 50 5f 49 73 4e 75   to skip OP_IsNu
a5e0: 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 77 68  ll opcodes.** wh
a5f0: 65 6e 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  en we know that 
a600: 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62  a value cannot b
a610: 65 20 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20  e NULL.  Hence, 
a620: 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65  a false positive
a630: 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 54  .** (returning T
a640: 52 55 45 20 77 68 65 6e 20 69 6e 20 66 61 63 74  RUE when in fact
a650: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
a660: 63 61 6e 20 6e 65 76 65 72 20 62 65 20 4e 55 4c  can never be NUL
a670: 4c 29 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61  L) might.** be a
a680: 20 73 6d 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e   small performan
a690: 63 65 20 68 69 74 20 62 75 74 20 69 73 20 6f 74  ce hit but is ot
a6a0: 68 65 72 77 69 73 65 20 68 61 72 6d 6c 65 73 73  herwise harmless
a6b0: 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 0a  .  On the other.
a6c0: 2a 2a 20 68 61 6e 64 2c 20 61 20 66 61 6c 73 65  ** hand, a false
a6d0: 20 6e 65 67 61 74 69 76 65 20 28 72 65 74 75 72   negative (retur
a6e0: 6e 69 6e 67 20 46 41 4c 53 45 20 77 68 65 6e 20  ning FALSE when 
a6f0: 74 68 65 20 72 65 73 75 6c 74 20 63 6f 75 6c 64  the result could
a700: 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69 6c   be NULL).** wil
a710: 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20  l likely result 
a720: 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20  in an incorrect 
a730: 61 6e 73 77 65 72 2e 20 20 53 6f 20 77 68 65 6e  answer.  So when
a740: 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72   in doubt, retur
a750: 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69 6e  n.** TRUE..*/.in
a760: 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  t sqlite3ExprCan
a770: 42 65 4e 75 6c 6c 28 63 6f 6e 73 74 20 45 78 70  BeNull(const Exp
a780: 72 20 2a 70 29 7b 0a 20 20 75 38 20 6f 70 3b 0a  r *p){.  u8 op;.
a790: 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d    while( p->op==
a7a0: 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f  TK_UPLUS || p->o
a7b0: 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20  p==TK_UMINUS ){ 
a7c0: 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a  p = p->pLeft; }.
a7d0: 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20    op = p->op;.  
a7e0: 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  if( op==TK_REGIS
a7f0: 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70  TER ) op = p->op
a800: 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  2;.  switch( op 
a810: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
a820: 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65  NTEGER:.    case
a830: 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20   TK_STRING:.    
a840: 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20  case TK_FLOAT:. 
a850: 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a     case TK_BLOB:
a860: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
a870: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
a880: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
a890: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
a8a0: 61 74 65 20 61 6e 20 4f 50 5f 49 73 4e 75 6c 6c  ate an OP_IsNull
a8b0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
a8c0: 74 20 74 65 73 74 73 20 72 65 67 69 73 74 65 72  t tests register
a8d0: 20 69 52 65 67 20 61 6e 64 20 6a 75 6d 70 73 0a   iReg and jumps.
a8e0: 2a 2a 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69  ** to location i
a8f0: 44 65 73 74 20 69 66 20 74 68 65 20 76 61 6c 75  Dest if the valu
a900: 65 20 69 6e 20 69 52 65 67 20 69 73 20 4e 55 4c  e in iReg is NUL
a910: 4c 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69 6e  L.  The value in
a920: 20 69 52 65 67 20 0a 2a 2a 20 77 61 73 20 63 6f   iReg .** was co
a930: 6d 70 75 74 65 64 20 62 79 20 70 45 78 70 72 2e  mputed by pExpr.
a940: 20 20 49 66 20 77 65 20 63 61 6e 20 6c 6f 6f 6b    If we can look
a950: 20 61 74 20 70 45 78 70 72 20 61 74 20 63 6f 6d   at pExpr at com
a960: 70 69 6c 65 2d 74 69 6d 65 20 61 6e 64 0a 2a 2a  pile-time and.**
a970: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 61 74 20   determine that 
a980: 69 74 20 63 61 6e 20 6e 65 76 65 72 20 67 65 6e  it can never gen
a990: 65 72 61 74 65 20 61 20 4e 55 4c 4c 2c 20 74 68  erate a NULL, th
a9a0: 65 6e 20 74 68 65 20 4f 50 5f 49 73 4e 75 6c 6c  en the OP_IsNull
a9b0: 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 61   operation.** ca
a9c0: 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e 0a 2a 2f  n be omitted..*/
a9d0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
a9e0: 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28  rCodeIsNullJump(
a9f0: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
aa00: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
aa10: 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  BE under constru
aa20: 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  ction */.  const
aa30: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 2f   Expr *pExpr,  /
aa40: 2a 20 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20  * Only generate 
aa50: 4f 50 5f 49 73 4e 75 6c 6c 20 69 66 20 74 68 69  OP_IsNull if thi
aa60: 73 20 65 78 70 72 20 63 61 6e 20 62 65 20 4e 55  s expr can be NU
aa70: 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67  LL */.  int iReg
aa80: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
aa90: 65 73 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e  est the value in
aaa0: 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 66   this register f
aab0: 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  or NULL */.  int
aac0: 20 69 44 65 73 74 20 20 20 20 20 20 20 20 20 20   iDest          
aad0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
aae0: 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 6e 75   the value is nu
aaf0: 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 73  ll */.){.  if( s
ab00: 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
ab10: 75 6c 6c 28 70 45 78 70 72 29 20 29 7b 0a 20 20  ull(pExpr) ){.  
ab20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ab30: 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
ab40: 2c 20 69 52 65 67 2c 20 69 44 65 73 74 29 3b 0a  , iReg, iDest);.
ab50: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
ab60: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
ab70: 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
ab80: 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 77   is a constant w
ab90: 68 69 63 68 20 77 6f 75 6c 64 20 62 65 0a 2a 2a  hich would be.**
aba0: 20 75 6e 63 68 61 6e 67 65 64 20 62 79 20 4f 50   unchanged by OP
abb0: 5f 41 66 66 69 6e 69 74 79 20 77 69 74 68 20 74  _Affinity with t
abc0: 68 65 20 61 66 66 69 6e 69 74 79 20 67 69 76 65  he affinity give
abd0: 6e 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a  n in the second.
abe0: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  ** argument..**.
abf0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
ac00: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
ac10: 6d 69 6e 65 20 69 66 20 74 68 65 20 4f 50 5f 41  mine if the OP_A
ac20: 66 66 69 6e 69 74 79 20 6f 70 65 72 61 74 69 6f  ffinity operatio
ac30: 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74  n.** can be omit
ac40: 74 65 64 2e 20 20 57 68 65 6e 20 69 6e 20 64 6f  ted.  When in do
ac50: 75 62 74 20 72 65 74 75 72 6e 20 46 41 4c 53 45  ubt return FALSE
ac60: 2e 20 20 41 20 66 61 6c 73 65 20 6e 65 67 61 74  .  A false negat
ac70: 69 76 65 0a 2a 2a 20 69 73 20 68 61 72 6d 6c 65  ive.** is harmle
ac80: 73 73 2e 20 20 41 20 66 61 6c 73 65 20 70 6f 73  ss.  A false pos
ac90: 69 74 69 76 65 2c 20 68 6f 77 65 76 65 72 2c 20  itive, however, 
aca0: 63 61 6e 20 72 65 73 75 6c 74 20 69 6e 20 74 68  can result in th
acb0: 65 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65  e wrong.** answe
acc0: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
acd0: 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69  3ExprNeedsNoAffi
ace0: 6e 69 74 79 43 68 61 6e 67 65 28 63 6f 6e 73 74  nityChange(const
acf0: 20 45 78 70 72 20 2a 70 2c 20 63 68 61 72 20 61   Expr *p, char a
ad00: 66 66 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20  ff){.  u8 op;.  
ad10: 69 66 28 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f  if( aff==SQLITE_
ad20: 41 46 46 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72  AFF_NONE ) retur
ad30: 6e 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d  n 1;.  while( p-
ad40: 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c  >op==TK_UPLUS ||
ad50: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55   p->op==TK_UMINU
ad60: 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66  S ){ p = p->pLef
ad70: 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f  t; }.  op = p->o
ad80: 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  p;.  if( op==TK_
ad90: 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20  REGISTER ) op = 
ada0: 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68  p->op2;.  switch
adb0: 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
adc0: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20   TK_INTEGER: {. 
add0: 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d       return aff=
ade0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45  =SQLITE_AFF_INTE
adf0: 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  GER || aff==SQLI
ae00: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a  TE_AFF_NUMERIC;.
ae10: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
ae20: 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  K_FLOAT: {.     
ae30: 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c   return aff==SQL
ae40: 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 7c 7c 20  ITE_AFF_REAL || 
ae50: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
ae60: 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20  NUMERIC;.    }. 
ae70: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
ae80: 47 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  G: {.      retur
ae90: 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  n aff==SQLITE_AF
aea0: 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20  F_TEXT;.    }.  
aeb0: 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20    case TK_BLOB: 
aec0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
aed0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
aee0: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
aef0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
af00: 54 61 62 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a 20  Table>=0 );  /* 
af10: 70 20 63 61 6e 6e 6f 74 20 62 65 20 70 61 72 74  p cannot be part
af20: 20 6f 66 20 61 20 43 48 45 43 4b 20 63 6f 6e 73   of a CHECK cons
af30: 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20  traint */.      
af40: 72 65 74 75 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d  return p->iColum
af50: 6e 3c 30 0a 20 20 20 20 20 20 20 20 20 20 26 26  n<0.          &&
af60: 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46   (aff==SQLITE_AF
af70: 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66  F_INTEGER || aff
af80: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
af90: 45 52 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ERIC);.    }.   
afa0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
afb0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
afc0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  }.  }.}../*.** R
afd0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
afe0: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69  e given string i
aff0: 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d  s a row-id colum
b000: 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73  n name..*/.int s
b010: 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f  qlite3IsRowid(co
b020: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
b030: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
b040: 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29  mp(z, "_ROWID_")
b050: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
b060: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
b070: 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29  ICmp(z, "ROWID")
b080: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
b090: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
b0a0: 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d  ICmp(z, "OID")==
b0b0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
b0c0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
b0d0: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
b0e0: 66 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f  f we are able to
b0f0: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
b100: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e   optimization on
b110: 20 61 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20 74   a.** query of t
b120: 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20  he form.**.**   
b130: 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54      x IN (SELECT
b140: 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 57 68 65 72   ...).**.** Wher
b150: 65 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20  e the SELECT... 
b160: 63 6c 61 75 73 65 20 69 73 20 61 73 20 73 70 65  clause is as spe
b170: 63 69 66 69 65 64 20 62 79 20 74 68 65 20 70 61  cified by the pa
b180: 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 0a  rameter to this.
b190: 2a 2a 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  ** routine..**.*
b1a0: 2a 20 54 68 65 20 53 65 6c 65 63 74 20 6f 62 6a  * The Select obj
b1b0: 65 63 74 20 70 61 73 73 65 64 20 69 6e 20 68 61  ect passed in ha
b1c0: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70  s already been p
b1d0: 72 65 70 72 6f 63 65 73 73 65 64 20 61 6e 64 20  reprocessed and 
b1e0: 6e 6f 0a 2a 2a 20 65 72 72 6f 72 73 20 68 61 76  no.** errors hav
b1f0: 65 20 62 65 65 6e 20 66 6f 75 6e 64 2e 0a 2a 2f  e been found..*/
b200: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b210: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 73 74  OMIT_SUBQUERY.st
b220: 61 74 69 63 20 69 6e 74 20 69 73 43 61 6e 64 69  atic int isCandi
b230: 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 53 65 6c  dateForInOpt(Sel
b240: 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69  ect *p){.  SrcLi
b250: 73 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70 72  st *pSrc;.  Expr
b260: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
b270: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69  Table *pTab;.  i
b280: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
b290: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
b2a0: 20 20 20 20 20 20 2f 2a 20 72 69 67 68 74 2d 68        /* right-h
b2b0: 61 6e 64 20 73 69 64 65 20 6f 66 20 49 4e 20 69  and side of IN i
b2c0: 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66  s SELECT */.  if
b2d0: 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20 72 65  ( p->pPrior ) re
b2e0: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
b2f0: 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f       /* Not a co
b300: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f  mpound SELECT */
b310: 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
b320: 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
b330: 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 20  t|SF_Aggregate) 
b340: 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  ){.    testcase(
b350: 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
b360: 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
b370: 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
b380: 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
b390: 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65  testcase( (p->se
b3a0: 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
b3b0: 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
b3c0: 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61  te))==SF_Aggrega
b3d0: 74 65 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  te );.    return
b3e0: 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49 4e   0; /* No DISTIN
b3f0: 43 54 20 6b 65 79 77 6f 72 64 20 61 6e 64 20 6e  CT keyword and n
b400: 6f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  o aggregate func
b410: 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 61  tions */.  }.  a
b420: 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70  ssert( p->pGroup
b430: 42 79 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20  By==0 );        
b440: 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
b450: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
b460: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d  */.  if( p->pLim
b470: 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  it ) return 0;  
b480: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
b490: 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75  as no LIMIT clau
b4a0: 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  se */.  assert( 
b4b0: 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b  p->pOffset==0 );
b4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b4d0: 2a 20 4e 6f 20 4c 49 4d 49 54 20 6d 65 61 6e 73  * No LIMIT means
b4e0: 20 6e 6f 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20   no OFFSET */.  
b4f0: 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20  if( p->pWhere ) 
b500: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
b510: 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f         /* Has no
b520: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
b530: 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
b540: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
b550: 63 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 53  c!=0 );.  if( pS
b560: 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65  rc->nSrc!=1 ) re
b570: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
b580: 20 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72 6d 20   /* Single term 
b590: 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  in FROM clause *
b5a0: 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b  /.  if( pSrc->a[
b5b0: 30 5d 2e 70 53 65 6c 65 63 74 20 29 20 72 65 74  0].pSelect ) ret
b5c0: 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46 52  urn 0;     /* FR
b5d0: 4f 4d 20 69 73 20 6e 6f 74 20 61 20 73 75 62 71  OM is not a subq
b5e0: 75 65 72 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a  uery or view */.
b5f0: 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61    pTab = pSrc->a
b600: 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 69 66 28 20  [0].pTab;.  if( 
b610: 4e 45 56 45 52 28 70 54 61 62 3d 3d 30 29 20 29  NEVER(pTab==0) )
b620: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73   return 0;.  ass
b630: 65 72 74 28 20 70 54 61 62 2d 3e 70 53 65 6c 65  ert( pTab->pSele
b640: 63 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20  ct==0 );        
b650: 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
b660: 73 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77  se is not a view
b670: 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74   */.  if( IsVirt
b680: 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75  ual(pTab) ) retu
b690: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20  rn 0;        /* 
b6a0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20  FROM clause not 
b6b0: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
b6c0: 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  */.  pEList = p-
b6d0: 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  >pEList;.  if( p
b6e0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  EList->nExpr!=1 
b6f0: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
b700: 20 20 2f 2a 20 4f 6e 65 20 63 6f 6c 75 6d 6e 20    /* One column 
b710: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
b720: 74 20 2a 2f 0a 20 20 69 66 28 20 70 45 4c 69 73  t */.  if( pELis
b730: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f  t->a[0].pExpr->o
b740: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72  p!=TK_COLUMN ) r
b750: 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 75  eturn 0; /* Resu
b760: 6c 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 2a  lt is a column *
b770: 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  /.  return 1;.}.
b780: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
b790: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
b7a0: 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  /../*.** Code an
b7b0: 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63   OP_Once instruc
b7c0: 74 69 6f 6e 20 61 6e 64 20 61 6c 6c 6f 63 61 74  tion and allocat
b7d0: 65 20 73 70 61 63 65 20 66 6f 72 20 69 74 73 20  e space for its 
b7e0: 66 6c 61 67 2e 20 52 65 74 75 72 6e 20 74 68 65  flag. Return the
b7f0: 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f 66 20   .** address of 
b800: 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75 63 74  the new instruct
b810: 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
b820: 74 65 33 43 6f 64 65 4f 6e 63 65 28 50 61 72 73  te3CodeOnce(Pars
b830: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64  e *pParse){.  Vd
b840: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
b850: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 20  etVdbe(pParse); 
b860: 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20       /* Virtual 
b870: 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63 6f  machine being co
b880: 64 65 64 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ded */.  return 
b890: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b8a0: 31 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20 70 50  1(v, OP_Once, pP
b8b0: 61 72 73 65 2d 3e 6e 4f 6e 63 65 2b 2b 29 3b 0a  arse->nOnce++);.
b8c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
b8d0: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62  nction is used b
b8e0: 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  y the implementa
b8f0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20 28  tion of the IN (
b900: 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  ...) operator..*
b910: 2a 20 54 68 65 20 70 58 20 70 61 72 61 6d 65 74  * The pX paramet
b920: 65 72 20 69 73 20 74 68 65 20 65 78 70 72 65 73  er is the expres
b930: 73 69 6f 6e 20 6f 6e 20 74 68 65 20 52 48 53 20  sion on the RHS 
b940: 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
b950: 6f 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67  or, which.** mig
b960: 68 74 20 62 65 20 65 69 74 68 65 72 20 61 20 6c  ht be either a l
b970: 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ist of expressio
b980: 6e 73 20 6f 72 20 61 20 73 75 62 71 75 65 72 79  ns or a subquery
b990: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20  ..**.** The job 
b9a0: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
b9b0: 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20 63 72  is to find or cr
b9c0: 65 61 74 65 20 61 20 62 2d 74 72 65 65 20 6f 62  eate a b-tree ob
b9d0: 6a 65 63 74 20 74 68 61 74 20 63 61 6e 0a 2a 2a  ject that can.**
b9e0: 20 62 65 20 75 73 65 64 20 65 69 74 68 65 72 20   be used either 
b9f0: 74 6f 20 74 65 73 74 20 66 6f 72 20 6d 65 6d 62  to test for memb
ba00: 65 72 73 68 69 70 20 69 6e 20 74 68 65 20 52 48  ership in the RH
ba10: 53 20 73 65 74 20 6f 72 20 74 6f 20 69 74 65 72  S set or to iter
ba20: 61 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61  ate through.** a
ba30: 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20 74 68  ll members of th
ba40: 65 20 52 48 53 20 73 65 74 2c 20 73 6b 69 70 70  e RHS set, skipp
ba50: 69 6e 67 20 64 75 70 6c 69 63 61 74 65 73 2e 0a  ing duplicates..
ba60: 2a 2a 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20 69  **.** A cursor i
ba70: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20  s opened on the 
ba80: 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68  b-tree object th
ba90: 61 74 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  at the RHS of th
baa0: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  e IN operator.**
bab0: 20 61 6e 64 20 70 58 2d 3e 69 54 61 62 6c 65 20   and pX->iTable 
bac0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e  is set to the in
bad0: 64 65 78 20 6f 66 20 74 68 61 74 20 63 75 72 73  dex of that curs
bae0: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  or..**.** The re
baf0: 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6f 66 20  turned value of 
bb00: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e  this function in
bb10: 64 69 63 61 74 65 73 20 74 68 65 20 62 2d 74 72  dicates the b-tr
bb20: 65 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c  ee type, as foll
bb30: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f  ows:.**.**   IN_
bb40: 49 4e 44 45 58 5f 52 4f 57 49 44 20 20 20 20 20  INDEX_ROWID     
bb50: 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61   - The cursor wa
bb60: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61  s opened on a da
bb70: 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a  tabase table..**
bb80: 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45     IN_INDEX_INDE
bb90: 58 5f 41 53 43 20 20 2d 20 54 68 65 20 63 75 72  X_ASC  - The cur
bba0: 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
bbb0: 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69  n an ascending i
bbc0: 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e  ndex..**   IN_IN
bbd0: 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 2d  DEX_INDEX_DESC -
bbe0: 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20   The cursor was 
bbf0: 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 65 73 63  opened on a desc
bc00: 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a  ending index..**
bc10: 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20     IN_INDEX_EPH 
bc20: 20 20 20 20 20 20 20 2d 20 54 68 65 20 63 75 72         - The cur
bc30: 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
bc40: 6e 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72  n a specially cr
bc50: 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20  eated and.**    
bc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc70: 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20 65       populated e
bc80: 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a  pheremal table..
bc90: 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e  **.** An existin
bca0: 67 20 62 2d 74 72 65 65 20 6d 69 67 68 74 20 62  g b-tree might b
bcb0: 65 20 75 73 65 64 20 69 66 20 74 68 65 20 52 48  e used if the RH
bcc0: 53 20 65 78 70 72 65 73 73 69 6f 6e 20 70 58 20  S expression pX 
bcd0: 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 73  is a simple.** s
bce0: 75 62 71 75 65 72 79 20 73 75 63 68 20 61 73 3a  ubquery such as:
bcf0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
bd00: 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d 20  T <column> FROM 
bd10: 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66  <table>.**.** If
bd20: 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
bd30: 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61  IN operator is a
bd40: 20 6c 69 73 74 20 6f 72 20 61 20 6d 6f 72 65 20   list or a more 
bd50: 63 6f 6d 70 6c 65 78 20 73 75 62 71 75 65 72 79  complex subquery
bd60: 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 65 70 68  , then.** an eph
bd70: 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6d 69 67  emeral table mig
bd80: 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20 67 65  ht need to be ge
bd90: 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65  nerated from the
bda0: 20 52 48 53 20 61 6e 64 20 74 68 65 6e 0a 2a 2a   RHS and then.**
bdb0: 20 70 58 2d 3e 69 54 61 62 6c 65 20 6d 61 64 65   pX->iTable made
bdc0: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
bdd0: 20 65 70 68 65 72 6d 65 72 61 6c 20 74 61 62 6c   ephermeral tabl
bde0: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6e 0a  e instead of an.
bdf0: 2a 2a 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c  ** existing tabl
be00: 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e.  .**.** If th
be10: 65 20 70 72 4e 6f 74 46 6f 75 6e 64 20 70 61 72  e prNotFound par
be20: 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68 65  ameter is 0, the
be30: 6e 20 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c  n the b-tree wil
be40: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69 74 65  l be used to ite
be50: 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20  rate.** through 
be60: 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73 2c  the set members,
be70: 20 73 6b 69 70 70 69 6e 67 20 61 6e 79 20 64 75   skipping any du
be80: 70 6c 69 63 61 74 65 73 2e 20 49 6e 20 74 68 69  plicates. In thi
be90: 73 20 63 61 73 65 20 61 6e 0a 2a 2a 20 65 70 68  s case an.** eph
bea0: 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73  eremal table mus
beb0: 74 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73  t be used unless
bec0: 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 3c 63   the selected <c
bed0: 6f 6c 75 6d 6e 3e 20 69 73 20 67 75 61 72 61 6e  olumn> is guaran
bee0: 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 75 6e  teed.** to be un
bef0: 69 71 75 65 20 2d 20 65 69 74 68 65 72 20 62 65  ique - either be
bf00: 63 61 75 73 65 20 69 74 20 69 73 20 61 6e 20 49  cause it is an I
bf10: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
bf20: 45 59 20 6f 72 20 69 74 0a 2a 2a 20 68 61 73 20  EY or it.** has 
bf30: 61 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  a UNIQUE constra
bf40: 69 6e 74 20 6f 72 20 55 4e 49 51 55 45 20 69 6e  int or UNIQUE in
bf50: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  dex..**.** If th
bf60: 65 20 70 72 4e 6f 74 46 6f 75 6e 64 20 70 61 72  e prNotFound par
bf70: 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c  ameter is not 0,
bf80: 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65   then the b-tree
bf90: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a   will be used .*
bfa0: 2a 20 66 6f 72 20 66 61 73 74 20 73 65 74 20 6d  * for fast set m
bfb0: 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 2e  embership tests.
bfc0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e   In this case an
bfd0: 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
bfe0: 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65   must .** be use
bff0: 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e  d unless <column
c000: 3e 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20  > is an INTEGER 
c010: 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 61  PRIMARY KEY or a
c020: 6e 20 69 6e 64 65 78 20 63 61 6e 20 0a 2a 2a 20  n index can .** 
c030: 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20 3c 63  be found with <c
c040: 6f 6c 75 6d 6e 3e 20 61 73 20 69 74 73 20 6c 65  olumn> as its le
c050: 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e 0a  ft-most column..
c060: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 62  **.** When the b
c070: 2d 74 72 65 65 20 69 73 20 62 65 69 6e 67 20 75  -tree is being u
c080: 73 65 64 20 66 6f 72 20 6d 65 6d 62 65 72 73 68  sed for membersh
c090: 69 70 20 74 65 73 74 73 2c 20 74 68 65 20 63 61  ip tests, the ca
c0a0: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a  lling function.*
c0b0: 2a 20 6e 65 65 64 73 20 74 6f 20 6b 6e 6f 77 20  * needs to know 
c0c0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
c0d0: 68 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  he structure con
c0e0: 74 61 69 6e 73 20 61 6e 20 53 51 4c 20 4e 55 4c  tains an SQL NUL
c0f0: 4c 20 0a 2a 2a 20 76 61 6c 75 65 20 69 6e 20 6f  L .** value in o
c100: 72 64 65 72 20 74 6f 20 63 6f 72 72 65 63 74 6c  rder to correctl
c110: 79 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65  y evaluate expre
c120: 73 73 69 6f 6e 73 20 6c 69 6b 65 20 22 58 20 49  ssions like "X I
c130: 4e 20 28 59 2c 20 5a 29 22 2e 0a 2a 2a 20 49 66  N (Y, Z)"..** If
c140: 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 63 68   there is any ch
c150: 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e  ance that the (.
c160: 2e 2e 29 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  ..) might contai
c170: 6e 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61  n a NULL value a
c180: 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68  t.** runtime, th
c190: 65 6e 20 61 20 72 65 67 69 73 74 65 72 20 69 73  en a register is
c1a0: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
c1b0: 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  he register numb
c1c0: 65 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f  er written.** to
c1d0: 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 2e 20 49 66   *prNotFound. If
c1e0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61   there is no cha
c1f0: 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e  nce that the (..
c200: 2e 29 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a  .) contains a.**
c210: 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65   NULL value, the
c220: 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 69 73  n *prNotFound is
c230: 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
c240: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69  .**.** If a regi
c250: 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65  ster is allocate
c260: 64 20 61 6e 64 20 69 74 73 20 6c 6f 63 61 74 69  d and its locati
c270: 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 72  on stored in *pr
c280: 4e 6f 74 46 6f 75 6e 64 2c 20 74 68 65 6e 0a 2a  NotFound, then.*
c290: 2a 20 69 74 73 20 69 6e 69 74 69 61 6c 20 76 61  * its initial va
c2a0: 6c 75 65 20 69 73 20 4e 55 4c 4c 2e 20 20 49 66  lue is NULL.  If
c2b0: 20 74 68 65 20 28 2e 2e 2e 29 20 64 6f 65 73 20   the (...) does 
c2c0: 6e 6f 74 20 72 65 6d 61 69 6e 20 63 6f 6e 73 74  not remain const
c2d0: 61 6e 74 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64  ant.** for the d
c2e0: 75 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 71  uration of the q
c2f0: 75 65 72 79 20 28 69 2e 65 2e 20 74 68 65 20 53  uery (i.e. the S
c300: 45 4c 45 43 54 20 77 69 74 68 69 6e 20 74 68 65  ELECT within the
c310: 20 28 2e 2e 2e 29 0a 2a 2a 20 69 73 20 61 20 63   (...).** is a c
c320: 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65  orrelated subque
c330: 72 79 29 20 74 68 65 6e 20 74 68 65 20 76 61 6c  ry) then the val
c340: 75 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61  ue of the alloca
c350: 74 65 64 20 72 65 67 69 73 74 65 72 20 69 73 0a  ted register is.
c360: 2a 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c  ** reset to NULL
c370: 20 65 61 63 68 20 74 69 6d 65 20 74 68 65 20 73   each time the s
c380: 75 62 71 75 65 72 79 20 69 73 20 72 65 72 75 6e  ubquery is rerun
c390: 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68  . This allows th
c3a0: 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 75  e.** caller to u
c3b0: 73 65 20 76 64 62 65 20 63 6f 64 65 20 65 71 75  se vdbe code equ
c3c0: 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 66  ivalent to the f
c3d0: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
c3e0: 20 20 69 66 28 20 72 65 67 69 73 74 65 72 3d 3d    if( register==
c3f0: 4e 55 4c 4c 20 29 7b 0a 2a 2a 20 20 20 20 20 68  NULL ){.**     h
c400: 61 73 5f 6e 75 6c 6c 20 3d 20 3c 74 65 73 74 20  as_null = <test 
c410: 69 66 20 64 61 74 61 20 73 74 72 75 63 74 75 72  if data structur
c420: 65 20 63 6f 6e 74 61 69 6e 73 20 6e 75 6c 6c 3e  e contains null>
c430: 0a 2a 2a 20 20 20 20 20 72 65 67 69 73 74 65 72  .**     register
c440: 20 3d 20 31 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a   = 1.**   }.**.*
c450: 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76  * in order to av
c460: 6f 69 64 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  oid running the 
c470: 3c 74 65 73 74 20 69 66 20 64 61 74 61 20 73 74  <test if data st
c480: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
c490: 20 6e 75 6c 6c 3e 0a 2a 2a 20 74 65 73 74 20 6d   null>.** test m
c4a0: 6f 72 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 69  ore often than i
c4b0: 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a  s necessary..*/.
c4c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c4d0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74  MIT_SUBQUERY.int
c4e0: 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
c4f0: 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
c500: 65 2c 20 45 78 70 72 20 2a 70 58 2c 20 69 6e 74  e, Expr *pX, int
c510: 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 29 7b 0a 20   *prNotFound){. 
c520: 20 53 65 6c 65 63 74 20 2a 70 3b 20 20 20 20 20   Select *p;     
c530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c540: 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
c550: 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66   to the right of
c560: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
c570: 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 30 3b    int eType = 0;
c580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c590: 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20          /* Type 
c5a0: 6f 66 20 52 48 53 20 74 61 62 6c 65 2e 20 49 4e  of RHS table. IN
c5b0: 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e  _INDEX_* */.  in
c5c0: 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d  t iTab = pParse-
c5d0: 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 20 20 20  >nTab++;        
c5e0: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66      /* Cursor of
c5f0: 20 74 68 65 20 52 48 53 20 74 61 62 6c 65 20 2a   the RHS table *
c600: 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42 65 55 6e  /.  int mustBeUn
c610: 69 71 75 65 20 3d 20 28 70 72 4e 6f 74 46 6f 75  ique = (prNotFou
c620: 6e 64 3d 3d 30 29 3b 20 20 20 2f 2a 20 54 72 75  nd==0);   /* Tru
c630: 65 20 69 66 20 52 48 53 20 6d 75 73 74 20 62 65  e if RHS must be
c640: 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 56 64 62   unique */.  Vdb
c650: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
c660: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 20 20  tVdbe(pParse);  
c670: 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61     /* Virtual ma
c680: 63 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65  chine being code
c690: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
c6a0: 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b  pX->op==TK_IN );
c6b0: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
c6c0: 73 65 65 20 69 66 20 61 6e 20 65 78 69 73 74 69  see if an existi
c6d0: 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  ng table or inde
c6e0: 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  x can be used to
c6f0: 0a 20 20 2a 2a 20 73 61 74 69 73 66 79 20 74 68  .  ** satisfy th
c700: 65 20 71 75 65 72 79 2e 20 20 54 68 69 73 20 69  e query.  This i
c710: 73 20 70 72 65 66 65 72 61 62 6c 65 20 74 6f 20  s preferable to 
c720: 67 65 6e 65 72 61 74 69 6e 67 20 61 20 6e 65 77  generating a new
c730: 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c   .  ** ephemeral
c740: 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 70   table..  */.  p
c750: 20 3d 20 28 45 78 70 72 48 61 73 50 72 6f 70 65   = (ExprHasPrope
c760: 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65  rty(pX, EP_xIsSe
c770: 6c 65 63 74 29 20 3f 20 70 58 2d 3e 78 2e 70 53  lect) ? pX->x.pS
c780: 65 6c 65 63 74 20 3a 20 30 29 3b 0a 20 20 69 66  elect : 0);.  if
c790: 28 20 41 4c 57 41 59 53 28 70 50 61 72 73 65 2d  ( ALWAYS(pParse-
c7a0: 3e 6e 45 72 72 3d 3d 30 29 20 26 26 20 69 73 43  >nErr==0) && isC
c7b0: 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
c7c0: 28 70 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  (p) ){.    sqlit
c7d0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
c7e0: 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  >db;            
c7f0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
c800: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  nnection */.    
c810: 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
c820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c830: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
c840: 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20  <table>. */.    
c850: 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20  Expr *pExpr;    
c860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c870: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
c880: 73 69 6f 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f  sion <column> */
c890: 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  .    int iCol;  
c8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
c8c0: 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 3c  ndex of column <
c8d0: 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20 69  column> */.    i
c8e0: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
c8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c900: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
c910: 65 20 69 64 78 20 66 6f 72 20 70 54 61 62 20 2a  e idx for pTab *
c920: 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  /..    assert( p
c930: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
c940: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65             /* Be
c950: 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69  cause of isCandi
c960: 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20  dateForInOpt(p) 
c970: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
c980: 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 20 20  ->pEList!=0 );  
c990: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65             /* Be
c9a0: 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69  cause of isCandi
c9b0: 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20  dateForInOpt(p) 
c9c0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
c9d0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
c9e0: 45 78 70 72 21 3d 30 20 29 3b 20 2f 2a 20 42 65  Expr!=0 ); /* Be
c9f0: 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69  cause of isCandi
ca00: 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20  dateForInOpt(p) 
ca10: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
ca20: 2d 3e 70 53 72 63 21 3d 30 20 29 3b 20 20 20 20  ->pSrc!=0 );    
ca30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65             /* Be
ca40: 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69  cause of isCandi
ca50: 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20  dateForInOpt(p) 
ca60: 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20 70 2d  */.    pTab = p-
ca70: 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62  >pSrc->a[0].pTab
ca80: 3b 0a 20 20 20 20 70 45 78 70 72 20 3d 20 70 2d  ;.    pExpr = p-
ca90: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
caa0: 78 70 72 3b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  xpr;.    iCol = 
cab0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
cac0: 20 20 20 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20     .    /* Code 
cad0: 61 6e 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b  an OP_VerifyCook
cae0: 69 65 20 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c  ie and OP_TableL
caf0: 6f 63 6b 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e  ock for <table>.
cb00: 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71   */.    iDb = sq
cb10: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
cb20: 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
cb30: 68 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74  hema);.    sqlit
cb40: 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
cb50: 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
cb60: 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c  .    sqlite3Tabl
cb70: 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
cb80: 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30  b, pTab->tnum, 0
cb90: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
cba0: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  .    /* This fun
cbb0: 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61  ction is only ca
cbc0: 6c 6c 65 64 20 66 72 6f 6d 20 74 77 6f 20 70 6c  lled from two pl
cbd0: 61 63 65 73 2e 20 49 6e 20 62 6f 74 68 20 63 61  aces. In both ca
cbe0: 73 65 73 20 74 68 65 20 76 64 62 65 0a 20 20 20  ses the vdbe.   
cbf0: 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20   ** has already 
cc00: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 20  been allocated. 
cc10: 53 6f 20 61 73 73 75 6d 65 20 73 71 6c 69 74 65  So assume sqlite
cc20: 33 47 65 74 56 64 62 65 28 29 20 69 73 20 61 6c  3GetVdbe() is al
cc30: 77 61 79 73 0a 20 20 20 20 2a 2a 20 73 75 63 63  ways.    ** succ
cc40: 65 73 73 66 75 6c 20 68 65 72 65 2e 0a 20 20 20  essful here..   
cc50: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 76   */.    assert(v
cc60: 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  );.    if( iCol<
cc70: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
cc80: 41 64 64 72 3b 0a 0a 20 20 20 20 20 20 69 41 64  Addr;..      iAd
cc90: 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  dr = sqlite3Code
cca0: 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a 0a 20  Once(pParse);.. 
ccb0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
ccc0: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54  Table(pParse, iT
ccd0: 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f  ab, iDb, pTab, O
cce0: 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20  P_OpenRead);.   
ccf0: 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
cd00: 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20 20 20 20  DEX_ROWID;..    
cd10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
cd20: 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b  pHere(v, iAddr);
cd30: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
cd40: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
cd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd60: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
cd70: 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a  or variable */..
cd80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c        /* The col
cd90: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
cda0: 75 73 65 64 20 62 79 20 74 68 65 20 63 6f 6d 70  used by the comp
cdb0: 61 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20 69 6e  arison. If an in
cdc0: 64 65 78 20 69 73 20 74 6f 0a 20 20 20 20 20 20  dex is to.      
cdd0: 2a 2a 20 62 65 20 75 73 65 64 20 69 6e 20 70 6c  ** be used in pl
cde0: 61 63 65 20 6f 66 20 61 20 74 65 6d 70 2d 74 61  ace of a temp-ta
cdf0: 62 6c 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20  ble, it must be 
ce00: 6f 72 64 65 72 65 64 20 61 63 63 6f 72 64 69 6e  ordered accordin
ce10: 67 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68  g.      ** to th
ce20: 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  is collation seq
ce30: 75 65 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20 20  uence.  */.     
ce40: 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d   CollSeq *pReq =
ce50: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
ce60: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
ce70: 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20  rse, pX->pLeft, 
ce80: 70 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20 2f  pExpr);..      /
ce90: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
cea0: 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 77   affinity that w
ceb0: 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 70  ill be used to p
cec0: 65 72 66 6f 72 6d 20 74 68 65 20 0a 20 20 20 20  erform the .    
ced0: 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20    ** comparison 
cee0: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
cef0: 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  he affinity of t
cf00: 68 65 20 63 6f 6c 75 6d 6e 2e 20 49 66 0a 20 20  he column. If.  
cf10: 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6e 6f 74      ** it is not
cf20: 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  , it is not poss
cf30: 69 62 6c 65 20 74 6f 20 75 73 65 20 61 6e 79 20  ible to use any 
cf40: 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 2a 2f 0a  index..      */.
cf50: 20 20 20 20 20 20 69 6e 74 20 61 66 66 69 6e 69        int affini
cf60: 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33 49  ty_ok = sqlite3I
cf70: 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70  ndexAffinityOk(p
cf80: 58 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  X, pTab->aCol[iC
cf90: 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 29 3b 0a 0a  ol].affinity);..
cfa0: 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70        for(pIdx=p
cfb0: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
cfc0: 78 20 26 26 20 65 54 79 70 65 3d 3d 30 20 26 26  x && eType==0 &&
cfd0: 20 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 70 49   affinity_ok; pI
cfe0: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
cff0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 49  .        if( (pI
d000: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d  dx->aiColumn[0]=
d010: 3d 69 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 20  =iCol).         
d020: 26 26 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f  && sqlite3FindCo
d030: 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62  llSeq(db, ENC(db
d040: 29 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b  ), pIdx->azColl[
d050: 30 5d 2c 20 30 29 3d 3d 70 52 65 71 0a 20 20 20  0], 0)==pReq.   
d060: 20 20 20 20 20 20 26 26 20 28 21 6d 75 73 74 42        && (!mustB
d070: 65 55 6e 69 71 75 65 20 7c 7c 20 28 70 49 64 78  eUnique || (pIdx
d080: 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20  ->nColumn==1 && 
d090: 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  pIdx->onError!=O
d0a0: 45 5f 4e 6f 6e 65 29 29 0a 20 20 20 20 20 20 20  E_None)).       
d0b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
d0c0: 74 20 69 41 64 64 72 3b 0a 20 20 20 20 20 20 20  t iAddr;.       
d0d0: 20 20 20 63 68 61 72 20 2a 70 4b 65 79 3b 0a 20     char *pKey;. 
d0e0: 20 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79   .          pKey
d0f0: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
d100: 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70  e3IndexKeyinfo(p
d110: 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20  Parse, pIdx);.  
d120: 20 20 20 20 20 20 20 20 69 41 64 64 72 20 3d 20          iAddr = 
d130: 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
d140: 70 50 61 72 73 65 29 3b 0a 20 20 0a 20 20 20 20  pParse);.  .    
d150: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d160: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
d170: 65 6e 52 65 61 64 2c 20 69 54 61 62 2c 20 70 49  enRead, iTab, pI
d180: 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20  dx->tnum, iDb,. 
d190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4b                pK
d1b0: 65 79 2c 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  ey,P4_KEYINFO_HA
d1c0: 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 20 20  NDOFF);.        
d1d0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
d1e0: 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e  , "%s", pIdx->zN
d1f0: 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ame));.         
d200: 20 61 73 73 65 72 74 28 20 49 4e 5f 49 4e 44 45   assert( IN_INDE
d210: 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20  X_INDEX_DESC == 
d220: 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41  IN_INDEX_INDEX_A
d230: 53 43 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20  SC+1 );.        
d240: 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
d250: 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 2b 20 70  EX_INDEX_ASC + p
d260: 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
d270: 30 5d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 73  0];..          s
d280: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
d290: 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20  re(v, iAddr);.  
d2a0: 20 20 20 20 20 20 20 20 69 66 28 20 70 72 4e 6f          if( prNo
d2b0: 74 46 6f 75 6e 64 20 26 26 20 21 70 54 61 62 2d  tFound && !pTab-
d2c0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e  >aCol[iCol].notN
d2d0: 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ull ){.         
d2e0: 20 20 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 3d     *prNotFound =
d2f0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
d300: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
d310: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d320: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 2a 70  , OP_Null, 0, *p
d330: 72 4e 6f 74 46 6f 75 6e 64 29 3b 0a 20 20 20 20  rNotFound);.    
d340: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d350: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
d360: 20 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65    }..  if( eType
d370: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  ==0 ){.    /* Co
d380: 75 6c 64 20 6e 6f 74 20 66 6f 75 6e 64 20 61 6e  uld not found an
d390: 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20   existing table 
d3a0: 6f 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  or index to use 
d3b0: 61 73 20 74 68 65 20 52 48 53 20 62 2d 74 72 65  as the RHS b-tre
d3c0: 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20 77 69 6c  e..    ** We wil
d3d0: 6c 20 68 61 76 65 20 74 6f 20 67 65 6e 65 72 61  l have to genera
d3e0: 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  te an ephemeral 
d3f0: 74 61 62 6c 65 20 74 6f 20 64 6f 20 74 68 65 20  table to do the 
d400: 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  job..    */.    
d410: 64 6f 75 62 6c 65 20 73 61 76 65 64 4e 51 75 65  double savedNQue
d420: 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d  ryLoop = pParse-
d430: 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20  >nQueryLoop;.   
d440: 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c   int rMayHaveNul
d450: 6c 20 3d 20 30 3b 0a 20 20 20 20 65 54 79 70 65  l = 0;.    eType
d460: 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b   = IN_INDEX_EPH;
d470: 0a 20 20 20 20 69 66 28 20 70 72 4e 6f 74 46 6f  .    if( prNotFo
d480: 75 6e 64 20 29 7b 0a 20 20 20 20 20 20 2a 70 72  und ){.      *pr
d490: 4e 6f 74 46 6f 75 6e 64 20 3d 20 72 4d 61 79 48  NotFound = rMayH
d4a0: 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72  aveNull = ++pPar
d4b0: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
d4c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d4d0: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
d4e0: 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 29 3b 0a 20   *prNotFound);. 
d4f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d500: 74 65 73 74 63 61 73 65 28 20 70 50 61 72 73 65  testcase( pParse
d510: 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3e 28 64 6f  ->nQueryLoop>(do
d520: 75 62 6c 65 29 31 20 29 3b 0a 20 20 20 20 20 20  uble)1 );.      
d530: 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
d540: 6f 70 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a  op = (double)1;.
d550: 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 70 4c        if( pX->pL
d560: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26  eft->iColumn<0 &
d570: 26 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f  & !ExprHasAnyPro
d580: 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73  perty(pX, EP_xIs
d590: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
d5a0: 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
d5b0: 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20  DEX_ROWID;.     
d5c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
d5d0: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
d5e0: 74 28 70 50 61 72 73 65 2c 20 70 58 2c 20 72 4d  t(pParse, pX, rM
d5f0: 61 79 48 61 76 65 4e 75 6c 6c 2c 20 65 54 79 70  ayHaveNull, eTyp
d600: 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49  e==IN_INDEX_ROWI
d610: 44 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  D);.    pParse->
d620: 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 73 61 76  nQueryLoop = sav
d630: 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  edNQueryLoop;.  
d640: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69  }else{.    pX->i
d650: 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20  Table = iTab;.  
d660: 7d 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70 65  }.  return eType
d670: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
d680: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
d690: 66 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71 75  for scalar subqu
d6a0: 65 72 69 65 73 20 75 73 65 64 20 61 73 20 61 20  eries used as a 
d6b0: 73 75 62 71 75 65 72 79 20 65 78 70 72 65 73 73  subquery express
d6c0: 69 6f 6e 2c 20 45 58 49 53 54 53 2c 0a 2a 2a 20  ion, EXISTS,.** 
d6d0: 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e  or IN operators.
d6e0: 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a    Examples:.**.*
d6f0: 2a 20 20 20 20 20 28 53 45 4c 45 43 54 20 61 20  *     (SELECT a 
d700: 46 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20 20  FROM b)         
d710: 20 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a 20   -- subquery.** 
d720: 20 20 20 20 45 58 49 53 54 53 20 28 53 45 4c 45      EXISTS (SELE
d730: 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 2d  CT a FROM b)   -
d740: 2d 20 45 58 49 53 54 53 20 73 75 62 71 75 65 72  - EXISTS subquer
d750: 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34  y.**     x IN (4
d760: 2c 35 2c 31 31 29 20 20 20 20 20 20 20 20 20 20  ,5,11)          
d770: 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74      -- IN operat
d780: 6f 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20  or with list on 
d790: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a  right-hand side.
d7a0: 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c  **     x IN (SEL
d7b0: 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20  ECT a FROM b)   
d7c0: 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72    -- IN operator
d7d0: 20 77 69 74 68 20 73 75 62 71 75 65 72 79 20 6f   with subquery o
d7e0: 6e 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a  n the right.**.*
d7f0: 2a 20 54 68 65 20 70 45 78 70 72 20 70 61 72 61  * The pExpr para
d800: 6d 65 74 65 72 20 64 65 73 63 72 69 62 65 73 20  meter describes 
d810: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
d820: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
d830: 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20   IN.** operator 
d840: 6f 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a  or subquery..**.
d850: 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
d860: 69 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a  isRowid is non-z
d870: 65 72 6f 2c 20 74 68 65 6e 20 65 78 70 72 65 73  ero, then expres
d880: 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 67 75  sion pExpr is gu
d890: 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62  aranteed.** to b
d8a0: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c  e of the form "<
d8b0: 72 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c  rowid> IN (?, ?,
d8c0: 20 3f 29 22 2c 20 77 68 65 72 65 20 3c 72 6f 77   ?)", where <row
d8d0: 69 64 3e 20 69 73 20 61 20 72 65 66 65 72 65 6e  id> is a referen
d8e0: 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20 69 6e  ce.** to some in
d8f0: 74 65 67 65 72 20 6b 65 79 20 63 6f 6c 75 6d 6e  teger key column
d900: 20 6f 66 20 61 20 74 61 62 6c 65 20 42 2d 54 72   of a table B-Tr
d910: 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ee. In this case
d920: 2c 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b  , use an.** intk
d930: 65 79 20 42 2d 54 72 65 65 20 74 6f 20 73 74 6f  ey B-Tree to sto
d940: 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 49 4e  re the set of IN
d950: 28 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69 6e 73  (...) values ins
d960: 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75 61  tead of the usua
d970: 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20 76 61  l.** (slower) va
d980: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65  riable length ke
d990: 79 73 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a 2a  ys B-Tree..**.**
d9a0: 20 49 66 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c   If rMayHaveNull
d9b0: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
d9c0: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  at means that th
d9d0: 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
d9e0: 6e 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20 53  n IN.** (not a S
d9f0: 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53 29  ELECT or EXISTS)
da00: 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 52 48   and that the RH
da10: 53 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 73  S might contains
da20: 20 4e 55 4c 4c 73 2e 0a 2a 2a 20 46 75 72 74 68   NULLs..** Furth
da30: 65 72 6d 6f 72 65 2c 20 74 68 65 20 49 4e 20 69  ermore, the IN i
da40: 73 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61  s in a WHERE cla
da50: 75 73 65 20 61 6e 64 20 74 68 61 74 20 77 65 20  use and that we 
da60: 72 65 61 6c 6c 79 20 77 61 6e 74 0a 2a 2a 20 74  really want.** t
da70: 6f 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 74  o iterate over t
da80: 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
da90: 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 6f 72 64   operator in ord
daa0: 65 72 20 74 6f 20 71 75 69 63 6b 6c 79 20 6c 6f  er to quickly lo
dab0: 63 61 74 65 0a 2a 2a 20 61 6c 6c 20 63 6f 72 72  cate.** all corr
dac0: 65 73 70 6f 6e 64 69 6e 67 20 4c 48 53 20 65 6c  esponding LHS el
dad0: 65 6d 65 6e 74 73 2e 20 20 41 6c 6c 20 74 68 69  ements.  All thi
dae0: 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 69  s routine does i
daf0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 0a 2a 2a 20  s initialize.** 
db00: 74 68 65 20 72 65 67 69 73 74 65 72 20 67 69 76  the register giv
db10: 65 6e 20 62 79 20 72 4d 61 79 48 61 76 65 4e 75  en by rMayHaveNu
db20: 6c 6c 20 74 6f 20 4e 55 4c 4c 2e 20 20 43 61 6c  ll to NULL.  Cal
db30: 6c 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 77 69  ling routines wi
db40: 6c 6c 20 74 61 6b 65 0a 2a 2a 20 63 61 72 65 20  ll take.** care 
db50: 6f 66 20 63 68 61 6e 67 69 6e 67 20 74 68 69 73  of changing this
db60: 20 72 65 67 69 73 74 65 72 20 76 61 6c 75 65 20   register value 
db70: 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 74  to non-NULL if t
db80: 68 65 20 52 48 53 20 69 73 20 4e 55 4c 4c 2d 66  he RHS is NULL-f
db90: 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d  ree..**.** If rM
dba0: 61 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 7a 65  ayHaveNull is ze
dbb0: 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ro, that means t
dbc0: 68 61 74 20 74 68 65 20 73 75 62 71 75 65 72 79  hat the subquery
dbd0: 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 0a 2a   is being used.*
dbe0: 2a 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70  * for membership
dbf0: 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20   testing only.  
dc00: 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
dc10: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61   to initialize a
dc20: 6e 79 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20  ny.** registers 
dc30: 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 65 20  to indicate the 
dc40: 70 72 65 73 65 6e 73 65 20 6f 72 20 61 62 73 65  presense or abse
dc50: 6e 63 65 20 6f 66 20 4e 55 4c 4c 73 20 6f 6e 20  nce of NULLs on 
dc60: 74 68 65 20 52 48 53 2e 0a 2a 2a 0a 2a 2a 20 46  the RHS..**.** F
dc70: 6f 72 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45  or a SELECT or E
dc80: 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 2c 20  XISTS operator, 
dc90: 72 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  return the regis
dca0: 74 65 72 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ter that holds t
dcb0: 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 20 46  he.** result.  F
dcc0: 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20  or IN operators 
dcd0: 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  or if an error o
dce0: 63 63 75 72 73 2c 20 74 68 65 20 72 65 74 75 72  ccurs, the retur
dcf0: 6e 20 76 61 6c 75 65 20 69 73 20 30 2e 0a 2a 2f  n value is 0..*/
dd00: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
dd10: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e  OMIT_SUBQUERY.in
dd20: 74 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62  t sqlite3CodeSub
dd30: 73 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  select(.  Parse 
dd40: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
dd50: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
dd60: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
dd70: 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
dd80: 20 20 2f 2a 20 54 68 65 20 49 4e 2c 20 53 45 4c    /* The IN, SEL
dd90: 45 43 54 2c 20 6f 72 20 45 58 49 53 54 53 20 6f  ECT, or EXISTS o
dda0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  perator */.  int
ddb0: 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 20   rMayHaveNull,  
ddc0: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
ddd0: 20 74 68 61 74 20 72 65 63 6f 72 64 73 20 77 68   that records wh
dde0: 65 74 68 65 72 20 4e 55 4c 4c 73 20 65 78 69 73  ether NULLs exis
ddf0: 74 20 69 6e 20 52 48 53 20 2a 2f 0a 20 20 69 6e  t in RHS */.  in
de00: 74 20 69 73 52 6f 77 69 64 20 20 20 20 20 20 20  t isRowid       
de10: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
de20: 2c 20 4c 48 53 20 6f 66 20 49 4e 20 6f 70 65 72  , LHS of IN oper
de30: 61 74 6f 72 20 69 73 20 61 20 72 6f 77 69 64 20  ator is a rowid 
de40: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 74 65 73 74  */.){.  int test
de50: 41 64 64 72 20 3d 20 2d 31 3b 20 20 20 20 20 20  Addr = -1;      
de60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de70: 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74  /* One-time test
de80: 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 69 6e   address */.  in
de90: 74 20 72 52 65 67 20 3d 20 30 3b 20 20 20 20 20  t rReg = 0;     
dea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
deb0: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
dec0: 72 20 73 74 6f 72 69 6e 67 20 72 65 73 75 6c 74  r storing result
ded0: 69 6e 67 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ing */.  Vdbe *v
dee0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
def0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
df00: 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72   NEVER(v==0) ) r
df10: 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74  eturn 0;.  sqlit
df20: 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
df30: 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 54  pParse);..  /* T
df40: 68 69 73 20 63 6f 64 65 20 6d 75 73 74 20 62 65  his code must be
df50: 20 72 75 6e 20 69 6e 20 69 74 73 20 65 6e 74 69   run in its enti
df60: 72 65 74 79 20 65 76 65 72 79 20 74 69 6d 65 20  rety every time 
df70: 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  it is encountere
df80: 64 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 6f 66  d.  ** if any of
df90: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
dfa0: 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a  s true:.  **.  *
dfb0: 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68  *    *  The righ
dfc0: 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61  t-hand side is a
dfd0: 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71   correlated subq
dfe0: 75 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20  uery.  **    *  
dff0: 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
e000: 69 64 65 20 69 73 20 61 6e 20 65 78 70 72 65 73  ide is an expres
e010: 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69  sion list contai
e020: 6e 69 6e 67 20 76 61 72 69 61 62 6c 65 73 0a 20  ning variables. 
e030: 20 2a 2a 20 20 20 20 2a 20 20 57 65 20 61 72 65   **    *  We are
e040: 20 69 6e 73 69 64 65 20 61 20 74 72 69 67 67 65   inside a trigge
e050: 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61  r.  **.  ** If a
e060: 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20  ll of the above 
e070: 61 72 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20  are false, then 
e080: 77 65 20 63 61 6e 20 72 75 6e 20 74 68 69 73 20  we can run this 
e090: 63 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20  code just once. 
e0a0: 20 2a 2a 20 73 61 76 65 20 74 68 65 20 72 65 73   ** save the res
e0b0: 75 6c 74 73 2c 20 61 6e 64 20 72 65 75 73 65 20  ults, and reuse 
e0c0: 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 20  the same result 
e0d0: 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e  on subsequent in
e0e0: 76 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  vocations..  */.
e0f0: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 41 6e    if( !ExprHasAn
e100: 79 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  yProperty(pExpr,
e110: 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20 29   EP_VarSelect) )
e120: 7b 0a 20 20 20 20 74 65 73 74 41 64 64 72 20 3d  {.    testAddr =
e130: 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65   sqlite3CodeOnce
e140: 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 23  (pParse);.  }..#
e150: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e160: 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 66 28  IT_EXPLAIN.  if(
e170: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
e180: 3d 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==2 ){.    char 
e190: 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d  *zMsg = sqlite3M
e1a0: 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
e1b0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 45 58 45  pParse->db, "EXE
e1c0: 43 55 54 45 20 25 73 25 73 20 53 55 42 51 55 45  CUTE %s%s SUBQUE
e1d0: 52 59 20 25 64 22 2c 20 74 65 73 74 41 64 64 72  RY %d", testAddr
e1e0: 3e 3d 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54  >=0?"":"CORRELAT
e1f0: 45 44 20 22 2c 0a 20 20 20 20 20 20 20 20 70 45  ED ",.        pE
e200: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f 22  xpr->op==TK_IN?"
e210: 4c 49 53 54 22 3a 22 53 43 41 4c 41 52 22 2c 20  LIST":"SCALAR", 
e220: 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
e230: 65 63 74 49 64 0a 20 20 20 20 29 3b 0a 20 20 20  ectId.    );.   
e240: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e250: 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  p4(v, OP_Explain
e260: 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  , pParse->iSelec
e270: 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c  tId, 0, 0, zMsg,
e280: 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
e290: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 77 69 74  }.#endif..  swit
e2a0: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
e2b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
e2c0: 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 61 66   {.      char af
e2d0: 66 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20 20  finity;         
e2e0: 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
e2f0: 20 6f 66 20 74 68 65 20 4c 48 53 20 6f 66 20 74   of the LHS of t
e300: 68 65 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 4b  he IN */.      K
e310: 65 79 49 6e 66 6f 20 6b 65 79 49 6e 66 6f 3b 20  eyInfo keyInfo; 
e320: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65             /* Ke
e330: 79 69 6e 66 6f 20 66 6f 72 20 74 68 65 20 67 65  yinfo for the ge
e340: 6e 65 72 61 74 65 64 20 74 61 62 6c 65 20 2a 2f  nerated table */
e350: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 75 38  .      static u8
e360: 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 20   sortOrder = 0; 
e370: 20 20 20 2f 2a 20 46 61 6b 65 20 61 53 6f 72 74     /* Fake aSort
e380: 4f 72 64 65 72 20 66 6f 72 20 6b 65 79 49 6e 66  Order for keyInf
e390: 6f 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  o */.      int a
e3a0: 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ddr;            
e3b0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
e3c0: 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65  s of OP_OpenEphe
e3d0: 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
e3e0: 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  n */.      Expr 
e3f0: 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
e400: 70 4c 65 66 74 3b 20 2f 2a 20 74 68 65 20 4c 48  pLeft; /* the LH
e410: 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
e420: 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 69  ator */..      i
e430: 66 28 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  f( rMayHaveNull 
e440: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
e450: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
e460: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 4d 61 79  OP_Null, 0, rMay
e470: 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  HaveNull);.     
e480: 20 7d 0a 0a 20 20 20 20 20 20 61 66 66 69 6e 69   }..      affini
e490: 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ty = sqlite3Expr
e4a0: 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 3b  Affinity(pLeft);
e4b0: 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68  ..      /* Wheth
e4c0: 65 72 20 74 68 69 73 20 69 73 20 61 6e 20 27 78  er this is an 'x
e4d0: 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20   IN(SELECT...)' 
e4e0: 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65 78 70  or an 'x IN(<exp
e4f0: 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20 20 2a  rlist>)'.      *
e500: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 74 20  * expression it 
e510: 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65 20 73  is handled the s
e520: 61 6d 65 20 77 61 79 2e 20 20 41 6e 20 65 70 68  ame way.  An eph
e530: 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 73 20  emeral table is 
e540: 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64  .      ** filled
e550: 20 77 69 74 68 20 73 69 6e 67 6c 65 2d 66 69 65   with single-fie
e560: 6c 64 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65  ld index keys re
e570: 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72  presenting the r
e580: 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20  esults.      ** 
e590: 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20  from the SELECT 
e5a0: 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74  or the <exprlist
e5b0: 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  >..      **.    
e5c0: 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20    ** If the 'x' 
e5d0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
e5e0: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72  column value, or
e5f0: 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20   the SELECT.... 
e600: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
e610: 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75  t returns a colu
e620: 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  mn value, then t
e630: 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  he affinity of t
e640: 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  hat.      ** col
e650: 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62  umn is used to b
e660: 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b  uild the index k
e670: 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27  eys. If both 'x'
e680: 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a   and the.      *
e690: 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  * SELECT... stat
e6a0: 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
e6b0: 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
e6c0: 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64  affinity is used
e6d0: 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74  .      ** if eit
e6e0: 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e  her column has N
e6f0: 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45  UMERIC or INTEGE
e700: 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e  R affinity. If n
e710: 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20  either.      ** 
e720: 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45  'x' nor the SELE
e730: 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20  CT... statement 
e740: 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  are columns, the
e750: 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  n numeric affini
e760: 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75  ty.      ** is u
e770: 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sed..      */.  
e780: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
e790: 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  e = pParse->nTab
e7a0: 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  ++;.      addr =
e7b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e7c0: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
e7d0: 65 6d 65 72 61 6c 2c 20 70 45 78 70 72 2d 3e 69  emeral, pExpr->i
e7e0: 54 61 62 6c 65 2c 20 21 69 73 52 6f 77 69 64 29  Table, !isRowid)
e7f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 4d 61 79  ;.      if( rMay
e800: 48 61 76 65 4e 75 6c 6c 3d 3d 30 20 29 20 73 71  HaveNull==0 ) sq
e810: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
e820: 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44  5(v, BTREE_UNORD
e830: 45 52 45 44 29 3b 0a 20 20 20 20 20 20 6d 65 6d  ERED);.      mem
e840: 73 65 74 28 26 6b 65 79 49 6e 66 6f 2c 20 30 2c  set(&keyInfo, 0,
e850: 20 73 69 7a 65 6f 66 28 6b 65 79 49 6e 66 6f 29   sizeof(keyInfo)
e860: 29 3b 0a 20 20 20 20 20 20 6b 65 79 49 6e 66 6f  );.      keyInfo
e870: 2e 6e 46 69 65 6c 64 20 3d 20 31 3b 0a 20 20 20  .nField = 1;.   
e880: 20 20 20 6b 65 79 49 6e 66 6f 2e 61 53 6f 72 74     keyInfo.aSort
e890: 4f 72 64 65 72 20 3d 20 26 73 6f 72 74 4f 72 64  Order = &sortOrd
e8a0: 65 72 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 45  er;..      if( E
e8b0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
e8c0: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
e8d0: 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ct) ){.        /
e8e0: 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20 65 78  * Case 1:     ex
e8f0: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
e900: 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  .).        **.  
e910: 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74        ** Generat
e920: 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20  e code to write 
e930: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
e940: 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74  he select into t
e950: 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  he temporary.   
e960: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c       ** table al
e970: 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e  located and open
e980: 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20  ed above..      
e990: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c    */.        Sel
e9a0: 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20  ectDest dest;.  
e9b0: 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
e9c0: 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20 20  pEList;..       
e9d0: 20 61 73 73 65 72 74 28 20 21 69 73 52 6f 77 69   assert( !isRowi
e9e0: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  d );.        sql
e9f0: 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
ea00: 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 53 65  it(&dest, SRT_Se
ea10: 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
ea20: 29 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e  );.        dest.
ea30: 61 66 66 53 64 73 74 20 3d 20 28 75 38 29 61 66  affSdst = (u8)af
ea40: 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20  finity;.        
ea50: 61 73 73 65 72 74 28 20 28 70 45 78 70 72 2d 3e  assert( (pExpr->
ea60: 69 54 61 62 6c 65 26 30 78 30 30 30 30 46 46 46  iTable&0x0000FFF
ea70: 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  F)==pExpr->iTabl
ea80: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78  e );.        pEx
ea90: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 69  pr->x.pSelect->i
eaa0: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
eab0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
eac0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78  lect(pParse, pEx
ead0: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26  pr->x.pSelect, &
eae0: 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  dest) ){.       
eaf0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
eb00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
eb10: 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  EList = pExpr->x
eb20: 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
eb30: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 41 4c  ;.        if( AL
eb40: 57 41 59 53 28 70 45 4c 69 73 74 21 3d 30 20 26  WAYS(pEList!=0 &
eb50: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  & pEList->nExpr>
eb60: 30 29 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20  0) ){ .         
eb70: 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30   keyInfo.aColl[0
eb80: 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  ] = sqlite3Binar
eb90: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
eba0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
ebb0: 4c 65 66 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Left,.          
ebc0: 20 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d      pEList->a[0]
ebd0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
ebe0: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
ebf0: 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d  f( ALWAYS(pExpr-
ec00: 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20 29 7b 0a  >x.pList!=0) ){.
ec10: 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20          /* Case 
ec20: 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28  2:     expr IN (
ec30: 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20  exprlist).      
ec40: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
ec50: 46 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73  For each express
ec60: 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e  ion, build an in
ec70: 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65  dex key from the
ec80: 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a   evaluation and.
ec90: 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65          ** store
eca0: 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f   it in the tempo
ecb0: 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c  rary table. If <
ecc0: 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d  expr> is a colum
ecd0: 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20  n, then use.    
ece0: 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75      ** that colu
ecf0: 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68 65  mns affinity whe
ed00: 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65 78  n building index
ed10: 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72 3e   keys. If <expr>
ed20: 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20   is not.        
ed30: 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65  ** a column, use
ed40: 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
ed50: 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  y..        */.  
ed60: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
ed70: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
ed80: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
ed90: 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 73  pList;.        s
eda0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
edb0: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
edc0: 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20      int r1, r2, 
edd0: 72 33 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  r3;..        if(
ede0: 20 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20   !affinity ){.  
edf0: 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79          affinity
ee00: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
ee10: 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
ee20: 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43        keyInfo.aC
ee30: 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33  oll[0] = sqlite3
ee40: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
ee50: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
ee60: 29 3b 0a 20 20 20 20 20 20 20 20 6b 65 79 49 6e  );.        keyIn
ee70: 66 6f 2e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  fo.aSortOrder = 
ee80: 26 73 6f 72 74 4f 72 64 65 72 3b 0a 0a 20 20 20  &sortOrder;..   
ee90: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72       /* Loop thr
eea0: 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73  ough each expres
eeb0: 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73  sion in <exprlis
eec0: 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  t>. */.        r
eed0: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
eee0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
eef0: 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69         r2 = sqli
ef00: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
ef10: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
ef20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ef30: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
ef40: 72 32 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  r2);.        for
ef50: 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  (i=pList->nExpr,
ef60: 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b   pItem=pList->a;
ef70: 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d   i>0; i--, pItem
ef80: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  ++){.          E
ef90: 78 70 72 20 2a 70 45 32 20 3d 20 70 49 74 65 6d  xpr *pE2 = pItem
efa0: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
efb0: 20 20 20 69 6e 74 20 69 56 61 6c 54 6f 49 6e 73     int iValToIns
efc0: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
efd0: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
efe0: 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e  n is not constan
eff0: 74 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e  t then we will n
f000: 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20  eed to.         
f010: 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20   ** disable the 
f020: 74 65 73 74 20 74 68 61 74 20 77 61 73 20 67 65  test that was ge
f030: 6e 65 72 61 74 65 64 20 61 62 6f 76 65 20 74 68  nerated above th
f040: 61 74 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20  at makes sure.  
f050: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
f060: 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74  code only execut
f070: 65 73 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73  es once.  Becaus
f080: 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73  e for a non-cons
f090: 74 61 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a  tant.          *
f0a0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77 65 20  * expression we 
f0b0: 6e 65 65 64 20 74 6f 20 72 65 72 75 6e 20 74 68  need to rerun th
f0c0: 69 73 20 63 6f 64 65 20 65 61 63 68 20 74 69 6d  is code each tim
f0d0: 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
f0e0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 74 65            if( te
f0f0: 73 74 41 64 64 72 3e 3d 30 20 26 26 20 21 73 71  stAddr>=0 && !sq
f100: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
f110: 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20  ant(pE2) ){.    
f120: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
f130: 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
f140: 76 2c 20 74 65 73 74 41 64 64 72 29 3b 0a 20 20  v, testAddr);.  
f150: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 41 64            testAd
f160: 64 72 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  dr = -1;.       
f170: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
f180: 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20  /* Evaluate the 
f190: 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69  expression and i
f1a0: 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68  nsert it into th
f1b0: 65 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a  e temp table */.
f1c0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73            if( is
f1d0: 52 6f 77 69 64 20 26 26 20 73 71 6c 69 74 65 33  Rowid && sqlite3
f1e0: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45  ExprIsInteger(pE
f1f0: 32 2c 20 26 69 56 61 6c 54 6f 49 6e 73 29 20 29  2, &iValToIns) )
f200: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
f210: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
f220: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 49 6e 74 2c  v, OP_InsertInt,
f230: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
f240: 72 32 2c 20 69 56 61 6c 54 6f 49 6e 73 29 3b 0a  r2, iValToIns);.
f250: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
f260: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 33 20  .            r3 
f270: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
f280: 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
f290: 70 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  pE2, r1);.      
f2a0: 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69        if( isRowi
f2b0: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d ){.           
f2c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f2d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp2(v, OP_MustB
f2e0: 65 49 6e 74 2c 20 72 33 2c 0a 20 20 20 20 20 20  eInt, r3,.      
f2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f300: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f310: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
f320: 28 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 20 20  (v)+2);.        
f330: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f340: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
f350: 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  sert, pExpr->iTa
f360: 62 6c 65 2c 20 72 32 2c 20 72 33 29 3b 0a 20 20  ble, r2, r3);.  
f370: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
f380: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
f390: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
f3a0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
f3b0: 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c 20 26 61  d, r3, 1, r2, &a
f3c0: 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20  ffinity, 1);.   
f3d0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
f3e0: 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
f3f0: 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
f400: 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20 20 20 20  , r3, 1);.      
f410: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
f420: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f430: 49 64 78 49 6e 73 65 72 74 2c 20 70 45 78 70 72  IdxInsert, pExpr
f440: 2d 3e 69 54 61 62 6c 65 2c 20 72 32 29 3b 0a 20  ->iTable, r2);. 
f450: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
f460: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f470: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
f480: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
f490: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
f4a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
f4b0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
f4c0: 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d  se, r2);.      }
f4d0: 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 52 6f  .      if( !isRo
f4e0: 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 73  wid ){.        s
f4f0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
f500: 50 34 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69  P4(v, addr, (voi
f510: 64 20 2a 29 26 6b 65 79 49 6e 66 6f 2c 20 50 34  d *)&keyInfo, P4
f520: 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
f530: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
f540: 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
f550: 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63  TK_EXISTS:.    c
f560: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20  ase TK_SELECT:. 
f570: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
f580: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 68      /* If this h
f590: 61 73 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61  as to be a scala
f5a0: 72 20 53 45 4c 45 43 54 2e 20 20 47 65 6e 65 72  r SELECT.  Gener
f5b0: 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20  ate code to put 
f5c0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c  the.      ** val
f5d0: 75 65 20 6f 66 20 74 68 69 73 20 73 65 6c 65 63  ue of this selec
f5e0: 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65  t in a memory ce
f5f0: 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68  ll and record th
f600: 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a  e number.      *
f610: 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20  * of the memory 
f620: 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e  cell in iColumn.
f630: 20 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20    If this is an 
f640: 45 58 49 53 54 53 2c 20 77 72 69 74 65 0a 20 20  EXISTS, write.  
f650: 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65      ** an intege
f660: 72 20 30 20 28 6e 6f 74 20 65 78 69 73 74 73 29  r 0 (not exists)
f670: 20 6f 72 20 31 20 28 65 78 69 73 74 73 29 20 69   or 1 (exists) i
f680: 6e 74 6f 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c  nto a memory cel
f690: 6c 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72  l.      ** and r
f6a0: 65 63 6f 72 64 20 74 68 61 74 20 6d 65 6d 6f 72  ecord that memor
f6b0: 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d  y cell in iColum
f6c0: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
f6d0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20    Select *pSel; 
f6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6f0: 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43          /* SELEC
f700: 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65  T statement to e
f710: 6e 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 53  ncode */.      S
f720: 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20  electDest dest; 
f730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f740: 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64       /* How to d
f750: 65 61 6c 20 77 69 74 68 20 53 45 4c 45 43 74 20  eal with SELECt 
f760: 72 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 20 20 20  result */..     
f770: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
f780: 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20  ->op==TK_EXISTS 
f790: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
f7a0: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
f7b0: 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20  _SELECT );.     
f7c0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
f7d0: 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 7c 7c  op==TK_EXISTS ||
f7e0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
f7f0: 45 4c 45 43 54 20 29 3b 0a 0a 20 20 20 20 20 20  ELECT );..      
f800: 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50  assert( ExprHasP
f810: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
f820: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
f830: 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70 45 78        pSel = pEx
f840: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20  pr->x.pSelect;. 
f850: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
f860: 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
f870: 2c 20 30 2c 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  , 0, ++pParse->n
f880: 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Mem);.      if( 
f890: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
f8a0: 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LECT ){.        
f8b0: 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
f8c0: 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 73 71  _Mem;.        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 4e 75 6c 6c 2c 20 30 2c 20 64  v, OP_Null, 0, d
f8f0: 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20  est.iSDParm);.  
f900: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
f910: 74 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62 71  t((v, "Init subq
f920: 75 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a  uery result"));.
f930: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f940: 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20       dest.eDest 
f950: 3d 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20  = SRT_Exists;.  
f960: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f970: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
f980: 74 65 67 65 72 2c 20 30 2c 20 64 65 73 74 2e 69  teger, 0, dest.i
f990: 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20  SDParm);.       
f9a0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
f9b0: 20 22 49 6e 69 74 20 45 58 49 53 54 53 20 72 65   "Init EXISTS re
f9c0: 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d  sult"));.      }
f9d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
f9e0: 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
f9f0: 3e 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69  >db, pSel->pLimi
fa00: 74 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e  t);.      pSel->
fa10: 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  pLimit = sqlite3
fa20: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
fa30: 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c 0a  _INTEGER, 0, 0,.
fa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa60: 20 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b    &sqlite3IntTok
fa70: 65 6e 73 5b 31 5d 29 3b 0a 20 20 20 20 20 20 70  ens[1]);.      p
fa80: 53 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b  Sel->iLimit = 0;
fa90: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
faa0: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
fab0: 20 70 53 65 6c 2c 20 26 64 65 73 74 29 20 29 7b   pSel, &dest) ){
fac0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
fad0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
fae0: 20 72 52 65 67 20 3d 20 64 65 73 74 2e 69 53 44   rReg = dest.iSD
faf0: 50 61 72 6d 3b 0a 20 20 20 20 20 20 45 78 70 72  Parm;.      Expr
fb00: 53 65 74 49 72 72 65 64 75 63 69 62 6c 65 28 70  SetIrreducible(p
fb10: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 62 72 65  Expr);.      bre
fb20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
fb30: 20 69 66 28 20 74 65 73 74 41 64 64 72 3e 3d 30   if( testAddr>=0
fb40: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
fb50: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 74  dbeJumpHere(v, t
fb60: 65 73 74 41 64 64 72 29 3b 0a 20 20 7d 0a 20 20  estAddr);.  }.  
fb70: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
fb80: 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a  Pop(pParse, 1);.
fb90: 0a 20 20 72 65 74 75 72 6e 20 72 52 65 67 3b 0a  .  return rReg;.
fba0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
fbb0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
fbc0: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
fbd0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
fbe0: 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  Y./*.** Generate
fbf0: 20 63 6f 64 65 20 66 6f 72 20 61 6e 20 49 4e 20   code for an IN 
fc00: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
fc10: 2a 20 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c  *      x IN (SEL
fc20: 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20 20  ECT ...).**     
fc30: 20 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61   x IN (value, va
fc40: 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20  lue, ...).**.** 
fc50: 54 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69  The left-hand si
fc60: 64 65 20 28 4c 48 53 29 20 69 73 20 61 20 73 63  de (LHS) is a sc
fc70: 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 2e  alar expression.
fc80: 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
fc90: 20 73 69 64 65 20 28 52 48 53 29 0a 2a 2a 20 69   side (RHS).** i
fca0: 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65  s an array of ze
fcb0: 72 6f 20 6f 72 20 6d 6f 72 65 20 76 61 6c 75 65  ro or more value
fcc0: 73 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69  s.  The expressi
fcd0: 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20 74 68  on is true if th
fce0: 65 20 4c 48 53 20 69 73 0a 2a 2a 20 63 6f 6e 74  e LHS is.** cont
fcf0: 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65  ained within the
fd00: 20 52 48 53 2e 20 20 54 68 65 20 76 61 6c 75 65   RHS.  The value
fd10: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
fd20: 6f 6e 20 69 73 20 75 6e 6b 6e 6f 77 6e 20 28 4e  on is unknown (N
fd30: 55 4c 4c 29 0a 2a 2a 20 69 66 20 74 68 65 20 4c  ULL).** if the L
fd40: 48 53 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66  HS is NULL or if
fd50: 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20   the LHS is not 
fd60: 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
fd70: 20 74 68 65 20 52 48 53 20 61 6e 64 20 74 68 65   the RHS and the
fd80: 0a 2a 2a 20 52 48 53 20 63 6f 6e 74 61 69 6e 73  .** RHS contains
fd90: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c   one or more NUL
fda0: 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20  L values..**.** 
fdb0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
fdc0: 65 72 61 74 65 73 20 63 6f 64 65 20 77 69 6c 6c  erates code will
fdd0: 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66 46   jump to destIfF
fde0: 61 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53 20  alse if the LHS 
fdf0: 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61  is not .** conta
fe00: 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ined within the 
fe10: 52 48 53 2e 20 20 49 66 20 64 75 65 20 74 6f 20  RHS.  If due to 
fe20: 4e 55 4c 4c 73 20 77 65 20 63 61 6e 6e 6f 74 20  NULLs we cannot 
fe30: 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
fe40: 20 4c 48 53 0a 2a 2a 20 69 73 20 63 6f 6e 74 61   LHS.** is conta
fe50: 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 20  ined in the RHS 
fe60: 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 64 65 73  then jump to des
fe70: 74 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65  tIfNull.  If the
fe80: 20 4c 48 53 20 69 73 20 63 6f 6e 74 61 69 6e 65   LHS is containe
fe90: 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  d.** within the 
fea0: 52 48 53 20 74 68 65 6e 20 66 61 6c 6c 20 74 68  RHS then fall th
feb0: 72 6f 75 67 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  rough..*/.static
fec0: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70   void sqlite3Exp
fed0: 72 43 6f 64 65 49 4e 28 0a 20 20 50 61 72 73 65  rCodeIN(.  Parse
fee0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
fef0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
ff00: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
ff10: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
ff20: 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
ff30: 20 20 20 2f 2a 20 54 68 65 20 49 4e 20 65 78 70     /* The IN exp
ff40: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ression */.  int
ff50: 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 20 20   destIfFalse,   
ff60: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
ff70: 69 66 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f  if LHS is not co
ff80: 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52  ntained in the R
ff90: 48 53 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  HS */.  int dest
ffa0: 49 66 4e 75 6c 6c 20 20 20 20 20 20 20 20 2f 2a  IfNull        /*
ffb0: 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68   Jump here if th
ffc0: 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e  e results are un
ffd0: 6b 6e 6f 77 6e 20 64 75 65 20 74 6f 20 4e 55 4c  known due to NUL
ffe0: 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  Ls */.){.  int r
fff0: 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 20  RhsHasNull = 0; 
10000 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 61   /* Register tha
10010 74 20 69 73 20 74 72 75 65 20 69 66 20 52 48 53  t is true if RHS
10020 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76   contains NULL v
10030 61 6c 75 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  alues */.  char 
10040 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20 20  affinity;       
10050 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 61   /* Comparison a
10060 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20 2a  ffinity to use *
10070 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20  /.  int eType;  
10080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70            /* Typ
10090 65 20 6f 66 20 74 68 65 20 52 48 53 20 2a 2f 0a  e of the RHS */.
100a0 20 20 69 6e 74 20 72 31 3b 20 20 20 20 20 20 20    int r1;       
100b0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
100c0 72 61 72 79 20 75 73 65 20 72 65 67 69 73 74 65  rary use registe
100d0 72 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  r */.  Vdbe *v; 
100e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
100f0 53 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20  Statement under 
10100 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
10110 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
10120 65 20 52 48 53 2e 20 20 20 41 66 74 65 72 20 74  e RHS.   After t
10130 68 69 73 20 73 74 65 70 2c 20 74 68 65 20 74 61  his step, the ta
10140 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 0a  ble with cursor.
10150 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54 61 62    ** pExpr->iTab
10160 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 73  le will contains
10170 20 74 68 65 20 76 61 6c 75 65 73 20 74 68 61 74   the values that
10180 20 6d 61 6b 65 20 75 70 20 74 68 65 20 52 48 53   make up the RHS
10190 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61  ..  */.  v = pPa
101a0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
101b0 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20  sert( v!=0 );   
101c0 20 20 20 20 2f 2a 20 4f 4f 4d 20 64 65 74 65 63      /* OOM detec
101d0 74 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 69  ted prior to thi
101e0 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 56  s routine */.  V
101f0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
10200 76 2c 20 22 62 65 67 69 6e 20 49 4e 20 65 78 70  v, "begin IN exp
10210 72 22 29 29 3b 0a 20 20 65 54 79 70 65 20 3d 20  r"));.  eType = 
10220 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
10230 65 78 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ex(pParse, pExpr
10240 2c 20 26 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b  , &rRhsHasNull);
10250 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
10260 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74  t the affinity t
10270 6f 20 75 73 65 20 74 6f 20 63 72 65 61 74 65 20  o use to create 
10280 61 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 72  a key from the r
10290 65 73 75 6c 74 73 0a 20 20 2a 2a 20 6f 66 20 74  esults.  ** of t
102a0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 61  he expression. a
102b0 66 66 69 6e 69 74 79 53 74 72 20 73 74 6f 72 65  ffinityStr store
102c0 73 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e  s a static strin
102d0 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0a 20  g suitable for. 
102e0 20 2a 2a 20 50 34 20 6f 66 20 4f 50 5f 4d 61 6b   ** P4 of OP_Mak
102f0 65 52 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a 20 20  eRecord..  */.  
10300 61 66 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61  affinity = compa
10310 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45  risonAffinity(pE
10320 78 70 72 29 3b 0a 0a 20 20 2f 2a 20 43 6f 64 65  xpr);..  /* Code
10330 20 74 68 65 20 4c 48 53 2c 20 74 68 65 20 3c 65   the LHS, the <e
10340 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72  xpr> from "<expr
10350 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 0a 20 20 2a  > IN (...)"..  *
10360 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  /.  sqlite3ExprC
10370 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
10380 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33  ;.  r1 = sqlite3
10390 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
103a0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  e);.  sqlite3Exp
103b0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
103c0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 72 31 29 3b  xpr->pLeft, r1);
103d0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4c 48  ..  /* If the LH
103e0 53 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  S is NULL, then 
103f0 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 65 69  the result is ei
10400 74 68 65 72 20 66 61 6c 73 65 20 6f 72 20 4e 55  ther false or NU
10410 4c 4c 20 64 65 70 65 6e 64 69 6e 67 0a 20 20 2a  LL depending.  *
10420 2a 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68 65  * on whether the
10430 20 52 48 53 20 69 73 20 65 6d 70 74 79 20 6f 72   RHS is empty or
10440 20 6e 6f 74 2c 20 72 65 73 70 65 63 74 69 76 65   not, respective
10450 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ly..  */.  if( d
10460 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49  estIfNull==destI
10470 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 2f 2a  fFalse ){.    /*
10480 20 53 68 6f 72 74 63 75 74 20 66 6f 72 20 74 68   Shortcut for th
10490 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
104a0 65 72 65 20 74 68 65 20 66 61 6c 73 65 20 61 6e  ere the false an
104b0 64 20 4e 55 4c 4c 20 6f 75 74 63 6f 6d 65 73 20  d NULL outcomes 
104c0 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  are.    ** the s
104d0 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ame. */.    sqli
104e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
104f0 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20   OP_IsNull, r1, 
10500 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d  destIfNull);.  }
10510 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 61 64  else{.    int ad
10520 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
10530 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f  eAddOp1(v, OP_No
10540 74 4e 75 6c 6c 2c 20 72 31 29 3b 0a 20 20 20 20  tNull, r1);.    
10550 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10560 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
10570 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64  pExpr->iTable, d
10580 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20  estIfFalse);.   
10590 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
105a0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
105b0 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
105c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
105d0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
105e0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 54 79  ;.  }..  if( eTy
105f0 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  pe==IN_INDEX_ROW
10600 49 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  ID ){.    /* In 
10610 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 52  this case, the R
10620 48 53 20 69 73 20 74 68 65 20 52 4f 57 49 44 20  HS is the ROWID 
10630 6f 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65 0a  of table b-tree.
10640 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
10650 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10660 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 31  OP_MustBeInt, r1
10670 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
10680 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10690 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45  ddOp3(v, OP_NotE
106a0 78 69 73 74 73 2c 20 70 45 78 70 72 2d 3e 69 54  xists, pExpr->iT
106b0 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73  able, destIfFals
106c0 65 2c 20 72 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  e, r1);.  }else{
106d0 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20  .    /* In this 
106e0 63 61 73 65 2c 20 74 68 65 20 52 48 53 20 69 73  case, the RHS is
106f0 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65   an index b-tree
10700 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
10710 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
10720 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 72  , OP_Affinity, r
10730 31 2c 20 31 2c 20 30 2c 20 26 61 66 66 69 6e 69  1, 1, 0, &affini
10740 74 79 2c 20 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  ty, 1);..    /* 
10750 49 66 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65  If the set membe
10760 72 73 68 69 70 20 74 65 73 74 20 66 61 69 6c 73  rship test fails
10770 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
10780 74 20 6f 66 20 74 68 65 20 0a 20 20 20 20 2a 2a  t of the .    **
10790 20 22 78 20 49 4e 20 28 2e 2e 2e 29 22 20 65 78   "x IN (...)" ex
107a0 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65  pression must be
107b0 20 65 69 74 68 65 72 20 30 20 6f 72 20 4e 55 4c   either 0 or NUL
107c0 4c 2e 20 49 66 20 74 68 65 20 73 65 74 0a 20 20  L. If the set.  
107d0 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f    ** contains no
107e0 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68   NULL values, th
107f0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  en the result is
10800 20 30 2e 20 49 66 20 74 68 65 20 73 65 74 20 0a   0. If the set .
10810 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20      ** contains 
10820 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c  one or more NULL
10830 20 76 61 6c 75 65 73 2c 20 74 68 65 6e 20 74 68   values, then th
10840 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a  e result of the.
10850 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
10860 6e 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 0a  n is also NULL..
10870 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
10880 52 68 73 48 61 73 4e 75 6c 6c 3d 3d 30 20 7c 7c  RhsHasNull==0 ||
10890 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65   destIfFalse==de
108a0 73 74 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  stIfNull ){.    
108b0 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
108c0 20 72 75 6e 73 20 69 66 20 69 74 20 69 73 20 6b   runs if it is k
108d0 6e 6f 77 6e 20 61 74 20 63 6f 6d 70 69 6c 65 20  nown at compile 
108e0 74 69 6d 65 20 74 68 61 74 20 74 68 65 20 52 48  time that the RH
108f0 53 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 6e 6f  S.      ** canno
10900 74 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 20 76  t contain NULL v
10910 61 6c 75 65 73 2e 20 54 68 69 73 20 68 61 70 70  alues. This happ
10920 65 6e 73 20 61 73 20 74 68 65 20 72 65 73 75 6c  ens as the resul
10930 74 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20  t.      ** of a 
10940 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74  "NOT NULL" const
10950 72 61 69 6e 74 20 69 6e 20 74 68 65 20 64 61 74  raint in the dat
10960 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20  abase schema..  
10970 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
10980 41 6c 73 6f 20 72 75 6e 20 74 68 69 73 20 62 72  Also run this br
10990 61 6e 63 68 20 69 66 20 4e 55 4c 4c 20 69 73 20  anch if NULL is 
109a0 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 46 41  equivalent to FA
109b0 4c 53 45 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  LSE.      ** for
109c0 20 74 68 69 73 20 70 61 72 74 69 63 75 6c 61 72   this particular
109d0 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20   IN operator..  
109e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
109f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
10a00 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  t(v, OP_NotFound
10a10 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
10a20 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31   destIfFalse, r1
10a30 2c 20 31 29 3b 0a 0a 20 20 20 20 7d 65 6c 73 65  , 1);..    }else
10a40 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68  {.      /* In th
10a50 69 73 20 62 72 61 6e 63 68 2c 20 74 68 65 20 52  is branch, the R
10a60 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6d 69 67  HS of the IN mig
10a70 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c  ht contain a NUL
10a80 4c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74  L and.      ** t
10a90 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 61  he presence of a
10aa0 20 4e 55 4c 4c 20 6f 6e 20 74 68 65 20 52 48 53   NULL on the RHS
10ab0 20 6d 61 6b 65 73 20 61 20 64 69 66 66 65 72 65   makes a differe
10ac0 6e 63 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20  nce in the.     
10ad0 20 2a 2a 20 6f 75 74 63 6f 6d 65 2e 0a 20 20 20   ** outcome..   
10ae0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
10af0 6a 31 2c 20 6a 32 2c 20 6a 33 3b 0a 0a 20 20 20  j1, j2, j3;..   
10b00 20 20 20 2f 2a 20 46 69 72 73 74 20 63 68 65 63     /* First chec
10b10 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
10b20 4c 48 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  LHS is contained
10b30 20 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66   in the RHS.  If
10b40 20 73 6f 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68   so,.      ** th
10b50 65 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  en the presence 
10b60 6f 66 20 4e 55 4c 4c 73 20 69 6e 20 74 68 65 20  of NULLs in the 
10b70 52 48 53 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  RHS does not mat
10b80 74 65 72 2c 20 73 6f 20 6a 75 6d 70 0a 20 20 20  ter, so jump.   
10b90 20 20 20 2a 2a 20 6f 76 65 72 20 61 6c 6c 20 6f     ** over all o
10ba0 66 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  f the code that 
10bb0 66 6f 6c 6c 6f 77 73 2e 0a 20 20 20 20 20 20 2a  follows..      *
10bc0 2f 0a 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c  /.      j1 = sql
10bd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
10be0 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70  t(v, OP_Found, p
10bf0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c  Expr->iTable, 0,
10c00 20 72 31 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20   r1, 1);..      
10c10 2f 2a 20 48 65 72 65 20 77 65 20 62 65 67 69 6e  /* Here we begin
10c20 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65   generating code
10c30 20 74 68 61 74 20 72 75 6e 73 20 69 66 20 74 68   that runs if th
10c40 65 20 4c 48 53 20 69 73 20 6e 6f 74 0a 20 20 20  e LHS is not.   
10c50 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20     ** contained 
10c60 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20  within the RHS. 
10c70 20 47 65 6e 65 72 61 74 65 20 61 64 64 69 74 69   Generate additi
10c80 6f 6e 61 6c 20 63 6f 64 65 20 74 68 61 74 0a 20  onal code that. 
10c90 20 20 20 20 20 2a 2a 20 74 65 73 74 73 20 74 68       ** tests th
10ca0 65 20 52 48 53 20 66 6f 72 20 4e 55 4c 4c 73 2e  e RHS for NULLs.
10cb0 20 20 49 66 20 74 68 65 20 52 48 53 20 63 6f 6e    If the RHS con
10cc0 74 61 69 6e 73 20 61 20 4e 55 4c 4c 20 74 68 65  tains a NULL the
10cd0 6e 0a 20 20 20 20 20 20 2a 2a 20 6a 75 6d 70 20  n.      ** jump 
10ce0 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20  to destIfNull.  
10cf0 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
10d00 4e 55 4c 4c 73 20 69 6e 20 74 68 65 20 52 48 53  NULLs in the RHS
10d10 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6a   then.      ** j
10d20 75 6d 70 20 74 6f 20 64 65 73 74 49 66 46 61 6c  ump to destIfFal
10d30 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  se..      */.   
10d40 20 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56     j2 = sqlite3V
10d50 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
10d60 4e 6f 74 4e 75 6c 6c 2c 20 72 52 68 73 48 61 73  NotNull, rRhsHas
10d70 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 6a 33 20  Null);.      j3 
10d80 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
10d90 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75  Op4Int(v, OP_Fou
10da0 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
10db0 65 2c 20 30 2c 20 72 52 68 73 48 61 73 4e 75 6c  e, 0, rRhsHasNul
10dc0 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  l, 1);.      sql
10dd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10de0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31  , OP_Integer, -1
10df0 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a  , rRhsHasNull);.
10e00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10e10 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 33 29  eJumpHere(v, j3)
10e20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10e30 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10e40 41 64 64 49 6d 6d 2c 20 72 52 68 73 48 61 73 4e  AddImm, rRhsHasN
10e50 75 6c 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  ull, 1);.      s
10e60 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
10e70 72 65 28 76 2c 20 6a 32 29 3b 0a 0a 20 20 20 20  re(v, j2);..    
10e80 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
10e90 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 61 72   appropriate tar
10ea0 67 65 74 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  get depending on
10eb0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a   whether or not.
10ec0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 52 48 53        ** the RHS
10ed0 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c   contains a NULL
10ee0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
10ef0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10f00 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 52 68 73  2(v, OP_If, rRhs
10f10 48 61 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e  HasNull, destIfN
10f20 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
10f30 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10f40 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73   OP_Goto, 0, des
10f50 74 49 66 46 61 6c 73 65 29 3b 0a 0a 20 20 20 20  tIfFalse);..    
10f60 20 20 2f 2a 20 54 68 65 20 4f 50 5f 46 6f 75 6e    /* The OP_Foun
10f70 64 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20  d at the top of 
10f80 74 68 69 73 20 62 72 61 6e 63 68 20 6a 75 6d 70  this branch jump
10f90 73 20 68 65 72 65 20 77 68 65 6e 20 74 72 75 65  s here when true
10fa0 2c 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 75 73  , .      ** caus
10fb0 69 6e 67 20 74 68 65 20 6f 76 65 72 61 6c 6c 20  ing the overall 
10fc0 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76  IN expression ev
10fd0 61 6c 75 61 74 69 6f 6e 20 74 6f 20 66 61 6c 6c  aluation to fall
10fe0 20 74 68 72 6f 75 67 68 2e 0a 20 20 20 20 20 20   through..      
10ff0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
11000 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
11010 6a 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  j1);.    }.  }. 
11020 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
11030 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
11040 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  1);.  sqlite3Exp
11050 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
11060 2c 20 31 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  , 1);.  VdbeComm
11070 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 49 4e 20  ent((v, "end IN 
11080 65 78 70 72 22 29 29 3b 0a 7d 0a 23 65 6e 64 69  expr"));.}.#endi
11090 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
110a0 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a  _SUBQUERY */../*
110b0 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 61 6e  .** Duplicate an
110c0 20 38 2d 62 79 74 65 20 76 61 6c 75 65 0a 2a 2f   8-byte value.*/
110d0 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 64 75  .static char *du
110e0 70 38 62 79 74 65 73 28 56 64 62 65 20 2a 76 2c  p8bytes(Vdbe *v,
110f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 6e 29   const char *in)
11100 7b 0a 20 20 63 68 61 72 20 2a 6f 75 74 20 3d 20  {.  char *out = 
11110 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
11120 61 77 28 73 71 6c 69 74 65 33 56 64 62 65 44 62  aw(sqlite3VdbeDb
11130 28 76 29 2c 20 38 29 3b 0a 20 20 69 66 28 20 6f  (v), 8);.  if( o
11140 75 74 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  ut ){.    memcpy
11150 28 6f 75 74 2c 20 69 6e 2c 20 38 29 3b 0a 20 20  (out, in, 8);.  
11160 7d 0a 20 20 72 65 74 75 72 6e 20 6f 75 74 3b 0a  }.  return out;.
11170 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
11180 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
11190 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  POINT./*.** Gene
111a0 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74  rate an instruct
111b0 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75  ion that will pu
111c0 74 20 74 68 65 20 66 6c 6f 61 74 69 6e 67 20 70  t the floating p
111d0 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65  oint.** value de
111e0 73 63 72 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e  scribed by z[0..
111f0 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74  n-1] into regist
11200 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54  er iMem..**.** T
11210 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69  he z[] string wi
11220 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20  ll probably not 
11230 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74  be zero-terminat
11240 65 64 2e 20 20 42 75 74 20 74 68 65 20 0a 2a 2a  ed.  But the .**
11250 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65 72 20   z[n] character 
11260 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
11270 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68   be something th
11280 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b  at does not look
11290 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e  .** like the con
112a0 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65  tinuation of the
112b0 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74   number..*/.stat
112c0 69 63 20 76 6f 69 64 20 63 6f 64 65 52 65 61 6c  ic void codeReal
112d0 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20  (Vdbe *v, const 
112e0 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 65 67  char *z, int neg
112f0 61 74 65 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65  ateFlag, int iMe
11300 6d 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  m){.  if( ALWAYS
11310 28 7a 21 3d 30 29 20 29 7b 0a 20 20 20 20 64 6f  (z!=0) ){.    do
11320 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20 20 20  uble value;.    
11330 63 68 61 72 20 2a 7a 56 3b 0a 20 20 20 20 73 71  char *zV;.    sq
11340 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20 26 76 61  lite3AtoF(z, &va
11350 6c 75 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  lue, sqlite3Strl
11360 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f  en30(z), SQLITE_
11370 55 54 46 38 29 3b 0a 20 20 20 20 61 73 73 65 72  UTF8);.    asser
11380 74 28 20 21 73 71 6c 69 74 65 33 49 73 4e 61 4e  t( !sqlite3IsNaN
11390 28 76 61 6c 75 65 29 20 29 3b 20 2f 2a 20 54 68  (value) ); /* Th
113a0 65 20 6e 65 77 20 41 74 6f 46 20 6e 65 76 65 72  e new AtoF never
113b0 20 72 65 74 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a   returns NaN */.
113c0 20 20 20 20 69 66 28 20 6e 65 67 61 74 65 46 6c      if( negateFl
113d0 61 67 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61  ag ) value = -va
113e0 6c 75 65 3b 0a 20 20 20 20 7a 56 20 3d 20 64 75  lue;.    zV = du
113f0 70 38 62 79 74 65 73 28 76 2c 20 28 63 68 61 72  p8bytes(v, (char
11400 2a 29 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 73  *)&value);.    s
11410 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
11420 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20  (v, OP_Real, 0, 
11430 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f  iMem, 0, zV, P4_
11440 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  REAL);.  }.}.#en
11450 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  dif.../*.** Gene
11460 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74  rate an instruct
11470 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75  ion that will pu
11480 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 64 65  t the integer de
11490 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78  scribe by.** tex
114a0 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f  t z[0..n-1] into
114b0 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a   register iMem..
114c0 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54 6f  **.** Expr.u.zTo
114d0 6b 65 6e 20 69 73 20 61 6c 77 61 79 73 20 55 54  ken is always UT
114e0 46 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72 6d  F8 and zero-term
114f0 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  inated..*/.stati
11500 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67  c void codeInteg
11510 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  er(Parse *pParse
11520 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
11530 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20  nt negFlag, int 
11540 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a 76  iMem){.  Vdbe *v
11550 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
11560 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66  ;.  if( pExpr->f
11570 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c  lags & EP_IntVal
11580 75 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20  ue ){.    int i 
11590 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75  = pExpr->u.iValu
115a0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  e;.    assert( i
115b0 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  >=0 );.    if( n
115c0 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b  egFlag ) i = -i;
115d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
115e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
115f0 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a  eger, i, iMem);.
11600 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
11610 20 63 3b 0a 20 20 20 20 69 36 34 20 76 61 6c 75   c;.    i64 valu
11620 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
11630 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e  r *z = pExpr->u.
11640 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73 65  zToken;.    asse
11650 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20  rt( z!=0 );.    
11660 63 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69 36  c = sqlite3Atoi6
11670 34 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c  4(z, &value, sql
11680 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c  ite3Strlen30(z),
11690 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
116a0 20 20 20 69 66 28 20 63 3d 3d 30 20 7c 7c 20 28     if( c==0 || (
116b0 63 3d 3d 32 20 26 26 20 6e 65 67 46 6c 61 67 29  c==2 && negFlag)
116c0 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
116d0 7a 56 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  zV;.      if( ne
116e0 67 46 6c 61 67 20 29 7b 20 76 61 6c 75 65 20 3d  gFlag ){ value =
116f0 20 63 3d 3d 32 20 3f 20 53 4d 41 4c 4c 45 53 54   c==2 ? SMALLEST
11700 5f 49 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b  _INT64 : -value;
11710 20 7d 0a 20 20 20 20 20 20 7a 56 20 3d 20 64 75   }.      zV = du
11720 70 38 62 79 74 65 73 28 76 2c 20 28 63 68 61 72  p8bytes(v, (char
11730 2a 29 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 20  *)&value);.     
11740 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11750 70 34 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20  p4(v, OP_Int64, 
11760 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20  0, iMem, 0, zV, 
11770 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d  P4_INT64);.    }
11780 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c  else{.#ifdef SQL
11790 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
117a0 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 73 71  G_POINT.      sq
117b0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
117c0 61 72 73 65 2c 20 22 6f 76 65 72 73 69 7a 65 64  arse, "oversized
117d0 20 69 6e 74 65 67 65 72 3a 20 25 73 25 73 22 2c   integer: %s%s",
117e0 20 6e 65 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a   negFlag ? "-" :
117f0 20 22 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 20   "", z);.#else. 
11800 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c       codeReal(v,
11810 20 7a 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65   z, negFlag, iMe
11820 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  m);.#endif.    }
11830 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
11840 65 61 72 20 61 20 63 61 63 68 65 20 65 6e 74 72  ear a cache entr
11850 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
11860 64 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61  d cacheEntryClea
11870 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
11880 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
11890 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  e *p){.  if( p->
118a0 74 65 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 69  tempReg ){.    i
118b0 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  f( pParse->nTemp
118c0 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50  Reg<ArraySize(pP
118d0 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20  arse->aTempReg) 
118e0 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
118f0 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65  >aTempReg[pParse
11900 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20  ->nTempReg++] = 
11910 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20  p->iReg;.    }. 
11920 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20     p->tempReg = 
11930 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  0;.  }.}.../*.**
11940 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20 63   Record in the c
11950 6f 6c 75 6d 6e 20 63 61 63 68 65 20 74 68 61 74  olumn cache that
11960 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f   a particular co
11970 6c 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a 20 70  lumn from a.** p
11980 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 20  articular table 
11990 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20 70  is stored in a p
119a0 61 72 74 69 63 75 6c 61 72 20 72 65 67 69 73 74  articular regist
119b0 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  er..*/.void sqli
119c0 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
119d0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
119e0 20 69 6e 74 20 69 54 61 62 2c 20 69 6e 74 20 69   int iTab, int i
119f0 43 6f 6c 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a  Col, int iReg){.
11a00 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d    int i;.  int m
11a10 69 6e 4c 72 75 3b 0a 20 20 69 6e 74 20 69 64 78  inLru;.  int idx
11a20 4c 72 75 3b 0a 20 20 73 74 72 75 63 74 20 79 43  Lru;.  struct yC
11a30 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 61  olCache *p;..  a
11a40 73 73 65 72 74 28 20 69 52 65 67 3e 30 20 29 3b  ssert( iReg>0 );
11a50 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 6e 75    /* Register nu
11a60 6d 62 65 72 73 20 61 72 65 20 61 6c 77 61 79 73  mbers are always
11a70 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 61   positive */.  a
11a80 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 2d 31 20  ssert( iCol>=-1 
11a90 26 26 20 69 43 6f 6c 3c 33 32 37 36 38 20 29 3b  && iCol<32768 );
11aa0 20 20 2f 2a 20 46 69 6e 69 74 65 20 63 6f 6c 75    /* Finite colu
11ab0 6d 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20  mn numbers */.. 
11ac0 20 2f 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 43   /* The SQLITE_C
11ad0 6f 6c 75 6d 6e 43 61 63 68 65 20 66 6c 61 67 20  olumnCache flag 
11ae0 64 69 73 61 62 6c 65 73 20 74 68 65 20 63 6f 6c  disables the col
11af0 75 6d 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73  umn cache.  This
11b00 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 66 6f   is used.  ** fo
11b10 72 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 20 2d  r testing only -
11b20 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
11b30 53 51 4c 69 74 65 20 61 6c 77 61 79 73 20 67 65  SQLite always ge
11b40 74 73 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77  ts the same answ
11b50 65 72 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e 64  er.  ** with and
11b60 20 77 69 74 68 6f 75 74 20 74 68 65 20 63 6f 6c   without the col
11b70 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a  umn cache..  */.
11b80 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69    if( Optimizati
11b90 6f 6e 44 69 73 61 62 6c 65 64 28 70 50 61 72 73  onDisabled(pPars
11ba0 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f  e->db, SQLITE_Co
11bb0 6c 75 6d 6e 43 61 63 68 65 29 20 29 20 72 65 74  lumnCache) ) ret
11bc0 75 72 6e 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74  urn;..  /* First
11bd0 20 72 65 70 6c 61 63 65 20 61 6e 79 20 65 78 69   replace any exi
11be0 73 74 69 6e 67 20 65 6e 74 72 79 2e 0a 20 20 2a  sting entry..  *
11bf0 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c  *.  ** Actually,
11c00 20 74 68 65 20 77 61 79 20 74 68 65 20 63 6f 6c   the way the col
11c10 75 6d 6e 20 63 61 63 68 65 20 69 73 20 63 75 72  umn cache is cur
11c20 72 65 6e 74 6c 79 20 75 73 65 64 2c 20 77 65 20  rently used, we 
11c30 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a 20  are guaranteed. 
11c40 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 62 6a   ** that the obj
11c50 65 63 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 61  ect will never a
11c60 6c 72 65 61 64 79 20 62 65 20 69 6e 20 63 61 63  lready be in cac
11c70 68 65 2e 20 20 56 65 72 69 66 79 20 74 68 69 73  he.  Verify this
11c80 20 67 75 61 72 61 6e 74 65 65 2e 0a 20 20 2a 2f   guarantee..  */
11c90 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
11ca0 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
11cb0 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
11cc0 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
11cd0 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
11ce0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
11cf0 52 65 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 54 61  Reg==0 || p->iTa
11d00 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e  ble!=iTab || p->
11d10 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b  iColumn!=iCol );
11d20 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
11d30 2a 20 46 69 6e 64 20 61 6e 20 65 6d 70 74 79 20  * Find an empty 
11d40 73 6c 6f 74 20 61 6e 64 20 72 65 70 6c 61 63 65  slot and replace
11d50 20 69 74 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30   it */.  for(i=0
11d60 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
11d70 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
11d80 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
11d90 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
11da0 2d 3e 69 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20  ->iReg==0 ){.   
11db0 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70     p->iLevel = p
11dc0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
11dd0 65 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 54 61  el;.      p->iTa
11de0 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  ble = iTab;.    
11df0 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69    p->iColumn = i
11e00 43 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52  Col;.      p->iR
11e10 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 20  eg = iReg;.     
11e20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b   p->tempReg = 0;
11e30 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20  .      p->lru = 
11e40 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e  pParse->iCacheCn
11e50 74 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  t++;.      retur
11e60 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
11e70 2f 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 6c  /* Replace the l
11e80 61 73 74 20 72 65 63 65 6e 74 6c 79 20 75 73 65  ast recently use
11e90 64 20 2a 2f 0a 20 20 6d 69 6e 4c 72 75 20 3d 20  d */.  minLru = 
11ea0 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20 69 64  0x7fffffff;.  id
11eb0 78 4c 72 75 20 3d 20 2d 31 3b 0a 20 20 66 6f 72  xLru = -1;.  for
11ec0 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
11ed0 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
11ee0 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
11ef0 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
11f00 66 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75  f( p->lru<minLru
11f10 20 29 7b 0a 20 20 20 20 20 20 69 64 78 4c 72 75   ){.      idxLru
11f20 20 3d 20 69 3b 0a 20 20 20 20 20 20 6d 69 6e 4c   = i;.      minL
11f30 72 75 20 3d 20 70 2d 3e 6c 72 75 3b 0a 20 20 20  ru = p->lru;.   
11f40 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 41 4c 57   }.  }.  if( ALW
11f50 41 59 53 28 69 64 78 4c 72 75 3e 3d 30 29 20 29  AYS(idxLru>=0) )
11f60 7b 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72 73  {.    p = &pPars
11f70 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 64 78  e->aColCache[idx
11f80 4c 72 75 5d 3b 0a 20 20 20 20 70 2d 3e 69 4c 65  Lru];.    p->iLe
11f90 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43  vel = pParse->iC
11fa0 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 70  acheLevel;.    p
11fb0 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b  ->iTable = iTab;
11fc0 0a 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20  .    p->iColumn 
11fd0 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69  = iCol;.    p->i
11fe0 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20  Reg = iReg;.    
11ff0 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a  p->tempReg = 0;.
12000 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61      p->lru = pPa
12010 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b  rse->iCacheCnt++
12020 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
12030 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63  }.}../*.** Indic
12040 61 74 65 20 74 68 61 74 20 72 65 67 69 73 74 65  ate that registe
12050 72 73 20 62 65 74 77 65 65 6e 20 69 52 65 67 2e  rs between iReg.
12060 2e 69 52 65 67 2b 6e 52 65 67 2d 31 20 61 72 65  .iReg+nReg-1 are
12070 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74   being overwritt
12080 65 6e 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68 65  en..** Purge the
12090 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74   range of regist
120a0 65 72 73 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c  ers from the col
120b0 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f  umn cache..*/.vo
120c0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
120d0 63 68 65 52 65 6d 6f 76 65 28 50 61 72 73 65 20  cheRemove(Parse 
120e0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
120f0 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  g, int nReg){.  
12100 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 4c 61  int i;.  int iLa
12110 73 74 20 3d 20 69 52 65 67 20 2b 20 6e 52 65 67  st = iReg + nReg
12120 20 2d 20 31 3b 0a 20 20 73 74 72 75 63 74 20 79   - 1;.  struct y
12130 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66  ColCache *p;.  f
12140 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
12150 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
12160 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
12170 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
12180 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67   int r = p->iReg
12190 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 52 65  ;.    if( r>=iRe
121a0 67 20 26 26 20 72 3c 3d 69 4c 61 73 74 20 29 7b  g && r<=iLast ){
121b0 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72  .      cacheEntr
121c0 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70  yClear(pParse, p
121d0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67  );.      p->iReg
121e0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
121f0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65  }../*.** Remembe
12200 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  r the current co
12210 6c 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74 65  lumn cache conte
12220 78 74 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e 74  xt.  Any new ent
12230 72 69 65 73 20 61 64 64 65 64 0a 2a 2a 20 61 64  ries added.** ad
12240 64 65 64 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d  ded to the colum
12250 6e 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  n cache after th
12260 69 73 20 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f  is call are remo
12270 76 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20  ved when the.** 
12280 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f  corresponding po
12290 70 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69  p occurs..*/.voi
122a0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
122b0 68 65 50 75 73 68 28 50 61 72 73 65 20 2a 70 50  hePush(Parse *pP
122c0 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d  arse){.  pParse-
122d0 3e 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a  >iCacheLevel++;.
122e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
122f0 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20  from the column 
12300 63 61 63 68 65 20 61 6e 79 20 65 6e 74 72 69 65  cache any entrie
12310 73 20 74 68 61 74 20 77 65 72 65 20 61 64 64 65  s that were adde
12320 64 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 74  d since the.** t
12330 68 65 20 70 72 65 76 69 6f 75 73 20 4e 20 50 75  he previous N Pu
12340 73 68 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20  sh operations.  
12350 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
12360 72 65 73 74 6f 72 65 20 74 68 65 20 63 61 63 68  restore the cach
12370 65 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 74  e.** to the stat
12380 65 20 69 74 20 77 61 73 20 69 6e 20 4e 20 50 75  e it was in N Pu
12390 73 68 65 73 20 61 67 6f 2e 0a 2a 2f 0a 76 6f 69  shes ago..*/.voi
123a0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
123b0 68 65 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61  hePop(Parse *pPa
123c0 72 73 65 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69  rse, int N){.  i
123d0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
123e0 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 61  ColCache *p;.  a
123f0 73 73 65 72 74 28 20 4e 3e 30 20 29 3b 0a 20 20  ssert( N>0 );.  
12400 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
12410 69 43 61 63 68 65 4c 65 76 65 6c 3e 3d 4e 20 29  iCacheLevel>=N )
12420 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63  ;.  pParse->iCac
12430 68 65 4c 65 76 65 6c 20 2d 3d 20 4e 3b 0a 20 20  heLevel -= N;.  
12440 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
12450 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
12460 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
12470 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
12480 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20 26 26    if( p->iReg &&
12490 20 70 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73   p->iLevel>pPars
124a0 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 29  e->iCacheLevel )
124b0 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74  {.      cacheEnt
124c0 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20  ryClear(pParse, 
124d0 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65  p);.      p->iRe
124e0 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  g = 0;.    }.  }
124f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61  .}../*.** When a
12500 20 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e 20 69   cached column i
12510 73 20 72 65 75 73 65 64 2c 20 6d 61 6b 65 20 73  s reused, make s
12520 75 72 65 20 74 68 61 74 20 69 74 73 20 72 65 67  ure that its reg
12530 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c  ister is.** no l
12540 6f 6e 67 65 72 20 61 76 61 69 6c 61 62 6c 65 20  onger available 
12550 61 73 20 61 20 74 65 6d 70 20 72 65 67 69 73 74  as a temp regist
12560 65 72 2e 20 20 74 69 63 6b 65 74 20 23 33 38 37  er.  ticket #387
12570 39 3a 20 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a  9:  that same.**
12580 20 72 65 67 69 73 74 65 72 20 6d 69 67 68 74 20   register might 
12590 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  be in the cache 
125a0 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63  in multiple plac
125b0 65 73 2c 20 73 6f 20 62 65 20 73 75 72 65 20 74  es, so be sure t
125c0 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20 61 6c  o.** get them al
125d0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
125e0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
125f0 68 65 50 69 6e 52 65 67 69 73 74 65 72 28 50 61  hePinRegister(Pa
12600 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
12610 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b   iReg){.  int i;
12620 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
12630 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d  che *p;.  for(i=
12640 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
12650 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
12660 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
12670 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , p++){.    if( 
12680 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b  p->iReg==iReg ){
12690 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65  .      p->tempRe
126a0 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  g = 0;.    }.  }
126b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
126c0 74 65 20 63 6f 64 65 20 74 6f 20 65 78 74 72 61  te code to extra
126d0 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ct the value of 
126e0 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75  the iCol-th colu
126f0 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a 2a  mn of a table..*
12700 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
12710 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f  prCodeGetColumnO
12720 66 54 61 62 6c 65 28 0a 20 20 56 64 62 65 20 2a  fTable(.  Vdbe *
12730 76 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  v,        /* The
12740 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73   VDBE under cons
12750 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 61  truction */.  Ta
12760 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 2f 2a  ble *pTab,    /*
12770 20 54 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61   The table conta
12780 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20  ining the value 
12790 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72  */.  int iTabCur
127a0 2c 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73  ,    /* The curs
127b0 6f 72 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c  or for this tabl
127c0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c  e */.  int iCol,
127d0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
127e0 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f  of the column to
127f0 20 65 78 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e   extract */.  in
12800 74 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a  t regOut      /*
12810 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   Extract the val
12820 75 64 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67  ud into this reg
12830 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66  ister */.){.  if
12840 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c  ( iCol<0 || iCol
12850 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b  ==pTab->iPKey ){
12860 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12870 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
12880 69 64 2c 20 69 54 61 62 43 75 72 2c 20 72 65 67  id, iTabCur, reg
12890 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Out);.  }else{. 
128a0 20 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69     int op = IsVi
128b0 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50  rtual(pTab) ? OP
128c0 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f  _VColumn : OP_Co
128d0 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  lumn;.    sqlite
128e0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f  3VdbeAddOp3(v, o
128f0 70 2c 20 69 54 61 62 43 75 72 2c 20 69 43 6f 6c  p, iTabCur, iCol
12900 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 20  , regOut);.  }. 
12910 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a   if( iCol>=0 ){.
12920 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d      sqlite3Colum
12930 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62  nDefault(v, pTab
12940 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b  , iCol, regOut);
12950 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
12960 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
12970 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68   will extract th
12980 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c  e iColumn-th col
12990 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c  umn from.** tabl
129a0 65 20 70 54 61 62 20 61 6e 64 20 73 74 6f 72 65  e pTab and store
129b0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75   the column valu
129c0 65 20 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e  e in a register.
129d0 20 20 41 6e 20 65 66 66 6f 72 74 0a 2a 2a 20 69    An effort.** i
129e0 73 20 6d 61 64 65 20 74 6f 20 73 74 6f 72 65 20  s made to store 
129f0 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  the column value
12a00 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65   in register iRe
12a10 67 2c 20 62 75 74 20 74 68 69 73 20 69 73 0a 2a  g, but this is.*
12a20 2a 20 6e 6f 74 20 67 75 61 72 61 6e 74 65 65 64  * not guaranteed
12a30 2e 20 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  .  The location 
12a40 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61  of the column va
12a50 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  lue is returned.
12a60 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  .**.** There mus
12a70 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72  t be an open cur
12a80 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e 20 69  sor to pTab in i
12a90 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69 73 20  Table when this 
12aa0 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
12ab0 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d  lled.  If iColum
12ac0 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73  n<0 then code is
12ad0 20 67 65 6e 65 72 61 74 65 64 20 74 68 61 74 20   generated that 
12ae0 65 78 74 72 61 63 74 73 20 74 68 65 20 72 6f 77  extracts the row
12af0 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  id..*/.int sqlit
12b00 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
12b10 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  umn(.  Parse *pP
12b20 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69  arse,   /* Parsi
12b30 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
12b40 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
12b50 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
12b60 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
12b70 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ion of the table
12b80 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
12b90 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43  from */.  int iC
12ba0 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e  olumn,     /* In
12bb0 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65  dex of the table
12bc0 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74   column */.  int
12bd0 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a   iTable,      /*
12be0 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   The cursor poin
12bf0 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c  ting to the tabl
12c00 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c  e */.  int iReg,
12c10 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
12c20 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
12c30 0a 20 20 75 38 20 70 35 20 20 20 20 20 20 20 20  .  u8 p5        
12c40 20 20 20 20 2f 2a 20 50 35 20 76 61 6c 75 65 20      /* P5 value 
12c50 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2a 2f  for OP_Column */
12c60 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
12c70 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
12c80 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
12c90 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a   yColCache *p;..
12ca0 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
12cb0 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
12cc0 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
12cd0 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
12ce0 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3e      if( p->iReg>
12cf0 30 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d  0 && p->iTable==
12d00 69 54 61 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f  iTable && p->iCo
12d10 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b  lumn==iColumn ){
12d20 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20  .      p->lru = 
12d30 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e  pParse->iCacheCn
12d40 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t++;.      sqlit
12d50 65 33 45 78 70 72 43 61 63 68 65 50 69 6e 52 65  e3ExprCachePinRe
12d60 67 69 73 74 65 72 28 70 50 61 72 73 65 2c 20 70  gister(pParse, p
12d70 2d 3e 69 52 65 67 29 3b 0a 20 20 20 20 20 20 72  ->iReg);.      r
12d80 65 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20  eturn p->iReg;. 
12d90 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73     }.  }  .  ass
12da0 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73  ert( v!=0 );.  s
12db0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
12dc0 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76  tColumnOfTable(v
12dd0 2c 20 70 54 61 62 2c 20 69 54 61 62 6c 65 2c 20  , pTab, iTable, 
12de0 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a  iColumn, iReg);.
12df0 20 20 69 66 28 20 70 35 20 29 7b 0a 20 20 20 20    if( p5 ){.    
12e00 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
12e10 65 50 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d 65  eP5(v, p5);.  }e
12e20 6c 73 65 7b 20 20 20 0a 20 20 20 20 73 71 6c 69  lse{   .    sqli
12e30 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
12e40 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 6c 65  e(pParse, iTable
12e50 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29  , iColumn, iReg)
12e60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
12e70 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  Reg;.}../*.** Cl
12e80 65 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63  ear all column c
12e90 61 63 68 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  ache entries..*/
12ea0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
12eb0 72 43 61 63 68 65 43 6c 65 61 72 28 50 61 72 73  rCacheClear(Pars
12ec0 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e  e *pParse){.  in
12ed0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
12ee0 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66  olCache *p;..  f
12ef0 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
12f00 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
12f10 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
12f20 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
12f30 20 69 66 28 20 70 2d 3e 69 52 65 67 20 29 7b 0a   if( p->iReg ){.
12f40 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79        cacheEntry
12f50 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29  Clear(pParse, p)
12f60 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20  ;.      p->iReg 
12f70 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
12f80 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74  ../*.** Record t
12f90 68 65 20 66 61 63 74 20 74 68 61 74 20 61 6e 20  he fact that an 
12fa0 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20  affinity change 
12fb0 68 61 73 20 6f 63 63 75 72 72 65 64 20 6f 6e 20  has occurred on 
12fc0 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74  iCount.** regist
12fd0 65 72 73 20 73 74 61 72 74 69 6e 67 20 77 69 74  ers starting wit
12fe0 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69  h iStart..*/.voi
12ff0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
13000 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
13010 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
13020 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20  int iStart, int 
13030 69 43 6f 75 6e 74 29 7b 0a 20 20 73 71 6c 69 74  iCount){.  sqlit
13040 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
13050 65 28 70 50 61 72 73 65 2c 20 69 53 74 61 72 74  e(pParse, iStart
13060 2c 20 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a  , iCount);.}../*
13070 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
13080 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e  e to move conten
13090 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73  t from registers
130a0 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e   iFrom...iFrom+n
130b0 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f  Reg-1.** over to
130c0 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31   iTo..iTo+nReg-1
130d0 2e 20 4b 65 65 70 20 74 68 65 20 63 6f 6c 75 6d  . Keep the colum
130e0 6e 20 63 61 63 68 65 20 75 70 2d 74 6f 2d 64 61  n cache up-to-da
130f0 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  te..*/.void sqli
13100 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
13110 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
13120 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54  nt iFrom, int iT
13130 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  o, int nReg){.  
13140 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
13150 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20  yColCache *p;.  
13160 61 73 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d 69  assert( iFrom>=i
13170 54 6f 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f 6d  To+nReg || iFrom
13180 2b 6e 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20 20  +nReg<=iTo );.  
13190 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
131a0 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  3(pParse->pVdbe,
131b0 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c   OP_Move, iFrom,
131c0 20 69 54 6f 2c 20 6e 52 65 67 2d 31 29 3b 0a 20   iTo, nReg-1);. 
131d0 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
131e0 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
131f0 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
13200 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
13210 20 20 20 69 6e 74 20 78 20 3d 20 70 2d 3e 69 52     int x = p->iR
13220 65 67 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d 69  eg;.    if( x>=i
13230 46 72 6f 6d 20 26 26 20 78 3c 69 46 72 6f 6d 2b  From && x<iFrom+
13240 6e 52 65 67 20 29 7b 0a 20 20 20 20 20 20 70 2d  nReg ){.      p-
13250 3e 69 52 65 67 20 2b 3d 20 69 54 6f 2d 69 46 72  >iReg += iTo-iFr
13260 6f 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  om;.    }.  }.}.
13270 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
13280 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
13290 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56  fined(SQLITE_COV
132a0 45 52 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  ERAGE_TEST)./*.*
132b0 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
132c0 20 61 6e 79 20 72 65 67 69 73 74 65 72 20 69 6e   any register in
132d0 20 74 68 65 20 72 61 6e 67 65 20 69 46 72 6f 6d   the range iFrom
132e0 2e 2e 69 54 6f 20 28 69 6e 63 6c 75 73 69 76 65  ..iTo (inclusive
132f0 29 0a 2a 2a 20 69 73 20 75 73 65 64 20 61 73 20  ).** is used as 
13300 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6c 75  part of the colu
13310 6d 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  mn cache..**.** 
13320 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
13330 75 73 65 64 20 77 69 74 68 69 6e 20 61 73 73 65  used within asse
13340 72 74 28 29 20 61 6e 64 20 74 65 73 74 63 61 73  rt() and testcas
13350 65 28 29 20 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a  e() macros only.
13360 2a 2a 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ** and does not 
13370 61 70 70 65 61 72 20 69 6e 20 61 20 6e 6f 72 6d  appear in a norm
13380 61 6c 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61  al build..*/.sta
13390 74 69 63 20 69 6e 74 20 75 73 65 64 41 73 43 6f  tic int usedAsCo
133a0 6c 75 6d 6e 43 61 63 68 65 28 50 61 72 73 65 20  lumnCache(Parse 
133b0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72  *pParse, int iFr
133c0 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20  om, int iTo){.  
133d0 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
133e0 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20  yColCache *p;.  
133f0 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
13400 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
13410 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
13420 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
13430 20 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65    int r = p->iRe
13440 67 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 46  g;.    if( r>=iF
13450 72 6f 6d 20 26 26 20 72 3c 3d 69 54 6f 20 29 20  rom && r<=iTo ) 
13460 72 65 74 75 72 6e 20 31 3b 20 20 20 20 2f 2a 4e  return 1;    /*N
13470 4f 5f 54 45 53 54 2a 2f 0a 20 20 7d 0a 20 20 72  O_TEST*/.  }.  r
13480 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
13490 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
134a0 47 20 7c 7c 20 53 51 4c 49 54 45 5f 43 4f 56 45  G || SQLITE_COVE
134b0 52 41 47 45 5f 54 45 53 54 20 2a 2f 0a 0a 2f 2a  RAGE_TEST */../*
134c0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
134d0 65 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65  e into the curre
134e0 6e 74 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75  nt Vdbe to evalu
134f0 61 74 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  ate the given.**
13500 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 41 74   expression.  At
13510 74 65 6d 70 74 20 74 6f 20 73 74 6f 72 65 20 74  tempt to store t
13520 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65  he results in re
13530 67 69 73 74 65 72 20 22 74 61 72 67 65 74 22 2e  gister "target".
13540 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72  .** Return the r
13550 65 67 69 73 74 65 72 20 77 68 65 72 65 20 72 65  egister where re
13560 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64  sults are stored
13570 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69  ..**.** With thi
13580 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 72 65  s routine, there
13590 20 69 73 20 6e 6f 20 67 75 61 72 61 6e 74 65 65   is no guarantee
135a0 20 74 68 61 74 20 72 65 73 75 6c 74 73 20 77 69   that results wi
135b0 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64 20  ll.** be stored 
135c0 69 6e 20 74 61 72 67 65 74 2e 20 20 54 68 65 20  in target.  The 
135d0 72 65 73 75 6c 74 20 6d 69 67 68 74 20 62 65 20  result might be 
135e0 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f  stored in some o
135f0 74 68 65 72 0a 2a 2a 20 72 65 67 69 73 74 65 72  ther.** register
13600 20 69 66 20 69 74 20 69 73 20 63 6f 6e 76 65 6e   if it is conven
13610 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20  ient to do so.  
13620 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
13630 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65  tion.** must che
13640 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  ck the return co
13650 64 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20  de and move the 
13660 72 65 73 75 6c 74 73 20 74 6f 20 74 68 65 20 64  results to the d
13670 65 73 69 72 65 64 0a 2a 2a 20 72 65 67 69 73 74  esired.** regist
13680 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
13690 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
136a0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
136b0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
136c0 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65   target){.  Vdbe
136d0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
136e0 64 62 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20  dbe;  /* The VM 
136f0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
13700 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20  on */.  int op; 
13710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13720 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20    /* The opcode 
13730 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
13740 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 74 61 72   int inReg = tar
13750 67 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  get;       /* Re
13760 73 75 6c 74 73 20 73 74 6f 72 65 64 20 69 6e 20  sults stored in 
13770 72 65 67 69 73 74 65 72 20 69 6e 52 65 67 20 2a  register inReg *
13780 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31  /.  int regFree1
13790 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
137a0 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65   If non-zero fre
137b0 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  e this temporary
137c0 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
137d0 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  nt regFree2 = 0;
137e0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e           /* If n
137f0 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69  on-zero free thi
13800 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  s temporary regi
13810 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31  ster */.  int r1
13820 2c 20 72 32 2c 20 72 33 2c 20 72 34 3b 20 20 20  , r2, r3, r4;   
13830 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 72      /* Various r
13840 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20  egister numbers 
13850 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
13860 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f   = pParse->db; /
13870 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
13880 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  onnection */..  
13890 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
138a0 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72   && target<=pPar
138b0 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66  se->nMem );.  if
138c0 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ( v==0 ){.    as
138d0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
138e0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
138f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
13900 20 20 7d 0a 0a 20 20 69 66 28 20 70 45 78 70 72    }..  if( pExpr
13910 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20  ==0 ){.    op = 
13920 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65  TK_NULL;.  }else
13930 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72  {.    op = pExpr
13940 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74  ->op;.  }.  swit
13950 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
13960 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
13970 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66  : {.      AggInf
13980 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45  o *pAggInfo = pE
13990 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20  xpr->pAggInfo;. 
139a0 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
139b0 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20  nfo_col *pCol = 
139c0 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  &pAggInfo->aCol[
139d0 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20  pExpr->iAgg];.  
139e0 20 20 20 20 69 66 28 20 21 70 41 67 67 49 6e 66      if( !pAggInf
139f0 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b  o->directMode ){
13a00 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
13a10 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b   pCol->iMem>0 );
13a20 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
13a30 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20   pCol->iMem;.   
13a40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13a50 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67    }else if( pAgg
13a60 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67  Info->useSorting
13a70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Idx ){.        s
13a80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
13a90 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70  (v, OP_Column, p
13aa0 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67  AggInfo->sorting
13ab0 49 64 78 50 54 61 62 2c 0a 20 20 20 20 20 20 20  IdxPTab,.       
13ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ad0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
13ae0 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67  rterColumn, targ
13af0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  et);.        bre
13b00 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
13b10 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    /* Otherwise, 
13b20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74  fall thru into t
13b30 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73  he TK_COLUMN cas
13b40 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63  e */.    }.    c
13b50 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
13b60 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
13b70 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20  ->iTable<0 ){.  
13b80 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 6f 6e        /* This on
13b90 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  ly happens when 
13ba0 63 6f 64 69 6e 67 20 63 68 65 63 6b 20 63 6f 6e  coding check con
13bb0 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20  straints */.    
13bc0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
13bd0 73 65 2d 3e 63 6b 42 61 73 65 3e 30 20 29 3b 0a  se->ckBase>0 );.
13be0 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20          inReg = 
13bf0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2b  pExpr->iColumn +
13c00 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3b   pParse->ckBase;
13c10 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13c20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
13c30 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
13c40 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70  Column(pParse, p
13c50 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20 20 20 20  Expr->pTab,.    
13c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c70 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
13c80 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 45 78  pr->iColumn, pEx
13c90 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67  pr->iTable, targ
13ca0 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  et,.            
13cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cc0 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 29       pExpr->op2)
13cd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13ce0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
13cf0 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
13d00 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e  : {.      codeIn
13d10 74 65 67 65 72 28 70 50 61 72 73 65 2c 20 70 45  teger(pParse, pE
13d20 78 70 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  xpr, 0, target);
13d30 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13d40 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
13d50 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
13d60 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20  _POINT.    case 
13d70 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20  TK_FLOAT: {.    
13d80 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
13d90 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
13da0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
13db0 3b 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c  ;.      codeReal
13dc0 28 76 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  (v, pExpr->u.zTo
13dd0 6b 65 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ken, 0, target);
13de0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13df0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
13e00 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
13e10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
13e20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
13e30 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
13e40 75 65 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ue) );.      sql
13e50 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
13e60 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
13e70 20 74 61 72 67 65 74 2c 20 30 2c 20 70 45 78 70   target, 0, pExp
13e80 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b  r->u.zToken, 0);
13e90 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13ea0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
13eb0 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  NULL: {.      sq
13ec0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13ed0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
13ee0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
13ef0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
13f00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
13f10 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20  LOB_LITERAL.    
13f20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a  case TK_BLOB: {.
13f30 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
13f40 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
13f50 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42  ;.      char *zB
13f60 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72  lob;.      asser
13f70 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
13f80 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
13f90 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
13fa0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
13fb0 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27  u.zToken[0]=='x'
13fc0 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f   || pExpr->u.zTo
13fd0 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20  ken[0]=='X' );. 
13fe0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
13ff0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d  pr->u.zToken[1]=
14000 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a  ='\'' );.      z
14010 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f   = &pExpr->u.zTo
14020 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20  ken[2];.      n 
14030 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
14040 30 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20 20 20  0(z) - 1;.      
14050 61 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c  assert( z[n]=='\
14060 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f  '' );.      zBlo
14070 62 20 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f  b = sqlite3HexTo
14080 42 6c 6f 62 28 73 71 6c 69 74 65 33 56 64 62 65  Blob(sqlite3Vdbe
14090 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20  Db(v), z, n);.  
140a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
140b0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62  ddOp4(v, OP_Blob
140c0 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20 30  , n/2, target, 0
140d0 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41  , zBlob, P4_DYNA
140e0 4d 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61  MIC);.      brea
140f0 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
14100 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
14110 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 61 73  ABLE: {.      as
14120 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
14130 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
14140 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
14150 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
14160 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29  r->u.zToken!=0 )
14170 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14180 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
14190 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  0]!=0 );.      s
141a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
141b0 28 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c  (v, OP_Variable,
141c0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c   pExpr->iColumn,
141d0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
141e0 69 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  if( pExpr->u.zTo
141f0 6b 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20  ken[1]!=0 ){.   
14200 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
14210 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d  pr->u.zToken[0]=
14220 3d 27 3f 27 20 0a 20 20 20 20 20 20 20 20 20 20  ='?' .          
14230 20 20 20 7c 7c 20 73 74 72 63 6d 70 28 70 45 78     || strcmp(pEx
14240 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 50  pr->u.zToken, pP
14250 61 72 73 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70  arse->azVar[pExp
14260 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 29 3d 3d  r->iColumn-1])==
14270 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 );.        sql
14280 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
14290 28 76 2c 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e  (v, -1, pParse->
142a0 61 7a 56 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f  azVar[pExpr->iCo
142b0 6c 75 6d 6e 2d 31 5d 2c 20 50 34 5f 53 54 41 54  lumn-1], P4_STAT
142c0 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IC);.      }.   
142d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
142e0 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49      case TK_REGI
142f0 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e  STER: {.      in
14300 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  Reg = pExpr->iTa
14310 62 6c 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ble;.      break
14320 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
14330 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20   TK_AS: {.      
14340 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
14350 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
14360 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
14370 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ft, target);.   
14380 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
14390 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
143a0 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73  MIT_CAST.    cas
143b0 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20  e TK_CAST: {.   
143c0 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
143d0 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20  s of the form:  
143e0 20 43 41 53 54 28 70 4c 65 66 74 20 41 53 20 74   CAST(pLeft AS t
143f0 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69  oken) */.      i
14400 6e 74 20 61 66 66 2c 20 74 6f 5f 6f 70 3b 0a 20  nt aff, to_op;. 
14410 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
14420 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
14430 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
14440 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29  ->pLeft, target)
14450 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14460 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
14470 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
14480 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 66  lue) );.      af
14490 66 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e  f = sqlite3Affin
144a0 69 74 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75  ityType(pExpr->u
144b0 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
144c0 74 6f 5f 6f 70 20 3d 20 61 66 66 20 2d 20 53 51  to_op = aff - SQ
144d0 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 2b 20  LITE_AFF_TEXT + 
144e0 4f 50 5f 54 6f 54 65 78 74 3b 0a 20 20 20 20 20  OP_ToText;.     
144f0 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
14500 4f 50 5f 54 6f 54 65 78 74 20 20 20 20 7c 7c 20  OP_ToText    || 
14510 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
14520 54 45 58 54 20 20 20 20 29 3b 0a 20 20 20 20 20  TEXT    );.     
14530 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
14540 4f 50 5f 54 6f 42 6c 6f 62 20 20 20 20 7c 7c 20  OP_ToBlob    || 
14550 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
14560 4e 4f 4e 45 20 20 20 20 29 3b 0a 20 20 20 20 20  NONE    );.     
14570 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
14580 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 20 7c 7c 20  OP_ToNumeric || 
14590 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
145a0 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 20  NUMERIC );.     
145b0 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
145c0 4f 50 5f 54 6f 49 6e 74 20 20 20 20 20 7c 7c 20  OP_ToInt     || 
145d0 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
145e0 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 20  INTEGER );.     
145f0 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
14600 4f 50 5f 54 6f 52 65 61 6c 20 20 20 20 7c 7c 20  OP_ToReal    || 
14610 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
14620 52 45 41 4c 20 20 20 20 29 3b 0a 20 20 20 20 20  REAL    );.     
14630 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70   testcase( to_op
14640 3d 3d 4f 50 5f 54 6f 54 65 78 74 20 29 3b 0a 20  ==OP_ToText );. 
14650 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74       testcase( t
14660 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20  o_op==OP_ToBlob 
14670 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14680 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e  e( to_op==OP_ToN
14690 75 6d 65 72 69 63 20 29 3b 0a 20 20 20 20 20 20  umeric );.      
146a0 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d  testcase( to_op=
146b0 3d 4f 50 5f 54 6f 49 6e 74 20 29 3b 0a 20 20 20  =OP_ToInt );.   
146c0 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f     testcase( to_
146d0 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 29 3b  op==OP_ToReal );
146e0 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67  .      if( inReg
146f0 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20  !=target ){.    
14700 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14710 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
14720 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74  y, inReg, target
14730 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  );.        inReg
14740 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20   = target;.     
14750 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
14760 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 74 6f  VdbeAddOp1(v, to
14770 5f 6f 70 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20  _op, inReg);.   
14780 20 20 20 74 65 73 74 63 61 73 65 28 20 75 73 65     testcase( use
14790 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70  dAsColumnCache(p
147a0 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e  Parse, inReg, in
147b0 52 65 67 29 20 29 3b 0a 20 20 20 20 20 20 73 71  Reg) );.      sq
147c0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
147d0 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
147e0 72 73 65 2c 20 69 6e 52 65 67 2c 20 31 29 3b 0a  rse, inReg, 1);.
147f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14800 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
14810 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f  ITE_OMIT_CAST */
14820 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
14830 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
14840 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
14850 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
14860 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
14870 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
14880 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
14890 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b   TK_LT==OP_Lt );
148a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
148b0 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20  K_LE==OP_Le );. 
148c0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
148d0 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20  GT==OP_Gt );.   
148e0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45     assert( TK_GE
148f0 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20  ==OP_Ge );.     
14900 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d   assert( TK_EQ==
14910 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61  OP_Eq );.      a
14920 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50  ssert( TK_NE==OP
14930 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _Ne );.      tes
14940 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54  tcase( op==TK_LT
14950 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14960 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b  se( op==TK_LE );
14970 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14980 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20   op==TK_GT );.  
14990 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
149a0 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20  ==TK_GE );.     
149b0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
149c0 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65  K_EQ );.      te
149d0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
149e0 45 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  E );.      r1 = 
149f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
14a00 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
14a10 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
14a20 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
14a30 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
14a40 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
14a50 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
14a60 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f  Free2);.      co
14a70 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
14a80 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
14a90 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
14aa0 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
14ab0 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52       r1, r2, inR
14ac0 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  eg, SQLITE_STORE
14ad0 50 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  P2);.      testc
14ae0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
14af0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14b00 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
14b10 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
14b20 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
14b30 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IS:.    case T
14b40 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20  K_ISNOT: {.     
14b50 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
14b60 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65  K_IS );.      te
14b70 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
14b80 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31  SNOT );.      r1
14b90 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
14ba0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
14bb0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
14bc0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
14bd0 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
14be0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
14bf0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
14c00 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
14c10 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53   op = (op==TK_IS
14c20 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e  ) ? TK_EQ : TK_N
14c30 45 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  E;.      codeCom
14c40 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
14c50 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
14c60 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
14c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c80 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53  r1, r2, inReg, S
14c90 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 7c 20  QLITE_STOREP2 | 
14ca0 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
14cb0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14cc0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
14cd0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
14ce0 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
14cf0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
14d00 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
14d10 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  :.    case TK_OR
14d20 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c  :.    case TK_PL
14d30 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
14d40 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54  STAR:.    case T
14d50 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73  K_MINUS:.    cas
14d60 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61  e TK_REM:.    ca
14d70 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20  se TK_BITAND:.  
14d80 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a    case TK_BITOR:
14d90 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41  .    case TK_SLA
14da0 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  SH:.    case TK_
14db0 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65  LSHIFT:.    case
14dc0 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20   TK_RSHIFT: .   
14dd0 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a   case TK_CONCAT:
14de0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
14df0 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20   TK_AND==OP_And 
14e00 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14e10 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b   TK_OR==OP_Or );
14e20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
14e30 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29  K_PLUS==OP_Add )
14e40 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14e50 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62  TK_MINUS==OP_Sub
14e60 74 72 61 63 74 20 29 3b 0a 20 20 20 20 20 20 61  tract );.      a
14e70 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f  ssert( TK_REM==O
14e80 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 0a 20  P_Remainder );. 
14e90 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
14ea0 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e  BITAND==OP_BitAn
14eb0 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d );.      asser
14ec0 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f  t( TK_BITOR==OP_
14ed0 42 69 74 4f 72 20 29 3b 0a 20 20 20 20 20 20 61  BitOr );.      a
14ee0 73 73 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d  ssert( TK_SLASH=
14ef0 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b 0a 20 20  =OP_Divide );.  
14f00 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
14f10 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c  SHIFT==OP_ShiftL
14f20 65 66 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  eft );.      ass
14f30 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d  ert( TK_RSHIFT==
14f40 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b  OP_ShiftRight );
14f50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
14f60 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e  K_CONCAT==OP_Con
14f70 63 61 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  cat );.      tes
14f80 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e  tcase( op==TK_AN
14f90 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  D );.      testc
14fa0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29  ase( op==TK_OR )
14fb0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14fc0 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b  ( op==TK_PLUS );
14fd0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14fe0 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b   op==TK_MINUS );
14ff0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15000 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20   op==TK_REM );. 
15010 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
15020 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a  p==TK_BITAND );.
15030 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15040 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a  op==TK_BITOR );.
15050 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15060 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a  op==TK_SLASH );.
15070 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15080 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b  op==TK_LSHIFT );
15090 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
150a0 20 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29   op==TK_RSHIFT )
150b0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
150c0 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20  ( op==TK_CONCAT 
150d0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
150e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
150f0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
15100 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
15110 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
15120 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
15130 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
15140 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
15150 65 65 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee2);.      sqli
15160 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
15170 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74 61 72   op, r2, r1, tar
15180 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  get);.      test
15190 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
151a0 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
151b0 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
151c0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
151d0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
151e0 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
151f0 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
15200 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
15210 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65       assert( pLe
15220 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ft );.      if( 
15230 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pLeft->op==TK_IN
15240 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20  TEGER ){.       
15250 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61   codeInteger(pPa
15260 72 73 65 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74  rse, pLeft, 1, t
15270 61 72 67 65 74 29 3b 0a 23 69 66 6e 64 65 66 20  arget);.#ifndef 
15280 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
15290 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20  TING_POINT.     
152a0 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74   }else if( pLeft
152b0 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29  ->op==TK_FLOAT )
152c0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
152d0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
152e0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
152f0 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
15300 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c    codeReal(v, pL
15310 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31  eft->u.zToken, 1
15320 2c 20 74 61 72 67 65 74 29 3b 0a 23 65 6e 64 69  , target);.#endi
15330 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  f.      }else{. 
15340 20 20 20 20 20 20 20 72 65 67 46 72 65 65 31 20         regFree1 
15350 3d 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  = r1 = sqlite3Ge
15360 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
15370 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15380 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15390 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 31  P_Integer, 0, r1
153a0 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20  );.        r2 = 
153b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
153c0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
153d0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
153e0 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ee2);.        sq
153f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
15400 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20  v, OP_Subtract, 
15410 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b  r2, r1, target);
15420 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
15430 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
15440 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15450 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a  inReg = target;.
15460 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15470 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
15480 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20  ITNOT:.    case 
15490 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
154a0 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f  assert( TK_BITNO
154b0 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 0a  T==OP_BitNot );.
154c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
154d0 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a  _NOT==OP_Not );.
154e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
154f0 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b  op==TK_BITNOT );
15500 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15510 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20   op==TK_NOT );. 
15520 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
15530 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
15540 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
15550 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
15560 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15570 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
15580 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72       inReg = tar
15590 67 65 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  get;.      sqlit
155a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
155b0 6f 70 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a  op, r1, inReg);.
155c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
155d0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
155e0 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
155f0 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
15600 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
15610 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49      assert( TK_I
15620 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  SNULL==OP_IsNull
15630 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
15640 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50  ( TK_NOTNULL==OP
15650 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20  _NotNull );.    
15660 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
15670 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  TK_ISNULL );.   
15680 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
15690 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20  =TK_NOTNULL );. 
156a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
156b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
156c0 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29  eger, 1, target)
156d0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
156e0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
156f0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
15700 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
15710 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
15720 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
15730 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
15740 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
15750 28 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20  (v, op, r1);.   
15760 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15770 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
15780 6d 2c 20 74 61 72 67 65 74 2c 20 2d 31 29 3b 0a  m, target, -1);.
15790 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
157a0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
157b0 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  r);.      break;
157c0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
157d0 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
157e0 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f   {.      AggInfo
157f0 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d   *pInfo = pExpr-
15800 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20  >pAggInfo;.     
15810 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b   if( pInfo==0 ){
15820 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
15830 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
15840 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
15850 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
15860 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
15870 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65  (pParse, "misuse
15880 20 6f 66 20 61 67 67 72 65 67 61 74 65 3a 20 25   of aggregate: %
15890 73 28 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  s()", pExpr->u.z
158a0 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65  Token);.      }e
158b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 52  lse{.        inR
158c0 65 67 20 3d 20 70 49 6e 66 6f 2d 3e 61 46 75 6e  eg = pInfo->aFun
158d0 63 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69  c[pExpr->iAgg].i
158e0 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Mem;.      }.   
158f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
15900 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53      case TK_CONS
15910 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63 61 73 65  T_FUNC:.    case
15920 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a   TK_FUNCTION: {.
15930 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
15940 70 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20  pFarg;       /* 
15950 4c 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e  List of function
15960 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
15970 20 20 20 20 69 6e 74 20 6e 46 61 72 67 3b 20 20      int nFarg;  
15980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
15990 6d 62 65 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e  mber of function
159a0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
159b0 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
159c0 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  f;         /* Th
159d0 65 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e  e function defin
159e0 69 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a  ition object */.
159f0 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20        int nId;  
15a00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15a10 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 66 75  Length of the fu
15a20 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 69 6e 20 62  nction name in b
15a30 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 63 6f  ytes */.      co
15a40 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20  nst char *zId;  
15a50 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63       /* The func
15a60 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  tion name */.   
15a70 20 20 20 69 6e 74 20 63 6f 6e 73 74 4d 61 73 6b     int constMask
15a80 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4d 61 73   = 0;     /* Mas
15a90 6b 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  k of function ar
15aa0 67 75 6d 65 6e 74 73 20 74 68 61 74 20 61 72 65  guments that are
15ab0 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 20   constant */.   
15ac0 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
15ad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
15ae0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
15af0 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28     u8 enc = ENC(
15b00 64 62 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  db);      /* The
15b10 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 75   text encoding u
15b20 73 65 64 20 62 79 20 74 68 69 73 20 64 61 74 61  sed by this data
15b30 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f  base */.      Co
15b40 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30  llSeq *pColl = 0
15b50 3b 20 20 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74  ;    /* A collat
15b60 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a  ing sequence */.
15b70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
15b80 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
15b90 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
15ba0 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 74 65  ect) );.      te
15bb0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43  stcase( op==TK_C
15bc0 4f 4e 53 54 5f 46 55 4e 43 20 29 3b 0a 20 20 20  ONST_FUNC );.   
15bd0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
15be0 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  =TK_FUNCTION );.
15bf0 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
15c00 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78  sAnyProperty(pEx
15c10 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
15c20 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61  ) ){.        pFa
15c30 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  rg = 0;.      }e
15c40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61  lse{.        pFa
15c50 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  rg = pExpr->x.pL
15c60 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ist;.      }.   
15c70 20 20 20 6e 46 61 72 67 20 3d 20 70 46 61 72 67     nFarg = pFarg
15c80 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70 72 20   ? pFarg->nExpr 
15c90 3a 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  : 0;.      asser
15ca0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
15cb0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
15cc0 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
15cd0 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e   zId = pExpr->u.
15ce0 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 49  zToken;.      nI
15cf0 64 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  d = sqlite3Strle
15d00 6e 33 30 28 7a 49 64 29 3b 0a 20 20 20 20 20 20  n30(zId);.      
15d10 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69  pDef = sqlite3Fi
15d20 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a  ndFunction(db, z
15d30 49 64 2c 20 6e 49 64 2c 20 6e 46 61 72 67 2c 20  Id, nId, nFarg, 
15d40 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  enc, 0);.      i
15d50 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20  f( pDef==0 ){.  
15d60 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
15d70 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
15d80 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a  nknown function:
15d90 20 25 2e 2a 73 28 29 22 2c 20 6e 49 64 2c 20 7a   %.*s()", nId, z
15da0 49 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  Id);.        bre
15db0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
15dc0 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 61 20     /* Attempt a 
15dd0 64 69 72 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74  direct implement
15de0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69  ation of the bui
15df0 6c 74 2d 69 6e 20 43 4f 41 4c 45 53 43 45 28 29  lt-in COALESCE()
15e00 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 49 46   and.      ** IF
15e10 4e 55 4c 4c 28 29 20 66 75 6e 63 74 69 6f 6e 73  NULL() functions
15e20 2e 20 20 54 68 69 73 20 61 76 6f 69 64 73 20 75  .  This avoids u
15e30 6e 6e 65 63 65 73 73 61 72 79 20 65 76 61 6c 61  nnecessary evala
15e40 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a  tion of.      **
15e50 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 74 20   arguments past 
15e60 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55  the first non-NU
15e70 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20  LL argument..   
15e80 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
15e90 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51  pDef->flags & SQ
15ea0 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53  LITE_FUNC_COALES
15eb0 43 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  CE ){.        in
15ec0 74 20 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20  t endCoalesce = 
15ed0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
15ee0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
15ef0 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d   assert( nFarg>=
15f00 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  2 );.        sql
15f10 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
15f20 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d  rse, pFarg->a[0]
15f30 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
15f40 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31  .        for(i=1
15f50 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b  ; i<nFarg; i++){
15f60 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
15f70 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15f80 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67  OP_NotNull, targ
15f90 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29  et, endCoalesce)
15fa0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
15fb0 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
15fc0 76 65 28 70 50 61 72 73 65 2c 20 74 61 72 67 65  ve(pParse, targe
15fd0 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  t, 1);.         
15fe0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
15ff0 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
16000 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16010 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
16020 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78   pFarg->a[i].pEx
16030 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
16040 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
16050 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
16060 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  e, 1);.        }
16070 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16080 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
16090 28 76 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29  (v, endCoalesce)
160a0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
160b0 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20  .      }...     
160c0 20 69 66 28 20 70 46 61 72 67 20 29 7b 0a 20 20   if( pFarg ){.  
160d0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
160e0 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
160f0 50 61 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a 0a  Parse, nFarg);..
16100 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
16110 65 6e 67 74 68 28 29 20 61 6e 64 20 74 79 70 65  ength() and type
16120 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 77  of() functions w
16130 69 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67  ith a column arg
16140 75 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a  ument,.        *
16150 2a 20 73 65 74 20 74 68 65 20 50 35 20 70 61 72  * set the P5 par
16160 61 6d 65 74 65 72 20 74 6f 20 74 68 65 20 4f 50  ameter to the OP
16170 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74  _Column opcode t
16180 6f 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41  o OPFLAG_LENGTHA
16190 52 47 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  RG.        ** or
161a0 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52   OPFLAG_TYPEOFAR
161b0 47 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20  G respectively, 
161c0 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73  to avoid unneces
161d0 73 61 72 79 20 64 61 74 61 0a 20 20 20 20 20 20  sary data.      
161e0 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20    ** loading..  
161f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
16200 20 69 66 28 20 28 70 44 65 66 2d 3e 66 6c 61 67   if( (pDef->flag
16210 73 20 26 20 28 53 51 4c 49 54 45 5f 46 55 4e 43  s & (SQLITE_FUNC
16220 5f 4c 45 4e 47 54 48 7c 53 51 4c 49 54 45 5f 46  _LENGTH|SQLITE_F
16230 55 4e 43 5f 54 59 50 45 4f 46 29 29 21 3d 30 20  UNC_TYPEOF))!=0 
16240 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  ){.          u8 
16250 65 78 70 72 4f 70 3b 0a 20 20 20 20 20 20 20 20  exprOp;.        
16260 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3d    assert( nFarg=
16270 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =1 );.          
16280 61 73 73 65 72 74 28 20 70 46 61 72 67 2d 3e 61  assert( pFarg->a
16290 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a  [0].pExpr!=0 );.
162a0 20 20 20 20 20 20 20 20 20 20 65 78 70 72 4f 70            exprOp
162b0 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70   = pFarg->a[0].p
162c0 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 20 20  Expr->op;.      
162d0 20 20 20 20 69 66 28 20 65 78 70 72 4f 70 3d 3d      if( exprOp==
162e0 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70  TK_COLUMN || exp
162f0 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  rOp==TK_AGG_COLU
16300 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  MN ){.          
16310 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
16320 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50  _FUNC_LENGTH==OP
16330 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29  FLAG_LENGTHARG )
16340 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
16350 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e  sert( SQLITE_FUN
16360 43 5f 54 59 50 45 4f 46 3d 3d 4f 50 46 4c 41 47  C_TYPEOF==OPFLAG
16370 5f 54 59 50 45 4f 46 41 52 47 20 29 3b 0a 20 20  _TYPEOFARG );.  
16380 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
16390 73 65 28 20 70 44 65 66 2d 3e 66 6c 61 67 73 3d  se( pDef->flags=
163a0 3d 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e  =SQLITE_FUNC_LEN
163b0 47 54 48 20 29 3b 0a 20 20 20 20 20 20 20 20 20  GTH );.         
163c0 20 20 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70     pFarg->a[0].p
163d0 45 78 70 72 2d 3e 6f 70 32 20 3d 20 70 44 65 66  Expr->op2 = pDef
163e0 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20  ->flags;.       
163f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a     }.        }..
16400 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
16410 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
16420 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 54 69 63  rse);     /* Tic
16430 6b 65 74 20 32 65 61 32 34 32 35 64 33 34 62 65  ket 2ea2425d34be
16440 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
16450 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
16460 69 73 74 28 70 50 61 72 73 65 2c 20 70 46 61 72  ist(pParse, pFar
16470 67 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20  g, r1, 1);.     
16480 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
16490 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31  chePop(pParse, 1
164a0 29 3b 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32  );   /* Ticket 2
164b0 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20  ea2425d34be */. 
164c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
164d0 20 20 20 20 72 31 20 3d 20 30 3b 0a 20 20 20 20      r1 = 0;.    
164e0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
164f0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
16500 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f  ABLE.      /* Po
16510 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20  ssibly overload 
16520 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20  the function if 
16530 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
16540 6e 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  nt is.      ** a
16550 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63   virtual table c
16560 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a  olumn..      **.
16570 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66        ** For inf
16580 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49  ix functions (LI
16590 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50  KE, GLOB, REGEXP
165a0 2c 20 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65  , and MATCH) use
165b0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65   the.      ** se
165c0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e  cond argument, n
165d0 6f 74 20 74 68 65 20 66 69 72 73 74 2c 20 61 73  ot the first, as
165e0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   the argument to
165f0 20 74 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a   test to.      *
16600 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 61  * see if it is a
16610 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72   column in a vir
16620 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69  tual table.  Thi
16630 73 20 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73  s is done becaus
16640 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c  e.      ** the l
16650 65 66 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69  eft operand of i
16660 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28  nfix functions (
16670 74 68 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77  the operand we w
16680 61 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ant to.      ** 
16690 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64  control overload
166a0 69 6e 67 29 20 65 6e 64 73 20 75 70 20 61 73 20  ing) ends up as 
166b0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
166c0 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20  ent to the.     
166d0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54   ** function.  T
166e0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41  he expression "A
166f0 20 67 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69   glob B" is equi
16700 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20  valent to .     
16710 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20   ** "glob(B,A). 
16720 20 57 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20   We want to use 
16730 74 68 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62  the A in "A glob
16740 20 42 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20   B" to test.    
16750 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f    ** for functio
16760 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20  n overloading.  
16770 42 75 74 20 77 65 20 75 73 65 20 74 68 65 20 42  But we use the B
16780 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42   term in "glob(B
16790 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ,A)"..      */. 
167a0 20 20 20 20 20 69 66 28 20 6e 46 61 72 67 3e 3d       if( nFarg>=
167b0 32 20 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61  2 && (pExpr->fla
167c0 67 73 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e  gs & EP_InfixFun
167d0 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  c) ){.        pD
167e0 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  ef = sqlite3Vtab
167f0 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e  OverloadFunction
16800 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67  (db, pDef, nFarg
16810 2c 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45  , pFarg->a[1].pE
16820 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  xpr);.      }els
16830 65 20 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b  e if( nFarg>0 ){
16840 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
16850 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c  sqlite3VtabOverl
16860 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  oadFunction(db, 
16870 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61  pDef, nFarg, pFa
16880 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  rg->a[0].pExpr);
16890 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
168a0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
168b0 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  <nFarg; i++){.  
168c0 20 20 20 20 20 20 69 66 28 20 69 3c 33 32 20 26        if( i<32 &
168d0 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
168e0 6f 6e 73 74 61 6e 74 28 70 46 61 72 67 2d 3e 61  onstant(pFarg->a
168f0 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [i].pExpr) ){.  
16900 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73          constMas
16910 6b 20 7c 3d 20 28 31 3c 3c 69 29 3b 0a 20 20 20  k |= (1<<i);.   
16920 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
16930 66 28 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20  f( (pDef->flags 
16940 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45  & SQLITE_FUNC_NE
16950 45 44 43 4f 4c 4c 29 21 3d 30 20 26 26 20 21 70  EDCOLL)!=0 && !p
16960 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
16970 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
16980 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
16990 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d  rse, pFarg->a[i]
169a0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
169b0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
169c0 20 69 66 28 20 70 44 65 66 2d 3e 66 6c 61 67 73   if( pDef->flags
169d0 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e   & SQLITE_FUNC_N
169e0 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20  EEDCOLL ){.     
169f0 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
16a00 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
16a10 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20  tColl; .        
16a20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16a30 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c  4(v, OP_CollSeq,
16a40 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20   0, 0, 0, (char 
16a50 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
16a60 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  SEQ);.      }.  
16a70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16a80 64 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63  ddOp4(v, OP_Func
16a90 74 69 6f 6e 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c  tion, constMask,
16aa0 20 72 31 2c 20 74 61 72 67 65 74 2c 0a 20 20 20   r1, target,.   
16ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ac0 20 20 20 20 20 28 63 68 61 72 2a 29 70 44 65 66       (char*)pDef
16ad0 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
16ae0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16af0 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29  ChangeP5(v, (u8)
16b00 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 69 66  nFarg);.      if
16b10 28 20 6e 46 61 72 67 20 29 7b 0a 20 20 20 20 20  ( nFarg ){.     
16b20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
16b30 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
16b40 65 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20  e, r1, nFarg);. 
16b50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
16b60 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
16b70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
16b80 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
16b90 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63  TK_EXISTS:.    c
16ba0 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
16bb0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
16bc0 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29   op==TK_EXISTS )
16bd0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
16be0 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
16bf0 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d  );.      inReg =
16c00 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
16c10 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
16c20 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  xpr, 0, 0);.    
16c30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
16c40 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
16c50 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49  .      int destI
16c60 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33  fFalse = sqlite3
16c70 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
16c80 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  ;.      int dest
16c90 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33  IfNull = sqlite3
16ca0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
16cb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16cc0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16cd0 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
16ce0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
16cf0 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65  xprCodeIN(pParse
16d00 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49 66 46  , pExpr, destIfF
16d10 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c  alse, destIfNull
16d20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16d30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16d40 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72  _Integer, 1, tar
16d50 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  get);.      sqli
16d60 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
16d70 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c  bel(v, destIfFal
16d80 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
16d90 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16da0 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65  OP_AddImm, targe
16db0 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  t, 0);.      sql
16dc0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
16dd0 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75  abel(v, destIfNu
16de0 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
16df0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
16e00 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
16e10 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20  BQUERY */...    
16e20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42  /*.    **    x B
16e30 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20  ETWEEN y AND z. 
16e40 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
16e50 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  s is equivalent 
16e60 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  to.    **.    **
16e70 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d      x>=y AND x<=
16e80 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  z.    **.    ** 
16e90 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  X is stored in p
16ea0 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20  Expr->pLeft..   
16eb0 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20   ** Y is stored 
16ec0 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  in pExpr->pList-
16ed0 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20  >a[0].pExpr..   
16ee0 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20   ** Z is stored 
16ef0 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  in pExpr->pList-
16f00 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20  >a[1].pExpr..   
16f10 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
16f20 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
16f30 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
16f40 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
16f50 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
16f60 73 74 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20  st_item *pLItem 
16f70 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
16f80 2d 3e 61 3b 0a 20 20 20 20 20 20 45 78 70 72 20  ->a;.      Expr 
16f90 2a 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d  *pRight = pLItem
16fa0 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20 20 20  ->pExpr;..      
16fb0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
16fc0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
16fd0 20 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65   pLeft, &regFree
16fe0 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
16ff0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
17000 6d 70 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  mp(pParse, pRigh
17010 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
17020 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
17030 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
17040 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
17050 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
17060 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47     r3 = sqlite3G
17070 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
17080 29 3b 0a 20 20 20 20 20 20 72 34 20 3d 20 73 71  );.      r4 = sq
17090 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
170a0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 63  pParse);.      c
170b0 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
170c0 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
170d0 2c 20 4f 50 5f 47 65 2c 0a 20 20 20 20 20 20 20  , OP_Ge,.       
170e0 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
170f0 32 2c 20 72 33 2c 20 53 51 4c 49 54 45 5f 53 54  2, r3, SQLITE_ST
17100 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20 70 4c  OREP2);.      pL
17110 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52  Item++;.      pR
17120 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70  ight = pLItem->p
17130 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
17140 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
17150 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
17160 65 32 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e2);.      r2 = 
17170 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
17180 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52 69 67  emp(pParse, pRig
17190 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
171a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
171b0 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
171c0 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
171d0 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
171e0 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 72  pRight, OP_Le, r
171f0 31 2c 20 72 32 2c 20 72 34 2c 20 53 51 4c 49 54  1, r2, r4, SQLIT
17200 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20  E_STOREP2);.    
17210 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17220 4f 70 33 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 72  Op3(v, OP_And, r
17230 33 2c 20 72 34 2c 20 74 61 72 67 65 74 29 3b 0a  3, r4, target);.
17240 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
17250 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
17260 73 65 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 73  se, r3);.      s
17270 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
17280 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 34 29  pReg(pParse, r4)
17290 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
172a0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
172b0 5f 43 4f 4c 4c 41 54 45 3a 20 0a 20 20 20 20 63  _COLLATE: .    c
172c0 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a  ase TK_UPLUS: {.
172d0 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
172e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
172f0 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
17300 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
17310 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
17320 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
17330 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20 20  TK_TRIGGER: {.  
17340 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70      /* If the op
17350 63 6f 64 65 20 69 73 20 54 4b 5f 54 52 49 47 47  code is TK_TRIGG
17360 45 52 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70  ER, then the exp
17370 72 65 73 73 69 6f 6e 20 69 73 20 61 20 72 65 66  ression is a ref
17380 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20  erence.      ** 
17390 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  to a column in t
173a0 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e  he new.* or old.
173b0 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 73 20  * pseudo-tables 
173c0 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20  available to.   
173d0 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 70 72     ** trigger pr
173e0 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68 69 73 20  ograms. In this 
173f0 63 61 73 65 20 45 78 70 72 2e 69 54 61 62 6c 65  case Expr.iTable
17400 20 69 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72   is set to 1 for
17410 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65   the.      ** ne
17420 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  w.* pseudo-table
17430 2c 20 6f 72 20 30 20 66 6f 72 20 74 68 65 20 6f  , or 0 for the o
17440 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ld.* pseudo-tabl
17450 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a  e. Expr.iColumn.
17460 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20        ** is set 
17470 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66  to the column of
17480 20 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c   the pseudo-tabl
17490 65 20 74 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f  e to read, or to
174a0 20 2d 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20   -1 to.      ** 
174b0 72 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 66  read the rowid f
174c0 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ield..      **. 
174d0 20 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70 72       ** The expr
174e0 65 73 73 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d  ession is implem
174f0 65 6e 74 65 64 20 75 73 69 6e 67 20 61 6e 20 4f  ented using an O
17500 50 5f 50 61 72 61 6d 20 6f 70 63 6f 64 65 2e 20  P_Param opcode. 
17510 54 68 65 20 70 31 0a 20 20 20 20 20 20 2a 2a 20  The p1.      ** 
17520 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 65 74  parameter is set
17530 20 74 6f 20 30 20 66 6f 72 20 61 6e 20 6f 6c 64   to 0 for an old
17540 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65  .rowid reference
17550 2c 20 6f 72 20 74 6f 20 28 69 2b 31 29 0a 20 20  , or to (i+1).  
17560 20 20 20 20 2a 2a 20 74 6f 20 72 65 66 65 72 65      ** to refere
17570 6e 63 65 20 61 6e 6f 74 68 65 72 20 63 6f 6c 75  nce another colu
17580 6d 6e 20 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20  mn of the old.* 
17590 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 77 68  pseudo-table, wh
175a0 65 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 20  ere .      ** i 
175b0 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
175c0 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20  the column. For 
175d0 61 20 6e 65 77 2e 72 6f 77 69 64 20 72 65 66 65  a new.rowid refe
175e0 72 65 6e 63 65 2c 20 70 31 20 69 73 0a 20 20 20  rence, p1 is.   
175f0 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 28 6e 2b     ** set to (n+
17600 31 29 2c 20 77 68 65 72 65 20 6e 20 69 73 20 74  1), where n is t
17610 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
17620 75 6d 6e 73 20 69 6e 20 65 61 63 68 20 70 73 65  umns in each pse
17630 75 64 6f 2d 74 61 62 6c 65 2e 0a 20 20 20 20 20  udo-table..     
17640 20 2a 2a 20 46 6f 72 20 61 20 72 65 66 65 72 65   ** For a refere
17650 6e 63 65 20 74 6f 20 61 6e 79 20 6f 74 68 65 72  nce to any other
17660 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e   column in the n
17670 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ew.* pseudo-tabl
17680 65 2c 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 69  e, p1.      ** i
17690 73 20 73 65 74 20 74 6f 20 28 6e 2b 32 2b 69 29  s set to (n+2+i)
176a0 2c 20 77 68 65 72 65 20 6e 20 61 6e 64 20 69 20  , where n and i 
176b0 61 72 65 20 61 73 20 64 65 66 69 6e 65 64 20 70  are as defined p
176c0 72 65 76 69 6f 75 73 6c 79 2e 20 46 6f 72 0a 20  reviously. For. 
176d0 20 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c       ** example,
176e0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 6f 6e   if the table on
176f0 20 77 68 69 63 68 20 74 72 69 67 67 65 72 73 20   which triggers 
17700 61 72 65 20 62 65 69 6e 67 20 66 69 72 65 64 20  are being fired 
17710 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 63 6c  is.      ** decl
17720 61 72 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a  ared as:.      *
17730 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45  *.      **   CRE
17740 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
17750 62 29 3b 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  b);.      **.   
17760 20 20 20 2a 2a 20 54 68 65 6e 20 70 31 20 69 73     ** Then p1 is
17770 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
17780 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a  follows:.      *
17790 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d  *.      **   p1=
177a0 3d 30 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 72  =0   ->    old.r
177b0 6f 77 69 64 20 20 20 20 20 70 31 3d 3d 33 20 20  owid     p1==3  
177c0 20 2d 3e 20 20 20 20 6e 65 77 2e 72 6f 77 69 64   ->    new.rowid
177d0 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d  .      **   p1==
177e0 31 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 61 20  1   ->    old.a 
177f0 20 20 20 20 20 20 20 20 70 31 3d 3d 34 20 20 20          p1==4   
17800 2d 3e 20 20 20 20 6e 65 77 2e 61 0a 20 20 20 20  ->    new.a.    
17810 20 20 2a 2a 20 20 20 70 31 3d 3d 32 20 20 20 2d    **   p1==2   -
17820 3e 20 20 20 20 6f 6c 64 2e 62 20 20 20 20 20 20  >    old.b      
17830 20 20 20 70 31 3d 3d 35 20 20 20 2d 3e 20 20 20     p1==5   ->   
17840 20 6e 65 77 2e 62 20 20 20 20 20 20 20 0a 20 20   new.b       .  
17850 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62      */.      Tab
17860 6c 65 20 2a 70 54 61 62 20 3d 20 70 45 78 70 72  le *pTab = pExpr
17870 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e  ->pTab;.      in
17880 74 20 70 31 20 3d 20 70 45 78 70 72 2d 3e 69 54  t p1 = pExpr->iT
17890 61 62 6c 65 20 2a 20 28 70 54 61 62 2d 3e 6e 43  able * (pTab->nC
178a0 6f 6c 2b 31 29 20 2b 20 31 20 2b 20 70 45 78 70  ol+1) + 1 + pExp
178b0 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20  r->iColumn;..   
178c0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
178d0 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70  ->iTable==0 || p
178e0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 31 20  Expr->iTable==1 
178f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
17900 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
17910 3d 2d 31 20 26 26 20 70 45 78 70 72 2d 3e 69 43  =-1 && pExpr->iC
17920 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c  olumn<pTab->nCol
17930 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
17940 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20  ( pTab->iPKey<0 
17950 7c 7c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  || pExpr->iColum
17960 6e 21 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29  n!=pTab->iPKey )
17970 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
17980 70 31 3e 3d 30 20 26 26 20 70 31 3c 28 70 54 61  p1>=0 && p1<(pTa
17990 62 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a  b->nCol*2+2) );.
179a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
179b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50  beAddOp2(v, OP_P
179c0 61 72 61 6d 2c 20 70 31 2c 20 74 61 72 67 65 74  aram, p1, target
179d0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
179e0 6d 65 6e 74 28 28 76 2c 20 22 25 73 2e 25 73 20  ment((v, "%s.%s 
179f0 2d 3e 20 24 25 64 22 2c 0a 20 20 20 20 20 20 20  -> $%d",.       
17a00 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20   (pExpr->iTable 
17a10 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29  ? "new" : "old")
17a20 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78 70 72  ,.        (pExpr
17a30 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72  ->iColumn<0 ? "r
17a40 6f 77 69 64 22 20 3a 20 70 45 78 70 72 2d 3e 70  owid" : pExpr->p
17a50 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d  Tab->aCol[pExpr-
17a60 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29  >iColumn].zName)
17a70 2c 0a 20 20 20 20 20 20 20 20 74 61 72 67 65 74  ,.        target
17a80 0a 20 20 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e  .      ));..#ifn
17a90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17aa0 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
17ab0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63       /* If the c
17ac0 6f 6c 75 6d 6e 20 68 61 73 20 52 45 41 4c 20 61  olumn has REAL a
17ad0 66 66 69 6e 69 74 79 2c 20 69 74 20 6d 61 79 20  ffinity, it may 
17ae0 63 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f  currently be sto
17af0 72 65 64 20 61 73 20 61 6e 0a 20 20 20 20 20 20  red as an.      
17b00 2a 2a 20 69 6e 74 65 67 65 72 2e 20 55 73 65 20  ** integer. Use 
17b10 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 20  OP_RealAffinity 
17b20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20  to make sure it 
17b30 69 73 20 72 65 61 6c 6c 79 20 72 65 61 6c 2e 20  is really real. 
17b40 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 45   */.      if( pE
17b50 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20  xpr->iColumn>=0 
17b60 0a 20 20 20 20 20 20 20 26 26 20 70 54 61 62 2d  .       && pTab-
17b70 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f  >aCol[pExpr->iCo
17b80 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d  lumn].affinity==
17b90 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a  SQLITE_AFF_REAL.
17ba0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
17bb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17bc0 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66  p1(v, OP_RealAff
17bd0 69 6e 69 74 79 2c 20 74 61 72 67 65 74 29 3b 0a  inity, target);.
17be0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
17bf0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17c00 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  }...    /*.    *
17c10 2a 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a  * Form A:.    **
17c20 20 20 20 43 41 53 45 20 78 20 57 48 45 4e 20 65     CASE x WHEN e
17c30 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65  1 THEN r1 WHEN e
17c40 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48  2 THEN r2 ... WH
17c50 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c  EN eN THEN rN EL
17c60 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a  SE y END.    **.
17c70 20 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20      ** Form B:. 
17c80 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45     **   CASE WHE
17c90 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  N e1 THEN r1 WHE
17ca0 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e  N e2 THEN r2 ...
17cb0 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e   WHEN eN THEN rN
17cc0 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20   ELSE y END.    
17cd0 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41  **.    ** Form A
17ce0 20 69 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73   is can be trans
17cf0 66 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20  formed into the 
17d00 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20  equivalent form 
17d10 42 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  B as follows:.  
17d20 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e    **   CASE WHEN
17d30 20 78 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48   x=e1 THEN r1 WH
17d40 45 4e 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20  EN x=e2 THEN r2 
17d50 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ....    **      
17d60 20 20 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e    WHEN x=eN THEN
17d70 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
17d80 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28     **.    ** X (
17d90 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73  if it exists) is
17da0 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   in pExpr->pLeft
17db0 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e  ..    ** Y is in
17dc0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2e 20   pExpr->pRight. 
17dd0 20 54 68 65 20 59 20 69 73 20 61 6c 73 6f 20 6f   The Y is also o
17de0 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65  ptional.  If the
17df0 72 65 20 69 73 20 6e 6f 0a 20 20 20 20 2a 2a 20  re is no.    ** 
17e00 45 4c 53 45 20 63 6c 61 75 73 65 20 61 6e 64 20  ELSE clause and 
17e10 6e 6f 20 6f 74 68 65 72 20 74 65 72 6d 20 6d 61  no other term ma
17e20 74 63 68 65 73 2c 20 74 68 65 6e 20 74 68 65 20  tches, then the 
17e30 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20  result of the.  
17e40 20 20 2a 2a 20 65 78 70 72 73 73 69 6f 6e 20 69    ** exprssion i
17e50 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45  s NULL..    ** E
17e60 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70  i is in pExpr->p
17e70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64  List->a[i*2] and
17e80 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c   Ri is pExpr->pL
17e90 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20  ist->a[i*2+1].. 
17ea0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
17eb0 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65   result of the e
17ec0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65  xpression is the
17ed0 20 52 69 20 66 6f 72 20 74 68 65 20 66 69 72 73   Ri for the firs
17ee0 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20  t matching Ei,. 
17ef0 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72     ** or if ther
17f00 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67  e is no matching
17f10 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65   Ei, the ELSE te
17f20 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72  rm Y, or if ther
17f30 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45  e is.    ** no E
17f40 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a  LSE term, NULL..
17f50 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
17f60 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  lt: assert( op==
17f70 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20  TK_CASE ); {.   
17f80 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b     int endLabel;
17f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fa0 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62       /* GOTO lab
17fb0 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41  el for end of CA
17fc0 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20  SE stmt */.     
17fd0 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20   int nextCase;  
17fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ff0 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c     /* GOTO label
18000 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63   for next WHEN c
18010 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69  lause */.      i
18020 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20  nt nExpr;       
18030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18040 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66   /* 2x number of
18050 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
18060 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20       int i;     
18070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18080 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
18090 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
180a0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
180b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
180c0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45    /* List of WHE
180d0 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
180e0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
180f0 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d  _item *aListelem
18100 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57  ;  /* Array of W
18110 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
18120 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72     Expr opCompar
18130 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
18140 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45       /* The X==E
18150 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  i expression */.
18160 20 20 20 20 20 20 45 78 70 72 20 63 61 63 68 65        Expr cache
18170 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
18180 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65          /* Cache
18190 64 20 65 78 70 72 65 73 73 69 6f 6e 20 58 20 2a  d expression X *
181a0 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  /.      Expr *pX
181b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
181c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
181d0 20 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f   X expression */
181e0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65  .      Expr *pTe
181f0 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
18200 20 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45           /* X==E
18210 69 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75  i (form A) or ju
18220 73 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a  st Ei (form B) *
18230 2f 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59  /.      VVA_ONLY
18240 28 20 69 6e 74 20 69 43 61 63 68 65 4c 65 76 65  ( int iCacheLeve
18250 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  l = pParse->iCac
18260 68 65 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20  heLevel; )..    
18270 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
18280 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
18290 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
182a0 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  && pExpr->x.pLis
182b0 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
182c0 74 28 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  t((pExpr->x.pLis
182d0 74 2d 3e 6e 45 78 70 72 20 25 20 32 29 20 3d 3d  t->nExpr % 2) ==
182e0 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
182f0 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  t(pExpr->x.pList
18300 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20  ->nExpr > 0);.  
18310 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78      pEList = pEx
18320 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
18330 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70     aListelem = p
18340 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  EList->a;.      
18350 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e  nExpr = pEList->
18360 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64  nExpr;.      end
18370 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56  Label = sqlite3V
18380 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
18390 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 20 3d  .      if( (pX =
183a0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d   pExpr->pLeft)!=
183b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 63  0 ){.        cac
183c0 68 65 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20  heX = *pX;.     
183d0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d     testcase( pX-
183e0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
183f0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
18400 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 52  se( pX->op==TK_R
18410 45 47 49 53 54 45 52 20 29 3b 0a 20 20 20 20 20  EGISTER );.     
18420 20 20 20 63 61 63 68 65 58 2e 69 54 61 62 6c 65     cacheX.iTable
18430 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
18440 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
18450 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  X, &regFree1);. 
18460 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
18470 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
18480 20 20 20 20 20 20 20 20 63 61 63 68 65 58 2e 6f          cacheX.o
18490 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b  p = TK_REGISTER;
184a0 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61  .        opCompa
184b0 72 65 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20  re.op = TK_EQ;. 
184c0 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65         opCompare
184d0 2e 70 4c 65 66 74 20 3d 20 26 63 61 63 68 65 58  .pLeft = &cacheX
184e0 3b 0a 20 20 20 20 20 20 20 20 70 54 65 73 74 20  ;.        pTest 
184f0 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20  = &opCompare;.  
18500 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20        /* Ticket 
18510 62 33 35 31 64 39 35 66 39 63 64 35 65 66 31 37  b351d95f9cd5ef17
18520 65 39 64 39 64 62 61 65 31 38 66 35 63 61 38 36  e9d9dbae18f5ca86
18530 31 31 31 39 30 30 30 31 3a 0a 20 20 20 20 20 20  11190001:.      
18540 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69    ** The value i
18550 6e 20 72 65 67 46 72 65 65 31 20 6d 69 67 68 74  n regFree1 might
18560 20 67 65 74 20 53 43 6f 70 79 2d 65 64 20 69 6e   get SCopy-ed in
18570 74 6f 20 74 68 65 20 66 69 6c 65 20 72 65 73 75  to the file resu
18580 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  lt..        ** S
18590 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
185a0 20 74 68 65 20 72 65 67 46 72 65 65 31 20 72 65   the regFree1 re
185b0 67 69 73 74 65 72 20 69 73 20 6e 6f 74 20 72 65  gister is not re
185c0 75 73 65 64 20 66 6f 72 20 6f 74 68 65 72 0a 20  used for other. 
185d0 20 20 20 20 20 20 20 2a 2a 20 70 75 72 70 6f 73         ** purpos
185e0 65 73 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20  es and possibly 
185f0 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f  overwritten.  */
18600 0a 20 20 20 20 20 20 20 20 72 65 67 46 72 65 65  .        regFree
18610 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  1 = 0;.      }. 
18620 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
18630 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20  nExpr; i=i+2){. 
18640 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
18650 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
18660 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  se);.        if(
18670 20 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20   pX ){.         
18680 20 61 73 73 65 72 74 28 20 70 54 65 73 74 21 3d   assert( pTest!=
18690 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  0 );.          o
186a0 70 43 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20  pCompare.pRight 
186b0 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70  = aListelem[i].p
186c0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65  Expr;.        }e
186d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
186e0 54 65 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d  Test = aListelem
186f0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
18700 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78     }.        nex
18710 74 43 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56  tCase = sqlite3V
18720 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
18730 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
18740 65 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b  e( pTest->op==TK
18750 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
18760 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
18770 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54  False(pParse, pT
18780 65 73 74 2c 20 6e 65 78 74 43 61 73 65 2c 20 53  est, nextCase, S
18790 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
187a0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
187b0 61 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69  ase( aListelem[i
187c0 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  +1].pExpr->op==T
187d0 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
187e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4c      testcase( aL
187f0 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78  istelem[i+1].pEx
18800 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  pr->op==TK_REGIS
18810 54 45 52 20 29 3b 0a 20 20 20 20 20 20 20 20 73  TER );.        s
18820 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
18830 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d  Parse, aListelem
18840 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61 72  [i+1].pExpr, tar
18850 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  get);.        sq
18860 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18870 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65  v, OP_Goto, 0, e
18880 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  ndLabel);.      
18890 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
188a0 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
188b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
188c0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
188d0 6c 28 76 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a  l(v, nextCase);.
188e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
188f0 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20  ( pExpr->pRight 
18900 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
18910 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
18920 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
18930 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
18940 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
18950 70 52 69 67 68 74 2c 20 74 61 72 67 65 74 29 3b  pRight, target);
18960 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18970 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
18980 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  rse, 1);.      }
18990 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
189a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
189b0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
189c0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  arget);.      }.
189d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
189e0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
189f0 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  | pParse->nErr>0
18a00 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
18a10 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
18a20 76 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76 65 6c  vel==iCacheLevel
18a30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
18a40 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
18a50 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a  l(v, endLabel);.
18a60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18a70 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
18a80 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20  E_OMIT_TRIGGER. 
18a90 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45     case TK_RAISE
18aa0 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
18ab0 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  ( pExpr->affinit
18ac0 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a  y==OE_Rollback .
18ad0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45             || pE
18ae0 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
18af0 45 5f 41 62 6f 72 74 0a 20 20 20 20 20 20 20 20  E_Abort.        
18b00 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66     || pExpr->aff
18b10 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20  inity==OE_Fail. 
18b20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78            || pEx
18b30 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
18b40 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20 20 29 3b  _Ignore.      );
18b50 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72  .      if( !pPar
18b60 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20  se->pTriggerTab 
18b70 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
18b80 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
18b90 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
18ba0 20 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45            "RAISE
18bb0 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75  () may only be u
18bc0 73 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69  sed within a tri
18bd0 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a  gger-program");.
18be0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
18bf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18c00 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  if( pExpr->affin
18c10 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b  ity==OE_Abort ){
18c20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18c30 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
18c40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18c50 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
18c60 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
18c70 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
18c80 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
18c90 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67  >affinity==OE_Ig
18ca0 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20  nore ){.        
18cb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18cc0 34 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 76  4(.            v
18cd0 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54  , OP_Halt, SQLIT
18ce0 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c  E_OK, OE_Ignore,
18cf0 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f   0, pExpr->u.zTo
18d00 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65  ken,0);.      }e
18d10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
18d20 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69  ite3HaltConstrai
18d30 6e 74 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  nt(pParse, SQLIT
18d40 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49  E_CONSTRAINT_TRI
18d50 47 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20  GGER,.          
18d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d70 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e      pExpr->affin
18d80 69 74 79 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ity, pExpr->u.zT
18d90 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  oken, 0);.      
18da0 7d 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  }..      break;.
18db0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
18dc0 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
18dd0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
18de0 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
18df0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
18e00 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
18e10 72 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  ree2);.  return 
18e20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  inReg;.}../*.** 
18e30 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
18e40 20 65 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70   evaluate an exp
18e50 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72  ression and stor
18e60 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a  e the results.**
18e70 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72   into a register
18e80 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
18e90 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68  gister number wh
18ea0 65 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ere the results.
18eb0 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a  ** are stored..*
18ec0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 67 69  *.** If the regi
18ed0 73 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72  ster is a tempor
18ee0 61 72 79 20 72 65 67 69 73 74 65 72 20 74 68 61  ary register tha
18ef0 74 20 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63  t can be dealloc
18f00 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72  ated,.** then wr
18f10 69 74 65 20 69 74 73 20 6e 75 6d 62 65 72 20 69  ite its number i
18f20 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49 66 20 74  nto *pReg.  If t
18f30 68 65 20 72 65 73 75 6c 74 20 72 65 67 69 73 74  he result regist
18f40 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74  er is not.** a t
18f50 65 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e 20 73  emporary, then s
18f60 65 74 20 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f  et *pReg to zero
18f70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18f80 45 78 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72  ExprCodeTemp(Par
18f90 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
18fa0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52   *pExpr, int *pR
18fb0 65 67 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20  eg){.  int r1 = 
18fc0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
18fd0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  g(pParse);.  int
18fe0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
18ff0 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
19000 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a  se, pExpr, r1);.
19010 20 20 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a    if( r2==r1 ){.
19020 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a      *pReg = r1;.
19030 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
19040 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
19050 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
19060 20 20 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20      *pReg = 0;. 
19070 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32 3b 0a   }.  return r2;.
19080 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
19090 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
190a0 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73   evaluate expres
190b0 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73  sion pExpr and s
190c0 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75  tore the.** resu
190d0 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  lts in register 
190e0 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73  target.  The res
190f0 75 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e 74  ults are guarant
19100 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a  eed to appear.**
19110 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72   in register tar
19120 67 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  get..*/.int sqli
19130 74 65 33 45 78 70 72 43 6f 64 65 28 50 61 72 73  te3ExprCode(Pars
19140 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
19150 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
19160 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67  et){.  int inReg
19170 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  ;..  assert( tar
19180 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c  get>0 && target<
19190 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b  =pParse->nMem );
191a0 0a 20 20 69 66 28 20 70 45 78 70 72 20 26 26 20  .  if( pExpr && 
191b0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45  pExpr->op==TK_RE
191c0 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20 73 71  GISTER ){.    sq
191d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
191e0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
191f0 50 5f 43 6f 70 79 2c 20 70 45 78 70 72 2d 3e 69  P_Copy, pExpr->i
19200 54 61 62 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a  Table, target);.
19210 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 52    }else{.    inR
19220 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
19230 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
19240 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
19250 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
19260 50 61 72 73 65 2d 3e 70 56 64 62 65 20 7c 7c 20  Parse->pVdbe || 
19270 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
19280 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
19290 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65  if( inReg!=targe
192a0 74 20 26 26 20 70 50 61 72 73 65 2d 3e 70 56 64  t && pParse->pVd
192b0 62 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  be ){.      sqli
192c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50  te3VdbeAddOp2(pP
192d0 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
192e0 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61  SCopy, inReg, ta
192f0 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rget);.    }.  }
19300 0a 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74  .  return target
19310 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
19320 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 65 76  ate code that ev
19330 61 6c 75 74 65 73 20 74 68 65 20 67 69 76 65 6e  alutes the given
19340 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
19350 70 75 74 73 20 74 68 65 20 72 65 73 75 6c 74 0a  puts the result.
19360 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ** in register t
19370 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  arget..**.** Als
19380 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  o make a copy of
19390 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
193a0 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f  results into ano
193b0 74 68 65 72 20 22 63 61 63 68 65 22 20 72 65 67  ther "cache" reg
193c0 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64  ister.** and mod
193d0 69 66 79 20 74 68 65 20 65 78 70 72 65 73 73 69  ify the expressi
193e0 6f 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e  on so that the n
193f0 65 78 74 20 74 69 6d 65 20 69 74 20 69 73 20 65  ext time it is e
19400 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65  valuated,.** the
19410 20 72 65 73 75 6c 74 20 69 73 20 61 20 63 6f 70   result is a cop
19420 79 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 72  y of the cache r
19430 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  egister..**.** T
19440 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
19450 73 65 64 20 66 6f 72 20 65 78 70 72 65 73 73 69  sed for expressi
19460 6f 6e 73 20 74 68 61 74 20 61 72 65 20 75 73 65  ons that are use
19470 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74  d multiple .** t
19480 69 6d 65 73 2e 20 20 54 68 65 79 20 61 72 65 20  imes.  They are 
19490 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65 20 61  evaluated once a
194a0 6e 64 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  nd the results o
194b0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
194c0 0a 2a 2a 20 61 72 65 20 72 65 75 73 65 64 2e 0a  .** are reused..
194d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
194e0 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50  prCodeAndCache(P
194f0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
19500 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
19510 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a  arget){.  Vdbe *
19520 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
19530 65 3b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a  e;.  int inReg;.
19540 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
19550 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
19560 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
19570 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67  ;.  assert( targ
19580 65 74 3e 30 20 29 3b 0a 20 20 2f 2a 20 54 68 69  et>0 );.  /* Thi
19590 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
195a0 6c 65 64 20 66 6f 72 20 74 65 72 6d 73 20 74 6f  led for terms to
195b0 20 49 4e 53 45 52 54 20 6f 72 20 55 50 44 41 54   INSERT or UPDAT
195c0 45 2e 20 20 41 6e 64 20 74 68 65 20 6f 6e 6c 79  E.  And the only
195d0 0a 20 20 2a 2a 20 6f 74 68 65 72 20 70 6c 61 63  .  ** other plac
195e0 65 20 77 68 65 72 65 20 65 78 70 72 65 73 73 69  e where expressi
195f0 6f 6e 73 20 63 61 6e 20 62 65 20 63 6f 6e 76 65  ons can be conve
19600 72 74 65 64 20 69 6e 74 6f 20 54 4b 5f 52 45 47  rted into TK_REG
19610 49 53 54 45 52 20 69 73 0a 20 20 2a 2a 20 69 6e  ISTER is.  ** in
19620 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
19630 6f 63 65 73 73 69 6e 67 2e 20 20 53 6f 20 61 73  ocessing.  So as
19640 20 63 75 72 72 65 6e 74 6c 79 20 69 6d 70 6c 65   currently imple
19650 6d 65 6e 74 65 64 2c 20 74 68 65 72 65 20 69 73  mented, there is
19660 0a 20 20 2a 2a 20 6e 6f 20 77 61 79 20 66 6f 72  .  ** no way for
19670 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52 20 74   a TK_REGISTER t
19680 6f 20 65 78 69 73 74 20 68 65 72 65 2e 20 20 42  o exist here.  B
19690 75 74 20 69 74 20 73 65 65 6d 73 20 70 72 75 64  ut it seems prud
196a0 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70  ent to.  ** keep
196b0 20 74 68 65 20 41 4c 57 41 59 53 28 29 20 69 6e   the ALWAYS() in
196c0 20 63 61 73 65 20 74 68 65 20 63 6f 6e 64 69 74   case the condit
196d0 69 6f 6e 73 20 61 62 6f 76 65 20 63 68 61 6e 67  ions above chang
196e0 65 20 77 69 74 68 20 66 75 74 75 72 65 0a 20 20  e with future.  
196f0 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73  ** modifications
19700 20 6f 72 20 65 6e 68 61 6e 63 65 6d 65 6e 74 73   or enhancements
19710 2e 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59  . */.  if( ALWAY
19720 53 28 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  S(pExpr->op!=TK_
19730 52 45 47 49 53 54 45 52 29 20 29 7b 20 20 0a 20  REGISTER) ){  . 
19740 20 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 20     int iMem;.   
19750 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65   iMem = ++pParse
19760 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
19770 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19780 20 4f 50 5f 43 6f 70 79 2c 20 69 6e 52 65 67 2c   OP_Copy, inReg,
19790 20 69 4d 65 6d 29 3b 0a 20 20 20 20 70 45 78 70   iMem);.    pExp
197a0 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 4d 65 6d  r->iTable = iMem
197b0 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32  ;.    pExpr->op2
197c0 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
197d0 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
197e0 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 7d 0a 20  _REGISTER;.  }. 
197f0 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d   return inReg;.}
19800 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
19810 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45  LITE_ENABLE_TREE
19820 5f 45 58 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20  _EXPLAIN)./*.** 
19830 47 65 6e 65 72 61 74 65 20 61 20 68 75 6d 61 6e  Generate a human
19840 2d 72 65 61 64 61 62 6c 65 20 65 78 70 6c 61 6e  -readable explan
19850 61 74 69 6f 6e 20 6f 66 20 61 6e 20 65 78 70 72  ation of an expr
19860 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a  ession tree..*/.
19870 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 6c  void sqlite3Expl
19880 61 69 6e 45 78 70 72 28 56 64 62 65 20 2a 70 4f  ainExpr(Vdbe *pO
19890 75 74 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  ut, Expr *pExpr)
198a0 7b 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  {.  int op;     
198b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
198c0 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e   The opcode bein
198d0 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 63 6f 6e  g coded */.  con
198e0 73 74 20 63 68 61 72 20 2a 7a 42 69 6e 4f 70 20  st char *zBinOp 
198f0 3d 20 30 3b 20 20 20 2f 2a 20 42 69 6e 61 72 79  = 0;   /* Binary
19900 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 63   operator */.  c
19910 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 6e 69 4f  onst char *zUniO
19920 70 20 3d 20 30 3b 20 20 20 2f 2a 20 55 6e 61 72  p = 0;   /* Unar
19930 79 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  y operator */.  
19940 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a  if( pExpr==0 ){.
19950 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c      op = TK_NULL
19960 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
19970 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
19980 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20   }.  switch( op 
19990 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
199a0 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  GG_COLUMN: {.   
199b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
199c0 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 41  nPrintf(pOut, "A
199d0 47 47 7b 25 64 3a 25 64 7d 22 2c 0a 20 20 20 20  GG{%d:%d}",.    
199e0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
199f0 54 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43  Table, pExpr->iC
19a00 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72  olumn);.      br
19a10 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
19a20 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
19a30 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
19a40 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20  ->iTable<0 ){.  
19a50 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 6f 6e        /* This on
19a60 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  ly happens when 
19a70 63 6f 64 69 6e 67 20 63 68 65 63 6b 20 63 6f 6e  coding check con
19a80 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20  straints */.    
19a90 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
19aa0 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
19ab0 43 4f 4c 55 4d 4e 28 25 64 29 22 2c 20 70 45 78  COLUMN(%d)", pEx
19ac0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  pr->iColumn);.  
19ad0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19ae0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
19af0 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 7b  nPrintf(pOut, "{
19b00 25 64 3a 25 64 7d 22 2c 0a 20 20 20 20 20 20 20  %d:%d}",.       
19b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
19b30 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ble, pExpr->iCol
19b40 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  umn);.      }.  
19b50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19b60 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
19b70 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 66  EGER: {.      if
19b80 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ( pExpr->flags &
19b90 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a   EP_IntValue ){.
19ba0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
19bb0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
19bc0 74 2c 20 22 25 64 22 2c 20 70 45 78 70 72 2d 3e  t, "%d", pExpr->
19bd0 75 2e 69 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  u.iValue);.     
19be0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
19bf0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
19c00 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 73 22 2c  intf(pOut, "%s",
19c10 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
19c20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
19c30 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
19c40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19c50 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
19c60 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
19c70 41 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AT: {.      sqli
19c80 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
19c90 28 70 4f 75 74 2c 22 25 73 22 2c 20 70 45 78 70  (pOut,"%s", pExp
19ca0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
19cb0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19cc0 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
19cd0 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20   TK_STRING: {.  
19ce0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
19cf0 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 25  inPrintf(pOut,"%
19d00 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  Q", pExpr->u.zTo
19d10 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ken);.      brea
19d20 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
19d30 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  e TK_NULL: {.   
19d40 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
19d50 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 4e 55  nPrintf(pOut,"NU
19d60 4c 4c 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  LL");.      brea
19d70 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
19d80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f   SQLITE_OMIT_BLO
19d90 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61  B_LITERAL.    ca
19da0 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20  se TK_BLOB: {.  
19db0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
19dc0 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 25  inPrintf(pOut,"%
19dd0 73 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  s", pExpr->u.zTo
19de0 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ken);.      brea
19df0 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
19e00 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
19e10 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  ABLE: {.      sq
19e20 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
19e30 74 66 28 70 4f 75 74 2c 22 56 41 52 49 41 42 4c  tf(pOut,"VARIABL
19e40 45 28 25 73 2c 25 64 29 22 2c 0a 20 20 20 20 20  E(%s,%d)",.     
19e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e60 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a        pExpr->u.z
19e70 54 6f 6b 65 6e 2c 20 70 45 78 70 72 2d 3e 69 43  Token, pExpr->iC
19e80 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72  olumn);.      br
19e90 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
19ea0 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a  ase TK_REGISTER:
19eb0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
19ec0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
19ed0 75 74 2c 22 52 45 47 49 53 54 45 52 28 25 64 29  ut,"REGISTER(%d)
19ee0 22 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  ", pExpr->iTable
19ef0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
19f00 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
19f10 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20 73 71  K_AS: {.      sq
19f20 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
19f30 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c  (pOut, pExpr->pL
19f40 65 66 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  eft);.      brea
19f50 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
19f60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53   SQLITE_OMIT_CAS
19f70 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41  T.    case TK_CA
19f80 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  ST: {.      /* E
19f90 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
19fa0 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70  e form:   CAST(p
19fb0 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a  Left AS token) *
19fc0 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  /.      const ch
19fd0 61 72 20 2a 7a 41 66 66 20 3d 20 22 75 6e 6b 22  ar *zAff = "unk"
19fe0 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20  ;.      switch( 
19ff0 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
1a000 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  ype(pExpr->u.zTo
1a010 6b 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ken) ){.        
1a020 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f  case SQLITE_AFF_
1a030 54 45 58 54 3a 20 20 20 20 7a 41 66 66 20 3d 20  TEXT:    zAff = 
1a040 22 54 45 58 54 22 3b 20 20 20 20 20 62 72 65 61  "TEXT";     brea
1a050 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
1a060 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3a  SQLITE_AFF_NONE:
1a070 20 20 20 20 7a 41 66 66 20 3d 20 22 4e 4f 4e 45      zAff = "NONE
1a080 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
1a090 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
1a0a0 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3a 20 7a  E_AFF_NUMERIC: z
1a0b0 41 66 66 20 3d 20 22 4e 55 4d 45 52 49 43 22 3b  Aff = "NUMERIC";
1a0c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1a0d0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46   case SQLITE_AFF
1a0e0 5f 49 4e 54 45 47 45 52 3a 20 7a 41 66 66 20 3d  _INTEGER: zAff =
1a0f0 20 22 49 4e 54 45 47 45 52 22 3b 20 20 62 72 65   "INTEGER";  bre
1a100 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
1a110 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
1a120 3a 20 20 20 20 7a 41 66 66 20 3d 20 22 52 45 41  :    zAff = "REA
1a130 4c 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  L";     break;. 
1a140 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1a150 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1a160 66 28 70 4f 75 74 2c 20 22 43 41 53 54 2d 25 73  f(pOut, "CAST-%s
1a170 28 22 2c 20 7a 41 66 66 29 3b 0a 20 20 20 20 20  (", zAff);.     
1a180 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
1a190 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d  xpr(pOut, pExpr-
1a1a0 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
1a1b0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1a1c0 6e 74 66 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a  ntf(pOut, ")");.
1a1d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1a1e0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
1a1f0 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f  ITE_OMIT_CAST */
1a200 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
1a210 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22        zBinOp = "
1a220 4c 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  LT";     break;.
1a230 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20      case TK_LE: 
1a240 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4c       zBinOp = "L
1a250 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  E";     break;. 
1a260 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20     case TK_GT:  
1a270 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 47 54      zBinOp = "GT
1a280 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
1a290 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20    case TK_GE:   
1a2a0 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 47 45 22     zBinOp = "GE"
1a2b0 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
1a2c0 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20   case TK_NE:    
1a2d0 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4e 45 22 3b    zBinOp = "NE";
1a2e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a2f0 63 61 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20  case TK_EQ:     
1a300 20 7a 42 69 6e 4f 70 20 3d 20 22 45 51 22 3b 20   zBinOp = "EQ"; 
1a310 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1a320 61 73 65 20 54 4b 5f 49 53 3a 20 20 20 20 20 20  ase TK_IS:      
1a330 7a 42 69 6e 4f 70 20 3d 20 22 49 53 22 3b 20 20  zBinOp = "IS";  
1a340 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1a350 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 7a  se TK_ISNOT:   z
1a360 42 69 6e 4f 70 20 3d 20 22 49 53 4e 4f 54 22 3b  BinOp = "ISNOT";
1a370 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1a380 65 20 54 4b 5f 41 4e 44 3a 20 20 20 20 20 7a 42  e TK_AND:     zB
1a390 69 6e 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20 20  inOp = "AND";   
1a3a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1a3b0 20 54 4b 5f 4f 52 3a 20 20 20 20 20 20 7a 42 69   TK_OR:      zBi
1a3c0 6e 4f 70 20 3d 20 22 4f 52 22 3b 20 20 20 20 20  nOp = "OR";     
1a3d0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1a3e0 54 4b 5f 50 4c 55 53 3a 20 20 20 20 7a 42 69 6e  TK_PLUS:    zBin
1a3f0 4f 70 20 3d 20 22 41 44 44 22 3b 20 20 20 20 62  Op = "ADD";    b
1a400 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1a410 4b 5f 53 54 41 52 3a 20 20 20 20 7a 42 69 6e 4f  K_STAR:    zBinO
1a420 70 20 3d 20 22 4d 55 4c 22 3b 20 20 20 20 62 72  p = "MUL";    br
1a430 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1a440 5f 4d 49 4e 55 53 3a 20 20 20 7a 42 69 6e 4f 70  _MINUS:   zBinOp
1a450 20 3d 20 22 53 55 42 22 3b 20 20 20 20 62 72 65   = "SUB";    bre
1a460 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1a470 52 45 4d 3a 20 20 20 20 20 7a 42 69 6e 4f 70 20  REM:     zBinOp 
1a480 3d 20 22 52 45 4d 22 3b 20 20 20 20 62 72 65 61  = "REM";    brea
1a490 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  k;.    case TK_B
1a4a0 49 54 41 4e 44 3a 20 20 7a 42 69 6e 4f 70 20 3d  ITAND:  zBinOp =
1a4b0 20 22 42 49 54 41 4e 44 22 3b 20 62 72 65 61 6b   "BITAND"; break
1a4c0 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  ;.    case TK_BI
1a4d0 54 4f 52 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20  TOR:   zBinOp = 
1a4e0 22 42 49 54 4f 52 22 3b 20 20 62 72 65 61 6b 3b  "BITOR";  break;
1a4f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41  .    case TK_SLA
1a500 53 48 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22  SH:   zBinOp = "
1a510 44 49 56 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  DIV";    break;.
1a520 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49      case TK_LSHI
1a530 46 54 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4c  FT:  zBinOp = "L
1a540 53 48 49 46 54 22 3b 20 62 72 65 61 6b 3b 0a 20  SHIFT"; break;. 
1a550 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46     case TK_RSHIF
1a560 54 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22 52 53  T:  zBinOp = "RS
1a570 48 49 46 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20  HIFT"; break;.  
1a580 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54    case TK_CONCAT
1a590 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22 43 4f 4e  :  zBinOp = "CON
1a5a0 43 41 54 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20  CAT"; break;..  
1a5b0 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
1a5c0 3a 20 20 7a 55 6e 69 4f 70 20 3d 20 22 55 4d 49  :  zUniOp = "UMI
1a5d0 4e 55 53 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  NUS"; break;.   
1a5e0 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20   case TK_UPLUS: 
1a5f0 20 20 7a 55 6e 69 4f 70 20 3d 20 22 55 50 4c 55    zUniOp = "UPLU
1a600 53 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  S";  break;.    
1a610 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 20  case TK_BITNOT: 
1a620 20 7a 55 6e 69 4f 70 20 3d 20 22 42 49 54 4e 4f   zUniOp = "BITNO
1a630 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  T"; break;.    c
1a640 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20 20 20 20  ase TK_NOT:     
1a650 7a 55 6e 69 4f 70 20 3d 20 22 4e 4f 54 22 3b 20  zUniOp = "NOT"; 
1a660 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1a670 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 7a  se TK_ISNULL:  z
1a680 55 6e 69 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22  UniOp = "ISNULL"
1a690 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
1a6a0 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 55  e TK_NOTNULL: zU
1a6b0 6e 69 4f 70 20 3d 20 22 4e 4f 54 4e 55 4c 4c 22  niOp = "NOTNULL"
1a6c0 3b 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61  ; break;..    ca
1a6d0 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20 7b  se TK_COLLATE: {
1a6e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1a6f0 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20  plainExpr(pOut, 
1a700 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
1a710 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1a720 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22  ainPrintf(pOut,"
1a730 2e 43 4f 4c 4c 41 54 45 28 25 73 29 22 2c 70 45  .COLLATE(%s)",pE
1a740 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
1a750 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1a760 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
1a770 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20  AGG_FUNCTION:.  
1a780 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f    case TK_CONST_
1a790 46 55 4e 43 3a 0a 20 20 20 20 63 61 73 65 20 54  FUNC:.    case T
1a7a0 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  K_FUNCTION: {.  
1a7b0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46      ExprList *pF
1a7c0 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69  arg;       /* Li
1a7d0 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61  st of function a
1a7e0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  rguments */.    
1a7f0 20 20 69 66 28 20 45 78 70 72 48 61 73 41 6e 79    if( ExprHasAny
1a800 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1a810 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
1a820 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d  .        pFarg =
1a830 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
1a840 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d  .        pFarg =
1a850 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
1a860 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1a870 66 28 20 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55  f( op==TK_AGG_FU
1a880 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20  NCTION ){.      
1a890 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1a8a0 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 41 47  Printf(pOut, "AG
1a8b0 47 5f 46 55 4e 43 54 49 4f 4e 25 64 3a 25 73 28  G_FUNCTION%d:%s(
1a8c0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1a8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8e0 70 45 78 70 72 2d 3e 6f 70 32 2c 20 70 45 78 70  pExpr->op2, pExp
1a8f0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
1a900 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a910 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1a920 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 46  nPrintf(pOut, "F
1a930 55 4e 43 54 49 4f 4e 3a 25 73 28 22 2c 20 70 45  UNCTION:%s(", pE
1a940 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
1a950 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1a960 28 20 70 46 61 72 67 20 29 7b 0a 20 20 20 20 20  ( pFarg ){.     
1a970 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1a980 6e 45 78 70 72 4c 69 73 74 28 70 4f 75 74 2c 20  nExprList(pOut, 
1a990 70 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a  pFarg);.      }.
1a9a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a9b0 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1a9c0 20 22 29 22 29 3b 0a 20 20 20 20 20 20 62 72 65   ")");.      bre
1a9d0 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
1a9e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
1a9f0 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
1aa00 54 4b 5f 45 58 49 53 54 53 3a 20 7b 0a 20 20 20  TK_EXISTS: {.   
1aa10 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1aa20 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 45  nPrintf(pOut, "E
1aa30 58 49 53 54 53 28 22 29 3b 0a 20 20 20 20 20 20  XISTS(");.      
1aa40 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53 65  sqlite3ExplainSe
1aa50 6c 65 63 74 28 70 4f 75 74 2c 20 70 45 78 70 72  lect(pOut, pExpr
1aa60 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ->x.pSelect);.  
1aa70 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1aa80 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 29  inPrintf(pOut,")
1aa90 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
1aaa0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1aab0 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
1aac0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1aad0 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 28  nPrintf(pOut, "(
1aae0 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ");.      sqlite
1aaf0 33 45 78 70 6c 61 69 6e 53 65 6c 65 63 74 28 70  3ExplainSelect(p
1ab00 4f 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53  Out, pExpr->x.pS
1ab10 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73 71  elect);.      sq
1ab20 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1ab30 74 66 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20  tf(pOut, ")");. 
1ab40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ab50 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
1ab60 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1ab70 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1ab80 4f 75 74 2c 20 22 49 4e 28 22 29 3b 0a 20 20 20  Out, "IN(");.   
1ab90 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1aba0 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70  nExpr(pOut, pExp
1abb0 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
1abc0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1abd0 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 2c 22 29  rintf(pOut, ",")
1abe0 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ;.      if( Expr
1abf0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1ac00 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1ac10 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1ac20 74 65 33 45 78 70 6c 61 69 6e 53 65 6c 65 63 74  te3ExplainSelect
1ac30 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e  (pOut, pExpr->x.
1ac40 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
1ac50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
1ac60 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
1ac70 72 4c 69 73 74 28 70 4f 75 74 2c 20 70 45 78 70  rList(pOut, pExp
1ac80 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  r->x.pList);.   
1ac90 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1aca0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1acb0 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20 20 20 20  pOut, ")");.    
1acc0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1acd0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1ace0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
1acf0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1ad00 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41     x BETWEEN y A
1ad10 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ND z.    **.    
1ad20 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75 69 76  ** This is equiv
1ad30 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a  alent to.    **.
1ad40 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41      **    x>=y A
1ad50 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20  ND x<=z.    **. 
1ad60 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65     ** X is store
1ad70 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66  d in pExpr->pLef
1ad80 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73  t..    ** Y is s
1ad90 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
1ada0 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
1adb0 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73  r..    ** Z is s
1adc0 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
1add0 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
1ade0 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  r..    */.    ca
1adf0 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
1ae00 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20  .      Expr *pX 
1ae10 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
1ae20 20 20 20 20 20 20 45 78 70 72 20 2a 70 59 20 3d        Expr *pY =
1ae30 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
1ae40 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
1ae50 20 20 20 45 78 70 72 20 2a 70 5a 20 3d 20 70 45     Expr *pZ = pE
1ae60 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
1ae70 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  1].pExpr;.      
1ae80 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1ae90 69 6e 74 66 28 70 4f 75 74 2c 20 22 42 45 54 57  intf(pOut, "BETW
1aea0 45 45 4e 28 22 29 3b 0a 20 20 20 20 20 20 73 71  EEN(");.      sq
1aeb0 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
1aec0 28 70 4f 75 74 2c 20 70 58 29 3b 0a 20 20 20 20  (pOut, pX);.    
1aed0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1aee0 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 2c 22  Printf(pOut, ","
1aef0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1af00 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74  ExplainExpr(pOut
1af10 2c 20 70 59 29 3b 0a 20 20 20 20 20 20 73 71 6c  , pY);.      sql
1af20 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1af30 66 28 70 4f 75 74 2c 20 22 2c 22 29 3b 0a 20 20  f(pOut, ",");.  
1af40 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1af50 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 5a 29  inExpr(pOut, pZ)
1af60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1af70 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1af80 74 2c 20 22 29 22 29 3b 0a 20 20 20 20 20 20 62  t, ")");.      b
1af90 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1afa0 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45 52 3a  case TK_TRIGGER:
1afb0 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74   {.      /* If t
1afc0 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f  he opcode is TK_
1afd0 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20 74 68  TRIGGER, then th
1afe0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1aff0 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20  a reference.    
1b000 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e    ** to a column
1b010 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72   in the new.* or
1b020 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61   old.* pseudo-ta
1b030 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74  bles available t
1b040 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67  o.      ** trigg
1b050 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20  er programs. In 
1b060 74 68 69 73 20 63 61 73 65 20 45 78 70 72 2e 69  this case Expr.i
1b070 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20  Table is set to 
1b080 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20  1 for the.      
1b090 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d  ** new.* pseudo-
1b0a0 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20  table, or 0 for 
1b0b0 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f  the old.* pseudo
1b0c0 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f  -table. Expr.iCo
1b0d0 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73  lumn.      ** is
1b0e0 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75   set to the colu
1b0f0 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f  mn of the pseudo
1b100 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64 2c 20  -table to read, 
1b110 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20  or to -1 to.    
1b120 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20 72 6f    ** read the ro
1b130 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20 20 20  wid field..     
1b140 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
1b150 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1b160 4f 75 74 2c 20 22 25 73 28 25 64 29 22 2c 20 0a  Out, "%s(%d)", .
1b170 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1b180 3e 69 54 61 62 6c 65 20 3f 20 22 4e 45 57 22 20  >iTable ? "NEW" 
1b190 3a 20 22 4f 4c 44 22 2c 20 70 45 78 70 72 2d 3e  : "OLD", pExpr->
1b1a0 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
1b1b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1b1c0 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 20 7b   case TK_CASE: {
1b1d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1b1e0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1b1f0 2c 20 22 43 41 53 45 28 22 29 3b 0a 20 20 20 20  , "CASE(");.    
1b200 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1b210 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72  Expr(pOut, pExpr
1b220 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
1b230 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1b240 69 6e 74 66 28 70 4f 75 74 2c 20 22 2c 22 29 3b  intf(pOut, ",");
1b250 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1b260 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70 4f  plainExprList(pO
1b270 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  ut, pExpr->x.pLi
1b280 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
1b290 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1b2a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
1b2b0 47 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GER.    case TK_
1b2c0 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 63  RAISE: {.      c
1b2d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
1b2e0 20 3d 20 22 75 6e 6b 22 3b 0a 20 20 20 20 20 20   = "unk";.      
1b2f0 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 61  switch( pExpr->a
1b300 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20  ffinity ){.     
1b310 20 20 20 63 61 73 65 20 4f 45 5f 52 6f 6c 6c 62     case OE_Rollb
1b320 61 63 6b 3a 20 20 20 7a 54 79 70 65 20 3d 20 22  ack:   zType = "
1b330 72 6f 6c 6c 62 61 63 6b 22 3b 20 20 62 72 65 61  rollback";  brea
1b340 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
1b350 4f 45 5f 41 62 6f 72 74 3a 20 20 20 20 20 20 7a  OE_Abort:      z
1b360 54 79 70 65 20 3d 20 22 61 62 6f 72 74 22 3b 20  Type = "abort"; 
1b370 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1b380 20 20 20 63 61 73 65 20 4f 45 5f 46 61 69 6c 3a     case OE_Fail:
1b390 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22         zType = "
1b3a0 66 61 69 6c 22 3b 20 20 20 20 20 20 62 72 65 61  fail";      brea
1b3b0 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
1b3c0 4f 45 5f 49 67 6e 6f 72 65 3a 20 20 20 20 20 7a  OE_Ignore:     z
1b3d0 54 79 70 65 20 3d 20 22 69 67 6e 6f 72 65 22 3b  Type = "ignore";
1b3e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1b3f0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1b400 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1b410 75 74 2c 20 22 52 41 49 53 45 2d 25 73 28 25 73  ut, "RAISE-%s(%s
1b420 29 22 2c 20 7a 54 79 70 65 2c 20 70 45 78 70 72  )", zType, pExpr
1b430 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
1b440 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1b450 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28  #endif.  }.  if(
1b460 20 7a 42 69 6e 4f 70 20 29 7b 0a 20 20 20 20 73   zBinOp ){.    s
1b470 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1b480 6e 74 66 28 70 4f 75 74 2c 22 25 73 28 22 2c 20  ntf(pOut,"%s(", 
1b490 7a 42 69 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c  zBinOp);.    sql
1b4a0 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
1b4b0 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65  pOut, pExpr->pLe
1b4c0 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ft);.    sqlite3
1b4d0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1b4e0 75 74 2c 22 2c 22 29 3b 0a 20 20 20 20 73 71 6c  ut,",");.    sql
1b4f0 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
1b500 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  pOut, pExpr->pRi
1b510 67 68 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ght);.    sqlite
1b520 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1b530 4f 75 74 2c 22 29 22 29 3b 0a 20 20 7d 65 6c 73  Out,")");.  }els
1b540 65 20 69 66 28 20 7a 55 6e 69 4f 70 20 29 7b 0a  e if( zUniOp ){.
1b550 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1b560 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 25  inPrintf(pOut,"%
1b570 73 28 22 2c 20 7a 55 6e 69 4f 70 29 3b 0a 20 20  s(", zUniOp);.  
1b580 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1b590 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72  Expr(pOut, pExpr
1b5a0 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71  ->pLeft);.    sq
1b5b0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1b5c0 74 66 28 70 4f 75 74 2c 22 29 22 29 3b 0a 20 20  tf(pOut,")");.  
1b5d0 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  }.}.#endif /* de
1b5e0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1b5f0 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e  BLE_TREE_EXPLAIN
1b600 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65  ) */..#if define
1b610 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
1b620 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 2f 2a  TREE_EXPLAIN)./*
1b630 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68  .** Generate a h
1b640 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 78  uman-readable ex
1b650 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 61 6e 20  planation of an 
1b660 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
1b670 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1b680 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28  ExplainExprList(
1b690 56 64 62 65 20 2a 70 4f 75 74 2c 20 45 78 70 72  Vdbe *pOut, Expr
1b6a0 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
1b6b0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
1b6c0 73 74 3d 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e  st==0 || pList->
1b6d0 6e 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20  nExpr==0 ){.    
1b6e0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1b6f0 69 6e 74 66 28 70 4f 75 74 2c 20 22 28 65 6d 70  intf(pOut, "(emp
1b700 74 79 2d 6c 69 73 74 29 22 29 3b 0a 20 20 20 20  ty-list)");.    
1b710 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20  return;.  }else 
1b720 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  if( pList->nExpr
1b730 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==1 ){.    sqlit
1b740 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f  e3ExplainExpr(pO
1b750 75 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ut, pList->a[0].
1b760 70 45 78 70 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  pExpr);.  }else{
1b770 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
1b780 61 69 6e 50 75 73 68 28 70 4f 75 74 29 3b 0a 20  ainPush(pOut);. 
1b790 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
1b7a0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
1b7b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1b7c0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1b7d0 74 2c 20 22 69 74 65 6d 5b 25 64 5d 20 3d 20 22  t, "item[%d] = "
1b7e0 2c 20 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , i);.      sqli
1b7f0 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70  te3ExplainPush(p
1b800 4f 75 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Out);.      sqli
1b810 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70  te3ExplainExpr(p
1b820 4f 75 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  Out, pList->a[i]
1b830 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73  .pExpr);.      s
1b840 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 6f 70  qlite3ExplainPop
1b850 28 70 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 66  (pOut);.      if
1b860 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  ( pList->a[i].zN
1b870 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
1b880 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1b890 6e 74 66 28 70 4f 75 74 2c 20 22 20 41 53 20 25  ntf(pOut, " AS %
1b8a0 73 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  s", pList->a[i].
1b8b0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
1b8c0 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
1b8d0 3e 61 5b 69 5d 2e 62 53 70 61 6e 49 73 54 61 62  >a[i].bSpanIsTab
1b8e0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1b8f0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1b900 28 70 4f 75 74 2c 20 22 20 28 25 73 29 22 2c 20  (pOut, " (%s)", 
1b910 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61  pList->a[i].zSpa
1b920 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
1b930 20 20 69 66 28 20 69 3c 70 4c 69 73 74 2d 3e 6e    if( i<pList->n
1b940 45 78 70 72 2d 31 20 29 7b 0a 20 20 20 20 20 20  Expr-1 ){.      
1b950 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1b960 4e 4c 28 70 4f 75 74 29 3b 0a 20 20 20 20 20 20  NL(pOut);.      
1b970 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
1b980 74 65 33 45 78 70 6c 61 69 6e 50 6f 70 28 70 4f  te3ExplainPop(pO
1b990 75 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ut);.  }.}.#endi
1b9a0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
1b9b0 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  G */../*.** Retu
1b9c0 72 6e 20 54 52 55 45 20 69 66 20 70 45 78 70 72  rn TRUE if pExpr
1b9d0 20 69 73 20 61 6e 20 63 6f 6e 73 74 61 6e 74 20   is an constant 
1b9e0 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
1b9f0 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  is appropriate.*
1ba00 2a 20 66 6f 72 20 66 61 63 74 6f 72 69 6e 67 20  * for factoring 
1ba10 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 20 20  out of a loop.  
1ba20 41 70 70 72 6f 70 72 69 61 74 65 20 65 78 70 72  Appropriate expr
1ba30 65 73 73 69 6f 6e 73 20 61 72 65 3a 0a 2a 2a 0a  essions are:.**.
1ba40 2a 2a 20 20 20 20 2a 20 20 41 6e 79 20 65 78 70  **    *  Any exp
1ba50 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65 76 61  ression that eva
1ba60 6c 75 61 74 65 73 20 74 6f 20 74 77 6f 20 6f 72  luates to two or
1ba70 20 6d 6f 72 65 20 6f 70 63 6f 64 65 73 2e 0a 2a   more opcodes..*
1ba80 2a 0a 2a 2a 20 20 20 20 2a 20 20 41 6e 79 20 4f  *.**    *  Any O
1ba90 50 5f 49 6e 74 65 67 65 72 2c 20 4f 50 5f 52 65  P_Integer, OP_Re
1baa0 61 6c 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 4f  al, OP_String, O
1bab0 50 5f 42 6c 6f 62 2c 20 4f 50 5f 4e 75 6c 6c 2c  P_Blob, OP_Null,
1bac0 20 0a 2a 2a 20 20 20 20 20 20 20 6f 72 20 4f 50   .**       or OP
1bad0 5f 56 61 72 69 61 62 6c 65 20 74 68 61 74 20 64  _Variable that d
1bae0 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
1baf0 62 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 0a  be placed in a .
1bb00 2a 2a 20 20 20 20 20 20 20 73 70 65 63 69 66 69  **       specifi
1bb10 63 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a  c register..**.*
1bb20 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 70 6f  * There is no po
1bb30 69 6e 74 20 69 6e 20 66 61 63 74 6f 72 69 6e 67  int in factoring
1bb40 20 6f 75 74 20 73 69 6e 67 6c 65 2d 69 6e 73 74   out single-inst
1bb50 72 75 63 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74  ruction constant
1bb60 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
1bb70 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
1bb80 70 6c 61 63 65 64 20 69 6e 20 61 20 70 61 72 74  placed in a part
1bb90 69 63 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e  icular register.
1bba0 20 20 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 66    .** We could f
1bbb0 61 63 74 6f 72 20 74 68 65 6d 20 6f 75 74 2c 20  actor them out, 
1bbc0 62 75 74 20 74 68 65 6e 20 77 65 20 77 6f 75 6c  but then we woul
1bbd0 64 20 65 6e 64 20 75 70 20 61 64 64 69 6e 67 20  d end up adding 
1bbe0 61 6e 0a 2a 2a 20 4f 50 5f 53 43 6f 70 79 20 69  an.** OP_SCopy i
1bbf0 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 6d 6f  nstruction to mo
1bc00 76 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 74  ve the value int
1bc10 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 65  o the correct re
1bc20 67 69 73 74 65 72 0a 2a 2a 20 6c 61 74 65 72 2e  gister.** later.
1bc30 20 20 57 65 20 6d 69 67 68 74 20 61 73 20 77 65    We might as we
1bc40 6c 6c 20 6a 75 73 74 20 75 73 65 20 74 68 65 20  ll just use the 
1bc50 6f 72 69 67 69 6e 61 6c 20 69 6e 73 74 72 75 63  original instruc
1bc60 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 61 76 6f 69  tion and.** avoi
1bc70 64 20 74 68 65 20 4f 50 5f 53 43 6f 70 79 2e 0a  d the OP_SCopy..
1bc80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
1bc90 41 70 70 72 6f 70 72 69 61 74 65 46 6f 72 46 61  AppropriateForFa
1bca0 63 74 6f 72 69 6e 67 28 45 78 70 72 20 2a 70 29  ctoring(Expr *p)
1bcb0 7b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  {.  if( !sqlite3
1bcc0 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
1bcd0 74 4a 6f 69 6e 28 70 29 20 29 7b 0a 20 20 20 20  tJoin(p) ){.    
1bce0 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4f 6e  return 0;  /* On
1bcf0 6c 79 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72  ly constant expr
1bd00 65 73 73 69 6f 6e 73 20 61 72 65 20 61 70 70 72  essions are appr
1bd10 6f 70 72 69 61 74 65 20 66 6f 72 20 66 61 63 74  opriate for fact
1bd20 6f 72 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69  oring */.  }.  i
1bd30 66 28 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45  f( (p->flags & E
1bd40 50 5f 46 69 78 65 64 44 65 73 74 29 3d 3d 30 20  P_FixedDest)==0 
1bd50 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
1bd60 20 20 2f 2a 20 41 6e 79 20 63 6f 6e 73 74 61 6e    /* Any constan
1bd70 74 20 77 69 74 68 6f 75 74 20 61 20 66 69 78 65  t without a fixe
1bd80 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73  d destination is
1bd90 20 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a   appropriate */.
1bda0 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e    }.  while( p->
1bdb0 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 20 70  op==TK_UPLUS ) p
1bdc0 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 73   = p->pLeft;.  s
1bdd0 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
1bde0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1bdf0 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c  MIT_BLOB_LITERAL
1be00 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
1be10 42 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61  B:.#endif.    ca
1be20 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a  se TK_VARIABLE:.
1be30 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
1be40 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  GER:.    case TK
1be50 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65  _FLOAT:.    case
1be60 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20 63 61   TK_NULL:.    ca
1be70 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
1be80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1be90 70 2d 3e 6f 70 3d 3d 54 4b 5f 42 4c 4f 42 20 29  p->op==TK_BLOB )
1bea0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1beb0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49  ( p->op==TK_VARI
1bec0 41 42 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65  ABLE );.      te
1bed0 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
1bee0 4b 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20  K_INTEGER );.   
1bef0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
1bf00 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 3b 0a  op==TK_FLOAT );.
1bf10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1bf20 70 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c 4c 20 29  p->op==TK_NULL )
1bf30 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1bf40 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49  ( p->op==TK_STRI
1bf50 4e 47 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 53  NG );.      /* S
1bf60 69 6e 67 6c 65 2d 69 6e 73 74 72 75 63 74 69 6f  ingle-instructio
1bf70 6e 20 63 6f 6e 73 74 61 6e 74 73 20 77 69 74 68  n constants with
1bf80 20 61 20 66 69 78 65 64 20 64 65 73 74 69 6e 61   a fixed destina
1bf90 74 69 6f 6e 20 61 72 65 0a 20 20 20 20 20 20 2a  tion are.      *
1bfa0 2a 20 62 65 74 74 65 72 20 64 6f 6e 65 20 69 6e  * better done in
1bfb0 2d 6c 69 6e 65 2e 20 20 49 66 20 77 65 20 66 61  -line.  If we fa
1bfc0 63 74 6f 72 20 74 68 65 6d 2c 20 74 68 65 79 20  ctor them, they 
1bfd0 77 69 6c 6c 20 6a 75 73 74 20 65 6e 64 0a 20 20  will just end.  
1bfe0 20 20 20 20 2a 2a 20 75 70 20 67 65 6e 65 72 61      ** up genera
1bff0 74 69 6e 67 20 61 6e 20 4f 50 5f 53 43 6f 70 79  ting an OP_SCopy
1c000 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 76 61 6c   to move the val
1c010 75 65 20 74 6f 20 74 68 65 20 64 65 73 74 69 6e  ue to the destin
1c020 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72  ation.      ** r
1c030 65 67 69 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20  egister. */.    
1c040 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
1c050 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d  }.    case TK_UM
1c060 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 66  INUS: {.      if
1c070 28 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d  ( p->pLeft->op==
1c080 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70 2d 3e 70  TK_FLOAT || p->p
1c090 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54  Left->op==TK_INT
1c0a0 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20  EGER ){.        
1c0b0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
1c0c0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
1c0d0 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
1c0e0 3a 20 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  : {.      break;
1c0f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1c100 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
1c110 49 66 20 70 45 78 70 72 20 69 73 20 61 20 63 6f  If pExpr is a co
1c120 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f  nstant expressio
1c130 6e 20 74 68 61 74 20 69 73 20 61 70 70 72 6f 70  n that is approp
1c140 72 69 61 74 65 20 66 6f 72 0a 2a 2a 20 66 61 63  riate for.** fac
1c150 74 6f 72 69 6e 67 20 6f 75 74 20 6f 66 20 61 20  toring out of a 
1c160 6c 6f 6f 70 2c 20 74 68 65 6e 20 65 76 61 6c 75  loop, then evalu
1c170 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ate the expressi
1c180 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67  on.** into a reg
1c190 69 73 74 65 72 20 61 6e 64 20 63 6f 6e 76 65 72  ister and conver
1c1a0 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
1c1b0 20 69 6e 74 6f 20 61 20 54 4b 5f 52 45 47 49 53   into a TK_REGIS
1c1c0 54 45 52 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  TER.** expressio
1c1d0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
1c1e0 20 65 76 61 6c 43 6f 6e 73 74 45 78 70 72 28 57   evalConstExpr(W
1c1f0 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
1c200 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
1c210 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
1c220 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
1c230 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
1c240 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
1c250 20 54 4b 5f 49 4e 3a 0a 20 20 20 20 63 61 73 65   TK_IN:.    case
1c260 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a   TK_REGISTER: {.
1c270 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
1c280 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  _Prune;.    }.  
1c290 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54    case TK_COLLAT
1c2a0 45 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  E: {.      retur
1c2b0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
1c2c0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1c2d0 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  K_FUNCTION:.    
1c2e0 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
1c2f0 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  TION:.    case T
1c300 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 20 7b 0a  K_CONST_FUNC: {.
1c310 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 72 67        /* The arg
1c320 75 6d 65 6e 74 73 20 74 6f 20 61 20 66 75 6e 63  uments to a func
1c330 74 69 6f 6e 20 68 61 76 65 20 61 20 66 69 78 65  tion have a fixe
1c340 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 20  d destination.. 
1c350 20 20 20 20 20 2a 2a 20 4d 61 72 6b 20 74 68 65       ** Mark the
1c360 6d 20 74 68 69 73 20 77 61 79 20 74 6f 20 61 76  m this way to av
1c370 6f 69 64 20 67 65 6e 65 72 61 74 65 64 20 75 6e  oid generated un
1c380 6e 65 65 64 65 64 20 4f 50 5f 53 43 6f 70 79 0a  needed OP_SCopy.
1c390 20 20 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63        ** instruc
1c3a0 74 69 6f 6e 73 2e 20 0a 20 20 20 20 20 20 2a 2f  tions. .      */
1c3b0 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
1c3c0 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
1c3d0 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61  x.pList;.      a
1c3e0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1c3f0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1c400 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
1c410 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 20        if( pList 
1c420 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
1c430 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
1c440 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
1c450 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
1c460 49 74 65 6d 20 3d 20 70 4c 69 73 74 2d 3e 61 3b  Item = pList->a;
1c470 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20 69  .        for(; i
1c480 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
1c490 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1c4a0 20 41 4c 57 41 59 53 28 70 49 74 65 6d 2d 3e 70   ALWAYS(pItem->p
1c4b0 45 78 70 72 29 20 29 20 70 49 74 65 6d 2d 3e 70  Expr) ) pItem->p
1c4c0 45 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Expr->flags |= E
1c4d0 50 5f 46 69 78 65 64 44 65 73 74 3b 0a 20 20 20  P_FixedDest;.   
1c4e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1c4f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c500 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 70  }.  }.  if( isAp
1c510 70 72 6f 70 72 69 61 74 65 46 6f 72 46 61 63 74  propriateForFact
1c520 6f 72 69 6e 67 28 70 45 78 70 72 29 20 29 7b 0a  oring(pExpr) ){.
1c530 20 20 20 20 69 6e 74 20 72 31 20 3d 20 2b 2b 70      int r1 = ++p
1c540 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
1c550 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65   int r2 = sqlite
1c560 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
1c570 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72  pParse, pExpr, r
1c580 31 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 72 32  1);.    /* If r2
1c590 21 3d 72 31 2c 20 69 74 20 6d 65 61 6e 73 20 74  !=r1, it means t
1c5a0 68 61 74 20 72 65 67 69 73 74 65 72 20 72 31 20  hat register r1 
1c5b0 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 20  is never used.  
1c5c0 54 68 61 74 20 69 73 20 68 61 72 6d 6c 65 73 73  That is harmless
1c5d0 0a 20 20 20 20 2a 2a 20 62 75 74 20 73 75 62 6f  .    ** but subo
1c5e0 70 74 69 6d 61 6c 2c 20 73 6f 20 77 65 20 77 61  ptimal, so we wa
1c5f0 6e 74 20 74 6f 20 6b 6e 6f 77 20 61 62 6f 75 74  nt to know about
1c600 20 74 68 65 20 73 69 74 75 61 74 69 6f 6e 20 74   the situation t
1c610 6f 20 66 69 78 20 69 74 2e 0a 20 20 20 20 2a 2a  o fix it..    **
1c620 20 48 65 6e 63 65 20 74 68 65 20 66 6f 6c 6c 6f   Hence the follo
1c630 77 69 6e 67 20 61 73 73 65 72 74 3a 20 2a 2f 0a  wing assert: */.
1c640 20 20 20 20 61 73 73 65 72 74 28 20 72 32 3d 3d      assert( r2==
1c650 72 31 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d  r1 );.    pExpr-
1c660 3e 6f 70 32 20 3d 20 70 45 78 70 72 2d 3e 6f 70  >op2 = pExpr->op
1c670 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20  ;.    pExpr->op 
1c680 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20  = TK_REGISTER;. 
1c690 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
1c6a0 20 3d 20 72 32 3b 0a 20 20 20 20 72 65 74 75 72   = r2;.    retur
1c6b0 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
1c6c0 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
1c6d0 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
1c6e0 20 50 72 65 65 76 61 6c 75 61 74 65 20 63 6f 6e   Preevaluate con
1c6f0 73 74 61 6e 74 20 73 75 62 65 78 70 72 65 73 73  stant subexpress
1c700 69 6f 6e 73 20 77 69 74 68 69 6e 20 70 45 78 70  ions within pExp
1c710 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a  r and store the.
1c720 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65  ** results in re
1c730 67 69 73 74 65 72 73 2e 20 20 4d 6f 64 69 66 79  gisters.  Modify
1c740 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 74   pExpr so that t
1c750 68 65 20 63 6f 6e 73 74 61 6e 74 20 73 75 62 65  he constant sube
1c760 78 70 72 65 73 69 6f 6e 73 0a 2a 2a 20 61 72 65  xpresions.** are
1c770 20 54 4b 5f 52 45 47 49 53 54 45 52 20 6f 70 63   TK_REGISTER opc
1c780 6f 64 65 73 20 74 68 61 74 20 72 65 66 65 72 20  odes that refer 
1c790 74 6f 20 74 68 65 20 70 72 65 63 6f 6d 70 75 74  to the precomput
1c7a0 65 64 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a  ed values..**.**
1c7b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1c7c0 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
1c7d0 6a 75 6d 70 20 74 6f 20 74 68 65 20 63 6f 6f 6b  jump to the cook
1c7e0 69 65 2d 63 68 65 63 6b 20 63 6f 64 65 20 68 61  ie-check code ha
1c7f0 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63  s.** already occ
1c800 75 72 2e 20 20 53 69 6e 63 65 20 74 68 65 20 63  ur.  Since the c
1c810 6f 6f 6b 69 65 2d 63 68 65 63 6b 20 6a 75 6d 70  ookie-check jump
1c820 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 70 72   is generated pr
1c830 69 6f 72 20 74 6f 0a 2a 2a 20 61 6e 79 20 6f 74  ior to.** any ot
1c840 68 65 72 20 73 65 72 69 6f 75 73 20 70 72 6f 63  her serious proc
1c850 65 73 73 69 6e 67 2c 20 74 68 69 73 20 63 68 65  essing, this che
1c860 63 6b 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ck ensures that 
1c870 74 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 77  there is no.** w
1c880 61 79 20 74 6f 20 61 63 63 69 64 65 6e 74 6c 79  ay to accidently
1c890 20 62 79 70 61 73 73 20 74 68 65 20 63 6f 6e 73   bypass the cons
1c8a0 74 61 6e 74 20 69 6e 69 74 69 61 6c 69 7a 61 74  tant initializat
1c8b0 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ions..**.** This
1c8c0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6c 73 6f   routine is also
1c8d0 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
1c8e0 53 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75 74  SQLITE_FactorOut
1c8f0 43 6f 6e 73 74 20 6f 70 74 69 6d 69 7a 61 74 69  Const optimizati
1c900 6f 6e 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65  on.** is disable
1c910 64 20 76 69 61 20 74 68 65 20 73 71 6c 69 74 65  d via the sqlite
1c920 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1c930 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
1c940 50 54 49 4d 49 5a 41 54 49 4f 4e 53 29 0a 2a 2a  PTIMIZATIONS).**
1c950 20 69 6e 74 65 72 66 61 63 65 2e 20 20 54 68 69   interface.  Thi
1c960 73 20 61 6c 6c 6f 77 73 20 74 65 73 74 20 6c 6f  s allows test lo
1c970 67 69 63 20 74 6f 20 76 65 72 69 66 79 20 74 68  gic to verify th
1c980 61 74 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77  at the same answ
1c990 65 72 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65  er is.** obtaine
1c9a0 64 20 66 6f 72 20 71 75 65 72 69 65 73 20 72 65  d for queries re
1c9b0 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
1c9c0 68 65 72 20 6f 72 20 6e 6f 74 20 63 6f 6e 73 74  her or not const
1c9d0 61 6e 74 73 20 61 72 65 0a 2a 2a 20 70 72 65 63  ants are.** prec
1c9e0 6f 6d 70 75 74 65 64 20 69 6e 74 6f 20 72 65 67  omputed into reg
1c9f0 69 73 74 65 72 73 20 6f 72 20 69 66 20 74 68 65  isters or if the
1ca00 79 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  y are inserted i
1ca10 6e 2d 6c 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20  n-line..*/.void 
1ca20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43  sqlite3ExprCodeC
1ca30 6f 6e 73 74 61 6e 74 73 28 50 61 72 73 65 20 2a  onstants(Parse *
1ca40 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
1ca50 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  xpr){.  Walker w
1ca60 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1ca70 63 6f 6f 6b 69 65 47 6f 74 6f 20 29 20 72 65 74  cookieGoto ) ret
1ca80 75 72 6e 3b 0a 20 20 69 66 28 20 4f 70 74 69 6d  urn;.  if( Optim
1ca90 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28  izationDisabled(
1caa0 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49  pParse->db, SQLI
1cab0 54 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73  TE_FactorOutCons
1cac0 74 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77  t) ) return;.  w
1cad0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
1cae0 20 65 76 61 6c 43 6f 6e 73 74 45 78 70 72 3b 0a   evalConstExpr;.
1caf0 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
1cb00 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 70 50 61  ack = 0;.  w.pPa
1cb10 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
1cb20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
1cb30 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 0a  &w, pExpr);.}...
1cb40 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1cb50 6f 64 65 20 74 68 61 74 20 70 75 73 68 65 73 20  ode that pushes 
1cb60 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 76 65  the value of eve
1cb70 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  ry element of th
1cb80 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65  e given.** expre
1cb90 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f 20  ssion list into 
1cba0 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65  a sequence of re
1cbb0 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e  gisters beginnin
1cbc0 67 20 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a 0a  g at target..**.
1cbd0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
1cbe0 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
1cbf0 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2f 0a 69   evaluated..*/.i
1cc00 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
1cc10 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61  deExprList(.  Pa
1cc20 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1cc30 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
1cc40 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
1cc50 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54  t *pList,   /* T
1cc60 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
1cc70 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  st to be coded *
1cc80 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74 2c 20  /.  int target, 
1cc90 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
1cca0 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c 74 73  to write results
1ccb0 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 48 61 72 64   */.  int doHard
1ccc0 43 6f 70 79 20 20 20 20 20 2f 2a 20 4d 61 6b 65  Copy     /* Make
1ccd0 20 61 20 68 61 72 64 20 63 6f 70 79 20 6f 66 20   a hard copy of 
1cce0 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 2a 2f  every element */
1ccf0 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70  .){.  struct Exp
1cd00 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
1cd10 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  m;.  int i, n;. 
1cd20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
1cd30 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  0 );.  assert( t
1cd40 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73  arget>0 );.  ass
1cd50 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64  ert( pParse->pVd
1cd60 62 65 21 3d 30 20 29 3b 20 20 2f 2a 20 4e 65 76  be!=0 );  /* Nev
1cd70 65 72 20 67 65 74 73 20 74 68 69 73 20 66 61 72  er gets this far
1cd80 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20   otherwise */.  
1cd90 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  n = pList->nExpr
1cda0 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
1cdb0 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e  ist->a, i=0; i<n
1cdc0 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
1cdd0 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
1cde0 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
1cdf0 0a 20 20 20 20 69 6e 74 20 69 6e 52 65 67 20 3d  .    int inReg =
1ce00 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1ce10 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
1ce20 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b  Expr, target+i);
1ce30 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d  .    if( inReg!=
1ce40 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20 20  target+i ){.    
1ce50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ce60 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op2(pParse->pVdb
1ce70 65 2c 20 64 6f 48 61 72 64 43 6f 70 79 20 3f 20  e, doHardCopy ? 
1ce80 4f 50 5f 43 6f 70 79 20 3a 20 4f 50 5f 53 43 6f  OP_Copy : OP_SCo
1ce90 70 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  py,.            
1cea0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 52 65              inRe
1ceb0 67 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  g, target+i);.  
1cec0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1ced0 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   n;.}../*.** Gen
1cee0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
1cef0 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f   BETWEEN operato
1cf00 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20 42 45  r..**.**    x BE
1cf10 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a  TWEEN y AND z.**
1cf20 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73  .** The above is
1cf30 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a   equivalent to .
1cf40 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e  **.**    x>=y AN
1cf50 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64  D x<=z.**.** Cod
1cf60 65 20 69 74 20 61 73 20 73 75 63 68 2c 20 74 61  e it as such, ta
1cf70 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20  king care to do 
1cf80 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78  the common subex
1cf90 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c 65 6d  pression.** elem
1cfa0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a  entation of x..*
1cfb0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
1cfc0 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 0a 20  prCodeBetween(. 
1cfd0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1cfe0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
1cff0 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
1d000 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
1d010 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
1d020 20 2f 2a 20 54 68 65 20 42 45 54 57 45 45 4e 20   /* The BETWEEN 
1d030 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
1d040 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20 20  int dest,       
1d050 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
1d060 66 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61  f the jump is ta
1d070 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d  ken */.  int jum
1d080 70 49 66 54 72 75 65 2c 20 20 20 2f 2a 20 54 61  pIfTrue,   /* Ta
1d090 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74  ke the jump if t
1d0a0 68 65 20 42 45 54 57 45 45 4e 20 69 73 20 74 72  he BETWEEN is tr
1d0b0 75 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  ue */.  int jump
1d0c0 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b  IfNull    /* Tak
1d0d0 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68  e the jump if th
1d0e0 65 20 42 45 54 57 45 45 4e 20 69 73 20 4e 55 4c  e BETWEEN is NUL
1d0f0 4c 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 65  L */.){.  Expr e
1d100 78 70 72 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54  xprAnd;     /* T
1d110 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20  he AND operator 
1d120 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d  in  x>=y AND x<=
1d130 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d  z  */.  Expr com
1d140 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20 54 68 65  pLeft;    /* The
1d150 20 20 78 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a    x>=y  term */.
1d160 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68 74    Expr compRight
1d170 3b 20 20 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a  ;   /* The  x<=z
1d180 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72    term */.  Expr
1d190 20 65 78 70 72 58 3b 20 20 20 20 20 20 20 2f 2a   exprX;       /*
1d1a0 20 54 68 65 20 20 78 20 20 73 75 62 65 78 70 72   The  x  subexpr
1d1b0 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
1d1c0 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a  regFree1 = 0; /*
1d1d0 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72   Temporary use r
1d1e0 65 67 69 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73  egister */..  as
1d1f0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1d200 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1d210 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
1d220 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d   exprX = *pExpr-
1d230 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e  >pLeft;.  exprAn
1d240 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20  d.op = TK_AND;. 
1d250 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d   exprAnd.pLeft =
1d260 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 65 78   &compLeft;.  ex
1d270 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26  prAnd.pRight = &
1d280 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63 6f 6d  compRight;.  com
1d290 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45  pLeft.op = TK_GE
1d2a0 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65  ;.  compLeft.pLe
1d2b0 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63  ft = &exprX;.  c
1d2c0 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20 3d  ompLeft.pRight =
1d2d0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
1d2e0 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 63  >a[0].pExpr;.  c
1d2f0 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b  ompRight.op = TK
1d300 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74  _LE;.  compRight
1d310 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b  .pLeft = &exprX;
1d320 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69  .  compRight.pRi
1d330 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ght = pExpr->x.p
1d340 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
1d350 3b 0a 20 20 65 78 70 72 58 2e 69 54 61 62 6c 65  ;.  exprX.iTable
1d360 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1d370 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26  deTemp(pParse, &
1d380 65 78 70 72 58 2c 20 26 72 65 67 46 72 65 65 31  exprX, &regFree1
1d390 29 3b 0a 20 20 65 78 70 72 58 2e 6f 70 20 3d 20  );.  exprX.op = 
1d3a0 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 69  TK_REGISTER;.  i
1d3b0 66 28 20 6a 75 6d 70 49 66 54 72 75 65 20 29 7b  f( jumpIfTrue ){
1d3c0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1d3d0 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 26  IfTrue(pParse, &
1d3e0 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a  exprAnd, dest, j
1d3f0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65  umpIfNull);.  }e
1d400 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
1d410 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
1d420 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65  se, &exprAnd, de
1d430 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1d440 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
1d450 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1d460 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
1d470 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 61 64 65  .  /* Ensure ade
1d480 71 75 61 74 65 20 74 65 73 74 20 63 6f 76 65 72  quate test cover
1d490 61 67 65 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  age */.  testcas
1d4a0 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30  e( jumpIfTrue==0
1d4b0 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
1d4c0 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
1d4d0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1d4e0 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26  jumpIfTrue==0 &&
1d4f0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26   jumpIfNull==0 &
1d500 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b  & regFree1!=0 );
1d510 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d  .  testcase( jum
1d520 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75  pIfTrue==0 && ju
1d530 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72  mpIfNull!=0 && r
1d540 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1d550 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1d560 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49  True==0 && jumpI
1d570 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
1d580 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73  ree1!=0 );.  tes
1d590 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75  tcase( jumpIfTru
1d5a0 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75  e!=0 && jumpIfNu
1d5b0 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll==0 && regFree
1d5c0 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
1d5d0 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d  se( jumpIfTrue!=
1d5e0 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  0 && jumpIfNull=
1d5f0 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
1d600 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
1d610 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26   jumpIfTrue!=0 &
1d620 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20  & jumpIfNull!=0 
1d630 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  && regFree1==0 )
1d640 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  ;.  testcase( ju
1d650 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a  mpIfTrue!=0 && j
1d660 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
1d670 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 7d  regFree1!=0 );.}
1d680 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1d690 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c   code for a bool
1d6a0 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73  ean expression s
1d6b0 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20  uch that a jump 
1d6c0 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68  is made.** to th
1d6d0 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69  e label "dest" i
1d6e0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1d6f0 20 69 73 20 74 72 75 65 20 62 75 74 20 65 78 65   is true but exe
1d700 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e  cution.** contin
1d710 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72  ues straight thr
1d720 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  u if the express
1d730 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a  ion is false..**
1d740 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
1d750 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20  ssion evaluates 
1d760 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72  to NULL (neither
1d770 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29   true nor false)
1d780 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74  , then.** take t
1d790 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a  he jump if the j
1d7a0 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69  umpIfNull flag i
1d7b0 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  s SQLITE_JUMPIFN
1d7c0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ULL..**.** This 
1d7d0 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20  code depends on 
1d7e0 74 68 65 20 66 61 63 74 20 74 68 61 74 20 63 65  the fact that ce
1d7f0 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75  rtain token valu
1d800 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a  es (ex: TK_EQ).*
1d810 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61  * are the same a
1d820 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20  s opcode values 
1d830 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74  (ex: OP_Eq) that
1d840 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63   implement the c
1d850 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
1d860 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63  operation.  Spec
1d870 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  ial comments in 
1d880 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d  vdbe.c and the m
1d890 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72  kopcodeh.awk scr
1d8a0 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61  ipt in.** the ma
1d8b0 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75 73 65  ke process cause
1d8c0 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f   these values to
1d8d0 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28   align.  Assert(
1d8e0 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a  )s in the code.*
1d8f0 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74  * below verify t
1d900 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20  hat the numbers 
1d910 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72  are aligned corr
1d920 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ectly..*/.void s
1d930 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
1d940 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1d950 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
1d960 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49   dest, int jumpI
1d970 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a  fNull){.  Vdbe *
1d980 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1d990 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b  e;.  int op = 0;
1d9a0 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
1d9b0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72  = 0;.  int regFr
1d9c0 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ee2 = 0;.  int r
1d9d0 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74  1, r2;..  assert
1d9e0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  ( jumpIfNull==SQ
1d9f0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
1da00 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  || jumpIfNull==0
1da10 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   );.  if( NEVER(
1da20 76 3d 3d 30 29 20 29 20 20 20 20 20 72 65 74 75  v==0) )     retu
1da30 72 6e 3b 20 20 2f 2a 20 45 78 69 73 74 61 6e 63  rn;  /* Existanc
1da40 65 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65  e of VDBE checke
1da50 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20  d by caller */. 
1da60 20 69 66 28 20 4e 45 56 45 52 28 70 45 78 70 72   if( NEVER(pExpr
1da70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20 20  ==0) ) return;  
1da80 2f 2a 20 4e 6f 20 77 61 79 20 74 68 69 73 20 63  /* No way this c
1da90 61 6e 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 6f  an happen */.  o
1daa0 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
1dab0 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
1dac0 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
1dad0 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d  {.      int d2 =
1dae0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1daf0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
1db00 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1db10 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1db20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1db30 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
1db40 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1db50 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
1db60 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32  pExpr->pLeft, d2
1db70 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49  ,jumpIfNull^SQLI
1db80 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
1db90 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1dba0 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
1dbb0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
1dbc0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1dbd0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1dbe0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1dbf0 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71  v, d2);.      sq
1dc00 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
1dc10 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20  p(pParse, 1);.  
1dc20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1dc30 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
1dc40 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1dc50 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1dc60 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1dc70 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
1dc80 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1dc90 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1dca0 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
1dcb0 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
1dcc0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1dcd0 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
1dce0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
1dcf0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1dd00 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
1dd10 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1dd20 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1dd30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1dd40 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
1dd50 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
1dd60 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1dd70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1dd80 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
1dd90 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
1dda0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
1ddb0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
1ddc0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
1ddd0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
1dde0 51 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  Q: {.      asser
1ddf0 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20  t( TK_LT==OP_Lt 
1de00 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1de10 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b   TK_LE==OP_Le );
1de20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1de30 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20  K_GT==OP_Gt );. 
1de40 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1de50 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20  GE==OP_Ge );.   
1de60 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51     assert( TK_EQ
1de70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20  ==OP_Eq );.     
1de80 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d   assert( TK_NE==
1de90 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 74  OP_Ne );.      t
1dea0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1deb0 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LT );.      test
1dec0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20  case( op==TK_LE 
1ded0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1dee0 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a  e( op==TK_GT );.
1def0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1df00 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20  op==TK_GE );.   
1df10 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1df20 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20  =TK_EQ );.      
1df30 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1df40 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _NE );.      tes
1df50 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
1df60 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31  l==0 );.      r1
1df70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1df80 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1df90 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1dfa0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
1dfb0 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
1dfc0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1dfd0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
1dfe0 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
1dff0 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
1e000 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1e010 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
1e020 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
1e030 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
1e040 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1e050 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1e060 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1e070 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e080 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
1e090 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1e0a0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1e0b0 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  IS:.    case TK_
1e0c0 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  ISNOT: {.      t
1e0d0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1e0e0 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  IS );.      test
1e0f0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
1e100 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  OT );.      r1 =
1e110 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1e120 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1e130 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1e140 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
1e150 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1e160 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1e170 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
1e180 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 6f  gFree2);.      o
1e190 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20  p = (op==TK_IS) 
1e1a0 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b  ? TK_EQ : TK_NE;
1e1b0 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
1e1c0 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
1e1d0 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
1e1e0 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
1e1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
1e200 2c 20 72 32 2c 20 64 65 73 74 2c 20 53 51 4c 49  , r2, dest, SQLI
1e210 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
1e220 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1e230 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1e240 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1e250 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
1e260 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1e270 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
1e280 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
1e290 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73  NULL: {.      as
1e2a0 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d  sert( TK_ISNULL=
1e2b0 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20  =OP_IsNull );.  
1e2c0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
1e2d0 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75  OTNULL==OP_NotNu
1e2e0 6c 6c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ll );.      test
1e2f0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
1e300 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ULL );.      tes
1e310 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
1e320 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72  TNULL );.      r
1e330 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1e340 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1e350 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
1e360 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1e370 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e380 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73  2(v, op, r1, des
1e390 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
1e3a0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1e3b0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1e3c0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1e3d0 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
1e3e0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1e3f0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1e400 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74 77      exprCodeBetw
1e410 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70  een(pParse, pExp
1e420 72 2c 20 64 65 73 74 2c 20 31 2c 20 6a 75 6d 70  r, dest, 1, jump
1e430 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
1e440 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
1e450 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e460 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
1e470 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
1e480 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65   int destIfFalse
1e490 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1e4a0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
1e4b0 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c    int destIfNull
1e4c0 20 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20   = jumpIfNull ? 
1e4d0 64 65 73 74 20 3a 20 64 65 73 74 49 66 46 61 6c  dest : destIfFal
1e4e0 73 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se;.      sqlite
1e4f0 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72  3ExprCodeIN(pPar
1e500 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49  se, pExpr, destI
1e510 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75  fFalse, destIfNu
1e520 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
1e530 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1e540 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74  OP_Goto, 0, dest
1e550 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e560 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1e570 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  (v, destIfFalse)
1e580 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1e590 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1e5a0 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
1e5b0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1e5c0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1e5d0 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65  , pExpr, &regFre
1e5e0 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e1);.      sqlit
1e5f0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1e600 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c  OP_If, r1, dest,
1e610 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b   jumpIfNull!=0);
1e620 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e630 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1e640 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e650 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1e660 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1e670 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1e680 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1e690 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
1e6a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
1e6b0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1e6c0 65 2c 20 72 65 67 46 72 65 65 32 29 3b 20 20 0a  e, regFree2);  .
1e6d0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1e6e0 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f  e code for a boo
1e6f0 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lean expression 
1e700 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70  such that a jump
1e710 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74   is made.** to t
1e720 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20  he label "dest" 
1e730 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
1e740 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74 20 65  n is false but e
1e750 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74  xecution.** cont
1e760 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74  inues straight t
1e770 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65  hru if the expre
1e780 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a  ssion is true..*
1e790 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
1e7a0 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  ession evaluates
1e7b0 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65   to NULL (neithe
1e7c0 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65  r true nor false
1e7d0 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69  ) then.** jump i
1e7e0 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20  f jumpIfNull is 
1e7f0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
1e800 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67  L or fall throug
1e810 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a  h if jumpIfNull.
1e820 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64  ** is 0..*/.void
1e830 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
1e840 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lse(Parse *pPars
1e850 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
1e860 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75  int dest, int ju
1e870 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62  mpIfNull){.  Vdb
1e880 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1e890 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d  Vdbe;.  int op =
1e8a0 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
1e8b0 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  e1 = 0;.  int re
1e8c0 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e  gFree2 = 0;.  in
1e8d0 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73  t r1, r2;..  ass
1e8e0 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ert( jumpIfNull=
1e8f0 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55  =SQLITE_JUMPIFNU
1e900 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c  LL || jumpIfNull
1e910 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56  ==0 );.  if( NEV
1e920 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
1e930 6e 3b 20 2f 2a 20 45 78 69 73 74 61 6e 63 65 20  n; /* Existance 
1e940 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20  of VDBE checked 
1e950 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69  by caller */.  i
1e960 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 20 20  f( pExpr==0 )   
1e970 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54   return;..  /* T
1e980 68 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70  he value of pExp
1e990 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65  r->op and op are
1e9a0 20 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c   related as foll
1e9b0 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
1e9c0 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20       pExpr->op  
1e9d0 20 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a            op.  *
1e9e0 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  *       --------
1e9f0 2d 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d  -          -----
1ea00 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20  -----.  **      
1ea10 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20   TK_ISNULL      
1ea20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20      OP_NotNull. 
1ea30 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54   **       TK_NOT
1ea40 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f  NULL         OP_
1ea50 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  IsNull.  **     
1ea60 20 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20    TK_NE         
1ea70 20 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20       OP_Eq.  ** 
1ea80 20 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20        TK_EQ     
1ea90 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20           OP_Ne. 
1eaa0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20   **       TK_GT 
1eab0 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
1eac0 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Le.  **       TK
1ead0 5f 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  _LE             
1eae0 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20   OP_Gt.  **     
1eaf0 20 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20    TK_GE         
1eb00 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20       OP_Lt.  ** 
1eb10 20 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20        TK_LT     
1eb20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20           OP_Ge. 
1eb30 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68   **.  ** For oth
1eb40 65 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78  er values of pEx
1eb50 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e  pr->op, op is un
1eb60 64 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73  defined and unus
1eb70 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c  ed..  ** The val
1eb80 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50  ue of TK_ and OP
1eb90 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20  _ constants are 
1eba0 61 72 72 61 6e 67 65 64 20 73 75 63 68 20 74 68  arranged such th
1ebb0 61 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63  at we.  ** can c
1ebc0 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70 69  ompute the mappi
1ebd0 6e 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74  ng above using t
1ebe0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70  he following exp
1ebf0 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73  ression..  ** As
1ec00 73 65 72 74 28 29 73 20 76 65 72 69 66 79 20 74  sert()s verify t
1ec10 68 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74  hat the computat
1ec20 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  ion is correct..
1ec30 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45    */.  op = ((pE
1ec40 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55  xpr->op+(TK_ISNU
1ec50 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53  LL&1))^1)-(TK_IS
1ec60 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56  NULL&1);..  /* V
1ec70 65 72 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c  erify correct al
1ec80 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61  ignment of TK_ a
1ec90 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73  nd OP_ constants
1eca0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1ecb0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53  pExpr->op!=TK_IS
1ecc0 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e  NULL || op==OP_N
1ecd0 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65  otNull );.  asse
1ece0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
1ecf0 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d  K_NOTNULL || op=
1ed00 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20  =OP_IsNull );.  
1ed10 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
1ed20 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_NE || op==
1ed30 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72  OP_Eq );.  asser
1ed40 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
1ed50 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65  _EQ || op==OP_Ne
1ed60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1ed70 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c  xpr->op!=TK_LT |
1ed80 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20  | op==OP_Ge );. 
1ed90 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1eda0 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d  op!=TK_LE || op=
1edb0 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65  =OP_Gt );.  asse
1edc0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
1edd0 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  K_GT || op==OP_L
1ede0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
1edf0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20  Expr->op!=TK_GE 
1ee00 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a  || op==OP_Lt );.
1ee10 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
1ee20 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
1ee30 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20   TK_AND: {.     
1ee40 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1ee50 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1ee60 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
1ee70 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
1ee80 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
1ee90 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1eea0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1eeb0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
1eec0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
1eed0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1eee0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1eef0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1ef00 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  OR: {.      int 
1ef10 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
1ef20 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1ef30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1ef40 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1ef50 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1ef60 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
1ef70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ef80 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
1ef90 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1efa0 20 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e   d2, jumpIfNull^
1efb0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
1efc0 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
1efd0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
1efe0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1eff0 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
1f000 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
1f010 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1f020 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20  abel(v, d2);.   
1f030 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1f040 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31  chePop(pParse, 1
1f050 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1f060 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1f070 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  K_NOT: {.      t
1f080 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1f090 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1f0a0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
1f0b0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1f0c0 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
1f0d0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1f0e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1f0f0 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
1f100 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
1f110 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
1f120 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
1f130 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
1f140 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
1f150 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f160 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20  op==TK_LT );.   
1f170 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1f180 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20  =TK_LE );.      
1f190 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1f1a0 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GT );.      tes
1f1b0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45  tcase( op==TK_GE
1f1c0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1f1d0 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b  se( op==TK_EQ );
1f1e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1f1f0 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20   op==TK_NE );.  
1f200 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1f210 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1f220 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1f230 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1f240 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1f250 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1f260 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
1f270 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1f280 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1f290 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
1f2a0 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
1f2b0 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
1f2c0 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
1f2d0 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
1f2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1f2f0 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d  1, r2, dest, jum
1f300 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1f310 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1f320 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
1f330 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1f340 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
1f350 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1f360 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63  ase TK_IS:.    c
1f370 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a  ase TK_ISNOT: {.
1f380 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f390 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
1f3a0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1f3b0 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
1f3c0 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20  K_ISNOT );.     
1f3d0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1f3e0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1f3f0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1f400 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1f410 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1f420 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1f430 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
1f440 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
1f450 20 20 20 20 6f 70 20 3d 20 28 70 45 78 70 72 2d      op = (pExpr-
1f460 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b  >op==TK_IS) ? TK
1f470 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a 20 20 20  _NE : TK_EQ;.   
1f480 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
1f490 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1f4a0 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
1f4b0 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
1f4c0 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
1f4d0 2c 20 64 65 73 74 2c 20 53 51 4c 49 54 45 5f 4e  , dest, SQLITE_N
1f4e0 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65  ULLEQ);.      te
1f4f0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1f500 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
1f510 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
1f520 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
1f530 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1f540 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
1f550 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
1f560 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1f570 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  se( op==TK_ISNUL
1f580 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  L );.      testc
1f590 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  ase( op==TK_NOTN
1f5a0 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20  ULL );.      r1 
1f5b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1f5c0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1f5d0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1f5e0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71  Free1);.      sq
1f5f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1f600 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29  v, op, r1, dest)
1f610 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1f620 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1f630 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1f640 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1f650 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
1f660 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1f670 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1f680 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65    exprCodeBetwee
1f690 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  n(pParse, pExpr,
1f6a0 20 64 65 73 74 2c 20 30 2c 20 6a 75 6d 70 49 66   dest, 0, jumpIf
1f6b0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
1f6c0 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
1f6d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
1f6e0 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
1f6f0 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
1f700 66 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b  f( jumpIfNull ){
1f710 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f720 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73  ExprCodeIN(pPars
1f730 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
1f740 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dest);.      }el
1f750 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
1f760 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c  destIfNull = sql
1f770 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1f780 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  l(v);.        sq
1f790 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
1f7a0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
1f7b0 65 73 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  est, destIfNull)
1f7c0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1f7d0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1f7e0 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  l(v, destIfNull)
1f7f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f800 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
1f810 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  dif.    default:
1f820 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71   {.      r1 = sq
1f830 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1f840 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  p(pParse, pExpr,
1f850 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1f860 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f870 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp3(v, OP_IfNot
1f880 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r1, dest, jump
1f890 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20  IfNull!=0);.    
1f8a0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1f8b0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1f8c0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1f8d0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1f8e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1f8f0 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
1f900 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1f910 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20  e, regFree1);.  
1f920 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1f930 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
1f940 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  gFree2);.}../*.*
1f950 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70  * Do a deep comp
1f960 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78  arison of two ex
1f970 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20  pression trees. 
1f980 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   Return 0 if the
1f990 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69   two.** expressi
1f9a0 6f 6e 73 20 61 72 65 20 63 6f 6d 70 6c 65 74 65  ons are complete
1f9b0 6c 79 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 52  ly identical.  R
1f9c0 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 79 20  eturn 1 if they 
1f9d0 64 69 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62  differ only.** b
1f9e0 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  y a COLLATE oper
1f9f0 61 74 6f 72 20 61 74 20 74 68 65 20 74 6f 70 20  ator at the top 
1fa00 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 32  level.  Return 2
1fa10 20 69 66 20 74 68 65 72 65 20 61 72 65 20 64 69   if there are di
1fa20 66 66 65 72 65 6e 63 65 73 0a 2a 2a 20 6f 74 68  fferences.** oth
1fa30 65 72 20 74 68 61 6e 20 74 68 65 20 74 6f 70 2d  er than the top-
1fa40 6c 65 76 65 6c 20 43 4f 4c 4c 41 54 45 20 6f 70  level COLLATE op
1fa50 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 53 6f  erator..**.** So
1fa60 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75  metimes this rou
1fa70 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
1fa80 20 32 20 65 76 65 6e 20 69 66 20 74 68 65 20 74   2 even if the t
1fa90 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  wo expressions.*
1faa0 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75  * really are equ
1fab0 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20  ivalent.  If we 
1fac0 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61  cannot prove tha
1fad0 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
1fae0 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63  s are.** identic
1faf0 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32 20  al, we return 2 
1fb00 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e  just to be safe.
1fb10 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75    So if this rou
1fb20 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
1fb30 32 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e  2, then you do n
1fb40 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66  ot really know f
1fb50 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20 74 68  or certain if th
1fb60 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73  e two.** express
1fb70 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d  ions are the sam
1fb80 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20 67  e.  But if you g
1fb90 65 74 20 61 20 30 20 6f 72 20 31 20 72 65 74 75  et a 0 or 1 retu
1fba0 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20  rn, then you.** 
1fbb0 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 65 20  can be sure the 
1fbc0 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
1fbd0 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68  the same.  In th
1fbe0 65 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a  e places where.*
1fbf0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
1fc00 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20  s used, it does 
1fc10 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74 20  not hurt to get 
1fc20 61 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68 61  an extra 2 - tha
1fc30 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20  t.** just might 
1fc40 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73  result in some s
1fc50 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63  lightly slower c
1fc60 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e  ode.  But return
1fc70 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72  ing.** an incorr
1fc80 65 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c 64  ect 0 or 1 could
1fc90 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75   lead to a malfu
1fca0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
1fcb0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
1fcc0 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72  e(Expr *pA, Expr
1fcd0 20 2a 70 42 29 7b 0a 20 20 69 66 28 20 70 41 3d   *pB){.  if( pA=
1fce0 3d 30 7c 7c 70 42 3d 3d 30 20 29 7b 0a 20 20 20  =0||pB==0 ){.   
1fcf0 20 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 20 3f   return pB==pA ?
1fd00 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20 61 73   0 : 2;.  }.  as
1fd10 73 65 72 74 28 20 21 45 78 70 72 48 61 73 41 6e  sert( !ExprHasAn
1fd20 79 50 72 6f 70 65 72 74 79 28 70 41 2c 20 45 50  yProperty(pA, EP
1fd30 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
1fd40 64 75 63 65 64 29 20 29 3b 0a 20 20 61 73 73 65  duced) );.  asse
1fd50 72 74 28 20 21 45 78 70 72 48 61 73 41 6e 79 50  rt( !ExprHasAnyP
1fd60 72 6f 70 65 72 74 79 28 70 42 2c 20 45 50 5f 54  roperty(pB, EP_T
1fd70 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
1fd80 63 65 64 29 20 29 3b 0a 20 20 69 66 28 20 45 78  ced) );.  if( Ex
1fd90 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 41  prHasProperty(pA
1fda0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1fdb0 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  || ExprHasProper
1fdc0 74 79 28 70 42 2c 20 45 50 5f 78 49 73 53 65 6c  ty(pB, EP_xIsSel
1fdd0 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ect) ){.    retu
1fde0 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 2;.  }.  if( 
1fdf0 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  (pA->flags & EP_
1fe00 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e  Distinct)!=(pB->
1fe10 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
1fe20 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b  nct) ) return 2;
1fe30 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70  .  if( pA->op!=p
1fe40 42 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 69 66 28  B->op ){.    if(
1fe50 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   pA->op==TK_COLL
1fe60 41 54 45 20 26 26 20 73 71 6c 69 74 65 33 45 78  ATE && sqlite3Ex
1fe70 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c  prCompare(pA->pL
1fe80 65 66 74 2c 20 70 42 29 3c 32 20 29 7b 0a 20 20  eft, pB)<2 ){.  
1fe90 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1fea0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 2d 3e    }.    if( pB->
1feb0 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26  op==TK_COLLATE &
1fec0 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  & sqlite3ExprCom
1fed0 70 61 72 65 28 70 41 2c 20 70 42 2d 3e 70 4c 65  pare(pA, pB->pLe
1fee0 66 74 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72  ft)<2 ){.      r
1fef0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
1ff00 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
1ff10 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
1ff20 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c  prCompare(pA->pL
1ff30 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 29 20  eft, pB->pLeft) 
1ff40 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66  ) return 2;.  if
1ff50 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
1ff60 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c  pare(pA->pRight,
1ff70 20 70 42 2d 3e 70 52 69 67 68 74 29 20 29 20 72   pB->pRight) ) r
1ff80 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 73  eturn 2;.  if( s
1ff90 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
1ffa0 6d 70 61 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73  mpare(pA->x.pLis
1ffb0 74 2c 20 70 42 2d 3e 78 2e 70 4c 69 73 74 29 20  t, pB->x.pList) 
1ffc0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66  ) return 2;.  if
1ffd0 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42  ( pA->iTable!=pB
1ffe0 2d 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41 2d 3e  ->iTable || pA->
1fff0 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f  iColumn!=pB->iCo
20000 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 32 3b  lumn ) return 2;
20010 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
20020 6f 70 65 72 74 79 28 70 41 2c 20 45 50 5f 49 6e  operty(pA, EP_In
20030 74 56 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 69  tValue) ){.    i
20040 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
20050 72 74 79 28 70 42 2c 20 45 50 5f 49 6e 74 56 61  rty(pB, EP_IntVa
20060 6c 75 65 29 20 7c 7c 20 70 41 2d 3e 75 2e 69 56  lue) || pA->u.iV
20070 61 6c 75 65 21 3d 70 42 2d 3e 75 2e 69 56 61 6c  alue!=pB->u.iVal
20080 75 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ue ){.      retu
20090 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  rn 2;.    }.  }e
200a0 6c 73 65 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d  lse if( pA->op!=
200b0 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41 4c 57  TK_COLUMN && ALW
200c0 41 59 53 28 70 41 2d 3e 6f 70 21 3d 54 4b 5f 41  AYS(pA->op!=TK_A
200d0 47 47 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 41  GG_COLUMN) && pA
200e0 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 7b 0a 20 20 20  ->u.zToken){.   
200f0 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
20100 65 72 74 79 28 70 42 2c 20 45 50 5f 49 6e 74 56  erty(pB, EP_IntV
20110 61 6c 75 65 29 20 7c 7c 20 4e 45 56 45 52 28 70  alue) || NEVER(p
20120 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 3d 3d 30 29 20  B->u.zToken==0) 
20130 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
20140 69 66 28 20 73 74 72 63 6d 70 28 70 41 2d 3e 75  if( strcmp(pA->u
20150 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54  .zToken,pB->u.zT
20160 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20  oken)!=0 ){.    
20170 20 20 72 65 74 75 72 6e 20 70 41 2d 3e 6f 70 3d    return pA->op=
20180 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 3f 20 31 20  =TK_COLLATE ? 1 
20190 3a 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  : 2;.    }.  }. 
201a0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
201b0 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  .** Compare two 
201c0 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73  ExprList objects
201d0 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74  .  Return 0 if t
201e0 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63 61  hey are identica
201f0 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65  l and .** non-ze
20200 72 6f 20 69 66 20 74 68 65 79 20 64 69 66 66 65  ro if they diffe
20210 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a  r in any way..**
20220 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
20230 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 6e 6f   might return no
20240 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71 75 69 76  n-zero for equiv
20250 61 6c 65 6e 74 20 45 78 70 72 4c 69 73 74 73 2e  alent ExprLists.
20260 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f    The.** only co
20270 6e 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 20 62  nsequence will b
20280 65 20 64 69 73 61 62 6c 65 64 20 6f 70 74 69 6d  e disabled optim
20290 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75 74 20 74  izations.  But t
202a0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d  his routine.** m
202b0 75 73 74 20 6e 65 76 65 72 20 72 65 74 75 72 6e  ust never return
202c0 20 30 20 69 66 20 74 68 65 20 74 77 6f 20 45 78   0 if the two Ex
202d0 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 20 61  prList objects a
202e0 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20 6f 72  re different, or
202f0 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f  .** a malfunctio
20300 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a  n will result..*
20310 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 70 6f  *.** Two NULL po
20320 69 6e 74 65 72 73 20 61 72 65 20 63 6f 6e 73 69  inters are consi
20330 64 65 72 65 64 20 74 6f 20 62 65 20 74 68 65 20  dered to be the 
20340 73 61 6d 65 2e 20 20 42 75 74 20 61 20 4e 55 4c  same.  But a NUL
20350 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 61 6c 77  L pointer.** alw
20360 61 79 73 20 64 69 66 66 65 72 73 20 66 72 6f 6d  ays differs from
20370 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e   a non-NULL poin
20380 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ter..*/.int sqli
20390 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
203a0 72 65 28 45 78 70 72 4c 69 73 74 20 2a 70 41 2c  re(ExprList *pA,
203b0 20 45 78 70 72 4c 69 73 74 20 2a 70 42 29 7b 0a   ExprList *pB){.
203c0 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
203d0 41 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20 29 20  A==0 && pB==0 ) 
203e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
203f0 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29  pA==0 || pB==0 )
20400 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
20410 20 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e   pA->nExpr!=pB->
20420 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20 31  nExpr ) return 1
20430 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
20440 41 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  A->nExpr; i++){.
20450 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 41      Expr *pExprA
20460 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70   = pA->a[i].pExp
20470 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  r;.    Expr *pEx
20480 70 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70  prB = pB->a[i].p
20490 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 41  Expr;.    if( pA
204a0 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
204b0 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  !=pB->a[i].sortO
204c0 72 64 65 72 20 29 20 72 65 74 75 72 6e 20 31 3b  rder ) return 1;
204d0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
204e0 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70  ExprCompare(pExp
204f0 72 41 2c 20 70 45 78 70 72 42 29 20 29 20 72 65  rA, pExprB) ) re
20500 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
20510 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
20520 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
20530 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
20540 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20  ructure is used 
20550 62 79 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b  by the tree walk
20560 65 72 0a 2a 2a 20 74 6f 20 63 6f 75 6e 74 20 72  er.** to count r
20570 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62  eferences to tab
20580 6c 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  le columns in th
20590 65 20 61 72 67 75 6d 65 6e 74 73 20 6f 66 20 61  e arguments of a
205a0 6e 20 0a 2a 2a 20 61 67 67 72 65 67 61 74 65 20  n .** aggregate 
205b0 66 75 6e 63 74 69 6f 6e 2c 20 69 6e 20 6f 72 64  function, in ord
205c0 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  er to implement 
205d0 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 75  the.** sqlite3Fu
205e0 6e 63 74 69 6f 6e 54 68 69 73 53 72 63 28 29 20  nctionThisSrc() 
205f0 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75  routine..*/.stru
20600 63 74 20 53 72 63 43 6f 75 6e 74 20 7b 0a 20 20  ct SrcCount {.  
20610 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20  SrcList *pSrc;  
20620 20 2f 2a 20 4f 6e 65 20 70 61 72 74 69 63 75 6c   /* One particul
20630 61 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  ar FROM clause i
20640 6e 20 61 20 6e 65 73 74 65 64 20 71 75 65 72 79  n a nested query
20650 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 68 69 73 3b   */.  int nThis;
20660 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
20670 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
20680 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 53 72  o columns in pSr
20690 63 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  cList */.  int n
206a0 4f 74 68 65 72 3b 20 20 20 20 20 20 2f 2a 20 4e  Other;      /* N
206b0 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
206c0 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69  ces to columns i
206d0 6e 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61  n other FROM cla
206e0 75 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  uses */.};../*.*
206f0 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
20700 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
20710 20 74 6f 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a   to columns..*/.
20720 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53  static int exprS
20730 72 63 43 6f 75 6e 74 28 57 61 6c 6b 65 72 20 2a  rcCount(Walker *
20740 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
20750 45 78 70 72 29 7b 0a 20 20 2f 2a 20 54 68 65 20  Expr){.  /* The 
20760 4e 45 56 45 52 28 29 20 6f 6e 20 74 68 65 20 73  NEVER() on the s
20770 65 63 6f 6e 64 20 74 65 72 6d 20 69 73 20 62 65  econd term is be
20780 63 61 75 73 65 20 73 71 6c 69 74 65 33 46 75 6e  cause sqlite3Fun
20790 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63  ctionUsesThisSrc
207a0 28 29 0a 20 20 2a 2a 20 69 73 20 61 6c 77 61 79  ().  ** is alway
207b0 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
207c0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
207d0 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20 61  zeAggregates() a
207e0 6e 64 20 73 6f 20 74 68 65 0a 20 20 2a 2a 20 54  nd so the.  ** T
207f0 4b 5f 43 4f 4c 55 4d 4e 73 20 68 61 76 65 20 6e  K_COLUMNs have n
20800 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 6e 76  ot yet been conv
20810 65 72 74 65 64 20 69 6e 74 6f 20 54 4b 5f 41 47  erted into TK_AG
20820 47 5f 43 4f 4c 55 4d 4e 2e 20 20 49 66 0a 20 20  G_COLUMN.  If.  
20830 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69  ** sqlite3Functi
20840 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 29 20  onUsesThisSrc() 
20850 69 73 20 75 73 65 64 20 64 69 66 66 65 72 65 6e  is used differen
20860 74 6c 79 20 69 6e 20 74 68 65 20 66 75 74 75 72  tly in the futur
20870 65 2c 20 74 68 65 0a 20 20 2a 2a 20 4e 45 56 45  e, the.  ** NEVE
20880 52 28 29 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  R() will need to
20890 20 62 65 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a   be removed. */.
208a0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
208b0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 4e 45  =TK_COLUMN || NE
208c0 56 45 52 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  VER(pExpr->op==T
208d0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 29 7b  K_AGG_COLUMN) ){
208e0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
208f0 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20  struct SrcCount 
20900 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  *p = pWalker->u.
20910 70 53 72 63 43 6f 75 6e 74 3b 0a 20 20 20 20 53  pSrcCount;.    S
20920 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70  rcList *pSrc = p
20930 2d 3e 70 53 72 63 3b 0a 20 20 20 20 66 6f 72 28  ->pSrc;.    for(
20940 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72  i=0; i<pSrc->nSr
20950 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  c; i++){.      i
20960 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
20970 3d 3d 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75  ==pSrc->a[i].iCu
20980 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  rsor ) break;.  
20990 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 70 53    }.    if( i<pS
209a0 72 63 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20  rc->nSrc ){.    
209b0 20 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20    p->nThis++;.  
209c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
209d0 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20 20 20  ->nOther++;.    
209e0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  }.  }.  return W
209f0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
20a00 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
20a10 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 61 72  if any of the ar
20a20 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 70  guments to the p
20a30 45 78 70 72 20 46 75 6e 63 74 69 6f 6e 20 72 65  Expr Function re
20a40 66 65 72 65 6e 63 65 0a 2a 2a 20 70 53 72 63 4c  ference.** pSrcL
20a50 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75  ist.  Return tru
20a60 65 20 69 66 20 74 68 65 79 20 64 6f 2e 20 20 41  e if they do.  A
20a70 6c 73 6f 20 72 65 74 75 72 6e 20 74 72 75 65 20  lso return true 
20a80 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a  if the function.
20a90 2a 2a 20 68 61 73 20 6e 6f 20 61 72 67 75 6d 65  ** has no argume
20aa0 6e 74 73 20 6f 72 20 68 61 73 20 6f 6e 6c 79 20  nts or has only 
20ab0 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e  constant argumen
20ac0 74 73 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73  ts.  Return fals
20ad0 65 20 69 66 20 70 45 78 70 72 0a 2a 2a 20 72 65  e if pExpr.** re
20ae0 66 65 72 65 6e 63 65 73 20 63 6f 6c 75 6d 6e 73  ferences columns
20af0 20 62 75 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73   but not columns
20b00 20 6f 66 20 74 61 62 6c 65 73 20 66 6f 75 6e 64   of tables found
20b10 20 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2f   in pSrcList..*/
20b20 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 75 6e 63  .int sqlite3Func
20b30 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28  tionUsesThisSrc(
20b40 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53 72 63  Expr *pExpr, Src
20b50 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 29 7b  List *pSrcList){
20b60 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73  .  Walker w;.  s
20b70 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 63  truct SrcCount c
20b80 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  nt;.  assert( pE
20b90 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
20ba0 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 6d 65  FUNCTION );.  me
20bb0 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
20bc0 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70  of(w));.  w.xExp
20bd0 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
20be0 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77 2e 75 2e  SrcCount;.  w.u.
20bf0 70 53 72 63 43 6f 75 6e 74 20 3d 20 26 63 6e 74  pSrcCount = &cnt
20c00 3b 0a 20 20 63 6e 74 2e 70 53 72 63 20 3d 20 70  ;.  cnt.pSrc = p
20c10 53 72 63 4c 69 73 74 3b 0a 20 20 63 6e 74 2e 6e  SrcList;.  cnt.n
20c20 54 68 69 73 20 3d 20 30 3b 0a 20 20 63 6e 74 2e  This = 0;.  cnt.
20c30 6e 4f 74 68 65 72 20 3d 20 30 3b 0a 20 20 73 71  nOther = 0;.  sq
20c40 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73  lite3WalkExprLis
20c50 74 28 26 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70  t(&w, pExpr->x.p
20c60 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  List);.  return 
20c70 63 6e 74 2e 6e 54 68 69 73 3e 30 20 7c 7c 20 63  cnt.nThis>0 || c
20c80 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a  nt.nOther==0;.}.
20c90 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
20ca0 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
20cb0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
20cc0 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
20cd0 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20  the index of.** 
20ce0 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e  the new element.
20cf0 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74    Return a negat
20d00 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61  ive number if ma
20d10 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  lloc fails..*/.s
20d20 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67  tatic int addAgg
20d30 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74  InfoColumn(sqlit
20d40 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20  e3 *db, AggInfo 
20d50 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69  *pInfo){.  int i
20d60 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20  ;.  pInfo->aCol 
20d70 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
20d80 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64  locate(.       d
20d90 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d  b,.       pInfo-
20da0 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69  >aCol,.       si
20db0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c  zeof(pInfo->aCol
20dc0 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49  [0]),.       &pI
20dd0 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20  nfo->nColumn,.  
20de0 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72       &i.  );.  r
20df0 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a  eturn i;.}    ..
20e00 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
20e10 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70  element to the p
20e20 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
20e30 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
20e40 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20  the index of.** 
20e50 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e  the new element.
20e60 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74    Return a negat
20e70 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61  ive number if ma
20e80 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  lloc fails..*/.s
20e90 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67  tatic int addAgg
20ea0 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74 65 33  InfoFunc(sqlite3
20eb0 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70   *db, AggInfo *p
20ec0 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Info){.  int i;.
20ed0 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d    pInfo->aFunc =
20ee0 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c   sqlite3ArrayAll
20ef0 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62  ocate(.       db
20f00 2c 20 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d  , .       pInfo-
20f10 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 73  >aFunc,.       s
20f20 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75  izeof(pInfo->aFu
20f30 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26  nc[0]),.       &
20f40 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20  pInfo->nFunc,.  
20f50 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72       &i.  );.  r
20f60 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a  eturn i;.}    ..
20f70 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
20f80 65 20 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  e xExprCallback 
20f90 66 6f 72 20 61 20 74 72 65 65 20 77 61 6c 6b 65  for a tree walke
20fa0 72 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 74  r.  It is used t
20fb0 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73  o.** implement s
20fc0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
20fd0 65 41 67 67 72 65 67 61 74 65 73 28 29 2e 20 20  eAggregates().  
20fe0 53 65 65 20 73 71 6c 69 74 65 33 45 78 70 72 41  See sqlite3ExprA
20ff0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
21000 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .** for addition
21010 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
21020 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e  */.static int an
21030 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28 57  alyzeAggregate(W
21040 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
21050 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
21060 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
21070 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c  text *pNC = pWal
21080 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61  ker->u.pNC;.  Pa
21090 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e  rse *pParse = pN
210a0 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72 63  C->pParse;.  Src
210b0 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d  List *pSrcList =
210c0 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a   pNC->pSrcList;.
210d0 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49    AggInfo *pAggI
210e0 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49  nfo = pNC->pAggI
210f0 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  nfo;..  switch( 
21100 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
21110 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
21120 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UMN:.    case TK
21130 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
21140 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
21150 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
21160 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  UMN );.      tes
21170 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
21180 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
21190 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
211a0 20 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75   see if the colu
211b0 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20  mn is in one of 
211c0 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68  the tables in th
211d0 65 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20  e FROM.      ** 
211e0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67  clause of the ag
211f0 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f  gregate query */
21200 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
21210 53 28 70 53 72 63 4c 69 73 74 21 3d 30 29 20 29  S(pSrcList!=0) )
21220 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
21230 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
21240 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d  Item = pSrcList-
21250 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  >a;.        for(
21260 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d  i=0; i<pSrcList-
21270 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
21280 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
21290 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
212a0 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20  ol *pCol;.      
212b0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
212c0 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28  rHasAnyProperty(
212d0 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f  pExpr, EP_TokenO
212e0 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
212f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
21300 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
21310 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29  pItem->iCursor )
21320 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
21330 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
21340 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e  s point, it mean
21350 73 20 74 68 61 74 20 70 45 78 70 72 20 72 65 66  s that pExpr ref
21360 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a 20  ers to a table. 
21370 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
21380 61 74 20 69 73 20 69 6e 20 74 68 65 20 46 52 4f  at is in the FRO
21390 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
213a0 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e  aggregate query.
213b0 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a    .            *
213c0 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  *.            **
213d0 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66   Make an entry f
213e0 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e  or the column in
213f0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
21400 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 20  ] if there.     
21410 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74         ** is not
21420 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65 20   an entry there 
21430 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20 20  already..       
21440 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
21450 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
21460 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70 41         pCol = pA
21470 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20  ggInfo->aCol;.  
21480 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d            for(k=
21490 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; k<pAggInfo->n
214a0 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f  Column; k++, pCo
214b0 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l++){.          
214c0 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54      if( pCol->iT
214d0 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61  able==pExpr->iTa
214e0 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20  ble &&.         
214f0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
21500 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69  Column==pExpr->i
21510 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
21520 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
21530 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
21540 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
21550 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
21560 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f  k>=pAggInfo->nCo
21570 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20 20  lumn).          
21580 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41 67     && (k = addAg
21590 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72  gInfoColumn(pPar
215a0 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f  se->db, pAggInfo
215b0 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20 20  ))>=0 .         
215c0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
215d0 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67 67      pCol = &pAgg
215e0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20  Info->aCol[k];. 
215f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
21600 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72 2d  l->pTab = pExpr-
21610 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  >pTab;.         
21620 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c       pCol->iTabl
21630 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  e = pExpr->iTabl
21640 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
21650 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d   pCol->iColumn =
21660 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
21670 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
21680 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50  Col->iMem = ++pP
21690 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
216a0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
216b0 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20  iSorterColumn = 
216c0 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
216d0 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20    pCol->pExpr = 
216e0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
216f0 20 20 20 20 20 69 66 28 20 70 41 67 67 49 6e 66       if( pAggInf
21700 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  o->pGroupBy ){. 
21710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
21720 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20  nt j, n;.       
21730 20 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73           ExprLis
21740 74 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e 66  t *pGB = pAggInf
21750 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  o->pGroupBy;.   
21760 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
21770 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
21780 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e  m *pTerm = pGB->
21790 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  a;.             
217a0 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70     n = pGB->nExp
217b0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
217c0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b     for(j=0; j<n;
217d0 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   j++, pTerm++){.
217e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217f0 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54 65    Expr *pE = pTe
21800 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
21810 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
21820 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55   pE->op==TK_COLU
21830 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c 65  MN && pE->iTable
21840 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
21850 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
21860 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43 6f           pE->iCo
21870 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f  lumn==pExpr->iCo
21880 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
21890 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
218a0 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20  ->iSorterColumn 
218b0 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = j;.           
218c0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
218d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218e0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
218f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
21900 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
21910 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53      if( pCol->iS
21920 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b  orterColumn<0 ){
21930 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21940 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
21950 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d  lumn = pAggInfo-
21960 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b  >nSortingColumn+
21970 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  +;.             
21980 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
21990 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
219a0 54 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e 20  There is now an 
219b0 65 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72 20  entry for pExpr 
219c0 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  in pAggInfo->aCo
219d0 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20 20  l[] (either.    
219e0 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61 75          ** becau
219f0 73 65 20 69 74 20 77 61 73 20 74 68 65 72 65 20  se it was there 
21a00 62 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75 73  before or becaus
21a10 65 20 77 65 20 6a 75 73 74 20 63 72 65 61 74 65  e we just create
21a20 64 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20 20  d it)..         
21a30 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68     ** Convert th
21a40 65 20 70 45 78 70 72 20 74 6f 20 62 65 20 61 20  e pExpr to be a 
21a50 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65  TK_AGG_COLUMN re
21a60 66 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74 0a  ferring to that.
21a70 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
21a80 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
21a90 65 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20 20  entry..         
21aa0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
21ab0 20 20 45 78 70 72 53 65 74 49 72 72 65 64 75 63    ExprSetIrreduc
21ac0 69 62 6c 65 28 70 45 78 70 72 29 3b 0a 20 20 20  ible(pExpr);.   
21ad0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
21ae0 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49  pAggInfo = pAggI
21af0 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nfo;.           
21b00 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
21b10 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20  AGG_COLUMN;.    
21b20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
21b30 41 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20  Agg = (i16)k;.  
21b40 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
21b50 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20  .          } /* 
21b60 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54 61  endif pExpr->iTa
21b70 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72  ble==pItem->iCur
21b80 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  sor */.        }
21b90 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65   /* end loop ove
21ba0 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  r pSrcList */.  
21bb0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
21bc0 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
21bd0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
21be0 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a  AGG_FUNCTION: {.
21bf0 20 20 20 20 20 20 69 66 28 20 28 70 4e 43 2d 3e        if( (pNC->
21c00 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e 41  ncFlags & NC_InA
21c10 67 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20 20  ggFunc)==0.     
21c20 20 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77 61    && pWalker->wa
21c30 6c 6b 65 72 44 65 70 74 68 3d 3d 70 45 78 70 72  lkerDepth==pExpr
21c40 2d 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a 20  ->op2.      ){. 
21c50 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
21c60 74 6f 20 73 65 65 20 69 66 20 70 45 78 70 72 20  to see if pExpr 
21c70 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f  is a duplicate o
21c80 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67  f another aggreg
21c90 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ate .        ** 
21ca0 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
21cb0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
21cc0 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75  pAggInfo structu
21cd0 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  re.        */.  
21ce0 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
21cf0 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d  Info_func *pItem
21d00 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75   = pAggInfo->aFu
21d10 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  nc;.        for(
21d20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
21d30 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74  >nFunc; i++, pIt
21d40 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  em++){.         
21d50 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
21d60 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70  Compare(pItem->p
21d70 45 78 70 72 2c 20 70 45 78 70 72 29 3d 3d 30 20  Expr, pExpr)==0 
21d80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ){.            b
21d90 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
21da0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
21db0 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49      if( i>=pAggI
21dc0 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20  nfo->nFunc ){.  
21dd0 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72          /* pExpr
21de0 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d   is original.  M
21df0 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20  ake a new entry 
21e00 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  in pAggInfo->aFu
21e10 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a  nc[].          *
21e20 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65  /.          u8 e
21e30 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d  nc = ENC(pParse-
21e40 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >db);.          
21e50 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75  i = addAggInfoFu
21e60 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  nc(pParse->db, p
21e70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
21e80 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a      if( i>=0 ){.
21e90 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
21ea0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
21eb0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
21ec0 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
21ed0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d           pItem =
21ee0 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e   &pAggInfo->aFun
21ef0 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  c[i];.          
21f00 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d    pItem->pExpr =
21f10 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
21f20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20      pItem->iMem 
21f30 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
21f40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
21f50 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
21f60 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
21f70 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
21f80 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
21f90 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33  >pFunc = sqlite3
21fa0 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61  FindFunction(pPa
21fb0 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  rse->db,.       
21fc0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
21fd0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 73 71 6c  r->u.zToken, sql
21fe0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 45 78  ite3Strlen30(pEx
21ff0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2c 0a 20  pr->u.zToken),. 
22000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22010 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74    pExpr->x.pList
22020 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   ? pExpr->x.pLis
22030 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e  t->nExpr : 0, en
22040 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  c, 0);.         
22050 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c     if( pExpr->fl
22060 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
22070 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
22080 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69     pItem->iDisti
22090 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
220a0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ab++;.          
220b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
220c0 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44         pItem->iD
220d0 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
220e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
220f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22100 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b  }.        /* Mak
22110 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f  e pExpr point to
22120 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
22130 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
22140 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20  [] entry.       
22150 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
22160 72 74 28 20 21 45 78 70 72 48 61 73 41 6e 79 50  rt( !ExprHasAnyP
22170 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
22180 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
22190 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20  educed) );.     
221a0 20 20 20 45 78 70 72 53 65 74 49 72 72 65 64 75     ExprSetIrredu
221b0 63 69 62 6c 65 28 70 45 78 70 72 29 3b 0a 20 20  cible(pExpr);.  
221c0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
221d0 67 20 3d 20 28 69 31 36 29 69 3b 0a 20 20 20 20  g = (i16)i;.    
221e0 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49      pExpr->pAggI
221f0 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a  nfo = pAggInfo;.
22200 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
22210 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20  RC_Prune;.      
22220 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
22230 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
22240 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
22250 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  }.  }.  return W
22260 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73  RC_Continue;.}.s
22270 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a  tatic int analyz
22280 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c  eAggregatesInSel
22290 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ect(Walker *pWal
222a0 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  ker, Select *pSe
222b0 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f  lect){.  UNUSED_
222c0 50 41 52 41 4d 45 54 45 52 28 70 57 61 6c 6b 65  PARAMETER(pWalke
222d0 72 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  r);.  UNUSED_PAR
222e0 41 4d 45 54 45 52 28 70 53 65 6c 65 63 74 29 3b  AMETER(pSelect);
222f0 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
22300 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
22310 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 70 45 78   Analyze the pEx
22320 70 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f  pr expression lo
22330 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67  oking for aggreg
22340 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  ate functions an
22350 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62 6c  d.** for variabl
22360 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  es that need to 
22370 62 65 20 61 64 64 65 64 20 74 6f 20 41 67 67 49  be added to AggI
22380 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 20  nfo object that 
22390 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a  pNC->pAggInfo.**
223a0 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41 64 64   points to.  Add
223b0 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20  itional entries 
223c0 61 72 65 20 6d 61 64 65 20 6f 6e 20 74 68 65 20  are made on the 
223d0 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 61  AggInfo object a
223e0 73 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 2e 0a  s.** necessary..
223f0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
22400 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62  ne should only b
22410 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74  e called after t
22420 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61  he expression ha
22430 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a  s been.** analyz
22440 65 64 20 62 79 20 73 71 6c 69 74 65 33 52 65 73  ed by sqlite3Res
22450 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 2e  olveExprNames().
22460 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
22470 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
22480 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78  gates(NameContex
22490 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45  t *pNC, Expr *pE
224a0 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  xpr){.  Walker w
224b0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30  ;.  memset(&w, 0
224c0 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
224d0 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
224e0 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  = analyzeAggrega
224f0 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  te;.  w.xSelectC
22500 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a  allback = analyz
22510 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c  eAggregatesInSel
22520 65 63 74 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d  ect;.  w.u.pNC =
22530 20 70 4e 43 3b 0a 20 20 61 73 73 65 72 74 28 20   pNC;.  assert( 
22540 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30  pNC->pSrcList!=0
22550 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c   );.  sqlite3Wal
22560 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29  kExpr(&w, pExpr)
22570 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  ;.}../*.** Call 
22580 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
22590 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20 66  zeAggregates() f
225a0 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73  or every express
225b0 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70  ion in an.** exp
225c0 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52  ression list.  R
225d0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
225e0 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a   of errors..**.*
225f0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73  * If an error is
22600 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c   found, the anal
22610 79 73 69 73 20 69 73 20 63 75 74 20 73 68 6f 72  ysis is cut shor
22620 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
22630 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
22640 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74  List(NameContext
22650 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74 20   *pNC, ExprList 
22660 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75 63  *pList){.  struc
22670 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
22680 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  *pItem;.  int i;
22690 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
226a0 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c      for(pItem=pL
226b0 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70  ist->a, i=0; i<p
226c0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
226d0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
226e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
226f0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70  lyzeAggregates(p
22700 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  NC, pItem->pExpr
22710 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
22720 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
22730 20 73 69 6e 67 6c 65 20 6e 65 77 20 72 65 67 69   single new regi
22740 73 74 65 72 20 66 6f 72 20 75 73 65 20 74 6f 20  ster for use to 
22750 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65 72 6d  hold some interm
22760 65 64 69 61 74 65 20 72 65 73 75 6c 74 2e 0a 2a  ediate result..*
22770 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74  /.int sqlite3Get
22780 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70  TempReg(Parse *p
22790 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70 50  Parse){.  if( pP
227a0 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d  arse->nTempReg==
227b0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
227c0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
227d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61    }.  return pPa
227e0 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d  rse->aTempReg[--
227f0 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
22800 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c  ];.}../*.** Deal
22810 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73 74 65  locate a registe
22820 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69 6c 61  r, making availa
22830 62 6c 65 20 66 6f 72 20 72 65 75 73 65 20 66 6f  ble for reuse fo
22840 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  r some other.** 
22850 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  purpose..**.** I
22860 66 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20  f a register is 
22870 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
22880 75 73 65 64 20 62 79 20 74 68 65 20 63 6f 6c 75  used by the colu
22890 6d 6e 20 63 61 63 68 65 2c 20 74 68 65 6e 0a 2a  mn cache, then.*
228a0 2a 20 74 68 65 20 64 61 6c 6c 6f 63 61 74 69 6f  * the dallocatio
228b0 6e 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e  n is deferred un
228c0 74 69 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  til the column c
228d0 61 63 68 65 20 6c 69 6e 65 20 74 68 61 74 20 75  ache line that u
228e0 73 65 73 0a 2a 2a 20 74 68 65 20 72 65 67 69 73  ses.** the regis
228f0 74 65 72 20 62 65 63 6f 6d 65 73 20 73 74 61 6c  ter becomes stal
22900 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
22910 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
22920 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
22930 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 66 28  int iReg){.  if(
22940 20 69 52 65 67 20 26 26 20 70 50 61 72 73 65 2d   iReg && pParse-
22950 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53  >nTempReg<ArrayS
22960 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d  ize(pParse->aTem
22970 70 52 65 67 29 20 29 7b 0a 20 20 20 20 69 6e 74  pReg) ){.    int
22980 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20 79   i;.    struct y
22990 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 20  ColCache *p;.   
229a0 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
229b0 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
229c0 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
229d0 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
229e0 20 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67       if( p->iReg
229f0 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20  ==iReg ){.      
22a00 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 31    p->tempReg = 1
22a10 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
22a20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
22a30 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d      pParse->aTem
22a40 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65  pReg[pParse->nTe
22a50 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b  mpReg++] = iReg;
22a60 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
22a70 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f  locate or deallo
22a80 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20  cate a block of 
22a90 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65  nReg consecutive
22aa0 20 72 65 67 69 73 74 65 72 73 0a 2a 2f 0a 69 6e   registers.*/.in
22ab0 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  t sqlite3GetTemp
22ac0 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  Range(Parse *pPa
22ad0 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  rse, int nReg){.
22ae0 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 20    int i, n;.  i 
22af0 3d 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65  = pParse->iRange
22b00 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73  Reg;.  n = pPars
22b10 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20  e->nRangeReg;.  
22b20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20  if( nReg<=n ){. 
22b30 20 20 20 61 73 73 65 72 74 28 20 21 75 73 65 64     assert( !used
22b40 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50  AsColumnCache(pP
22b50 61 72 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29 20  arse, i, i+n-1) 
22b60 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69  );.    pParse->i
22b70 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67  RangeReg += nReg
22b80 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52  ;.    pParse->nR
22b90 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b  angeReg -= nReg;
22ba0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20  .  }else{.    i 
22bb0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
22bc0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
22bd0 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a  em += nReg;.  }.
22be0 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f    return i;.}.vo
22bf0 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  id sqlite3Releas
22c00 65 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65  eTempRange(Parse
22c10 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
22c20 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  eg, int nReg){. 
22c30 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
22c40 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20  eRemove(pParse, 
22c50 69 52 65 67 2c 20 6e 52 65 67 29 3b 0a 20 20 69  iReg, nReg);.  i
22c60 66 28 20 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e  f( nReg>pParse->
22c70 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a 20 20 20  nRangeReg ){.   
22c80 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
22c90 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70  eg = nReg;.    p
22ca0 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
22cb0 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a   = iReg;.  }.}..
22cc0 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20 74  /*.** Mark all t
22cd0 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
22ce0 72 73 20 61 73 20 62 65 69 6e 67 20 75 6e 61 76  rs as being unav
22cf0 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73  ailable for reus
22d00 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
22d10 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61  e3ClearTempRegCa
22d20 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  che(Parse *pPars
22d30 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54  e){.  pParse->nT
22d40 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 70 50  empReg = 0;.  pP
22d50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
22d60 3d 20 30 3b 0a 7d 0a                             = 0;.}.