/ Hex Artifact Content
Login

Artifact 7f93e51fd7ca0d3ea1be2715a29c86a69e7b1e93:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t.h"../*.** Retu
0220: 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74 79  rn the 'affinity
0230: 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  ' of the express
0240: 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e 79  ion pExpr if any
0250: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
0260: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61 20   is a column, a 
0270: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 63  reference to a c
0280: 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41 53  olumn via an 'AS
0290: 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20 61  ' alias,.** or a
02a0: 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74 68   sub-select with
02b0: 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65   a column as the
02c0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 74   return value, t
02d0: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66 69  hen the .** affi
02e0: 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f 6c  nity of that col
02f0: 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  umn is returned.
0300: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30 30   Otherwise, 0x00
0310: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
0320: 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 61   indicating no a
0330: 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65 20  ffinity for the 
0340: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
0350: 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52 45  * i.e. the WHERE
0360: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 73   clause expresss
0370: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0380: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0390: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
03a0: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
03b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
03c0: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
03d0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
03e0: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
03f0: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0400: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
0410: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
0420: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
0430: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
0440: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
0450: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
0460: 20 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   op;.  pExpr = s
0470: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0480: 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
0490: 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
04a0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c    if( op==TK_SEL
04b0: 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ECT ){.    asser
04c0: 74 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 26  t( pExpr->flags&
04d0: 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b 0a  EP_xIsSelect );.
04e0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
04f0: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
0500: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  Expr->x.pSelect-
0510: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
0520: 78 70 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  xpr);.  }.#ifnde
0530: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41  f SQLITE_OMIT_CA
0540: 53 54 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  ST.  if( op==TK_
0550: 43 41 53 54 20 29 7b 0a 20 20 20 20 61 73 73 65  CAST ){.    asse
0560: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
0570: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
0580: 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
0590: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41 66  return sqlite3Af
05a0: 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70 72  finityType(pExpr
05b0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 7d  ->u.zToken);.  }
05c0: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 28 6f  .#endif.  if( (o
05d0: 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
05e0: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   || op==TK_COLUM
05f0: 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49  N || op==TK_REGI
0600: 53 54 45 52 29 20 0a 20 20 20 26 26 20 70 45 78  STER) .   && pEx
0610: 70 72 2d 3e 70 54 61 62 21 3d 30 0a 20 20 29 7b  pr->pTab!=0.  ){
0620: 0a 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52  .    /* op==TK_R
0630: 45 47 49 53 54 45 52 20 26 26 20 70 45 78 70 72  EGISTER && pExpr
0640: 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e  ->pTab!=0 happen
0650: 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61 73  s when pExpr was
0660: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20   originally.    
0670: 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62  ** a TK_COLUMN b
0680: 75 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  ut was previousl
0690: 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  y evaluated and 
06a0: 63 61 63 68 65 64 20 69 6e 20 61 20 72 65 67 69  cached in a regi
06b0: 73 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ster */.    int 
06c0: 6a 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  j = pExpr->iColu
06d0: 6d 6e 3b 0a 20 20 20 20 69 66 28 20 6a 3c 30 20  mn;.    if( j<0 
06e0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
06f0: 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  AFF_INTEGER;.   
0700: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
0710: 70 54 61 62 20 26 26 20 6a 3c 70 45 78 70 72 2d  pTab && j<pExpr-
0720: 3e 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  >pTab->nCol );. 
0730: 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d     return pExpr-
0740: 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61  >pTab->aCol[j].a
0750: 66 66 69 6e 69 74 79 3b 0a 20 20 7d 0a 20 20 72  ffinity;.  }.  r
0760: 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61 66 66  eturn pExpr->aff
0770: 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  inity;.}../*.** 
0780: 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  Set the collatin
0790: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65  g sequence for e
07a0: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
07b0: 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c 61 74  to be the collat
07c0: 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20  ing.** sequence 
07d0: 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e 2e  named by pToken.
07e0: 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e     Return a poin
07f0: 74 65 72 20 74 6f 20 61 20 6e 65 77 20 45 78 70  ter to a new Exp
0800: 72 20 6e 6f 64 65 20 74 68 61 74 0a 2a 2a 20 69  r node that.** i
0810: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 43 4f  mplements the CO
0820: 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a  LLATE operator..
0830: 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72  **.** If a memor
0840: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
0850: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 61 74 20  or occurs, that 
0860: 66 61 63 74 20 69 73 20 72 65 63 6f 72 64 65 64  fact is recorded
0870: 20 69 6e 20 70 50 61 72 73 65 2d 3e 64 62 0a 2a   in pParse->db.*
0880: 2a 20 61 6e 64 20 74 68 65 20 70 45 78 70 72 20  * and the pExpr 
0890: 70 61 72 61 6d 65 74 65 72 20 69 73 20 72 65 74  parameter is ret
08a0: 75 72 6e 65 64 20 75 6e 63 68 61 6e 67 65 64 2e  urned unchanged.
08b0: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
08c0: 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54  3ExprAddCollateT
08d0: 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72  oken(Parse *pPar
08e0: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
08f0: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d   Token *pCollNam
0900: 65 29 7b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 4e  e){.  if( pCollN
0910: 61 6d 65 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20  ame->n>0 ){.    
0920: 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c  Expr *pNew = sql
0930: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50  ite3ExprAlloc(pP
0940: 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c  arse->db, TK_COL
0950: 4c 41 54 45 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c  LATE, pCollName,
0960: 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65   1);.    if( pNe
0970: 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  w ){.      pNew-
0980: 3e 70 4c 65 66 74 20 3d 20 70 45 78 70 72 3b 0a  >pLeft = pExpr;.
0990: 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67        pNew->flag
09a0: 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 3b  s |= EP_Collate;
09b0: 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70  .      pExpr = p
09c0: 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  New;.    }.  }. 
09d0: 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d   return pExpr;.}
09e0: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
09f0: 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69  prAddCollateStri
0a00: 6e 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ng(Parse *pParse
0a10: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63  , Expr *pExpr, c
0a20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 29 7b 0a  onst char *zC){.
0a30: 20 20 54 6f 6b 65 6e 20 73 3b 0a 20 20 61 73 73    Token s;.  ass
0a40: 65 72 74 28 20 7a 43 21 3d 30 20 29 3b 0a 20 20  ert( zC!=0 );.  
0a50: 73 2e 7a 20 3d 20 7a 43 3b 0a 20 20 73 2e 6e 20  s.z = zC;.  s.n 
0a60: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
0a70: 30 28 73 2e 7a 29 3b 0a 20 20 72 65 74 75 72 6e  0(s.z);.  return
0a80: 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43   sqlite3ExprAddC
0a90: 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72  ollateToken(pPar
0aa0: 73 65 2c 20 70 45 78 70 72 2c 20 26 73 29 3b 0a  se, pExpr, &s);.
0ab0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6b 69 70 20 6f 76  }../*.** Skip ov
0ac0: 65 72 20 61 6e 79 20 54 4b 5f 43 4f 4c 4c 41 54  er any TK_COLLAT
0ad0: 45 20 61 6e 64 2f 6f 72 20 54 4b 5f 41 53 20 6f  E and/or TK_AS o
0ae0: 70 65 72 61 74 6f 72 73 20 61 74 20 74 68 65 20  perators at the 
0af0: 72 6f 6f 74 20 6f 66 0a 2a 2a 20 61 6e 20 65 78  root of.** an ex
0b00: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45 78 70  pression..*/.Exp
0b10: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 53 6b  r *sqlite3ExprSk
0b20: 69 70 43 6f 6c 6c 61 74 65 28 45 78 70 72 20 2a  ipCollate(Expr *
0b30: 70 45 78 70 72 29 7b 0a 20 20 77 68 69 6c 65 28  pExpr){.  while(
0b40: 20 70 45 78 70 72 20 26 26 20 28 70 45 78 70 72   pExpr && (pExpr
0b50: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
0b60: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
0b70: 4b 5f 41 53 29 20 29 7b 0a 20 20 20 20 70 45 78  K_AS) ){.    pEx
0b80: 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  pr = pExpr->pLef
0b90: 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
0ba0: 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pExpr;.}../*.** 
0bb0: 52 65 74 75 72 6e 20 74 68 65 20 63 6f 6c 6c 61  Return the colla
0bc0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
0bd0: 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
0be0: 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a 20 74 68   pExpr. If.** th
0bf0: 65 72 65 20 69 73 20 6e 6f 20 64 65 66 69 6e 65  ere is no define
0c00: 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
0c10: 65 6e 63 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c  ence, return NUL
0c20: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c  L..**.** The col
0c30: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
0c40: 6d 69 67 68 74 20 62 65 20 64 65 74 65 72 6d 69  might be determi
0c50: 6e 65 64 20 62 79 20 61 20 43 4f 4c 4c 41 54 45  ned by a COLLATE
0c60: 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 6f 72 20   operator.** or 
0c70: 62 79 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  by the presence 
0c80: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 77 69 74 68  of a column with
0c90: 20 61 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61   a defined colla
0ca0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
0cb0: 2a 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  * COLLATE operat
0cc0: 6f 72 73 20 74 61 6b 65 20 66 69 72 73 74 20 70  ors take first p
0cd0: 72 65 63 65 64 65 6e 63 65 2e 20 20 4c 65 66 74  recedence.  Left
0ce0: 20 6f 70 65 72 61 6e 64 73 20 74 61 6b 65 0a 2a   operands take.*
0cf0: 2a 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65  * precedence ove
0d00: 72 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 73  r right operands
0d10: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
0d20: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
0d30: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
0d40: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
0d50: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
0d60: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 43 6f 6c 6c  arse->db;.  Coll
0d70: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
0d80: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 78 70    Expr *p = pExp
0d90: 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  r;.  while( p ){
0da0: 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 2d  .    int op = p-
0db0: 3e 6f 70 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d  >op;.    if( op=
0dc0: 3d 54 4b 5f 43 41 53 54 20 7c 7c 20 6f 70 3d 3d  =TK_CAST || op==
0dd0: 54 4b 5f 55 50 4c 55 53 20 29 7b 0a 20 20 20 20  TK_UPLUS ){.    
0de0: 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a    p = p->pLeft;.
0df0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
0e00: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70      }.    if( op
0e10: 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 7c 7c 20  ==TK_COLLATE || 
0e20: 28 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52  (op==TK_REGISTER
0e30: 20 26 26 20 70 2d 3e 6f 70 32 3d 3d 54 4b 5f 43   && p->op2==TK_C
0e40: 4f 4c 4c 41 54 45 29 20 29 7b 0a 20 20 20 20 20  OLLATE) ){.     
0e50: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
0e60: 47 65 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  GetCollSeq(pPars
0e70: 65 2c 20 45 4e 43 28 64 62 29 2c 20 30 2c 20 70  e, ENC(db), 0, p
0e80: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
0e90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
0ea0: 20 20 20 20 69 66 28 20 70 2d 3e 70 54 61 62 21      if( p->pTab!
0eb0: 3d 30 0a 20 20 20 20 20 26 26 20 28 6f 70 3d 3d  =0.     && (op==
0ec0: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c 7c  TK_AGG_COLUMN ||
0ed0: 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20   op==TK_COLUMN. 
0ee0: 20 20 20 20 20 20 20 20 20 7c 7c 20 6f 70 3d 3d           || op==
0ef0: 54 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f  TK_REGISTER || o
0f00: 70 3d 3d 54 4b 5f 54 52 49 47 47 45 52 29 0a 20  p==TK_TRIGGER). 
0f10: 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f     ){.      /* o
0f20: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26  p==TK_REGISTER &
0f30: 26 20 70 2d 3e 70 54 61 62 21 3d 30 20 68 61 70  & p->pTab!=0 hap
0f40: 70 65 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20  pens when pExpr 
0f50: 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  was originally. 
0f60: 20 20 20 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c       ** a TK_COL
0f70: 55 4d 4e 20 62 75 74 20 77 61 73 20 70 72 65 76  UMN but was prev
0f80: 69 6f 75 73 6c 79 20 65 76 61 6c 75 61 74 65 64  iously evaluated
0f90: 20 61 6e 64 20 63 61 63 68 65 64 20 69 6e 20 61   and cached in a
0fa0: 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20   register */.   
0fb0: 20 20 20 69 6e 74 20 6a 20 3d 20 70 2d 3e 69 43     int j = p->iC
0fc0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28  olumn;.      if(
0fd0: 20 6a 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   j>=0 ){.       
0fe0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
0ff0: 6c 6c 20 3d 20 70 2d 3e 70 54 61 62 2d 3e 61 43  ll = p->pTab->aC
1000: 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20  ol[j].zColl;.   
1010: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
1020: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
1030: 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f  db, ENC(db), zCo
1040: 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ll, 0);.      }.
1050: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1060: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c   }.    if( p->fl
1070: 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
1080: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 41 4c   ){.      if( AL
1090: 57 41 59 53 28 70 2d 3e 70 4c 65 66 74 29 20 26  WAYS(p->pLeft) &
10a0: 26 20 28 70 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61  & (p->pLeft->fla
10b0: 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29  gs & EP_Collate)
10c0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
10d0: 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20   = p->pLeft;.   
10e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10f0: 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b    p = p->pRight;
1100: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
1110: 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  se{.      break;
1120: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1130: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c   sqlite3CheckCol
1140: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f  lSeq(pParse, pCo
1150: 6c 6c 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c  ll) ){ .    pCol
1160: 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  l = 0;.  }.  ret
1170: 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a  urn pColl;.}../*
1180: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 6e 20  .** pExpr is an 
1190: 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d  operand of a com
11a0: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
11b0: 2e 20 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a  .  aff2 is the.*
11c0: 2a 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20  * type affinity 
11d0: 6f 66 20 74 68 65 20 6f 74 68 65 72 20 6f 70 65  of the other ope
11e0: 72 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74  rand.  This rout
11f0: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a  ine returns the.
1200: 2a 2a 20 74 79 70 65 20 61 66 66 69 6e 69 74 79  ** type affinity
1210: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
1220: 75 73 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d  used for the com
1230: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
1240: 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65  ..*/.char sqlite
1250: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
1260: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68  (Expr *pExpr, ch
1270: 61 72 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72  ar aff2){.  char
1280: 20 61 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45   aff1 = sqlite3E
1290: 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70  xprAffinity(pExp
12a0: 72 29 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26  r);.  if( aff1 &
12b0: 26 20 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a  & aff2 ){.    /*
12c0: 20 42 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74   Both sides of t
12d0: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72  he comparison ar
12e0: 65 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e  e columns. If on
12f0: 65 20 68 61 73 20 6e 75 6d 65 72 69 63 0a 20 20  e has numeric.  
1300: 20 20 2a 2a 20 61 66 66 69 6e 69 74 79 2c 20 75    ** affinity, u
1310: 73 65 20 74 68 61 74 2e 20 4f 74 68 65 72 77 69  se that. Otherwi
1320: 73 65 20 75 73 65 20 6e 6f 20 61 66 66 69 6e 69  se use no affini
1330: 74 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ty..    */.    i
1340: 66 28 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65  f( sqlite3IsNume
1350: 72 69 63 41 66 66 69 6e 69 74 79 28 61 66 66 31  ricAffinity(aff1
1360: 29 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4e 75  ) || sqlite3IsNu
1370: 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 61 66  mericAffinity(af
1380: 66 32 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  f2) ){.      ret
1390: 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  urn SQLITE_AFF_N
13a0: 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 65 6c 73  UMERIC;.    }els
13b0: 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
13c0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
13d0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
13e0: 66 28 20 21 61 66 66 31 20 26 26 20 21 61 66 66  f( !aff1 && !aff
13f0: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74  2 ){.    /* Neit
1400: 68 65 72 20 73 69 64 65 20 6f 66 20 74 68 65 20  her side of the 
1410: 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20  comparison is a 
1420: 63 6f 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61 72 65  column.  Compare
1430: 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75   the.    ** resu
1440: 6c 74 73 20 64 69 72 65 63 74 6c 79 2e 0a 20 20  lts directly..  
1450: 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20    */.    return 
1460: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
1470: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1480: 20 4f 6e 65 20 73 69 64 65 20 69 73 20 61 20 63   One side is a c
1490: 6f 6c 75 6d 6e 2c 20 74 68 65 20 6f 74 68 65 72  olumn, the other
14a0: 20 69 73 20 6e 6f 74 2e 20 55 73 65 20 74 68 65   is not. Use the
14b0: 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74   columns affinit
14c0: 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  y. */.    assert
14d0: 28 20 61 66 66 31 3d 3d 30 20 7c 7c 20 61 66 66  ( aff1==0 || aff
14e0: 32 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  2==0 );.    retu
14f0: 72 6e 20 28 61 66 66 31 20 2b 20 61 66 66 32 29  rn (aff1 + aff2)
1500: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  ;.  }.}../*.** p
1510: 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72  Expr is a compar
1520: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20  ison operator.  
1530: 52 65 74 75 72 6e 20 74 68 65 20 74 79 70 65 20  Return the type 
1540: 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68  affinity that sh
1550: 6f 75 6c 64 0a 2a 2a 20 62 65 20 61 70 70 6c 69  ould.** be appli
1560: 65 64 20 74 6f 20 62 6f 74 68 20 6f 70 65 72 61  ed to both opera
1570: 6e 64 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69  nds prior to doi
1580: 6e 67 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  ng the compariso
1590: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  n..*/.static cha
15a0: 72 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69  r comparisonAffi
15b0: 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70 72  nity(Expr *pExpr
15c0: 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20  ){.  char aff;. 
15d0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
15e0: 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78  op==TK_EQ || pEx
15f0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c  pr->op==TK_IN ||
1600: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c   pExpr->op==TK_L
1610: 54 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70  T ||.          p
1620: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20  Expr->op==TK_GT 
1630: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
1640: 5f 47 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _GE || pExpr->op
1650: 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20 20 20  ==TK_LE ||.     
1660: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d       pExpr->op==
1670: 54 4b 5f 4e 45 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_NE || pExpr->
1680: 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70 45 78  op==TK_IS || pEx
1690: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
16a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
16b0: 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20  xpr->pLeft );.  
16c0: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70  aff = sqlite3Exp
16d0: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  rAffinity(pExpr-
16e0: 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70  >pLeft);.  if( p
16f0: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a  Expr->pRight ){.
1700: 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65      aff = sqlite
1710: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
1720: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  (pExpr->pRight, 
1730: 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  aff);.  }else if
1740: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
1750: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
1760: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 61 66  elect) ){.    af
1770: 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  f = sqlite3Compa
1780: 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  reAffinity(pExpr
1790: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
17a0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
17b0: 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69   aff);.  }else i
17c0: 66 28 20 21 61 66 66 20 29 7b 0a 20 20 20 20 61  f( !aff ){.    a
17d0: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
17e0: 4e 4f 4e 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75  NONE;.  }.  retu
17f0: 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn aff;.}../*.**
1800: 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70   pExpr is a comp
1810: 61 72 69 73 6f 6e 20 65 78 70 72 65 73 73 69 6f  arison expressio
1820: 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c  n, eg. '=', '<',
1830: 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a   IN(...) etc..**
1840: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20 69 73   idx_affinity is
1850: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
1860: 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75   an indexed colu
1870: 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72 75 65 0a  mn. Return true.
1880: 2a 2a 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  ** if the index 
1890: 77 69 74 68 20 61 66 66 69 6e 69 74 79 20 69 64  with affinity id
18a0: 78 5f 61 66 66 69 6e 69 74 79 20 6d 61 79 20 62  x_affinity may b
18b0: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
18c0: 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61  ent.** the compa
18d0: 72 69 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a  rison in pExpr..
18e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
18f0: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 45 78  dexAffinityOk(Ex
1900: 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20  pr *pExpr, char 
1910: 69 64 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20  idx_affinity){. 
1920: 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70   char aff = comp
1930: 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70  arisonAffinity(p
1940: 45 78 70 72 29 3b 0a 20 20 73 77 69 74 63 68 28  Expr);.  switch(
1950: 20 61 66 66 20 29 7b 0a 20 20 20 20 63 61 73 65   aff ){.    case
1960: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
1970: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  :.      return 1
1980: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1990: 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20  E_AFF_TEXT:.    
19a0: 20 20 72 65 74 75 72 6e 20 69 64 78 5f 61 66 66    return idx_aff
19b0: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
19c0: 46 5f 54 45 58 54 3b 0a 20 20 20 20 64 65 66 61  F_TEXT;.    defa
19d0: 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ult:.      retur
19e0: 6e 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72  n sqlite3IsNumer
19f0: 69 63 41 66 66 69 6e 69 74 79 28 69 64 78 5f 61  icAffinity(idx_a
1a00: 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d 0a  ffinity);.  }.}.
1a10: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1a20: 65 20 50 35 20 76 61 6c 75 65 20 74 68 61 74 20  e P5 value that 
1a30: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66  should be used f
1a40: 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70  or a binary comp
1a50: 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65  arison.** opcode
1a60: 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20 65   (OP_Eq, OP_Ge e
1a70: 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f 6d  tc.) used to com
1a80: 70 61 72 65 20 70 45 78 70 72 31 20 61 6e 64 20  pare pExpr1 and 
1a90: 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74 69  pExpr2..*/.stati
1aa0: 63 20 75 38 20 62 69 6e 61 72 79 43 6f 6d 70 61  c u8 binaryCompa
1ab0: 72 65 50 35 28 45 78 70 72 20 2a 70 45 78 70 72  reP5(Expr *pExpr
1ac0: 31 2c 20 45 78 70 72 20 2a 70 45 78 70 72 32 2c  1, Expr *pExpr2,
1ad0: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
1ae0: 7b 0a 20 20 75 38 20 61 66 66 20 3d 20 28 63 68  {.  u8 aff = (ch
1af0: 61 72 29 73 71 6c 69 74 65 33 45 78 70 72 41 66  ar)sqlite3ExprAf
1b00: 66 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a  finity(pExpr2);.
1b10: 20 20 61 66 66 20 3d 20 28 75 38 29 73 71 6c 69    aff = (u8)sqli
1b20: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
1b30: 74 79 28 70 45 78 70 72 31 2c 20 61 66 66 29 20  ty(pExpr1, aff) 
1b40: 7c 20 28 75 38 29 6a 75 6d 70 49 66 4e 75 6c 6c  | (u8)jumpIfNull
1b50: 3b 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  ;.  return aff;.
1b60: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1b70: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1b80: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1b90: 6e 63 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  nce that should 
1ba0: 62 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 61 20  be used by.** a 
1bb0: 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f  binary compariso
1bc0: 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70 61  n operator compa
1bd0: 72 69 6e 67 20 70 4c 65 66 74 20 61 6e 64 20 70  ring pLeft and p
1be0: 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Right..**.** If 
1bf0: 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 65 78  the left hand ex
1c00: 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63  pression has a c
1c10: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1c20: 65 20 74 79 70 65 2c 20 74 68 65 6e 20 69 74 20  e type, then it 
1c30: 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68 65  is.** used. Othe
1c40: 72 77 69 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  rwise the collat
1c50: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
1c60: 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20   the right hand 
1c70: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
1c80: 20 75 73 65 64 2c 20 6f 72 20 74 68 65 20 64 65   used, or the de
1c90: 66 61 75 6c 74 20 28 42 49 4e 41 52 59 29 20 69  fault (BINARY) i
1ca0: 66 20 6e 65 69 74 68 65 72 20 65 78 70 72 65 73  f neither expres
1cb0: 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61  sion has a colla
1cc0: 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a 2a  ting.** type..**
1cd0: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 52 69  .** Argument pRi
1ce0: 67 68 74 20 28 62 75 74 20 6e 6f 74 20 70 4c 65  ght (but not pLe
1cf0: 66 74 29 20 6d 61 79 20 62 65 20 61 20 6e 75 6c  ft) may be a nul
1d00: 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74 68  l pointer. In th
1d10: 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20 69  is case,.** it i
1d20: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
1d30: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
1d40: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
1d50: 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61 72  reCollSeq(.  Par
1d60: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45  se *pParse, .  E
1d70: 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20 45  xpr *pLeft, .  E
1d80: 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20  xpr *pRight.){. 
1d90: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
1da0: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74  .  assert( pLeft
1db0: 20 29 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d   );.  if( pLeft-
1dc0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
1dd0: 61 74 65 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c  ate ){.    pColl
1de0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1df0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
1e00: 65 66 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  eft);.  }else if
1e10: 28 20 70 52 69 67 68 74 20 26 26 20 28 70 52 69  ( pRight && (pRi
1e20: 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ght->flags & EP_
1e30: 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20  Collate)!=0 ){. 
1e40: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
1e50: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
1e60: 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20  arse, pRight);. 
1e70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 6c   }else{.    pCol
1e80: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
1e90: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
1ea0: 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 21  Left);.    if( !
1eb0: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
1ec0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1ed0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
1ee0: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d  , pRight);.    }
1ef0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43  .  }.  return pC
1f00: 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  oll;.}../*.** Ge
1f10: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1f20: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
1f30: 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rator..*/.static
1f40: 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65   int codeCompare
1f50: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1f60: 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72  e,    /* The par
1f70: 73 69 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67  sing (and code g
1f80: 65 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65  enerating) conte
1f90: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  xt */.  Expr *pL
1fa0: 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  eft,      /* The
1fb0: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   left operand */
1fc0: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
1fd0: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
1fe0: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  t operand */.  i
1ff0: 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20  nt opcode,      
2000: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73   /* The comparis
2010: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69  on opcode */.  i
2020: 6e 74 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32 2c  nt in1, int in2,
2030: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
2040: 64 69 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a 2f  ding operands */
2050: 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20  .  int dest,    
2060: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
2070: 65 20 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20  e if true.  */. 
2080: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   int jumpIfNull 
2090: 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a     /* If true, j
20a0: 75 6d 70 20 69 66 20 65 69 74 68 65 72 20 6f 70  ump if either op
20b0: 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f  erand is NULL */
20c0: 0a 29 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20 20  .){.  int p5;.  
20d0: 69 6e 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c 6c  int addr;.  Coll
20e0: 53 65 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20 3d  Seq *p4;..  p4 =
20f0: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
2100: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
2110: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
2120: 68 74 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e 61  ht);.  p5 = bina
2130: 72 79 43 6f 6d 70 61 72 65 50 35 28 70 4c 65 66  ryCompareP5(pLef
2140: 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49  t, pRight, jumpI
2150: 66 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20 3d  fNull);.  addr =
2160: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2170: 70 34 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p4(pParse->pVdbe
2180: 2c 20 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20 64  , opcode, in2, d
2190: 65 73 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20 20  est, in1,.      
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 20 20 20 28 76 6f 69 64 2a 29 70 34 2c 20       (void*)p4, 
21c0: 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 73  P4_COLLSEQ);.  s
21d0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
21e0: 50 35 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  P5(pParse->pVdbe
21f0: 2c 20 28 75 38 29 70 35 29 3b 0a 20 20 72 65 74  , (u8)p5);.  ret
2200: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 23 69 66  urn addr;.}..#if
2210: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
2220: 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43  _DEPTH>0./*.** C
2230: 68 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65  heck that argume
2240: 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65  nt nHeight is le
2250: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
2260: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a   to the maximum.
2270: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65  ** expression de
2280: 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20  pth allowed. If 
2290: 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65  it is not, leave
22a0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
22b0: 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a  e in.** pParse..
22c0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
22d0: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 50 61  prCheckHeight(Pa
22e0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
22f0: 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74   nHeight){.  int
2300: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2310: 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20  .  int mxHeight 
2320: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c  = pParse->db->aL
2330: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
2340: 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20  T_EXPR_DEPTH];. 
2350: 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48   if( nHeight>mxH
2360: 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c  eight ){.    sql
2370: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2380: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78  rse, .       "Ex
2390: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73  pression tree is
23a0: 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69   too large (maxi
23b0: 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20  mum depth %d)", 
23c0: 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a  mxHeight.    );.
23d0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
23e0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
23f0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68  urn rc;.}../* Th
2400: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65  e following thre
2410: 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69  e functions, hei
2420: 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69  ghtOfExpr(), hei
2430: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a  ghtOfExprList().
2440: 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53  ** and heightOfS
2450: 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73 65  elect(), are use
2460: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  d to determine t
2470: 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68  he maximum heigh
2480: 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72  t.** of any expr
2490: 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65  ession tree refe
24a0: 72 65 6e 63 65 64 20 62 79 20 74 68 65 20 73 74  renced by the st
24b0: 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61  ructure passed a
24c0: 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61  s the.** first a
24d0: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  rgument..**.** I
24e0: 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68  f this maximum h
24f0: 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72  eight is greater
2500: 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
2510: 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a  t value pointed.
2520: 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68  ** to by pnHeigh
2530: 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  t, the second pa
2540: 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65  rameter, then se
2550: 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74  t *pnHeight to t
2560: 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f  hat.** value..*/
2570: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
2580: 67 68 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a  ghtOfExpr(Expr *
2590: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
25a0: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
25b0: 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74    if( p->nHeight
25c0: 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20  >*pnHeight ){.  
25d0: 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20      *pnHeight = 
25e0: 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20  p->nHeight;.    
25f0: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
2600: 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72  oid heightOfExpr
2610: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70  List(ExprList *p
2620: 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29  , int *pnHeight)
2630: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
2640: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
2650: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
2660: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69   i++){.      hei
2670: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69  ghtOfExpr(p->a[i
2680: 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68  ].pExpr, pnHeigh
2690: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
26a0: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67  static void heig
26b0: 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63  htOfSelect(Selec
26c0: 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69  t *p, int *pnHei
26d0: 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b  ght){.  if( p ){
26e0: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
26f0: 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48  r(p->pWhere, pnH
2700: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
2710: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 48 61 76  htOfExpr(p->pHav
2720: 69 6e 67 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ing, pnHeight);.
2730: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
2740: 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65  (p->pLimit, pnHe
2750: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
2760: 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f 66 66 73  tOfExpr(p->pOffs
2770: 65 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  et, pnHeight);. 
2780: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c     heightOfExprL
2790: 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 70  ist(p->pEList, p
27a0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
27b0: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
27c0: 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e 48 65  ->pGroupBy, pnHe
27d0: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
27e0: 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  tOfExprList(p->p
27f0: 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69 67 68  OrderBy, pnHeigh
2800: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
2810: 53 65 6c 65 63 74 28 70 2d 3e 70 50 72 69 6f 72  Select(p->pPrior
2820: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d  , pnHeight);.  }
2830: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
2840: 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76  e Expr.nHeight v
2850: 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65 20 73  ariable in the s
2860: 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
2870: 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d 65  as an .** argume
2880: 6e 74 2e 20 41 6e 20 65 78 70 72 65 73 73 69 6f  nt. An expressio
2890: 6e 20 77 69 74 68 20 6e 6f 20 63 68 69 6c 64 72  n with no childr
28a0: 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74 20 6f  en, Expr.pList o
28b0: 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c 65  r .** Expr.pSele
28c0: 63 74 20 6d 65 6d 62 65 72 20 68 61 73 20 61 20  ct member has a 
28d0: 68 65 69 67 68 74 20 6f 66 20 31 2e 20 41 6e 79  height of 1. Any
28e0: 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f   other expressio
28f0: 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65 69 67 68  n.** has a heigh
2900: 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d  t equal to the m
2910: 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66  aximum height of
2920: 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20 72   any other .** r
2930: 65 66 65 72 65 6e 63 65 64 20 45 78 70 72 20 70  eferenced Expr p
2940: 6c 75 73 20 6f 6e 65 2e 0a 2a 2f 0a 73 74 61 74  lus one..*/.stat
2950: 69 63 20 76 6f 69 64 20 65 78 70 72 53 65 74 48  ic void exprSetH
2960: 65 69 67 68 74 28 45 78 70 72 20 2a 70 29 7b 0a  eight(Expr *p){.
2970: 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20    int nHeight = 
2980: 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70  0;.  heightOfExp
2990: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65  r(p->pLeft, &nHe
29a0: 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f  ight);.  heightO
29b0: 66 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74 2c  fExpr(p->pRight,
29c0: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 69 66   &nHeight);.  if
29d0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
29e0: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
29f0: 74 29 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74  t) ){.    height
2a00: 4f 66 53 65 6c 65 63 74 28 70 2d 3e 78 2e 70 53  OfSelect(p->x.pS
2a10: 65 6c 65 63 74 2c 20 26 6e 48 65 69 67 68 74 29  elect, &nHeight)
2a20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 68  ;.  }else{.    h
2a30: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
2a40: 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 48 65  p->x.pList, &nHe
2a50: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  ight);.  }.  p->
2a60: 6e 48 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68  nHeight = nHeigh
2a70: 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t + 1;.}../*.** 
2a80: 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65  Set the Expr.nHe
2a90: 69 67 68 74 20 76 61 72 69 61 62 6c 65 20 75 73  ight variable us
2aa0: 69 6e 67 20 74 68 65 20 65 78 70 72 53 65 74 48  ing the exprSetH
2ab0: 65 69 67 68 74 28 29 20 66 75 6e 63 74 69 6f 6e  eight() function
2ac0: 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68 65 69 67  . If.** the heig
2ad0: 68 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ht is greater th
2ae0: 61 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  an the maximum a
2af0: 6c 6c 6f 77 65 64 20 65 78 70 72 65 73 73 69 6f  llowed expressio
2b00: 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c 65 61 76  n depth,.** leav
2b10: 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50  e an error in pP
2b20: 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  arse..*/.void sq
2b30: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
2b40: 68 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ht(Parse *pParse
2b50: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 65 78  , Expr *p){.  ex
2b60: 70 72 53 65 74 48 65 69 67 68 74 28 70 29 3b 0a  prSetHeight(p);.
2b70: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65    sqlite3ExprChe
2b80: 63 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c  ckHeight(pParse,
2b90: 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a   p->nHeight);.}.
2ba0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2bb0: 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  e maximum height
2bc0: 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69   of any expressi
2bd0: 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63  on tree referenc
2be0: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c  ed.** by the sel
2bf0: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ect statement pa
2c00: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
2c10: 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
2c20: 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
2c30: 67 68 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  ght(Select *p){.
2c40: 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20    int nHeight = 
2c50: 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c  0;.  heightOfSel
2c60: 65 63 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29  ect(p, &nHeight)
2c70: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67  ;.  return nHeig
2c80: 68 74 3b 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64  ht;.}.#else.  #d
2c90: 65 66 69 6e 65 20 65 78 70 72 53 65 74 48 65 69  efine exprSetHei
2ca0: 67 68 74 28 79 29 0a 23 65 6e 64 69 66 20 2f 2a  ght(y).#endif /*
2cb0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
2cc0: 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a  _DEPTH>0 */../*.
2cd0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2ce0: 69 73 20 74 68 65 20 63 6f 72 65 20 61 6c 6c 6f  is the core allo
2cf0: 63 61 74 6f 72 20 66 6f 72 20 45 78 70 72 20 6e  cator for Expr n
2d00: 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73  odes..**.** Cons
2d10: 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72  truct a new expr
2d20: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20  ession node and 
2d30: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
2d40: 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a   to it.  Memory.
2d50: 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65  ** for this node
2d60: 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70 54 6f   and for the pTo
2d70: 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ken argument is 
2d80: 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74  a single allocat
2d90: 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20  ion.** obtained 
2da0: 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61  from sqlite3DbMa
2db0: 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c  lloc().  The cal
2dc0: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
2dd0: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
2de0: 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20  for making sure 
2df0: 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61  the node eventua
2e00: 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a  lly gets freed..
2e10: 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74 65  **.** If dequote
2e20: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
2e30: 68 65 20 74 6f 6b 65 6e 20 28 69 66 20 69 74 20  he token (if it 
2e40: 65 78 69 73 74 73 29 20 69 73 20 64 65 71 75 6f  exists) is dequo
2e50: 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71 75 6f  ted..** If dequo
2e60: 74 65 20 69 73 20 66 61 6c 73 65 2c 20 6e 6f 20  te is false, no 
2e70: 64 65 71 75 6f 74 69 6e 67 20 69 73 20 70 65 72  dequoting is per
2e80: 66 6f 72 6d 61 6e 63 65 2e 20 20 54 68 65 20 64  formance.  The d
2e90: 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65  eQuote.** parame
2ea0: 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69  ter is ignored i
2eb0: 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c  f pToken is NULL
2ec0: 20 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e   or if the token
2ed0: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70   does not.** app
2ee0: 65 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64  ear to be quoted
2ef0: 2e 20 20 49 66 20 74 68 65 20 71 75 6f 74 65 73  .  If the quotes
2f00: 20 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72   were of the for
2f10: 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d  m "..." (double-
2f20: 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20  quotes).** then 
2f30: 74 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64  the EP_DblQuoted
2f40: 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20   flag is set on 
2f50: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  the expression n
2f60: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69  ode..**.** Speci
2f70: 61 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d  al case:  If op=
2f80: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20  =TK_INTEGER and 
2f90: 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f  pToken points to
2fa0: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a   a string that.*
2fb0: 2a 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61  * can be transla
2fc0: 74 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69  ted into a 32-bi
2fd0: 74 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20  t integer, then 
2fe0: 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74  the token is not
2ff0: 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e  .** stored in u.
3000: 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64  zToken.  Instead
3010: 2c 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  , the integer va
3020: 6c 75 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a  lues is written.
3030: 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65  ** into u.iValue
3040: 20 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56   and the EP_IntV
3050: 61 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65 74  alue flag is set
3060: 2e 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72  .  No extra stor
3070: 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61  age.** is alloca
3080: 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ted to hold the 
3090: 69 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e 64  integer text and
30a0: 20 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61   the dequote fla
30b0: 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f  g is ignored..*/
30c0: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
30d0: 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74  prAlloc(.  sqlit
30e0: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
30f0: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
3100: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
3110: 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e  Zero() (may be n
3120: 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  ull) */.  int op
3130: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3140: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
3150: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  opcode */.  cons
3160: 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c  t Token *pToken,
3170: 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67      /* Token arg
3180: 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65  ument.  Might be
3190: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 64   NULL */.  int d
31a0: 65 71 75 6f 74 65 20 20 20 20 20 20 20 20 20 20  equote          
31b0: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65     /* True to de
31c0: 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20 45 78  quote */.){.  Ex
31d0: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  pr *pNew;.  int 
31e0: 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 69 6e  nExtra = 0;.  in
31f0: 74 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a 0a 20  t iValue = 0;.. 
3200: 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20   if( pToken ){. 
3210: 20 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e     if( op!=TK_IN
3220: 54 45 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d  TEGER || pToken-
3230: 3e 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  >z==0.          
3240: 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  || sqlite3GetInt
3250: 33 32 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69  32(pToken->z, &i
3260: 56 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20  Value)==0 ){.   
3270: 20 20 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b     nExtra = pTok
3280: 65 6e 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20 20 61  en->n+1;.      a
3290: 73 73 65 72 74 28 20 69 56 61 6c 75 65 3e 3d 30  ssert( iValue>=0
32a0: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
32b0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
32c0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
32d0: 69 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74  izeof(Expr)+nExt
32e0: 72 61 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  ra);.  if( pNew 
32f0: 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20  ){.    pNew->op 
3300: 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e  = (u8)op;.    pN
3310: 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20  ew->iAgg = -1;. 
3320: 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b     if( pToken ){
3330: 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78 74 72  .      if( nExtr
3340: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  a==0 ){.        
3350: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
3360: 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20  P_IntValue;.    
3370: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c      pNew->u.iVal
3380: 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20  ue = iValue;.   
3390: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
33a0: 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20    int c;.       
33b0: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   pNew->u.zToken 
33c0: 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  = (char*)&pNew[1
33d0: 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
33e0: 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20  t( pToken->z!=0 
33f0: 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20  || pToken->n==0 
3400: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
3410: 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70  Token->n ) memcp
3420: 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  y(pNew->u.zToken
3430: 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f  , pToken->z, pTo
3440: 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20  ken->n);.       
3450: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b   pNew->u.zToken[
3460: 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a  pToken->n] = 0;.
3470: 20 20 20 20 20 20 20 20 69 66 28 20 64 65 71 75          if( dequ
3480: 6f 74 65 20 26 26 20 6e 45 78 74 72 61 3e 3d 33  ote && nExtra>=3
3490: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26   .             &
34a0: 26 20 28 28 63 20 3d 20 70 54 6f 6b 65 6e 2d 3e  & ((c = pToken->
34b0: 7a 5b 30 5d 29 3d 3d 27 5c 27 27 20 7c 7c 20 63  z[0])=='\'' || c
34c0: 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5b 27 20  =='"' || c=='[' 
34d0: 7c 7c 20 63 3d 3d 27 60 27 29 20 29 7b 0a 20 20  || c=='`') ){.  
34e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
34f0: 65 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a  equote(pNew->u.z
3500: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  Token);.        
3510: 20 20 69 66 28 20 63 3d 3d 27 22 27 20 29 20 70    if( c=='"' ) p
3520: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
3530: 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20  _DblQuoted;.    
3540: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
3550: 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d    }.#if SQLITE_M
3560: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a  AX_EXPR_DEPTH>0.
3570: 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68      pNew->nHeigh
3580: 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a  t = 1;.#endif  .
3590: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
35a0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  w;.}../*.** Allo
35b0: 63 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  cate a new expre
35c0: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20  ssion node from 
35d0: 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  a zero-terminate
35e0: 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61 73  d token that has
35f0: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e  .** already been
3600: 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78   dequoted..*/.Ex
3610: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28  pr *sqlite3Expr(
3620: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
3630: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
3640: 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ndle for sqlite3
3650: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28  DbMallocZero() (
3660: 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a  may be null) */.
3670: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
3680: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
3690: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
36a0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
36b0: 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54  zToken      /* T
36c0: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20  oken argument.  
36d0: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
36e0: 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20  .){.  Token x;. 
36f0: 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20   x.z = zToken;. 
3700: 20 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20   x.n = zToken ? 
3710: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
3720: 7a 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20 20 72  zToken) : 0;.  r
3730: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
3740: 72 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26  rAlloc(db, op, &
3750: 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x, 0);.}../*.** 
3760: 41 74 74 61 63 68 20 73 75 62 74 72 65 65 73 20  Attach subtrees 
3770: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
3780: 20 74 6f 20 74 68 65 20 45 78 70 72 20 6e 6f 64   to the Expr nod
3790: 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49  e pRoot..**.** I
37a0: 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68  f pRoot==NULL th
37b0: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20  at means that a 
37c0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
37d0: 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
37e0: 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74  rred..** In that
37f0: 20 63 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68   case, delete th
3800: 65 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74  e subtrees pLeft
3810: 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a   and pRight..*/.
3820: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
3830: 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28 0a  AttachSubtrees(.
3840: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
3850: 20 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20   Expr *pRoot,.  
3860: 45 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45  Expr *pLeft,.  E
3870: 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20  xpr *pRight.){. 
3880: 20 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b   if( pRoot==0 ){
3890: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
38a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
38b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
38c0: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74  Delete(db, pLeft
38d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
38e0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69  prDelete(db, pRi
38f0: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ght);.  }else{. 
3900: 20 20 20 69 66 28 20 70 52 69 67 68 74 20 29 7b     if( pRight ){
3910: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52  .      pRoot->pR
3920: 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20  ight = pRight;. 
3930: 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67       pRoot->flag
3940: 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 20  s |= EP_Collate 
3950: 26 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 3b  & pRight->flags;
3960: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
3970: 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 70 52  Left ){.      pR
3980: 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65  oot->pLeft = pLe
3990: 66 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d  ft;.      pRoot-
39a0: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c  >flags |= EP_Col
39b0: 6c 61 74 65 20 26 20 70 4c 65 66 74 2d 3e 66 6c  late & pLeft->fl
39c0: 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  ags;.    }.    e
39d0: 78 70 72 53 65 74 48 65 69 67 68 74 28 70 52 6f  xprSetHeight(pRo
39e0: 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ot);.  }.}../*.*
39f0: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 45 78 70  * Allocate a Exp
3a00: 72 20 6e 6f 64 65 20 77 68 69 63 68 20 6a 6f 69  r node which joi
3a10: 6e 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74 77  ns as many as tw
3a20: 6f 20 73 75 62 74 72 65 65 73 2e 0a 2a 2a 0a 2a  o subtrees..**.*
3a30: 2a 20 4f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66  * One or both of
3a40: 20 74 68 65 20 73 75 62 74 72 65 65 73 20 63 61   the subtrees ca
3a50: 6e 20 62 65 20 4e 55 4c 4c 2e 20 20 52 65 74 75  n be NULL.  Retu
3a60: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
3a70: 74 68 65 20 6e 65 77 0a 2a 2a 20 45 78 70 72 20  the new.** Expr 
3a80: 6e 6f 64 65 2e 20 20 4f 72 2c 20 69 66 20 61 6e  node.  Or, if an
3a90: 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72   OOM error occur
3aa0: 73 2c 20 73 65 74 20 70 50 61 72 73 65 2d 3e 64  s, set pParse->d
3ab0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2c  b->mallocFailed,
3ac0: 0a 2a 2a 20 66 72 65 65 20 74 68 65 20 73 75 62  .** free the sub
3ad0: 74 72 65 65 73 20 61 6e 64 20 72 65 74 75 72 6e  trees and return
3ae0: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78 70 72 20 2a   NULL..*/.Expr *
3af0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 0a 20 20  sqlite3PExpr(.  
3b00: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
3b10: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
3b20: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
3b30: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
3b40: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
3b50: 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a  ssion opcode */.
3b60: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20    Expr *pLeft,  
3b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66            /* Lef
3b80: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45  t operand */.  E
3b90: 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20  xpr *pRight,    
3ba0: 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
3bb0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e  operand */.  con
3bc0: 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  st Token *pToken
3bd0: 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
3be0: 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20 45   token */.){.  E
3bf0: 78 70 72 20 2a 70 3b 0a 20 20 69 66 28 20 6f 70  xpr *p;.  if( op
3c00: 3d 3d 54 4b 5f 41 4e 44 20 26 26 20 70 4c 65 66  ==TK_AND && pLef
3c10: 74 20 26 26 20 70 52 69 67 68 74 20 29 7b 0a 20  t && pRight ){. 
3c20: 20 20 20 2f 2a 20 54 61 6b 65 20 61 64 76 61 6e     /* Take advan
3c30: 74 61 67 65 20 6f 66 20 73 68 6f 72 74 2d 63 69  tage of short-ci
3c40: 72 63 75 69 74 20 66 61 6c 73 65 20 6f 70 74 69  rcuit false opti
3c50: 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 41 4e 44  mization for AND
3c60: 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c 69   */.    p = sqli
3c70: 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73  te3ExprAnd(pPars
3c80: 65 2d 3e 64 62 2c 20 70 4c 65 66 74 2c 20 70 52  e->db, pLeft, pR
3c90: 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ight);.  }else{.
3ca0: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45      p = sqlite3E
3cb0: 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  xprAlloc(pParse-
3cc0: 3e 64 62 2c 20 6f 70 2c 20 70 54 6f 6b 65 6e 2c  >db, op, pToken,
3cd0: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
3ce0: 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65  ExprAttachSubtre
3cf0: 65 73 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  es(pParse->db, p
3d00: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29  , pLeft, pRight)
3d10: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20 29 20  ;.  }.  if( p ) 
3d20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
3d30: 72 43 68 65 63 6b 48 65 69 67 68 74 28 70 50 61  rCheckHeight(pPa
3d40: 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29  rse, p->nHeight)
3d50: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
3d60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
3d70: 6e 20 31 20 69 66 20 61 6e 20 65 78 70 72 65 73  n 1 if an expres
3d80: 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 46 41 4c  sion must be FAL
3d90: 53 45 20 69 6e 20 61 6c 6c 20 63 61 73 65 73 20  SE in all cases 
3da0: 61 6e 64 20 30 20 69 66 20 74 68 65 0a 2a 2a 20  and 0 if the.** 
3db0: 65 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74  expression might
3dc0: 20 62 65 20 74 72 75 65 2e 20 20 54 68 69 73 20   be true.  This 
3dd0: 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
3de0: 6f 6e 2e 20 20 49 66 20 69 73 20 4f 4b 20 74 6f  on.  If is OK to
3df0: 0a 2a 2a 20 72 65 74 75 72 6e 20 30 20 68 65 72  .** return 0 her
3e00: 65 20 65 76 65 6e 20 69 66 20 74 68 65 20 65 78  e even if the ex
3e10: 70 72 65 73 73 69 6f 6e 20 72 65 61 6c 6c 79 20  pression really 
3e20: 69 73 20 61 6c 77 61 79 73 20 66 61 6c 73 65 20  is always false 
3e30: 28 61 20 0a 2a 2a 20 66 61 6c 73 65 20 6e 65 67  (a .** false neg
3e40: 61 74 69 76 65 29 2e 20 20 42 75 74 20 69 74 20  ative).  But it 
3e50: 69 73 20 61 20 62 75 67 20 74 6f 20 72 65 74 75  is a bug to retu
3e60: 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72  rn 1 if the expr
3e70: 65 73 73 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20  ession.** might 
3e80: 62 65 20 74 72 75 65 20 69 6e 20 73 6f 6d 65 20  be true in some 
3e90: 72 61 72 65 20 63 69 72 63 75 6d 73 74 61 6e 63  rare circumstanc
3ea0: 65 73 20 28 61 20 66 61 6c 73 65 20 70 6f 73 69  es (a false posi
3eb0: 74 69 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74  tive.).**.** Not
3ec0: 65 20 74 68 61 74 20 69 66 20 74 68 65 20 65 78  e that if the ex
3ed0: 70 72 65 73 73 69 6f 6e 20 69 73 20 70 61 72 74  pression is part
3ee0: 20 6f 66 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20   of conditional 
3ef0: 66 6f 72 20 61 0a 2a 2a 20 4c 45 46 54 20 4a 4f  for a.** LEFT JO
3f00: 49 4e 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 6e  IN, then we cann
3f10: 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 61 74 20  ot determine at 
3f20: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65  compile-time whe
3f30: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 69  ther or not.** i
3f40: 73 20 69 74 20 74 72 75 65 20 6f 72 20 66 61 6c  s it true or fal
3f50: 73 65 2c 20 73 6f 20 61 6c 77 61 79 73 20 72 65  se, so always re
3f60: 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  turn 0..*/.stati
3f70: 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61 79 73  c int exprAlways
3f80: 46 61 6c 73 65 28 45 78 70 72 20 2a 70 29 7b 0a  False(Expr *p){.
3f90: 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69    int v = 0;.  i
3fa0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
3fb0: 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  ty(p, EP_FromJoi
3fc0: 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  n) ) return 0;. 
3fd0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
3fe0: 72 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26 76  rIsInteger(p, &v
3ff0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
4000: 72 65 74 75 72 6e 20 76 3d 3d 30 3b 0a 7d 0a 0a  return v==0;.}..
4010: 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f 20 65  /*.** Join two e
4020: 78 70 72 65 73 73 69 6f 6e 73 20 75 73 69 6e 67  xpressions using
4030: 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
4040: 2e 20 20 49 66 20 65 69 74 68 65 72 20 65 78 70  .  If either exp
4050: 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55  ression is.** NU
4060: 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65  LL, then just re
4070: 74 75 72 6e 20 74 68 65 20 6f 74 68 65 72 20 65  turn the other e
4080: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
4090: 20 49 66 20 6f 6e 65 20 73 69 64 65 20 6f 72 20   If one side or 
40a0: 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
40b0: 20 41 4e 44 20 69 73 20 6b 6e 6f 77 6e 20 74 6f   AND is known to
40c0: 20 62 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   be false, then 
40d0: 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 72 65  instead.** of re
40e0: 74 75 72 6e 69 6e 67 20 61 6e 20 41 4e 44 20 65  turning an AND e
40f0: 78 70 72 65 73 73 69 6f 6e 2c 20 6a 75 73 74 20  xpression, just 
4100: 72 65 74 75 72 6e 20 61 20 63 6f 6e 73 74 61 6e  return a constan
4110: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74  t expression wit
4120: 68 0a 2a 2a 20 61 20 76 61 6c 75 65 20 6f 66 20  h.** a value of 
4130: 66 61 6c 73 65 2e 0a 2a 2f 0a 45 78 70 72 20 2a  false..*/.Expr *
4140: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 73  sqlite3ExprAnd(s
4150: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
4160: 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70   *pLeft, Expr *p
4170: 52 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 4c  Right){.  if( pL
4180: 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  eft==0 ){.    re
4190: 74 75 72 6e 20 70 52 69 67 68 74 3b 0a 20 20 7d  turn pRight;.  }
41a0: 65 6c 73 65 20 69 66 28 20 70 52 69 67 68 74 3d  else if( pRight=
41b0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
41c0: 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73 65 20   pLeft;.  }else 
41d0: 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 46 61  if( exprAlwaysFa
41e0: 6c 73 65 28 70 4c 65 66 74 29 20 7c 7c 20 65 78  lse(pLeft) || ex
41f0: 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 52  prAlwaysFalse(pR
4200: 69 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71 6c  ight) ){.    sql
4210: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
4220: 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  b, pLeft);.    s
4230: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
4240: 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  (db, pRight);.  
4250: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
4260: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
4270: 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c 69 74  _INTEGER, &sqlit
4280: 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20  e3IntTokens[0], 
4290: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
42a0: 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71   Expr *pNew = sq
42b0: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
42c0: 62 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20 30 29  b, TK_AND, 0, 0)
42d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
42e0: 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28  rAttachSubtrees(
42f0: 64 62 2c 20 70 4e 65 77 2c 20 70 4c 65 66 74 2c  db, pNew, pLeft,
4300: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65   pRight);.    re
4310: 74 75 72 6e 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d  turn pNew;.  }.}
4320: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63  ../*.** Construc
4330: 74 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69  t a new expressi
4340: 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20 66 75  on node for a fu
4350: 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74  nction with mult
4360: 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  iple.** argument
4370: 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  s..*/.Expr *sqli
4380: 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28  te3ExprFunction(
4390: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
43a0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
43b0: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
43c0: 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
43d0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
43e0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65  arse->db;.  asse
43f0: 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20 20  rt( pToken );.  
4400: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
4410: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 46  prAlloc(db, TK_F
4420: 55 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b 65 6e 2c  UNCTION, pToken,
4430: 20 31 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d   1);.  if( pNew=
4440: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
4450: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
4460: 64 62 2c 20 70 4c 69 73 74 29 3b 20 2f 2a 20 41  db, pList); /* A
4470: 76 6f 69 64 20 6d 65 6d 6f 72 79 20 6c 65 61 6b  void memory leak
4480: 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69   when malloc fai
4490: 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ls */.    return
44a0: 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e   0;.  }.  pNew->
44b0: 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b  x.pList = pList;
44c0: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
44d0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
44e0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
44f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
4500: 53 65 74 48 65 69 67 68 74 28 70 50 61 72 73 65  SetHeight(pParse
4510: 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72  , pNew);.  retur
4520: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
4530: 20 41 73 73 69 67 6e 20 61 20 76 61 72 69 61 62   Assign a variab
4540: 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20  le number to an 
4550: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
4560: 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63 61  encodes a wildca
4570: 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69  rd.** in the ori
4580: 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  ginal SQL statem
4590: 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c  ent.  .**.** Wil
45a0: 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69 6e  dcards consistin
45b0: 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22 3f  g of a single "?
45c0: 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  " are assigned t
45d0: 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69  he next sequenti
45e0: 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e  al.** variable n
45f0: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c  umber..**.** Wil
4600: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
4610: 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73  rm "?nnn" are as
4620: 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62 65  signed the numbe
4630: 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b  r "nnn".  We mak
4640: 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20  e.** sure "nnn" 
4650: 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f  is not too be to
4660: 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61 6c 20   avoid a denial 
4670: 6f 66 20 73 65 72 76 69 63 65 20 61 74 74 61 63  of service attac
4680: 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51  k when.** the SQ
4690: 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65  L statement come
46a0: 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e  s from an extern
46b0: 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a  al source..**.**
46c0: 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68   Wildcards of th
46d0: 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 2c 20 22  e form ":aaa", "
46e0: 40 61 61 61 22 2c 20 6f 72 20 22 24 61 61 61 22  @aaa", or "$aaa"
46f0: 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68   are assigned th
4700: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a  e same number.**
4710: 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73   as the previous
4720: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
4730: 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64 2e 20   same wildcard. 
4740: 20 4f 72 20 69 66 20 74 68 69 73 20 69 73 20 74   Or if this is t
4750: 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74  he first.** inst
4760: 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69 6c 64  ance of the wild
4770: 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74 20 73  card, the next s
4780: 65 71 75 65 6e 69 61 6c 20 76 61 72 69 61 62 6c  equenial variabl
4790: 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61  e number is.** a
47a0: 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64  ssigned..*/.void
47b0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 73 73 69   sqlite3ExprAssi
47c0: 67 6e 56 61 72 4e 75 6d 62 65 72 28 50 61 72 73  gnVarNumber(Pars
47d0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
47e0: 2a 70 45 78 70 72 29 7b 0a 20 20 73 71 6c 69 74  *pExpr){.  sqlit
47f0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
4800: 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  >db;.  const cha
4810: 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 45 78  r *z;..  if( pEx
4820: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
4830: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
4840: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
4850: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50  , EP_IntValue|EP
4860: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
4870: 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20  nOnly) );.  z = 
4880: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
4890: 0a 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20  .  assert( z!=0 
48a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 5b 30  );.  assert( z[0
48b0: 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a 5b  ]!=0 );.  if( z[
48c0: 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  1]==0 ){.    /* 
48d0: 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20  Wildcard of the 
48e0: 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73 69 67  form "?".  Assig
48f0: 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72 69 61  n the next varia
4900: 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ble number */.  
4910: 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d    assert( z[0]==
4920: 27 3f 27 20 29 3b 0a 20 20 20 20 70 45 78 70 72  '?' );.    pExpr
4930: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56  ->iColumn = (ynV
4940: 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  ar)(++pParse->nV
4950: 61 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ar);.  }else{.  
4960: 20 20 79 6e 56 61 72 20 78 20 3d 20 30 3b 0a 20    ynVar x = 0;. 
4970: 20 20 20 75 33 32 20 6e 20 3d 20 73 71 6c 69 74     u32 n = sqlit
4980: 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20  e3Strlen30(z);. 
4990: 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27     if( z[0]=='?'
49a0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c   ){.      /* Wil
49b0: 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72  dcard of the for
49c0: 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65  m "?nnn".  Conve
49d0: 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69  rt "nnn" to an i
49e0: 6e 74 65 67 65 72 20 61 6e 64 0a 20 20 20 20 20  nteger and.     
49f0: 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20 74 68   ** use it as th
4a00: 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  e variable numbe
4a10: 72 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69  r */.      i64 i
4a20: 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 20  ;.      int bOk 
4a30: 3d 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69  = 0==sqlite3Atoi
4a40: 36 34 28 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d  64(&z[1], &i, n-
4a50: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  1, SQLITE_UTF8);
4a60: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43  .      pExpr->iC
4a70: 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56  olumn = x = (ynV
4a80: 61 72 29 69 3b 0a 20 20 20 20 20 20 74 65 73 74  ar)i;.      test
4a90: 63 61 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20  case( i==0 );.  
4aa0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d      testcase( i=
4ab0: 3d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =1 );.      test
4ac0: 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69  case( i==db->aLi
4ad0: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
4ae0: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
4af0: 5d 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ]-1 );.      tes
4b00: 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c  tcase( i==db->aL
4b10: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
4b20: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
4b30: 52 5d 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  R] );.      if( 
4b40: 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c  bOk==0 || i<1 ||
4b50: 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51   i>db->aLimit[SQ
4b60: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
4b70: 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20  BLE_NUMBER] ){. 
4b80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
4b90: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
4ba0: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
4bb0: 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20  must be between 
4bc0: 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20  ?1 and ?%d",.   
4bd0: 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 4c 69           db->aLi
4be0: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
4bf0: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
4c00: 5d 29 3b 0a 20 20 20 20 20 20 20 20 78 20 3d 20  ]);.        x = 
4c10: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
4c20: 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e   if( i>pParse->n
4c30: 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Var ){.        p
4c40: 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 28 69  Parse->nVar = (i
4c50: 6e 74 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nt)i;.      }.  
4c60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
4c70: 2a 20 57 69 6c 64 63 61 72 64 73 20 6c 69 6b 65  * Wildcards like
4c80: 20 22 3a 61 61 61 22 2c 20 22 24 61 61 61 22 20   ":aaa", "$aaa" 
4c90: 6f 72 20 22 40 61 61 61 22 2e 20 20 52 65 75 73  or "@aaa".  Reus
4ca0: 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69 61  e the same varia
4cb0: 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d  ble.      ** num
4cc0: 62 65 72 20 61 73 20 74 68 65 20 70 72 69 6f 72  ber as the prior
4cd0: 20 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74   appearance of t
4ce0: 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72  he same name, or
4cf0: 20 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20 20   if the name.   
4d00: 20 20 20 2a 2a 20 68 61 73 20 6e 65 76 65 72 20     ** has never 
4d10: 61 70 70 65 61 72 65 64 20 62 65 66 6f 72 65 2c  appeared before,
4d20: 20 72 65 75 73 65 20 74 68 65 20 73 61 6d 65 20   reuse the same 
4d30: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a  variable number.
4d40: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 79        */.      y
4d50: 6e 56 61 72 20 69 3b 0a 20 20 20 20 20 20 66 6f  nVar i;.      fo
4d60: 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d  r(i=0; i<pParse-
4d70: 3e 6e 7a 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nzVar; i++){.  
4d80: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
4d90: 2d 3e 61 7a 56 61 72 5b 69 5d 20 26 26 20 73 74  ->azVar[i] && st
4da0: 72 63 6d 70 28 70 50 61 72 73 65 2d 3e 61 7a 56  rcmp(pParse->azV
4db0: 61 72 5b 69 5d 2c 7a 29 3d 3d 30 20 29 7b 0a 20  ar[i],z)==0 ){. 
4dc0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
4dd0: 69 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20 28 79  iColumn = x = (y
4de0: 6e 56 61 72 29 69 2b 31 3b 0a 20 20 20 20 20 20  nVar)i+1;.      
4df0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4e00: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
4e10: 20 20 20 69 66 28 20 78 3d 3d 30 20 29 20 78 20     if( x==0 ) x 
4e20: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
4e30: 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50 61   = (ynVar)(++pPa
4e40: 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20  rse->nVar);.    
4e50: 7d 0a 20 20 20 20 69 66 28 20 78 3e 30 20 29 7b  }.    if( x>0 ){
4e60: 0a 20 20 20 20 20 20 69 66 28 20 78 3e 70 50 61  .      if( x>pPa
4e70: 72 73 65 2d 3e 6e 7a 56 61 72 20 29 7b 0a 20 20  rse->nzVar ){.  
4e80: 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61 3b 0a        char **a;.
4e90: 20 20 20 20 20 20 20 20 61 20 3d 20 73 71 6c 69          a = sqli
4ea0: 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
4eb0: 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20   pParse->azVar, 
4ec0: 78 2a 73 69 7a 65 6f 66 28 61 5b 30 5d 29 29 3b  x*sizeof(a[0]));
4ed0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 3d 3d  .        if( a==
4ee0: 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  0 ) return;  /* 
4ef0: 45 72 72 6f 72 20 72 65 70 6f 72 74 65 64 20 74  Error reported t
4f00: 68 72 6f 75 67 68 20 64 62 2d 3e 6d 61 6c 6c 6f  hrough db->mallo
4f10: 63 46 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20  cFailed */.     
4f20: 20 20 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72     pParse->azVar
4f30: 20 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 6d 65   = a;.        me
4f40: 6d 73 65 74 28 26 61 5b 70 50 61 72 73 65 2d 3e  mset(&a[pParse->
4f50: 6e 7a 56 61 72 5d 2c 20 30 2c 20 28 78 2d 70 50  nzVar], 0, (x-pP
4f60: 61 72 73 65 2d 3e 6e 7a 56 61 72 29 2a 73 69 7a  arse->nzVar)*siz
4f70: 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20 20  eof(a[0]));.    
4f80: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61      pParse->nzVa
4f90: 72 20 3d 20 78 3b 0a 20 20 20 20 20 20 7d 0a 20  r = x;.      }. 
4fa0: 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27       if( z[0]!='
4fb0: 3f 27 20 7c 7c 20 70 50 61 72 73 65 2d 3e 61 7a  ?' || pParse->az
4fc0: 56 61 72 5b 78 2d 31 5d 3d 3d 30 20 29 7b 0a 20  Var[x-1]==0 ){. 
4fd0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
4fe0: 46 72 65 65 28 64 62 2c 20 70 50 61 72 73 65 2d  Free(db, pParse-
4ff0: 3e 61 7a 56 61 72 5b 78 2d 31 5d 29 3b 0a 20 20  >azVar[x-1]);.  
5000: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 7a        pParse->az
5010: 56 61 72 5b 78 2d 31 5d 20 3d 20 73 71 6c 69 74  Var[x-1] = sqlit
5020: 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
5030: 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  z, n);.      }. 
5040: 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66 28 20     }.  } .  if( 
5050: 21 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 26 26  !pParse->nErr &&
5060: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 64 62   pParse->nVar>db
5070: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
5080: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
5090: 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 73 71  UMBER] ){.    sq
50a0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
50b0: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
50c0: 53 51 4c 20 76 61 72 69 61 62 6c 65 73 22 29 3b  SQL variables");
50d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
50e0: 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65  cursively delete
50f0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
5100: 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ree..*/.void sql
5110: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 73  ite3ExprDelete(s
5120: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
5130: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30   *p){.  if( p==0
5140: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 2f 2a 20   ) return;.  /* 
5150: 53 61 6e 69 74 79 20 63 68 65 63 6b 3a 20 41 73  Sanity check: As
5160: 73 65 72 74 20 74 68 61 74 20 74 68 65 20 49 6e  sert that the In
5170: 74 56 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e 65  tValue is non-ne
5180: 67 61 74 69 76 65 20 69 66 20 69 74 20 65 78 69  gative if it exi
5190: 73 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  sts */.  assert(
51a0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
51b0: 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  y(p, EP_IntValue
51c0: 29 20 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c 75 65  ) || p->u.iValue
51d0: 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 45 78  >=0 );.  if( !Ex
51e0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
51f0: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
5200: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 45 78 70  {.    /* The Exp
5210: 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76  r.x union is nev
5220: 65 72 20 75 73 65 64 20 61 74 20 74 68 65 20 73  er used at the s
5230: 61 6d 65 20 74 69 6d 65 20 61 73 20 45 78 70 72  ame time as Expr
5240: 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20 20 20 61  .pRight */.    a
5250: 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 4c 69 73  ssert( p->x.pLis
5260: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68  t==0 || p->pRigh
5270: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  t==0 );.    sqli
5280: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
5290: 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  , p->pLeft);.   
52a0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
52b0: 74 65 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74  te(db, p->pRight
52c0: 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  );.    if( ExprH
52d0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
52e0: 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 20 73 71 6c  _MemToken) ) sql
52f0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
5300: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
5310: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
5320: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
5330: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73  lect) ){.      s
5340: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
5350: 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c  te(db, p->x.pSel
5360: 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ect);.    }else{
5370: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
5380: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
5390: 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20   p->x.pList);.  
53a0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 45    }.  }.  if( !E
53b0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
53c0: 2c 20 45 50 5f 53 74 61 74 69 63 29 20 29 7b 0a  , EP_Static) ){.
53d0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
53e0: 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a  e(db, p);.  }.}.
53f0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
5400: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
5410: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
5420: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73  the expression s
5430: 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 70 61 73  tructure .** pas
5440: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
5450: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 20   argument. This 
5460: 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66  is always one of
5470: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a   EXPR_FULLSIZE,.
5480: 2a 2a 20 45 58 50 52 5f 52 45 44 55 43 45 44 53  ** EXPR_REDUCEDS
5490: 49 5a 45 20 6f 72 20 45 58 50 52 5f 54 4f 4b 45  IZE or EXPR_TOKE
54a0: 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74  NONLYSIZE..*/.st
54b0: 61 74 69 63 20 69 6e 74 20 65 78 70 72 53 74 72  atic int exprStr
54c0: 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70 29  uctSize(Expr *p)
54d0: 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  {.  if( ExprHasP
54e0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f  roperty(p, EP_To
54f0: 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65 74 75 72  kenOnly) ) retur
5500: 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59  n EXPR_TOKENONLY
5510: 53 49 5a 45 3b 0a 20 20 69 66 28 20 45 78 70 72  SIZE;.  if( Expr
5520: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
5530: 50 5f 52 65 64 75 63 65 64 29 20 29 20 72 65 74  P_Reduced) ) ret
5540: 75 72 6e 20 45 58 50 52 5f 52 45 44 55 43 45 44  urn EXPR_REDUCED
5550: 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20 45  SIZE;.  return E
5560: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a  XPR_FULLSIZE;.}.
5570: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64  ./*.** The duped
5580: 45 78 70 72 2a 53 69 7a 65 28 29 20 72 6f 75 74  Expr*Size() rout
5590: 69 6e 65 73 20 65 61 63 68 20 72 65 74 75 72 6e  ines each return
55a0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
55b0: 79 74 65 73 20 72 65 71 75 69 72 65 64 0a 2a 2a  ytes required.**
55c0: 20 74 6f 20 73 74 6f 72 65 20 61 20 63 6f 70 79   to store a copy
55d0: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
55e0: 6e 20 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20  n or expression 
55f0: 74 72 65 65 2e 20 20 54 68 65 79 20 64 69 66 66  tree.  They diff
5600: 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63  er in.** how muc
5610: 68 20 6f 66 20 74 68 65 20 74 72 65 65 20 69 73  h of the tree is
5620: 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a   measured..**.**
5630: 20 20 20 20 20 64 75 70 65 64 45 78 70 72 53 74       dupedExprSt
5640: 72 75 63 74 53 69 7a 65 28 29 20 20 20 20 20 53  ructSize()     S
5650: 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74 68 65 20  ize of only the 
5660: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20 0a  Expr structure .
5670: 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72  **     dupedExpr
5680: 4e 6f 64 65 53 69 7a 65 28 29 20 20 20 20 20 20  NodeSize()      
5690: 20 53 69 7a 65 20 6f 66 20 45 78 70 72 20 2b 20   Size of Expr + 
56a0: 73 70 61 63 65 20 66 6f 72 20 74 6f 6b 65 6e 0a  space for token.
56b0: 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72  **     dupedExpr
56c0: 53 69 7a 65 28 29 20 20 20 20 20 20 20 20 20 20  Size()          
56d0: 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e 20 2b 20   Expr + token + 
56e0: 73 75 62 74 72 65 65 20 63 6f 6d 70 6f 6e 65 6e  subtree componen
56f0: 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ts.**.**********
5700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5740: 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65  *.**.** The dupe
5750: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
5760: 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ) function retur
5770: 6e 73 20 74 77 6f 20 76 61 6c 75 65 73 20 4f 52  ns two values OR
5780: 2d 65 64 20 74 6f 67 65 74 68 65 72 3a 20 20 0a  -ed together:  .
5790: 2a 2a 20 28 31 29 20 74 68 65 20 73 70 61 63 65  ** (1) the space
57a0: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 20   required for a 
57b0: 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72  copy of the Expr
57c0: 20 73 74 72 75 63 74 75 72 65 20 6f 6e 6c 79 20   structure only 
57d0: 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74 68 65 20  and .** (2) the 
57e0: 45 50 5f 78 78 78 20 66 6c 61 67 73 20 74 68 61  EP_xxx flags tha
57f0: 74 20 69 6e 64 69 63 61 74 65 20 77 68 61 74 20  t indicate what 
5800: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 73 69  the structure si
5810: 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a  ze should be..**
5820: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
5830: 65 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65  es is always one
5840: 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20   of:.**.**      
5850: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a  EXPR_FULLSIZE.**
5860: 20 20 20 20 20 20 45 58 50 52 5f 52 45 44 55 43        EXPR_REDUC
5870: 45 44 53 49 5a 45 20 20 20 7c 20 45 50 5f 52 65  EDSIZE   | EP_Re
5880: 64 75 63 65 64 0a 2a 2a 20 20 20 20 20 20 45 58  duced.**      EX
5890: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
58a0: 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a   | EP_TokenOnly.
58b0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f  **.** The size o
58c0: 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  f the structure 
58d0: 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20  can be found by 
58e0: 6d 61 73 6b 69 6e 67 20 74 68 65 20 72 65 74 75  masking the retu
58f0: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74  rn value.** of t
5900: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68  his routine with
5910: 20 30 78 66 66 66 2e 20 20 54 68 65 20 66 6c 61   0xfff.  The fla
5920: 67 73 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20  gs can be found 
5930: 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 0a 2a  by masking the.*
5940: 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 77  * return value w
5950: 69 74 68 20 45 50 5f 52 65 64 75 63 65 64 7c 45  ith EP_Reduced|E
5960: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a  P_TokenOnly..**.
5970: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 69 74  ** Note that wit
5980: 68 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50  h flags==EXPRDUP
5990: 5f 52 45 44 55 43 45 2c 20 74 68 69 73 20 72 6f  _REDUCE, this ro
59a0: 75 74 69 6e 65 73 20 77 6f 72 6b 73 20 6f 6e 20  utines works on 
59b0: 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e  full-size.** (un
59c0: 72 65 64 75 63 65 64 29 20 45 78 70 72 20 6f 62  reduced) Expr ob
59d0: 6a 65 63 74 73 20 61 73 20 74 68 65 79 20 6f 72  jects as they or
59e0: 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 73   originally cons
59f0: 74 72 75 63 74 65 64 20 62 79 20 74 68 65 20 70  tructed by the p
5a00: 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72 69 6e 67  arser..** During
5a10: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c   expression anal
5a20: 79 73 69 73 2c 20 65 78 74 72 61 20 69 6e 66 6f  ysis, extra info
5a30: 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 75  rmation is compu
5a40: 74 65 64 20 61 6e 64 20 6d 6f 76 65 64 20 69 6e  ted and moved in
5a50: 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70 61 72 74  to.** later part
5a60: 73 20 6f 66 20 74 65 68 20 45 78 70 72 20 6f 62  s of teh Expr ob
5a70: 6a 65 63 74 20 61 6e 64 20 74 68 61 74 20 65 78  ject and that ex
5a80: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
5a90: 6d 69 67 68 74 20 67 65 74 20 63 68 6f 70 70 65  might get choppe
5aa0: 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74 68 65 20  d.** off if the 
5ab0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65  expression is re
5ac0: 64 75 63 65 64 2e 20 20 4e 6f 74 65 20 61 6c 73  duced.  Note als
5ad0: 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e  o that it does n
5ae0: 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61  ot work to.** ma
5af0: 6b 65 20 61 20 45 58 50 52 44 55 50 5f 52 45 44  ke a EXPRDUP_RED
5b00: 55 43 45 20 63 6f 70 79 20 6f 66 20 61 20 72 65  UCE copy of a re
5b10: 64 75 63 65 64 20 65 78 70 72 65 73 73 69 6f 6e  duced expression
5b20: 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65  .  It is only le
5b30: 67 61 6c 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65  gal.** to reduce
5b40: 20 61 20 70 72 69 73 74 69 6e 65 20 65 78 70 72   a pristine expr
5b50: 65 73 73 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d  ession tree from
5b60: 20 74 68 65 20 70 61 72 73 65 72 2e 20 20 54 68   the parser.  Th
5b70: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
5b80: 0a 2a 2a 20 6f 66 20 64 75 70 65 64 45 78 70 72  .** of dupedExpr
5b90: 53 74 72 75 63 74 53 69 7a 65 28 29 20 63 6f 6e  StructSize() con
5ba0: 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73  tain multiple as
5bb0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
5bc0: 73 20 74 68 61 74 20 61 74 74 65 6d 70 74 0a 2a  s that attempt.*
5bd0: 2a 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 69  * to enforce thi
5be0: 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f  s constraint..*/
5bf0: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65  .static int dupe
5c00: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
5c10: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61  Expr *p, int fla
5c20: 67 73 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65  gs){.  int nSize
5c30: 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  ;.  assert( flag
5c40: 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43  s==EXPRDUP_REDUC
5c50: 45 20 7c 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b  E || flags==0 );
5c60: 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61   /* Only one fla
5c70: 67 20 76 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20  g value allowed 
5c80: 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 28 66 6c 61  */.  if( 0==(fla
5c90: 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55 43  gs&EXPRDUP_REDUC
5ca0: 45 29 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20  E) ){.    nSize 
5cb0: 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b  = EXPR_FULLSIZE;
5cc0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
5cd0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
5ce0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
5cf0: 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
5d00: 64 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  d) );.    assert
5d10: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
5d20: 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  ty(p, EP_FromJoi
5d30: 6e 29 20 29 3b 20 0a 20 20 20 20 61 73 73 65 72  n) ); .    asser
5d40: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
5d50: 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b  rty(p, EP_MemTok
5d60: 65 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  en) );.    asser
5d70: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
5d80: 72 74 79 28 70 2c 20 45 50 5f 49 72 72 65 64 75  rty(p, EP_Irredu
5d90: 63 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ce) );.    if( p
5da0: 2d 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e 70 52  ->pLeft || p->pR
5db0: 69 67 68 74 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69  ight || p->x.pLi
5dc0: 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a  st ){.      nSiz
5dd0: 65 20 3d 20 45 58 50 52 5f 52 45 44 55 43 45 44  e = EXPR_REDUCED
5de0: 53 49 5a 45 20 7c 20 45 50 5f 52 65 64 75 63 65  SIZE | EP_Reduce
5df0: 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  d;.    }else{.  
5e00: 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52      nSize = EXPR
5e10: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c  _TOKENONLYSIZE |
5e20: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20   EP_TokenOnly;. 
5e30: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5e40: 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n nSize;.}../*.*
5e50: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
5e60: 72 65 74 75 72 6e 73 20 74 68 65 20 73 70 61 63  returns the spac
5e70: 65 20 69 6e 20 62 79 74 65 73 20 72 65 71 75 69  e in bytes requi
5e80: 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  red to store the
5e90: 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74 68 65   copy .** of the
5ea0: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20   Expr structure 
5eb0: 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68  and a copy of th
5ec0: 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20  e Expr.u.zToken 
5ed0: 73 74 72 69 6e 67 20 28 69 66 20 74 68 61 74 0a  string (if that.
5ee0: 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 64 65 66  ** string is def
5ef0: 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61 74 69 63  ined.).*/.static
5f00: 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 4e 6f   int dupedExprNo
5f10: 64 65 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20  deSize(Expr *p, 
5f20: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
5f30: 74 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45  t nByte = dupedE
5f40: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c  xprStructSize(p,
5f50: 20 66 6c 61 67 73 29 20 26 20 30 78 66 66 66 3b   flags) & 0xfff;
5f60: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
5f70: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e  roperty(p, EP_In
5f80: 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e  tValue) && p->u.
5f90: 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 6e 42  zToken ){.    nB
5fa0: 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  yte += sqlite3St
5fb0: 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b  rlen30(p->u.zTok
5fc0: 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74  en)+1;.  }.  ret
5fd0: 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74 65  urn ROUND8(nByte
5fe0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
5ff0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
6000: 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20   bytes required 
6010: 74 6f 20 63 72 65 61 74 65 20 61 20 64 75 70 6c  to create a dupl
6020: 69 63 61 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a  icate of the .**
6030: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73   expression pass
6040: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
6050: 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 73 65  argument. The se
6060: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
6070: 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74 61   a.** mask conta
6080: 69 6e 69 6e 67 20 45 58 50 52 44 55 50 5f 58 58  ining EXPRDUP_XX
6090: 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54  X flags..**.** T
60a0: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
60b0: 64 20 69 6e 63 6c 75 64 65 73 20 73 70 61 63 65  d includes space
60c0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f 70   to create a cop
60d0: 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74  y of the Expr st
60e0: 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20 61  ruct.** itself a
60f0: 6e 64 20 74 68 65 20 62 75 66 66 65 72 20 72 65  nd the buffer re
6100: 66 65 72 72 65 64 20 74 6f 20 62 79 20 45 78 70  ferred to by Exp
6110: 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20 61  r.u.zToken, if a
6120: 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ny..**.** If the
6130: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20   EXPRDUP_REDUCE 
6140: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
6150: 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
6160: 75 65 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a 20  ue includes .** 
6170: 73 70 61 63 65 20 74 6f 20 64 75 70 6c 69 63 61  space to duplica
6180: 74 65 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64 65  te all Expr node
6190: 73 20 69 6e 20 74 68 65 20 74 72 65 65 20 66 6f  s in the tree fo
61a0: 72 6d 65 64 20 62 79 20 45 78 70 72 2e 70 4c 65  rmed by Expr.pLe
61b0: 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72 2e  ft .** and Expr.
61c0: 70 52 69 67 68 74 20 76 61 72 69 61 62 6c 65 73  pRight variables
61d0: 20 28 62 75 74 20 6e 6f 74 20 66 6f 72 20 61 6e   (but not for an
61e0: 79 20 73 74 72 75 63 74 75 72 65 73 20 70 6f 69  y structures poi
61f0: 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20 64  nted to or .** d
6200: 65 73 63 65 6e 64 65 64 20 66 72 6f 6d 20 74 68  escended from th
6210: 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 6f  e Expr.x.pList o
6220: 72 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74  r Expr.x.pSelect
6230: 20 76 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f 0a   variables)..*/.
6240: 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64  static int duped
6250: 45 78 70 72 53 69 7a 65 28 45 78 70 72 20 2a 70  ExprSize(Expr *p
6260: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
6270: 69 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20  int nByte = 0;. 
6280: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 6e 42   if( p ){.    nB
6290: 79 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 4e  yte = dupedExprN
62a0: 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  odeSize(p, flags
62b0: 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73  );.    if( flags
62c0: 26 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  &EXPRDUP_REDUCE 
62d0: 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b  ){.      nByte +
62e0: 3d 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  = dupedExprSize(
62f0: 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73 29  p->pLeft, flags)
6300: 20 2b 20 64 75 70 65 64 45 78 70 72 53 69 7a 65   + dupedExprSize
6310: 28 70 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61 67  (p->pRight, flag
6320: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  s);.    }.  }.  
6330: 72 65 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d 0a  return nByte;.}.
6340: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
6350: 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20  tion is similar 
6360: 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 44 75  to sqlite3ExprDu
6370: 70 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74  p(), except that
6380: 20 69 66 20 70 7a 42 75 66 66 65 72 20 0a 2a 2a   if pzBuffer .**
6390: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
63a0: 6e 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20 61  n *pzBuffer is a
63b0: 73 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74 20  ssumed to point 
63c0: 74 6f 20 61 20 62 75 66 66 65 72 20 6c 61 72 67  to a buffer larg
63d0: 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f 20  e enough .** to 
63e0: 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f  store the copy o
63f0: 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 2c 20  f expression p, 
6400: 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 70 2d  the copies of p-
6410: 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69 66  >u.zToken.** (if
6420: 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 61 6e   applicable), an
6430: 64 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20  d the copies of 
6440: 74 68 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e 64  the p->pLeft and
6450: 20 70 2d 3e 70 52 69 67 68 74 20 65 78 70 72 65   p->pRight expre
6460: 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e  ssions,.** if an
6470: 79 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  y. Before return
6480: 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65 72 20 69  ing, *pzBuffer i
6490: 73 20 73 65 74 20 74 6f 20 74 68 65 20 66 69 72  s set to the fir
64a0: 73 74 20 62 79 74 65 20 70 61 73 73 65 64 20 74  st byte passed t
64b0: 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f 66  he.** portion of
64c0: 20 74 68 65 20 62 75 66 66 65 72 20 63 6f 70 69   the buffer copi
64d0: 65 64 20 69 6e 74 6f 20 62 79 20 74 68 69 73 20  ed into by this 
64e0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
64f0: 74 69 63 20 45 78 70 72 20 2a 65 78 70 72 44 75  tic Expr *exprDu
6500: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  p(sqlite3 *db, E
6510: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
6520: 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66 65 72  s, u8 **pzBuffer
6530: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 20  ){.  Expr *pNew 
6540: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
6550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
6560: 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ue to return */.
6570: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63    if( p ){.    c
6580: 6f 6e 73 74 20 69 6e 74 20 69 73 52 65 64 75 63  onst int isReduc
6590: 65 64 20 3d 20 28 66 6c 61 67 73 26 45 58 50 52  ed = (flags&EXPR
65a0: 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20  DUP_REDUCE);.   
65b0: 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 0a 20 20 20   u8 *zAlloc;.   
65c0: 20 75 33 32 20 73 74 61 74 69 63 46 6c 61 67 20   u32 staticFlag 
65d0: 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  = 0;..    assert
65e0: 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c  ( pzBuffer==0 ||
65f0: 20 69 73 52 65 64 75 63 65 64 20 29 3b 0a 0a 20   isReduced );.. 
6600: 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
6610: 20 77 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   where to write 
6620: 74 68 65 20 6e 65 77 20 45 78 70 72 20 73 74 72  the new Expr str
6630: 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 20 20 69  ucture. */.    i
6640: 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20  f( pzBuffer ){. 
6650: 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a 70       zAlloc = *p
6660: 7a 42 75 66 66 65 72 3b 0a 20 20 20 20 20 20 73  zBuffer;.      s
6670: 74 61 74 69 63 46 6c 61 67 20 3d 20 45 50 5f 53  taticFlag = EP_S
6680: 74 61 74 69 63 3b 0a 20 20 20 20 7d 65 6c 73 65  tatic;.    }else
6690: 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d  {.      zAlloc =
66a0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
66b0: 52 61 77 28 64 62 2c 20 64 75 70 65 64 45 78 70  Raw(db, dupedExp
66c0: 72 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 29  rSize(p, flags))
66d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
66e0: 20 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c 6c 6f   = (Expr *)zAllo
66f0: 63 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 77  c;..    if( pNew
6700: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 65 74   ){.      /* Set
6710: 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74 68 65   nNewSize to the
6720: 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65 64 20   size allocated 
6730: 66 6f 72 20 74 68 65 20 73 74 72 75 63 74 75 72  for the structur
6740: 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20 20 20  e pointed to.   
6750: 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e 20 54     ** by pNew. T
6760: 68 69 73 20 69 73 20 65 69 74 68 65 72 20 45 58  his is either EX
6770: 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58 50  PR_FULLSIZE, EXP
6780: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72  R_REDUCEDSIZE or
6790: 0a 20 20 20 20 20 20 2a 2a 20 45 58 50 52 5f 54  .      ** EXPR_T
67a0: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54  OKENONLYSIZE. nT
67b0: 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f 20 74  oken is set to t
67c0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
67d0: 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20 20  es consumed.    
67e0: 20 20 2a 2a 20 62 79 20 74 68 65 20 63 6f 70 79    ** by the copy
67f0: 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f   of the p->u.zTo
6800: 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20 61  ken string (if a
6810: 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ny)..      */.  
6820: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
6830: 65 64 20 6e 53 74 72 75 63 74 53 69 7a 65 20 3d  ed nStructSize =
6840: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
6850: 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a  Size(p, flags);.
6860: 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
6870: 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74 72 75  nNewSize = nStru
6880: 63 74 53 69 7a 65 20 26 20 30 78 66 66 66 3b 0a  ctSize & 0xfff;.
6890: 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e        int nToken
68a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 45 78 70  ;.      if( !Exp
68b0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
68c0: 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20  EP_IntValue) && 
68d0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20  p->u.zToken ){. 
68e0: 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20         nToken = 
68f0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
6900: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b 20 31  p->u.zToken) + 1
6910: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6920: 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20         nToken = 
6930: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
6940: 20 69 66 28 20 69 73 52 65 64 75 63 65 64 20 29   if( isReduced )
6950: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
6960: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
6970: 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29  y(p, EP_Reduced)
6980: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  ==0 );.        m
6990: 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c  emcpy(zAlloc, p,
69a0: 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20   nNewSize);.    
69b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
69c0: 20 69 6e 74 20 6e 53 69 7a 65 20 3d 20 65 78 70   int nSize = exp
69d0: 72 53 74 72 75 63 74 53 69 7a 65 28 70 29 3b 0a  rStructSize(p);.
69e0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a          memcpy(z
69f0: 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a 65 29  Alloc, p, nSize)
6a00: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
6a10: 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c  (&zAlloc[nSize],
6a20: 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a   0, EXPR_FULLSIZ
6a30: 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  E-nSize);.      
6a40: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20  }..      /* Set 
6a50: 74 68 65 20 45 50 5f 52 65 64 75 63 65 64 2c 20  the EP_Reduced, 
6a60: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61 6e  EP_TokenOnly, an
6a70: 64 20 45 50 5f 53 74 61 74 69 63 20 66 6c 61 67  d EP_Static flag
6a80: 73 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e  s appropriately.
6a90: 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   */.      pNew->
6aa0: 66 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f 52 65  flags &= ~(EP_Re
6ab0: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
6ac0: 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c 45 50 5f  ly|EP_Static|EP_
6ad0: 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  MemToken);.     
6ae0: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
6af0: 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20 28 45  nStructSize & (E
6b00: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
6b10: 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 70  enOnly);.      p
6b20: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 73 74  New->flags |= st
6b30: 61 74 69 63 46 6c 61 67 3b 0a 0a 20 20 20 20 20  aticFlag;..     
6b40: 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 70 2d 3e   /* Copy the p->
6b50: 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 2c  u.zToken string,
6b60: 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20   if any. */.    
6b70: 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a    if( nToken ){.
6b80: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
6b90: 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a  oken = pNew->u.z
6ba0: 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26  Token = (char*)&
6bb0: 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d  zAlloc[nNewSize]
6bc0: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
6bd0: 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54  (zToken, p->u.zT
6be0: 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20  oken, nToken);. 
6bf0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
6c00: 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73 7c  ( 0==((p->flags|
6c10: 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26 20 45  pNew->flags) & E
6c20: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
6c30: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
6c40: 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e 70  in the pNew->x.p
6c50: 53 65 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d 3e  Select or pNew->
6c60: 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e 20  x.pList member. 
6c70: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 45  */.        if( E
6c80: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
6c90: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
6ca0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
6cb0: 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73  w->x.pSelect = s
6cc0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
6cd0: 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74  db, p->x.pSelect
6ce0: 2c 20 69 73 52 65 64 75 63 65 64 29 3b 0a 20 20  , isReduced);.  
6cf0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6d00: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70         pNew->x.p
6d10: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
6d20: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
6d30: 3e 78 2e 70 4c 69 73 74 2c 20 69 73 52 65 64 75  >x.pList, isRedu
6d40: 63 65 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ced);.        }.
6d50: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
6d60: 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d 3e  * Fill in pNew->
6d70: 70 4c 65 66 74 20 61 6e 64 20 70 4e 65 77 2d 3e  pLeft and pNew->
6d80: 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20  pRight. */.     
6d90: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
6da0: 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65  erty(pNew, EP_Re
6db0: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
6dc0: 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ly) ){.        z
6dd0: 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78  Alloc += dupedEx
6de0: 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c  prNodeSize(p, fl
6df0: 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ags);.        if
6e00: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
6e10: 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75 63  y(pNew, EP_Reduc
6e20: 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ed) ){.         
6e30: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 65   pNew->pLeft = e
6e40: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
6e50: 65 66 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44  eft, EXPRDUP_RED
6e60: 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a 20  UCE, &zAlloc);. 
6e70: 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70           pNew->p
6e80: 52 69 67 68 74 20 3d 20 65 78 70 72 44 75 70 28  Right = exprDup(
6e90: 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 45  db, p->pRight, E
6ea0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26  XPRDUP_REDUCE, &
6eb0: 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20  zAlloc);.       
6ec0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
6ed0: 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20  zBuffer ){.     
6ee0: 20 20 20 20 20 2a 70 7a 42 75 66 66 65 72 20 3d       *pzBuffer =
6ef0: 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 20   zAlloc;.       
6f00: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
6f10: 20 20 20 20 20 20 20 20 69 66 28 20 21 45 78 70          if( !Exp
6f20: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
6f30: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
6f40: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
6f50: 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33  >pLeft = sqlite3
6f60: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
6f70: 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Left, 0);.      
6f80: 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74      pNew->pRight
6f90: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
6fa0: 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c  p(db, p->pRight,
6fb0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
6fc0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 7d 0a 20 20       }..    }.  
6fd0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
6fe0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
6ff0: 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66  llowing group of
7000: 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64   routines make d
7010: 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78  eep copies of ex
7020: 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78  pressions,.** ex
7030: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20  pression lists, 
7040: 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65  ID lists, and se
7050: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e  lect statements.
7060: 20 20 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e    The copies can
7070: 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28  .** be deleted (
7080: 62 79 20 62 65 69 6e 67 20 70 61 73 73 65 64 20  by being passed 
7090: 74 6f 20 74 68 65 69 72 20 72 65 73 70 65 63 74  to their respect
70a0: 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20  ive ...Delete() 
70b0: 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74  routines).** wit
70c0: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
70d0: 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a  he originals..**
70e0: 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69  .** The expressi
70f0: 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64  on list, ID, and
7100: 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65   source lists re
7110: 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45  turn by sqlite3E
7120: 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a  xprListDup(),.**
7130: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
7140: 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33  p(), and sqlite3
7150: 53 72 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e  SrcListDup() can
7160: 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72 20   not be further 
7170: 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20  expanded .** by 
7180: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
7190: 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41   to sqlite*ListA
71a0: 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73  ppend() routines
71b0: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c  ..**.** Any tabl
71c0: 65 73 20 74 68 61 74 20 74 68 65 20 53 72 63 4c  es that the SrcL
71d0: 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ist might point 
71e0: 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69  to are not dupli
71f0: 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  cated..**.** The
7200: 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
7210: 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62   contains a comb
7220: 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45  ination of the E
7230: 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73  XPRDUP_XXX flags
7240: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52  ..** If the EXPR
7250: 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20  DUP_REDUCE flag 
7260: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
7270: 20 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72   structure retur
7280: 6e 65 64 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e  ned is a.** trun
7290: 63 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  cated version of
72a0: 20 74 68 65 20 75 73 75 61 6c 20 45 78 70 72 20   the usual Expr 
72b0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77  structure that w
72c0: 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73  ill be stored as
72d0: 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20  .** part of the 
72e0: 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
72f0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
7300: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
7310: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
7320: 33 45 78 70 72 44 75 70 28 73 71 6c 69 74 65 33  3ExprDup(sqlite3
7330: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69   *db, Expr *p, i
7340: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 72 65 74  nt flags){.  ret
7350: 75 72 6e 20 65 78 70 72 44 75 70 28 64 62 2c 20  urn exprDup(db, 
7360: 70 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 7d 0a  p, flags, 0);.}.
7370: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
7380: 33 45 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c  3ExprListDup(sql
7390: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69  ite3 *db, ExprLi
73a0: 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  st *p, int flags
73b0: 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
73c0: 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78  New;.  struct Ex
73d0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
73e0: 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20  em, *pOldItem;. 
73f0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d   int i;.  if( p=
7400: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
7410: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
7420: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
7430: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a  izeof(*pNew) );.
7440: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
7450: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
7460: 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 30 3b 0a  ->iECursor = 0;.
7470: 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20    pNew->nExpr = 
7480: 69 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20  i = p->nExpr;.  
7490: 69 66 28 20 28 66 6c 61 67 73 20 26 20 45 58 50  if( (flags & EXP
74a0: 52 44 55 50 5f 52 45 44 55 43 45 29 3d 3d 30 20  RDUP_REDUCE)==0 
74b0: 29 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e  ) for(i=1; i<p->
74c0: 6e 45 78 70 72 3b 20 69 2b 3d 69 29 7b 7d 0a 20  nExpr; i+=i){}. 
74d0: 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d   pNew->a = pItem
74e0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
74f0: 6f 63 52 61 77 28 64 62 2c 20 20 69 2a 73 69 7a  ocRaw(db,  i*siz
7500: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a  eof(p->a[0]) );.
7510: 20 20 69 66 28 20 70 49 74 65 6d 3d 3d 30 20 29    if( pItem==0 )
7520: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
7530: 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20  ree(db, pNew);. 
7540: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
7550: 20 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70   .  pOldItem = p
7560: 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ->a;.  for(i=0; 
7570: 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  i<p->nExpr; i++,
7580: 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74   pItem++, pOldIt
7590: 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  em++){.    Expr 
75a0: 2a 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64  *pOldExpr = pOld
75b0: 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
75c0: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20   pItem->pExpr = 
75d0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
75e0: 62 2c 20 70 4f 6c 64 45 78 70 72 2c 20 66 6c 61  b, pOldExpr, fla
75f0: 67 73 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  gs);.    pItem->
7600: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
7610: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
7620: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
7630: 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d    pItem->zSpan =
7640: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
7650: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
7660: 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d  Span);.    pItem
7670: 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f  ->sortOrder = pO
7680: 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65  ldItem->sortOrde
7690: 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f  r;.    pItem->do
76a0: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65  ne = 0;.    pIte
76b0: 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20  m->bSpanIsTab = 
76c0: 70 4f 6c 64 49 74 65 6d 2d 3e 62 53 70 61 6e 49  pOldItem->bSpanI
76d0: 73 54 61 62 3b 0a 20 20 20 20 70 49 74 65 6d 2d  sTab;.    pItem-
76e0: 3e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 70  >iOrderByCol = p
76f0: 4f 6c 64 49 74 65 6d 2d 3e 69 4f 72 64 65 72 42  OldItem->iOrderB
7700: 79 43 6f 6c 3b 0a 20 20 20 20 70 49 74 65 6d 2d  yCol;.    pItem-
7710: 3e 69 41 6c 69 61 73 20 3d 20 70 4f 6c 64 49 74  >iAlias = pOldIt
7720: 65 6d 2d 3e 69 41 6c 69 61 73 3b 0a 20 20 7d 0a  em->iAlias;.  }.
7730: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
7740: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f  ../*.** If curso
7750: 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69  rs, triggers, vi
7760: 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69  ews and subqueri
7770: 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74  es are all omitt
7780: 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62  ed from.** the b
7790: 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20  uild, then none 
77a0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
77b0: 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70   routines, excep
77c0: 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65  t for .** sqlite
77d0: 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61  3SelectDup(), ca
77e0: 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c  n be called. sql
77f0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 20  ite3SelectDup() 
7800: 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20  is sometimes.** 
7810: 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55  called with a NU
7820: 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  LL argument..*/.
7830: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
7840: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
7850: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
7860: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20  E_OMIT_TRIGGER) 
7870: 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  \. || !defined(S
7880: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
7890: 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71  ERY).SrcList *sq
78a0: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28  lite3SrcListDup(
78b0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63  sqlite3 *db, Src
78c0: 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61  List *p, int fla
78d0: 67 73 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  gs){.  SrcList *
78e0: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pNew;.  int i;. 
78f0: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66   int nByte;.  if
7900: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
7910: 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  0;.  nByte = siz
7920: 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53  eof(*p) + (p->nS
7930: 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d  rc>0 ? sizeof(p-
7940: 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72  >a[0]) * (p->nSr
7950: 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65  c-1) : 0);.  pNe
7960: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
7970: 6c 6f 63 52 61 77 28 64 62 2c 20 6e 42 79 74 65  locRaw(db, nByte
7980: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
7990: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
79a0: 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65  pNew->nSrc = pNe
79b0: 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e  w->nAlloc = p->n
79c0: 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  Src;.  for(i=0; 
79d0: 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  i<p->nSrc; i++){
79e0: 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
79f0: 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74  ist_item *pNewIt
7a00: 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d  em = &pNew->a[i]
7a10: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  ;.    struct Src
7a20: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49  List_item *pOldI
7a30: 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a  tem = &p->a[i];.
7a40: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
7a50: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
7a60: 53 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65  Schema = pOldIte
7a70: 6d 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  m->pSchema;.    
7a80: 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62  pNewItem->zDatab
7a90: 61 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ase = sqlite3DbS
7aa0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
7ab0: 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
7ac0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e      pNewItem->zN
7ad0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
7ae0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
7af0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
7b00: 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  pNewItem->zAlias
7b10: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
7b20: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
7b30: 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e  >zAlias);.    pN
7b40: 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ewItem->jointype
7b50: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69   = pOldItem->joi
7b60: 6e 74 79 70 65 3b 0a 20 20 20 20 70 4e 65 77 49  ntype;.    pNewI
7b70: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70  tem->iCursor = p
7b80: 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  OldItem->iCursor
7b90: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
7ba0: 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 70 4f  addrFillSub = pO
7bb0: 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c  ldItem->addrFill
7bc0: 53 75 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  Sub;.    pNewIte
7bd0: 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 70  m->regReturn = p
7be0: 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  OldItem->regRetu
7bf0: 72 6e 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  rn;.    pNewItem
7c00: 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 20 3d  ->isCorrelated =
7c10: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 43 6f 72   pOldItem->isCor
7c20: 72 65 6c 61 74 65 64 3b 0a 20 20 20 20 70 4e 65  related;.    pNe
7c30: 77 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74  wItem->viaCorout
7c40: 69 6e 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  ine = pOldItem->
7c50: 76 69 61 43 6f 72 6f 75 74 69 6e 65 3b 0a 20 20  viaCoroutine;.  
7c60: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 49 6e 64    pNewItem->zInd
7c70: 65 78 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  ex = sqlite3DbSt
7c80: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
7c90: 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a 20 20 20 20  m->zIndex);.    
7ca0: 70 4e 65 77 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64  pNewItem->notInd
7cb0: 65 78 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  exed = pOldItem-
7cc0: 3e 6e 6f 74 49 6e 64 65 78 65 64 3b 0a 20 20 20  >notIndexed;.   
7cd0: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 6e 64 65   pNewItem->pInde
7ce0: 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 49  x = pOldItem->pI
7cf0: 6e 64 65 78 3b 0a 20 20 20 20 70 54 61 62 20 3d  ndex;.    pTab =
7d00: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20   pNewItem->pTab 
7d10: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62  = pOldItem->pTab
7d20: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29  ;.    if( pTab )
7d30: 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  {.      pTab->nR
7d40: 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ef++;.    }.    
7d50: 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63  pNewItem->pSelec
7d60: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
7d70: 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  tDup(db, pOldIte
7d80: 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61 67  m->pSelect, flag
7d90: 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  s);.    pNewItem
7da0: 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45  ->pOn = sqlite3E
7db0: 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  xprDup(db, pOldI
7dc0: 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29  tem->pOn, flags)
7dd0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
7de0: 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  pUsing = sqlite3
7df0: 49 64 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f  IdListDup(db, pO
7e00: 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b  ldItem->pUsing);
7e10: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63  .    pNewItem->c
7e20: 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65  olUsed = pOldIte
7e30: 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a  m->colUsed;.  }.
7e40: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
7e50: 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
7e60: 49 64 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65  IdListDup(sqlite
7e70: 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70  3 *db, IdList *p
7e80: 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65  ){.  IdList *pNe
7e90: 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  w;.  int i;.  if
7ea0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
7eb0: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
7ec0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
7ed0: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  b, sizeof(*pNew)
7ee0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
7ef0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
7f00: 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e  pNew->nId = p->n
7f10: 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  Id;.  pNew->a = 
7f20: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
7f30: 61 77 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69  aw(db, p->nId*si
7f40: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b  zeof(p->a[0]) );
7f50: 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d  .  if( pNew->a==
7f60: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
7f70: 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29  DbFree(db, pNew)
7f80: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
7f90: 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68    }.  /* Note th
7fa0: 61 74 20 62 65 63 61 75 73 65 20 74 68 65 20 73  at because the s
7fb0: 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63  ize of the alloc
7fc0: 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d  ation for p->a[]
7fd0: 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63   is not.  ** nec
7fe0: 65 73 73 61 72 69 6c 79 20 61 20 70 6f 77 65 72  essarily a power
7ff0: 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74 65 33   of two, sqlite3
8000: 49 64 4c 69 73 74 41 70 70 65 6e 64 28 29 20 6d  IdListAppend() m
8010: 61 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64  ay not be called
8020: 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 75 70  .  ** on the dup
8030: 6c 69 63 61 74 65 20 63 72 65 61 74 65 64 20 62  licate created b
8040: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
8050: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
8060: 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  <p->nId; i++){. 
8070: 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
8080: 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20  _item *pNewItem 
8090: 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20  = &pNew->a[i];. 
80a0: 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
80b0: 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20  _item *pOldItem 
80c0: 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  = &p->a[i];.    
80d0: 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  pNewItem->zName 
80e0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
80f0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
8100: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77  zName);.    pNew
8110: 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64  Item->idx = pOld
8120: 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20  Item->idx;.  }. 
8130: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
8140: 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53  Select *sqlite3S
8150: 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65 33  electDup(sqlite3
8160: 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c   *db, Select *p,
8170: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53   int flags){.  S
8180: 65 6c 65 63 74 20 2a 70 4e 65 77 2c 20 2a 70 50  elect *pNew, *pP
8190: 72 69 6f 72 3b 0a 20 20 69 66 28 20 70 3d 3d 30  rior;.  if( p==0
81a0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
81b0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
81c0: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
81d0: 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
81e0: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
81f0: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c  n 0;.  pNew->pEL
8200: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
8210: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
8220: 70 45 4c 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a  pEList, flags);.
8230: 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73    pNew->pSrc = s
8240: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
8250: 28 64 62 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c  (db, p->pSrc, fl
8260: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57  ags);.  pNew->pW
8270: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
8280: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 68  prDup(db, p->pWh
8290: 65 72 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  ere, flags);.  p
82a0: 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  New->pGroupBy = 
82b0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
82c0: 75 70 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70  up(db, p->pGroup
82d0: 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  By, flags);.  pN
82e0: 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71  ew->pHaving = sq
82f0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
8300: 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61   p->pHaving, fla
8310: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72  gs);.  pNew->pOr
8320: 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
8330: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
8340: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 66 6c 61 67  ->pOrderBy, flag
8350: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  s);.  pNew->op =
8360: 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e   p->op;.  pNew->
8370: 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 20  pPrior = pPrior 
8380: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
8390: 75 70 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72  up(db, p->pPrior
83a0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20  , flags);.  if( 
83b0: 70 50 72 69 6f 72 20 29 20 70 50 72 69 6f 72 2d  pPrior ) pPrior-
83c0: 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20  >pNext = pNew;. 
83d0: 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30   pNew->pNext = 0
83e0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74  ;.  pNew->pLimit
83f0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
8400: 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c  p(db, p->pLimit,
8410: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
8420: 3e 70 4f 66 66 73 65 74 20 3d 20 73 71 6c 69 74  >pOffset = sqlit
8430: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
8440: 3e 70 4f 66 66 73 65 74 2c 20 66 6c 61 67 73 29  >pOffset, flags)
8450: 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74  ;.  pNew->iLimit
8460: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f   = 0;.  pNew->iO
8470: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4e 65  ffset = 0;.  pNe
8480: 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d  w->selFlags = p-
8490: 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e 53 46 5f  >selFlags & ~SF_
84a0: 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
84b0: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d 6f 73   pNew->pRightmos
84c0: 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 61  t = 0;.  pNew->a
84d0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
84e0: 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64   -1;.  pNew->add
84f0: 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d  rOpenEphm[1] = -
8500: 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  1;.  pNew->addrO
8510: 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b  penEphm[2] = -1;
8520: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
8530: 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a  }.#else.Select *
8540: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
8550: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65  (sqlite3 *db, Se
8560: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61  lect *p, int fla
8570: 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  gs){.  assert( p
8580: 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
8590: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  0;.}.#endif.../*
85a0: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
85b0: 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e 64  ement to the end
85c0: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
85d0: 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69 73  n list.  If pLis
85e0: 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c  t is.** initiall
85f0: 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65  y NULL, then cre
8600: 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65 73  ate a new expres
8610: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
8620: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
8630: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63  ocation error oc
8640: 63 75 72 73 2c 20 74 68 65 20 65 6e 74 69 72 65  curs, the entire
8650: 20 6c 69 73 74 20 69 73 20 66 72 65 65 64 20 61   list is freed a
8660: 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65  nd.** NULL is re
8670: 74 75 72 6e 65 64 2e 20 20 49 66 20 6e 6f 6e 2d  turned.  If non-
8680: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
8690: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61  , then it is gua
86a0: 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68 61 74 20  ranteed.** that 
86b0: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 61  the new entry wa
86c0: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61  s successfully a
86d0: 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70 72  ppended..*/.Expr
86e0: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70  List *sqlite3Exp
86f0: 72 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 50  rListAppend(.  P
8700: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
8710: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
8720: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
8730: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
8740: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
8750: 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e  o which to appen
8760: 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  d. Might be NULL
8770: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
8780: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r             /*
8790: 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62   Expression to b
87a0: 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69 67 68  e appended. Migh
87b0: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
87c0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
87d0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
87e0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
87f0: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
8800: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
8810: 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73  , sizeof(ExprLis
8820: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
8830: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
8840: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
8850: 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20   }.    pList->a 
8860: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
8870: 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
8880: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
8890: 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 3d     if( pList->a=
88a0: 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  =0 ) goto no_mem
88b0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70  ;.  }else if( (p
88c0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26 20 28 70  List->nExpr & (p
88d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 29 3d  List->nExpr-1))=
88e0: 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  =0 ){.    struct
88f0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
8900: 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  a;.    assert( p
8910: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
8920: 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33  .    a = sqlite3
8930: 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c  DbRealloc(db, pL
8940: 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e  ist->a, pList->n
8950: 45 78 70 72 2a 32 2a 73 69 7a 65 6f 66 28 70 4c  Expr*2*sizeof(pL
8960: 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20  ist->a[0]));.   
8970: 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20   if( a==0 ){.   
8980: 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
8990: 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d      }.    pList-
89a0: 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 61 73  >a = a;.  }.  as
89b0: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d  sert( pList->a!=
89c0: 30 20 29 3b 0a 20 20 69 66 28 20 31 20 29 7b 0a  0 );.  if( 1 ){.
89d0: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
89e0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
89f0: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
8a00: 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20  t->nExpr++];.   
8a10: 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30   memset(pItem, 0
8a20: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29  , sizeof(*pItem)
8a30: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45  );.    pItem->pE
8a40: 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d  xpr = pExpr;.  }
8a50: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
8a60: 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20  ..no_mem:     . 
8a70: 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e   /* Avoid leakin
8a80: 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c  g memory if mall
8a90: 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a  oc has failed. *
8aa0: 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  /.  sqlite3ExprD
8ab0: 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
8ac0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
8ad0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
8ae0: 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ist);.  return 0
8af0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
8b00: 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e  he ExprList.a[].
8b10: 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20 6f 66  zName element of
8b20: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
8b30: 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a  ly added item.**
8b40: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
8b50: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70  on list..**.** p
8b60: 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55  List might be NU
8b70: 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20  LL following an 
8b80: 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20  OOM error.  But 
8b90: 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 65 76  pName should nev
8ba0: 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20  er be.** NULL.  
8bb0: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
8bc0: 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68  cation fails, th
8bd0: 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  e pParse->db->ma
8be0: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a  llocFailed flag.
8bf0: 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f  ** is set..*/.vo
8c00: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
8c10: 73 74 53 65 74 4e 61 6d 65 28 0a 20 20 50 61 72  stSetName(.  Par
8c20: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
8c30: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
8c40: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
8c50: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
8c60: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
8c70: 77 68 69 63 68 20 74 6f 20 61 64 64 20 74 68 65  which to add the
8c80: 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65   span. */.  Toke
8c90: 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20  n *pName,       
8ca0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f 20 62      /* Name to b
8cb0: 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74  e added */.  int
8cc0: 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20   dequote        
8cd0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
8ce0: 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65 20 74  cause the name t
8cf0: 6f 20 62 65 20 64 65 71 75 6f 74 65 64 20 2a 2f  o be dequoted */
8d00: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  .){.  assert( pL
8d10: 69 73 74 21 3d 30 20 7c 7c 20 70 50 61 72 73 65  ist!=0 || pParse
8d20: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
8d30: 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
8d40: 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75  List ){.    stru
8d50: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
8d60: 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 73 73   *pItem;.    ass
8d70: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
8d80: 72 3e 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d  r>0 );.    pItem
8d90: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
8da0: 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20  st->nExpr-1];.  
8db0: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
8dc0: 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20  >zName==0 );.   
8dd0: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
8de0: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
8df0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61  (pParse->db, pNa
8e00: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29  me->z, pName->n)
8e10: 3b 0a 20 20 20 20 69 66 28 20 64 65 71 75 6f 74  ;.    if( dequot
8e20: 65 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  e && pItem->zNam
8e30: 65 20 29 20 73 71 6c 69 74 65 33 44 65 71 75 6f  e ) sqlite3Dequo
8e40: 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  te(pItem->zName)
8e50: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
8e60: 65 74 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e  et the ExprList.
8e70: 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d 65 6e  a[].zSpan elemen
8e80: 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  t of the most re
8e90: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65  cently added ite
8ea0: 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72  m.** on the expr
8eb0: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
8ec0: 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62  ** pList might b
8ed0: 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67  e NULL following
8ee0: 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20   an OOM error.  
8ef0: 42 75 74 20 70 53 70 61 6e 20 73 68 6f 75 6c 64  But pSpan should
8f00: 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c   never be.** NUL
8f10: 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  L.  If a memory 
8f20: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
8f30: 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62  , the pParse->db
8f40: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
8f50: 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a  lag.** is set..*
8f60: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
8f70: 70 72 4c 69 73 74 53 65 74 53 70 61 6e 28 0a 20  prListSetSpan(. 
8f80: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
8f90: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
8fa0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
8fb0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
8fc0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ,        /* List
8fd0: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64   to which to add
8fe0: 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20   the span. */.  
8ff0: 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61 6e 20  ExprSpan *pSpan 
9000: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
9010: 70 61 6e 20 74 6f 20 62 65 20 61 64 64 65 64 20  pan to be added 
9020: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
9030: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
9040: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
9050: 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  t!=0 || db->mall
9060: 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20  ocFailed!=0 );. 
9070: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
9080: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
9090: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
90a0: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
90b0: 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61  >nExpr-1];.    a
90c0: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
90d0: 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  xpr>0 );.    ass
90e0: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
90f0: 61 69 6c 65 64 20 7c 7c 20 70 49 74 65 6d 2d 3e  ailed || pItem->
9100: 70 45 78 70 72 3d 3d 70 53 70 61 6e 2d 3e 70 45  pExpr==pSpan->pE
9110: 78 70 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  xpr );.    sqlit
9120: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
9130: 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  em->zSpan);.    
9140: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73  pItem->zSpan = s
9150: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
9160: 64 62 2c 20 28 63 68 61 72 2a 29 70 53 70 61 6e  db, (char*)pSpan
9170: 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20 20 20  ->zStart,.      
9180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
91a0: 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20  nt)(pSpan->zEnd 
91b0: 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29  - pSpan->zStart)
91c0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
91d0: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
91e0: 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20 63 6f  n list pEList co
91f0: 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e  ntains more than
9200: 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73   iLimit elements
9210: 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72  ,.** leave an er
9220: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
9230: 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Parse..*/.void s
9240: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 68  qlite3ExprListCh
9250: 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61 72  eckLength(.  Par
9260: 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 45 78  se *pParse,.  Ex
9270: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a  prList *pEList,.
9280: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
9290: 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74 20 6d  bject.){.  int m
92a0: 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  x = pParse->db->
92b0: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
92c0: 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74  MIT_COLUMN];.  t
92d0: 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20  estcase( pEList 
92e0: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
92f0: 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74 63 61  ==mx );.  testca
9300: 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  se( pEList && pE
9310: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b  List->nExpr==mx+
9320: 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  1 );.  if( pELis
9330: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
9340: 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73 71 6c  pr>mx ){.    sql
9350: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
9360: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63  rse, "too many c
9370: 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a  olumns in %s", z
9380: 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  Object);.  }.}..
9390: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
93a0: 65 6e 74 69 72 65 20 65 78 70 72 65 73 73 69 6f  entire expressio
93b0: 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  n list..*/.void 
93c0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
93d0: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
93e0: 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  b, ExprList *pLi
93f0: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
9400: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
9410: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
9420: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
9430: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
9440: 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 70  pList->a!=0 || p
9450: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 29  List->nExpr==0 )
9460: 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
9470: 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70  ist->a, i=0; i<p
9480: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
9490: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
94a0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
94b0: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78  e(db, pItem->pEx
94c0: 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pr);.    sqlite3
94d0: 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
94e0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ->zName);.    sq
94f0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9500: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20  pItem->zSpan);. 
9510: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
9520: 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29  ee(db, pList->a)
9530: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
9540: 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a  e(db, pList);.}.
9550: 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  ./*.** These rou
9560: 74 69 6e 65 73 20 61 72 65 20 57 61 6c 6b 65 72  tines are Walker
9570: 20 63 61 6c 6c 62 61 63 6b 73 2e 20 20 57 61 6c   callbacks.  Wal
9580: 6b 65 72 2e 75 2e 70 69 20 69 73 20 61 20 70 6f  ker.u.pi is a po
9590: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 69  inter.** to an i
95a0: 6e 74 65 67 65 72 2e 20 20 54 68 65 73 65 20 72  nteger.  These r
95b0: 6f 75 74 69 6e 65 73 20 61 72 65 20 63 68 65 63  outines are chec
95c0: 6b 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73 69  king an expressi
95d0: 6f 6e 20 74 6f 20 73 65 65 0a 2a 2a 20 69 66 20  on to see.** if 
95e0: 69 74 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  it is a constant
95f0: 2e 20 20 53 65 74 20 2a 57 61 6c 6b 65 72 2e 75  .  Set *Walker.u
9600: 2e 70 69 20 74 6f 20 30 20 69 66 20 74 68 65 20  .pi to 0 if the 
9610: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a  expression is.**
9620: 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a   not constant..*
9630: 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 62  *.** These callb
9640: 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ack routines are
9650: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
9660: 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  nt the following
9670: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69  :.**.**     sqli
9680: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
9690: 74 28 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  t().**     sqlit
96a0: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
96b0: 4e 6f 74 4a 6f 69 6e 28 29 0a 2a 2a 20 20 20 20  NotJoin().**    
96c0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
96d0: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
96e0: 28 29 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  ().**.*/.static 
96f0: 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  int exprNodeIsCo
9700: 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70  nstant(Walker *p
9710: 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
9720: 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70  xpr){..  /* If p
9730: 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 69 73 20 33  Walker->u.i is 3
9740: 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d 20 6f   then any term o
9750: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
9760: 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72 6f 6d   that comes from
9770: 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20  .  ** the ON or 
9780: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
9790: 20 61 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69   a join disquali
97a0: 66 69 65 73 20 74 68 65 20 65 78 70 72 65 73 73  fies the express
97b0: 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65  ion.  ** from be
97c0: 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 63  ing considered c
97d0: 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66  onstant. */.  if
97e0: 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d  ( pWalker->u.i==
97f0: 33 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70  3 && ExprHasProp
9800: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
9810: 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20  romJoin) ){.    
9820: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30  pWalker->u.i = 0
9830: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  ;.    return WRC
9840: 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73  _Abort;.  }..  s
9850: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
9860: 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69   ){.    /* Consi
9870: 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  der functions to
9880: 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20   be constant if 
9890: 61 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65  all their argume
98a0: 6e 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74  nts are constant
98b0: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 70 57 61 6c  .    ** and pWal
98c0: 6b 65 72 2d 3e 75 2e 69 3d 3d 32 20 2a 2f 0a 20  ker->u.i==2 */. 
98d0: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
98e0: 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70  ION:.      if( p
98f0: 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 32 20 29  Walker->u.i==2 )
9900: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
9910: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
9920: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
9930: 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ID:.    case TK_
9940: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
9950: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
9960: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  :.    case TK_AG
9970: 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20  G_COLUMN:.      
9980: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
9990: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20  >op==TK_ID );.  
99a0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
99b0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
99c0: 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MN );.      test
99d0: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
99e0: 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
99f0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
9a00: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
9a10: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
9a20: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 75        pWalker->u
9a30: 2e 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  .i = 0;.      re
9a40: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
9a50: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
9a60: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
9a70: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
9a80: 54 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f  T ); /* selectNo
9a90: 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c  deIsConstant wil
9aa0: 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20  l disallow */.  
9ab0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
9ac0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53  xpr->op==TK_EXIS
9ad0: 54 53 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e  TS ); /* selectN
9ae0: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69  odeIsConstant wi
9af0: 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20  ll disallow */. 
9b00: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
9b10: 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a  Continue;.  }.}.
9b20: 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63  static int selec
9b30: 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28  tNodeIsConstant(
9b40: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
9b50: 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64   Select *NotUsed
9b60: 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
9b70: 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
9b80: 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d    pWalker->u.i =
9b90: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43   0;.  return WRC
9ba0: 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74 61 74 69 63  _Abort;.}.static
9bb0: 20 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74   int exprIsConst
9bc0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e  (Expr *p, int in
9bd0: 69 74 46 6c 61 67 29 7b 0a 20 20 57 61 6c 6b 65  itFlag){.  Walke
9be0: 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77  r w;.  memset(&w
9bf0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b  , 0, sizeof(w));
9c00: 0a 20 20 77 2e 75 2e 69 20 3d 20 69 6e 69 74 46  .  w.u.i = initF
9c10: 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  lag;.  w.xExprCa
9c20: 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64  llback = exprNod
9c30: 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77  eIsConstant;.  w
9c40: 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
9c50: 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43   = selectNodeIsC
9c60: 6f 6e 73 74 61 6e 74 3b 0a 20 20 73 71 6c 69 74  onstant;.  sqlit
9c70: 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
9c80: 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 75 2e  );.  return w.u.
9c90: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  i;.}../*.** Walk
9ca0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
9cb0: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69  ree.  Return 1 i
9cc0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
9cd0: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
9ce0: 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f  and 0 if it invo
9cf0: 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f  lves variables o
9d00: 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  r function calls
9d10: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
9d20: 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
9d30: 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75   function, a dou
9d40: 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
9d50: 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a  g (ex: "abc").**
9d60: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
9d70: 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20   variable but a 
9d80: 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74  single-quoted st
9d90: 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29  ring (ex: 'abc')
9da0: 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e   is.** a constan
9db0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
9dc0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
9dd0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
9de0: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
9df0: 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  , 1);.}../*.** W
9e00: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
9e10: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
9e20: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
9e30: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
9e40: 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 20  ** that does no 
9e50: 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d 20 74  originate from t
9e60: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
9e70: 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e  lauses of a join
9e80: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66  ..** Return 0 if
9e90: 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72   it involves var
9ea0: 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69  iables or functi
9eb0: 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65 72 6d  on calls or term
9ec0: 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e 20  s from.** an ON 
9ed0: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  or USING clause.
9ee0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
9ef0: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
9f00: 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20  Join(Expr *p){. 
9f10: 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f   return exprIsCo
9f20: 6e 73 74 28 70 2c 20 33 29 3b 0a 7d 0a 0a 2f 2a  nst(p, 3);.}../*
9f30: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
9f40: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
9f50: 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78  turn 1 if the ex
9f60: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
9f70: 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e  tant.** or a fun
9f80: 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20  ction call with 
9f90: 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e  constant argumen
9fa0: 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20  ts.  Return and 
9fb0: 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72  0 if there.** ar
9fc0: 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e  e any variables.
9fd0: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
9fe0: 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20  urposes of this 
9ff0: 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62  function, a doub
a000: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
a010: 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20   (ex: "abc").** 
a020: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
a030: 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73  variable but a s
a040: 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ingle-quoted str
a050: 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20  ing (ex: 'abc') 
a060: 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74  is.** a constant
a070: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
a080: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
a090: 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70  Function(Expr *p
a0a0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
a0b0: 49 73 43 6f 6e 73 74 28 70 2c 20 32 29 3b 0a 7d  IsConst(p, 2);.}
a0c0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ../*.** If the e
a0d0: 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65  xpression p code
a0e0: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74  s a constant int
a0f0: 65 67 65 72 20 74 68 61 74 20 69 73 20 73 6d 61  eger that is sma
a100: 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20  ll enough.** to 
a110: 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20  fit in a 32-bit 
a120: 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20  integer, return 
a130: 31 20 61 6e 64 20 70 75 74 20 74 68 65 20 76 61  1 and put the va
a140: 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67  lue of the integ
a150: 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65  er.** in *pValue
a160: 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73  .  If the expres
a170: 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69  sion is not an i
a180: 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69 74 20  nteger or if it 
a190: 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f  is too big.** to
a1a0: 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64   fit in a signed
a1b0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
a1c0: 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65   return 0 and le
a1d0: 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68  ave *pValue unch
a1e0: 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
a1f0: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
a200: 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  er(Expr *p, int 
a210: 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20  *pValue){.  int 
a220: 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66  rc = 0;..  /* If
a230: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69   an expression i
a240: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6c 69 74  s an integer lit
a250: 65 72 61 6c 20 74 68 61 74 20 66 69 74 73 20 69  eral that fits i
a260: 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69  n a signed 32-bi
a270: 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20  t.  ** integer, 
a280: 74 68 65 6e 20 74 68 65 20 45 50 5f 49 6e 74 56  then the EP_IntV
a290: 61 6c 75 65 20 66 6c 61 67 20 77 69 6c 6c 20 68  alue flag will h
a2a0: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
a2b0: 20 73 65 74 20 2a 2f 0a 20 20 61 73 73 65 72 74   set */.  assert
a2c0: 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45  ( p->op!=TK_INTE
a2d0: 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73  GER || (p->flags
a2e0: 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 21   & EP_IntValue)!
a2f0: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
a300: 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
a310: 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72  (p->u.zToken, &r
a320: 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  c)==0 );..  if( 
a330: 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  p->flags & EP_In
a340: 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70  tValue ){.    *p
a350: 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61  Value = p->u.iVa
a360: 6c 75 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  lue;.    return 
a370: 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  1;.  }.  switch(
a380: 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61   p->op ){.    ca
a390: 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20  se TK_UPLUS: {. 
a3a0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
a3b0: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
a3c0: 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29  ->pLeft, pValue)
a3d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a3e0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
a3f0: 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
a400: 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66   int v;.      if
a410: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
a420: 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c  nteger(p->pLeft,
a430: 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20   &v) ){.        
a440: 61 73 73 65 72 74 28 20 76 21 3d 28 2d 32 31 34  assert( v!=(-214
a450: 37 34 38 33 36 34 37 2d 31 29 20 29 3b 0a 20 20  7483647-1) );.  
a460: 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20        *pValue = 
a470: 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  -v;.        rc =
a480: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
a490: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
a4a0: 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61     default: brea
a4b0: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
a4c0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
a4d0: 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65  urn FALSE if the
a4e0: 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
a4f0: 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73  that the express
a500: 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e  ion can be NULL.
a510: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
a520: 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 62  pression might b
a530: 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65  e NULL or if the
a540: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
a550: 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f  oo complex.** to
a560: 20 74 65 6c 6c 20 72 65 74 75 72 6e 20 54 52 55   tell return TRU
a570: 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  E.  .**.** This 
a580: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
a590: 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  as an optimizati
a5a0: 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f 49  on, to skip OP_I
a5b0: 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a  sNull opcodes.**
a5c0: 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74 68   when we know th
a5d0: 61 74 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f  at a value canno
a5e0: 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e 63  t be NULL.  Henc
a5f0: 65 2c 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74  e, a false posit
a600: 69 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e  ive.** (returnin
a610: 67 20 54 52 55 45 20 77 68 65 6e 20 69 6e 20 66  g TRUE when in f
a620: 61 63 74 20 74 68 65 20 65 78 70 72 65 73 73 69  act the expressi
a630: 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20  on can never be 
a640: 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20 62  NULL) might.** b
a650: 65 20 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f 72  e a small perfor
a660: 6d 61 6e 63 65 20 68 69 74 20 62 75 74 20 69 73  mance hit but is
a670: 20 6f 74 68 65 72 77 69 73 65 20 68 61 72 6d 6c   otherwise harml
a680: 65 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68  ess.  On the oth
a690: 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66 61  er.** hand, a fa
a6a0: 6c 73 65 20 6e 65 67 61 74 69 76 65 20 28 72 65  lse negative (re
a6b0: 74 75 72 6e 69 6e 67 20 46 41 4c 53 45 20 77 68  turning FALSE wh
a6c0: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  en the result co
a6d0: 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20  uld be NULL).** 
a6e0: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75  will likely resu
a6f0: 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65  lt in an incorre
a700: 63 74 20 61 6e 73 77 65 72 2e 20 20 53 6f 20 77  ct answer.  So w
a710: 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65  hen in doubt, re
a720: 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f  turn.** TRUE..*/
a730: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
a740: 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74 20  CanBeNull(const 
a750: 45 78 70 72 20 2a 70 29 7b 0a 20 20 75 38 20 6f  Expr *p){.  u8 o
a760: 70 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f  p;.  while( p->o
a770: 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70  p==TK_UPLUS || p
a780: 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20  ->op==TK_UMINUS 
a790: 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b  ){ p = p->pLeft;
a7a0: 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b   }.  op = p->op;
a7b0: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45  .  if( op==TK_RE
a7c0: 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d  GISTER ) op = p-
a7d0: 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20  >op2;.  switch( 
a7e0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
a7f0: 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63  K_INTEGER:.    c
a800: 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20  ase TK_STRING:. 
a810: 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
a820: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  :.    case TK_BL
a830: 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  OB:.      return
a840: 20 30 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   0;.    default:
a850: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
a860: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
a870: 6e 65 72 61 74 65 20 61 6e 20 4f 50 5f 49 73 4e  nerate an OP_IsN
a880: 75 6c 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ull instruction 
a890: 74 68 61 74 20 74 65 73 74 73 20 72 65 67 69 73  that tests regis
a8a0: 74 65 72 20 69 52 65 67 20 61 6e 64 20 6a 75 6d  ter iReg and jum
a8b0: 70 73 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 69 6f  ps.** to locatio
a8c0: 6e 20 69 44 65 73 74 20 69 66 20 74 68 65 20 76  n iDest if the v
a8d0: 61 6c 75 65 20 69 6e 20 69 52 65 67 20 69 73 20  alue in iReg is 
a8e0: 4e 55 4c 4c 2e 20 20 54 68 65 20 76 61 6c 75 65  NULL.  The value
a8f0: 20 69 6e 20 69 52 65 67 20 0a 2a 2a 20 77 61 73   in iReg .** was
a900: 20 63 6f 6d 70 75 74 65 64 20 62 79 20 70 45 78   computed by pEx
a910: 70 72 2e 20 20 49 66 20 77 65 20 63 61 6e 20 6c  pr.  If we can l
a920: 6f 6f 6b 20 61 74 20 70 45 78 70 72 20 61 74 20  ook at pExpr at 
a930: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 61 6e 64  compile-time and
a940: 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 20 74 68  .** determine th
a950: 61 74 20 69 74 20 63 61 6e 20 6e 65 76 65 72 20  at it can never 
a960: 67 65 6e 65 72 61 74 65 20 61 20 4e 55 4c 4c 2c  generate a NULL,
a970: 20 74 68 65 6e 20 74 68 65 20 4f 50 5f 49 73 4e   then the OP_IsN
a980: 75 6c 6c 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a  ull operation.**
a990: 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e   can be omitted.
a9a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
a9b0: 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75  ExprCodeIsNullJu
a9c0: 6d 70 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20  mp(.  Vdbe *v,  
a9d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a9e0: 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73   VDBE under cons
a9f0: 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f  truction */.  co
aa00: 6e 73 74 20 45 78 70 72 20 2a 70 45 78 70 72 2c  nst Expr *pExpr,
aa10: 20 20 2f 2a 20 4f 6e 6c 79 20 67 65 6e 65 72 61    /* Only genera
aa20: 74 65 20 4f 50 5f 49 73 4e 75 6c 6c 20 69 66 20  te OP_IsNull if 
aa30: 74 68 69 73 20 65 78 70 72 20 63 61 6e 20 62 65  this expr can be
aa40: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69   NULL */.  int i
aa50: 52 65 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Reg,           /
aa60: 2a 20 54 65 73 74 20 74 68 65 20 76 61 6c 75 65  * Test the value
aa70: 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65   in this registe
aa80: 72 20 66 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  r for NULL */.  
aa90: 69 6e 74 20 69 44 65 73 74 20 20 20 20 20 20 20  int iDest       
aaa0: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
aab0: 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73   if the value is
aac0: 20 6e 75 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 66   null */.){.  if
aad0: 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  ( sqlite3ExprCan
aae0: 42 65 4e 75 6c 6c 28 70 45 78 70 72 29 20 29 7b  BeNull(pExpr) ){
aaf0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
ab00: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
ab10: 75 6c 6c 2c 20 69 52 65 67 2c 20 69 44 65 73 74  ull, iReg, iDest
ab20: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
ab30: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
ab40: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
ab50: 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  ion is a constan
ab60: 74 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65  t which would be
ab70: 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 62 79  .** unchanged by
ab80: 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 77 69 74   OP_Affinity wit
ab90: 68 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 67  h the affinity g
aba0: 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f  iven in the seco
abb0: 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  nd.** argument..
abc0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
abd0: 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  ne is used to de
abe0: 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4f  termine if the O
abf0: 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 65 72 61  P_Affinity opera
ac00: 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f  tion.** can be o
ac10: 6d 69 74 74 65 64 2e 20 20 57 68 65 6e 20 69 6e  mitted.  When in
ac20: 20 64 6f 75 62 74 20 72 65 74 75 72 6e 20 46 41   doubt return FA
ac30: 4c 53 45 2e 20 20 41 20 66 61 6c 73 65 20 6e 65  LSE.  A false ne
ac40: 67 61 74 69 76 65 0a 2a 2a 20 69 73 20 68 61 72  gative.** is har
ac50: 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c 73 65 20  mless.  A false 
ac60: 70 6f 73 69 74 69 76 65 2c 20 68 6f 77 65 76 65  positive, howeve
ac70: 72 2c 20 63 61 6e 20 72 65 73 75 6c 74 20 69 6e  r, can result in
ac80: 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e   the wrong.** an
ac90: 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  swer..*/.int sql
aca0: 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41  ite3ExprNeedsNoA
acb0: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 63 6f  ffinityChange(co
acc0: 6e 73 74 20 45 78 70 72 20 2a 70 2c 20 63 68 61  nst Expr *p, cha
acd0: 72 20 61 66 66 29 7b 0a 20 20 75 38 20 6f 70 3b  r aff){.  u8 op;
ace0: 0a 20 20 69 66 28 20 61 66 66 3d 3d 53 51 4c 49  .  if( aff==SQLI
acf0: 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 20 72 65  TE_AFF_NONE ) re
ad00: 74 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65 28  turn 1;.  while(
ad10: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53   p->op==TK_UPLUS
ad20: 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d   || p->op==TK_UM
ad30: 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70  INUS ){ p = p->p
ad40: 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70  Left; }.  op = p
ad50: 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
ad60: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
ad70: 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69   = p->op2;.  swi
ad80: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
ad90: 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
ada0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
adb0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ff==SQLITE_AFF_I
adc0: 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53  NTEGER || aff==S
add0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
ade0: 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  C;.    }.    cas
adf0: 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  e TK_FLOAT: {.  
ae00: 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d      return aff==
ae10: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
ae20: 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
ae30: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20  FF_NUMERIC;.    
ae40: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  }.    case TK_ST
ae50: 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72 65  RING: {.      re
ae60: 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45  turn aff==SQLITE
ae70: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d  _AFF_TEXT;.    }
ae80: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
ae90: 42 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  B: {.      retur
aea0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
aeb0: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
aec0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
aed0: 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20 20  ->iTable>=0 );  
aee0: 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65 20 70  /* p cannot be p
aef0: 61 72 74 20 6f 66 20 61 20 43 48 45 43 4b 20 63  art of a CHECK c
af00: 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
af10: 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 43 6f     return p->iCo
af20: 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20 20  lumn<0.         
af30: 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45   && (aff==SQLITE
af40: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20  _AFF_INTEGER || 
af50: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
af60: 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d 0a  NUMERIC);.    }.
af70: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
af80: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
af90: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
afa0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
afb0: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
afc0: 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f  g is a row-id co
afd0: 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e  lumn name..*/.in
afe0: 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64  t sqlite3IsRowid
aff0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
b000: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
b010: 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44  rICmp(z, "_ROWID
b020: 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  _")==0 ) return 
b030: 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
b040: 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49  StrICmp(z, "ROWI
b050: 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  D")==0 ) return 
b060: 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
b070: 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22  StrICmp(z, "OID"
b080: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
b090: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
b0a0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
b0b0: 65 20 69 66 20 77 65 20 61 72 65 20 61 62 6c 65  e if we are able
b0c0: 20 74 6f 20 74 68 65 20 49 4e 20 6f 70 65 72 61   to the IN opera
b0d0: 74 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  tor optimization
b0e0: 20 6f 6e 20 61 0a 2a 2a 20 71 75 65 72 79 20 6f   on a.** query o
b0f0: 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a  f the form.**.**
b100: 20 20 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c         x IN (SEL
b110: 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 57  ECT ...).**.** W
b120: 68 65 72 65 20 74 68 65 20 53 45 4c 45 43 54 2e  here the SELECT.
b130: 2e 2e 20 63 6c 61 75 73 65 20 69 73 20 61 73 20  .. clause is as 
b140: 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65  specified by the
b150: 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68   parameter to th
b160: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 0a 2a  is.** routine..*
b170: 2a 0a 2a 2a 20 54 68 65 20 53 65 6c 65 63 74 20  *.** The Select 
b180: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 69 6e  object passed in
b190: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
b1a0: 6e 20 70 72 65 70 72 6f 63 65 73 73 65 64 20 61  n preprocessed a
b1b0: 6e 64 20 6e 6f 0a 2a 2a 20 65 72 72 6f 72 73 20  nd no.** errors 
b1c0: 68 61 76 65 20 62 65 65 6e 20 66 6f 75 6e 64 2e  have been found.
b1d0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
b1e0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
b1f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 43 61  .static int isCa
b200: 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
b210: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72  Select *p){.  Sr
b220: 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45  cList *pSrc;.  E
b230: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
b240: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
b250: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
b260: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
b270: 20 20 20 20 20 20 20 20 20 2f 2a 20 72 69 67 68           /* righ
b280: 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 49  t-hand side of I
b290: 4e 20 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20  N is SELECT */. 
b2a0: 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
b2b0: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
b2c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61          /* Not a
b2d0: 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
b2e0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
b2f0: 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
b300: 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
b310: 65 29 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61  e) ){.    testca
b320: 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  se( (p->selFlags
b330: 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
b340: 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
b350: 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  SF_Distinct );. 
b360: 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 2d     testcase( (p-
b370: 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
b380: 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
b390: 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72  egate))==SF_Aggr
b3a0: 65 67 61 74 65 20 29 3b 0a 20 20 20 20 72 65 74  egate );.    ret
b3b0: 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53  urn 0; /* No DIS
b3c0: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 61 6e  TINCT keyword an
b3d0: 64 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66  d no aggregate f
b3e0: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a  unctions */.  }.
b3f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72    assert( p->pGr
b400: 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20 20 20 20  oupBy==0 );     
b410: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20           /* Has 
b420: 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  no GROUP BY clau
b430: 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  se */.  if( p->p
b440: 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30  Limit ) return 0
b450: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
b460: 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63  * Has no LIMIT c
b470: 6c 61 75 73 65 20 2a 2f 0a 20 20 61 73 73 65 72  lause */.  asser
b480: 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30  t( p->pOffset==0
b490: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
b4a0: 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54 20 6d 65    /* No LIMIT me
b4b0: 61 6e 73 20 6e 6f 20 4f 46 46 53 45 54 20 2a 2f  ans no OFFSET */
b4c0: 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65  .  if( p->pWhere
b4d0: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
b4e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
b4f0: 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
b500: 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   */.  pSrc = p->
b510: 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
b520: 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66 28  pSrc!=0 );.  if(
b530: 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29   pSrc->nSrc!=1 )
b540: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
b550: 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 74 65      /* Single te
b560: 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73  rm in FROM claus
b570: 65 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d  e */.  if( pSrc-
b580: 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29 20  >a[0].pSelect ) 
b590: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a  return 0;     /*
b5a0: 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61 20 73   FROM is not a s
b5b0: 75 62 71 75 65 72 79 20 6f 72 20 76 69 65 77 20  ubquery or view 
b5c0: 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63  */.  pTab = pSrc
b5d0: 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 69  ->a[0].pTab;.  i
b5e0: 66 28 20 4e 45 56 45 52 28 70 54 61 62 3d 3d 30  f( NEVER(pTab==0
b5f0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
b600: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70 53  assert( pTab->pS
b610: 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20 20 20  elect==0 );     
b620: 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63         /* FROM c
b630: 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61 20 76  lause is not a v
b640: 69 65 77 20 2a 2f 0a 20 20 69 66 28 20 49 73 56  iew */.  if( IsV
b650: 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72  irtual(pTab) ) r
b660: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
b670: 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e  /* FROM clause n
b680: 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ot a virtual tab
b690: 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d  le */.  pEList =
b6a0: 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66   p->pEList;.  if
b6b0: 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ( pEList->nExpr!
b6c0: 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =1 ) return 0;  
b6d0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 6f 6c 75       /* One colu
b6e0: 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  mn in the result
b6f0: 20 73 65 74 20 2a 2f 0a 20 20 69 66 28 20 70 45   set */.  if( pE
b700: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
b710: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
b720: 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52  ) return 0; /* R
b730: 65 73 75 6c 74 20 69 73 20 61 20 63 6f 6c 75 6d  esult is a colum
b740: 6e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b  n */.  return 1;
b750: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
b760: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
b770: 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  Y */../*.** Code
b780: 20 61 6e 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74   an OP_Once inst
b790: 72 75 63 74 69 6f 6e 20 61 6e 64 20 61 6c 6c 6f  ruction and allo
b7a0: 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 69  cate space for i
b7b0: 74 73 20 66 6c 61 67 2e 20 52 65 74 75 72 6e 20  ts flag. Return 
b7c0: 74 68 65 20 0a 2a 2a 20 61 64 64 72 65 73 73 20  the .** address 
b7d0: 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72  of the new instr
b7e0: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  uction..*/.int s
b7f0: 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 50  qlite3CodeOnce(P
b800: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
b810: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
b820: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
b830: 29 3b 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75  );      /* Virtu
b840: 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67  al machine being
b850: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 72 65 74 75   coded */.  retu
b860: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
b870: 64 4f 70 31 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c  dOp1(v, OP_Once,
b880: 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 2b 2b   pParse->nOnce++
b890: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
b8a0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
b8b0: 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65  d by the impleme
b8c0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49  ntation of the I
b8d0: 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72  N (...) operator
b8e0: 2e 0a 2a 2a 20 54 68 65 20 70 58 20 70 61 72 61  ..** The pX para
b8f0: 6d 65 74 65 72 20 69 73 20 74 68 65 20 65 78 70  meter is the exp
b900: 72 65 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20 52  ression on the R
b910: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
b920: 72 61 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a 20  rator, which.** 
b930: 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72 20  might be either 
b940: 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73  a list of expres
b950: 73 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 71 75  sions or a subqu
b960: 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  ery..**.** The j
b970: 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ob of this routi
b980: 6e 65 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72  ne is to find or
b990: 20 63 72 65 61 74 65 20 61 20 62 2d 74 72 65 65   create a b-tree
b9a0: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63 61 6e   object that can
b9b0: 0a 2a 2a 20 62 65 20 75 73 65 64 20 65 69 74 68  .** be used eith
b9c0: 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6d  er to test for m
b9d0: 65 6d 62 65 72 73 68 69 70 20 69 6e 20 74 68 65  embership in the
b9e0: 20 52 48 53 20 73 65 74 20 6f 72 20 74 6f 20 69   RHS set or to i
b9f0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a  terate through.*
ba00: 2a 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66  * all members of
ba10: 20 74 68 65 20 52 48 53 20 73 65 74 2c 20 73 6b   the RHS set, sk
ba20: 69 70 70 69 6e 67 20 64 75 70 6c 69 63 61 74 65  ipping duplicate
ba30: 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73 6f  s..**.** A curso
ba40: 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74  r is opened on t
ba50: 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74  he b-tree object
ba60: 20 74 68 61 74 20 74 68 65 20 52 48 53 20 6f 66   that the RHS of
ba70: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
ba80: 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e 69 54 61 62  .** and pX->iTab
ba90: 6c 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  le is set to the
baa0: 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63   index of that c
bab0: 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ursor..**.** The
bac0: 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
bad0: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
bae0: 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20 62   indicates the b
baf0: 2d 74 72 65 65 20 74 79 70 65 2c 20 61 73 20 66  -tree type, as f
bb00: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
bb10: 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 20  IN_INDEX_ROWID  
bb20: 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72      - The cursor
bb30: 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
bb40: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e   database table.
bb50: 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49  .**   IN_INDEX_I
bb60: 4e 44 45 58 5f 41 53 43 20 20 2d 20 54 68 65 20  NDEX_ASC  - The 
bb70: 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65  cursor was opene
bb80: 64 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e  d on an ascendin
bb90: 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e  g index..**   IN
bba0: 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53  _INDEX_INDEX_DES
bbb0: 43 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77  C - The cursor w
bbc0: 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64  as opened on a d
bbd0: 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e  escending index.
bbe0: 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45  .**   IN_INDEX_E
bbf0: 50 48 20 20 20 20 20 20 20 20 2d 20 54 68 65 20  PH        - The 
bc00: 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65  cursor was opene
bc10: 64 20 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c 79  d on a specially
bc20: 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20   created and.** 
bc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc40: 20 20 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65          populate
bc50: 64 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  d epheremal tabl
bc60: 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73  e..**.** An exis
bc70: 74 69 6e 67 20 62 2d 74 72 65 65 20 6d 69 67 68  ting b-tree migh
bc80: 74 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65  t be used if the
bc90: 20 52 48 53 20 65 78 70 72 65 73 73 69 6f 6e 20   RHS expression 
bca0: 70 58 20 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a  pX is a simple.*
bcb0: 2a 20 73 75 62 71 75 65 72 79 20 73 75 63 68 20  * subquery such 
bcc0: 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  as:.**.**     SE
bcd0: 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52  LECT <column> FR
bce0: 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a  OM <table>.**.**
bcf0: 20 49 66 20 74 68 65 20 52 48 53 20 6f 66 20 74   If the RHS of t
bd00: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  he IN operator i
bd10: 73 20 61 20 6c 69 73 74 20 6f 72 20 61 20 6d 6f  s a list or a mo
bd20: 72 65 20 63 6f 6d 70 6c 65 78 20 73 75 62 71 75  re complex subqu
bd30: 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20  ery, then.** an 
bd40: 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
bd50: 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65  might need to be
bd60: 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
bd70: 74 68 65 20 52 48 53 20 61 6e 64 20 74 68 65 6e  the RHS and then
bd80: 0a 2a 2a 20 70 58 2d 3e 69 54 61 62 6c 65 20 6d  .** pX->iTable m
bd90: 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ade to point to 
bda0: 74 68 65 20 65 70 68 65 72 6d 65 72 61 6c 20 74  the ephermeral t
bdb0: 61 62 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  able instead of 
bdc0: 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 74  an.** existing t
bdd0: 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66  able.  .**.** If
bde0: 20 74 68 65 20 70 72 4e 6f 74 46 6f 75 6e 64 20   the prNotFound 
bdf0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20  parameter is 0, 
be00: 74 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20  then the b-tree 
be10: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
be20: 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75  iterate.** throu
be30: 67 68 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65  gh the set membe
be40: 72 73 2c 20 73 6b 69 70 70 69 6e 67 20 61 6e 79  rs, skipping any
be50: 20 64 75 70 6c 69 63 61 74 65 73 2e 20 49 6e 20   duplicates. In 
be60: 74 68 69 73 20 63 61 73 65 20 61 6e 0a 2a 2a 20  this case an.** 
be70: 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20  epheremal table 
be80: 6d 75 73 74 20 62 65 20 75 73 65 64 20 75 6e 6c  must be used unl
be90: 65 73 73 20 74 68 65 20 73 65 6c 65 63 74 65 64  ess the selected
bea0: 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 67 75 61   <column> is gua
beb0: 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ranteed.** to be
bec0: 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68 65 72   unique - either
bed0: 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20 61   because it is a
bee0: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
bef0: 59 20 4b 45 59 20 6f 72 20 69 74 0a 2a 2a 20 68  Y KEY or it.** h
bf00: 61 73 20 61 20 55 4e 49 51 55 45 20 63 6f 6e 73  as a UNIQUE cons
bf10: 74 72 61 69 6e 74 20 6f 72 20 55 4e 49 51 55 45  traint or UNIQUE
bf20: 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 66   index..**.** If
bf30: 20 74 68 65 20 70 72 4e 6f 74 46 6f 75 6e 64 20   the prNotFound 
bf40: 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
bf50: 20 30 2c 20 74 68 65 6e 20 74 68 65 20 62 2d 74   0, then the b-t
bf60: 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ree will be used
bf70: 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20 73 65   .** for fast se
bf80: 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73  t membership tes
bf90: 74 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ts. In this case
bfa0: 20 61 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61   an epheremal ta
bfb0: 62 6c 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20  ble must .** be 
bfc0: 75 73 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c  used unless <col
bfd0: 75 6d 6e 3e 20 69 73 20 61 6e 20 49 4e 54 45 47  umn> is an INTEG
bfe0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  ER PRIMARY KEY o
bff0: 72 20 61 6e 20 69 6e 64 65 78 20 63 61 6e 20 0a  r an index can .
c000: 2a 2a 20 62 65 20 66 6f 75 6e 64 20 77 69 74 68  ** be found with
c010: 20 3c 63 6f 6c 75 6d 6e 3e 20 61 73 20 69 74 73   <column> as its
c020: 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
c030: 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  n..**.** When th
c040: 65 20 62 2d 74 72 65 65 20 69 73 20 62 65 69 6e  e b-tree is bein
c050: 67 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 62 65  g used for membe
c060: 72 73 68 69 70 20 74 65 73 74 73 2c 20 74 68 65  rship tests, the
c070: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
c080: 6e 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 6b 6e  n.** needs to kn
c090: 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ow whether or no
c0a0: 74 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  t the structure 
c0b0: 63 6f 6e 74 61 69 6e 73 20 61 6e 20 53 51 4c 20  contains an SQL 
c0c0: 4e 55 4c 4c 20 0a 2a 2a 20 76 61 6c 75 65 20 69  NULL .** value i
c0d0: 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 72 72 65  n order to corre
c0e0: 63 74 6c 79 20 65 76 61 6c 75 61 74 65 20 65 78  ctly evaluate ex
c0f0: 70 72 65 73 73 69 6f 6e 73 20 6c 69 6b 65 20 22  pressions like "
c100: 58 20 49 4e 20 28 59 2c 20 5a 29 22 2e 0a 2a 2a  X IN (Y, Z)"..**
c110: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   If there is any
c120: 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
c130: 20 28 2e 2e 2e 29 20 6d 69 67 68 74 20 63 6f 6e   (...) might con
c140: 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61 6c 75  tain a NULL valu
c150: 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c  e at.** runtime,
c160: 20 74 68 65 6e 20 61 20 72 65 67 69 73 74 65 72   then a register
c170: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
c180: 64 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e  d the register n
c190: 75 6d 62 65 72 20 77 72 69 74 74 65 6e 0a 2a 2a  umber written.**
c1a0: 20 74 6f 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 2e   to *prNotFound.
c1b0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
c1c0: 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
c1d0: 28 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e 73 20 61  (...) contains a
c1e0: 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20  .** NULL value, 
c1f0: 74 68 65 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64  then *prNotFound
c200: 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67   is left unchang
c210: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72  ed..**.** If a r
c220: 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63  egister is alloc
c230: 61 74 65 64 20 61 6e 64 20 69 74 73 20 6c 6f 63  ated and its loc
c240: 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20  ation stored in 
c250: 2a 70 72 4e 6f 74 46 6f 75 6e 64 2c 20 74 68 65  *prNotFound, the
c260: 6e 0a 2a 2a 20 69 74 73 20 69 6e 69 74 69 61 6c  n.** its initial
c270: 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2e 20   value is NULL. 
c280: 20 49 66 20 74 68 65 20 28 2e 2e 2e 29 20 64 6f   If the (...) do
c290: 65 73 20 6e 6f 74 20 72 65 6d 61 69 6e 20 63 6f  es not remain co
c2a0: 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20 74 68  nstant.** for th
c2b0: 65 20 64 75 72 61 74 69 6f 6e 20 6f 66 20 74 68  e duration of th
c2c0: 65 20 71 75 65 72 79 20 28 69 2e 65 2e 20 74 68  e query (i.e. th
c2d0: 65 20 53 45 4c 45 43 54 20 77 69 74 68 69 6e 20  e SELECT within 
c2e0: 74 68 65 20 28 2e 2e 2e 29 0a 2a 2a 20 69 73 20  the (...).** is 
c2f0: 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
c300: 71 75 65 72 79 29 20 74 68 65 6e 20 74 68 65 20  query) then the 
c310: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 61 6c 6c  value of the all
c320: 6f 63 61 74 65 64 20 72 65 67 69 73 74 65 72 20  ocated register 
c330: 69 73 0a 2a 2a 20 72 65 73 65 74 20 74 6f 20 4e  is.** reset to N
c340: 55 4c 4c 20 65 61 63 68 20 74 69 6d 65 20 74 68  ULL each time th
c350: 65 20 73 75 62 71 75 65 72 79 20 69 73 20 72 65  e subquery is re
c360: 72 75 6e 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73  run. This allows
c370: 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74   the.** caller t
c380: 6f 20 75 73 65 20 76 64 62 65 20 63 6f 64 65 20  o use vdbe code 
c390: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68  equivalent to th
c3a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
c3b0: 2a 2a 20 20 20 69 66 28 20 72 65 67 69 73 74 65  **   if( registe
c3c0: 72 3d 3d 4e 55 4c 4c 20 29 7b 0a 2a 2a 20 20 20  r==NULL ){.**   
c3d0: 20 20 68 61 73 5f 6e 75 6c 6c 20 3d 20 3c 74 65    has_null = <te
c3e0: 73 74 20 69 66 20 64 61 74 61 20 73 74 72 75 63  st if data struc
c3f0: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 6e 75  ture contains nu
c400: 6c 6c 3e 0a 2a 2a 20 20 20 20 20 72 65 67 69 73  ll>.**     regis
c410: 74 65 72 20 3d 20 31 0a 2a 2a 20 20 20 7d 0a 2a  ter = 1.**   }.*
c420: 2a 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  *.** in order to
c430: 20 61 76 6f 69 64 20 72 75 6e 6e 69 6e 67 20 74   avoid running t
c440: 68 65 20 3c 74 65 73 74 20 69 66 20 64 61 74 61  he <test if data
c450: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
c460: 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a 20 74 65 73  ins null>.** tes
c470: 74 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61  t more often tha
c480: 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  n is necessary..
c490: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
c4a0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
c4b0: 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49  int sqlite3FindI
c4c0: 6e 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  nIndex(Parse *pP
c4d0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 58 2c 20  arse, Expr *pX, 
c4e0: 69 6e 74 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 29  int *prNotFound)
c4f0: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 20 20  {.  Select *p;  
c500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c            /* SEL
c520: 45 43 54 20 74 6f 20 74 68 65 20 72 69 67 68 74  ECT to the right
c530: 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   of IN operator 
c540: 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d  */.  int eType =
c550: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
c560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79             /* Ty
c570: 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c 65 2e  pe of RHS table.
c580: 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20   IN_INDEX_* */. 
c590: 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72   int iTab = pPar
c5a0: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20  se->nTab++;     
c5b0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
c5c0: 20 6f 66 20 74 68 65 20 52 48 53 20 74 61 62 6c   of the RHS tabl
c5d0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42  e */.  int mustB
c5e0: 65 55 6e 69 71 75 65 20 3d 20 28 70 72 4e 6f 74  eUnique = (prNot
c5f0: 46 6f 75 6e 64 3d 3d 30 29 3b 20 20 20 2f 2a 20  Found==0);   /* 
c600: 54 72 75 65 20 69 66 20 52 48 53 20 6d 75 73 74  True if RHS must
c610: 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20   be unique */.  
c620: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
c630: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
c640: 3b 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c  ;     /* Virtual
c650: 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63   machine being c
c660: 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  oded */..  asser
c670: 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  t( pX->op==TK_IN
c680: 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
c690: 74 6f 20 73 65 65 20 69 66 20 61 6e 20 65 78 69  to see if an exi
c6a0: 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69  sting table or i
c6b0: 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64  ndex can be used
c6c0: 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69 73 66 79   to.  ** satisfy
c6d0: 20 74 68 65 20 71 75 65 72 79 2e 20 20 54 68 69   the query.  Thi
c6e0: 73 20 69 73 20 70 72 65 66 65 72 61 62 6c 65 20  s is preferable 
c6f0: 74 6f 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20  to generating a 
c700: 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65  new .  ** epheme
c710: 72 61 6c 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ral table..  */.
c720: 20 20 70 20 3d 20 28 45 78 70 72 48 61 73 50 72    p = (ExprHasPr
c730: 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49  operty(pX, EP_xI
c740: 73 53 65 6c 65 63 74 29 20 3f 20 70 58 2d 3e 78  sSelect) ? pX->x
c750: 2e 70 53 65 6c 65 63 74 20 3a 20 30 29 3b 0a 20  .pSelect : 0);. 
c760: 20 69 66 28 20 41 4c 57 41 59 53 28 70 50 61 72   if( ALWAYS(pPar
c770: 73 65 2d 3e 6e 45 72 72 3d 3d 30 29 20 26 26 20  se->nErr==0) && 
c780: 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
c790: 4f 70 74 28 70 29 20 29 7b 0a 20 20 20 20 73 71  Opt(p) ){.    sq
c7a0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
c7b0: 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20  se->db;         
c7c0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
c7d0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
c7e0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20     Table *pTab; 
c7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c800: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
c810: 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20  le <table>. */. 
c820: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20     Expr *pExpr; 
c830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c840: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
c850: 72 65 73 73 69 6f 6e 20 3c 63 6f 6c 75 6d 6e 3e  ression <column>
c860: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c   */.    int iCol
c870: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c890: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
c8a0: 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20  n <column> */.  
c8b0: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
c8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
c8e0: 62 61 73 65 20 69 64 78 20 66 6f 72 20 70 54 61  base idx for pTa
c8f0: 62 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  b */..    assert
c900: 28 20 70 20 29 3b 20 20 20 20 20 20 20 20 20 20  ( p );          
c910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c920: 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
c930: 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
c940: 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  p) */.    assert
c950: 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29  ( p->pEList!=0 )
c960: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
c970: 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
c980: 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
c990: 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  p) */.    assert
c9a0: 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  ( p->pEList->a[0
c9b0: 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 20 2f 2a  ].pExpr!=0 ); /*
c9c0: 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
c9d0: 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
c9e0: 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  p) */.    assert
c9f0: 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b 20  ( p->pSrc!=0 ); 
ca00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ca10: 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
ca20: 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
ca30: 70 29 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d  p) */.    pTab =
ca40: 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
ca50: 54 61 62 3b 0a 20 20 20 20 70 45 78 70 72 20 3d  Tab;.    pExpr =
ca60: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
ca70: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 43 6f 6c  .pExpr;.    iCol
ca80: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
ca90: 6e 3b 0a 20 20 20 0a 20 20 20 20 2f 2a 20 43 6f  n;.   .    /* Co
caa0: 64 65 20 61 6e 20 4f 50 5f 56 65 72 69 66 79 43  de an OP_VerifyC
cab0: 6f 6f 6b 69 65 20 61 6e 64 20 4f 50 5f 54 61 62  ookie and OP_Tab
cac0: 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c 74 61 62 6c  leLock for <tabl
cad0: 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d  e>. */.    iDb =
cae0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
caf0: 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
cb00: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 73 71  pSchema);.    sq
cb10: 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
cb20: 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
cb30: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  b);.    sqlite3T
cb40: 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
cb50: 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
cb60: 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
cb70: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  );..    /* This 
cb80: 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
cb90: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 74 77 6f   called from two
cba0: 20 70 6c 61 63 65 73 2e 20 49 6e 20 62 6f 74 68   places. In both
cbb0: 20 63 61 73 65 73 20 74 68 65 20 76 64 62 65 0a   cases the vdbe.
cbc0: 20 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61      ** has alrea
cbd0: 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
cbe0: 64 2e 20 53 6f 20 61 73 73 75 6d 65 20 73 71 6c  d. So assume sql
cbf0: 69 74 65 33 47 65 74 56 64 62 65 28 29 20 69 73  ite3GetVdbe() is
cc00: 20 61 6c 77 61 79 73 0a 20 20 20 20 2a 2a 20 73   always.    ** s
cc10: 75 63 63 65 73 73 66 75 6c 20 68 65 72 65 2e 0a  uccessful here..
cc20: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
cc30: 74 28 76 29 3b 0a 20 20 20 20 69 66 28 20 69 43  t(v);.    if( iC
cc40: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  ol<0 ){.      in
cc50: 74 20 69 41 64 64 72 3b 0a 0a 20 20 20 20 20 20  t iAddr;..      
cc60: 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43  iAddr = sqlite3C
cc70: 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b  odeOnce(pParse);
cc80: 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ..      sqlite3O
cc90: 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
cca0: 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62   iTab, iDb, pTab
ccb0: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a  , OP_OpenRead);.
ccc0: 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e        eType = IN
ccd0: 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20  _INDEX_ROWID;.. 
cce0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ccf0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64  JumpHere(v, iAdd
cd00: 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
cd10: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
cd20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cd30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
cd40: 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
cd50: 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  /..      /* The 
cd60: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
cd70: 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63  ce used by the c
cd80: 6f 6d 70 61 72 69 73 6f 6e 2e 20 49 66 20 61 6e  omparison. If an
cd90: 20 69 6e 64 65 78 20 69 73 20 74 6f 0a 20 20 20   index is to.   
cda0: 20 20 20 2a 2a 20 62 65 20 75 73 65 64 20 69 6e     ** be used in
cdb0: 20 70 6c 61 63 65 20 6f 66 20 61 20 74 65 6d 70   place of a temp
cdc0: 2d 74 61 62 6c 65 2c 20 69 74 20 6d 75 73 74 20  -table, it must 
cdd0: 62 65 20 6f 72 64 65 72 65 64 20 61 63 63 6f 72  be ordered accor
cde0: 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 6f  ding.      ** to
cdf0: 20 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20   this collation 
ce00: 73 65 71 75 65 6e 63 65 2e 20 20 2a 2f 0a 20 20  sequence.  */.  
ce10: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65      CollSeq *pRe
ce20: 71 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  q = sqlite3Binar
ce30: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
ce40: 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66  pParse, pX->pLef
ce50: 74 2c 20 70 45 78 70 72 29 3b 0a 0a 20 20 20 20  t, pExpr);..    
ce60: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
ce70: 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 68 61  the affinity tha
ce80: 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  t will be used t
ce90: 6f 20 70 65 72 66 6f 72 6d 20 74 68 65 20 0a 20  o perform the . 
cea0: 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73       ** comparis
ceb0: 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  on is the same a
cec0: 73 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f  s the affinity o
ced0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 49 66  f the column. If
cee0: 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20  .      ** it is 
cef0: 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74 20 70  not, it is not p
cf00: 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 61  ossible to use a
cf10: 6e 79 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  ny index..      
cf20: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66  */.      int aff
cf30: 69 6e 69 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74  inity_ok = sqlit
cf40: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f  e3IndexAffinityO
cf50: 6b 28 70 58 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  k(pX, pTab->aCol
cf60: 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 29  [iCol].affinity)
cf70: 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64  ;..      for(pId
cf80: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
cf90: 70 49 64 78 20 26 26 20 65 54 79 70 65 3d 3d 30  pIdx && eType==0
cfa0: 20 26 26 20 61 66 66 69 6e 69 74 79 5f 6f 6b 3b   && affinity_ok;
cfb0: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
cfc0: 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t){.        if( 
cfd0: 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  (pIdx->aiColumn[
cfe0: 30 5d 3d 3d 69 43 6f 6c 29 0a 20 20 20 20 20 20  0]==iCol).      
cff0: 20 20 20 26 26 20 73 71 6c 69 74 65 33 46 69 6e     && sqlite3Fin
d000: 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43  dCollSeq(db, ENC
d010: 28 64 62 29 2c 20 70 49 64 78 2d 3e 61 7a 43 6f  (db), pIdx->azCo
d020: 6c 6c 5b 30 5d 2c 20 30 29 3d 3d 70 52 65 71 0a  ll[0], 0)==pReq.
d030: 20 20 20 20 20 20 20 20 20 26 26 20 28 21 6d 75           && (!mu
d040: 73 74 42 65 55 6e 69 71 75 65 20 7c 7c 20 28 70  stBeUnique || (p
d050: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  Idx->nColumn==1 
d060: 26 26 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  && pIdx->onError
d070: 21 3d 4f 45 5f 4e 6f 6e 65 29 29 0a 20 20 20 20  !=OE_None)).    
d080: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
d090: 20 69 6e 74 20 69 41 64 64 72 3b 0a 20 20 20 20   int iAddr;.    
d0a0: 20 20 20 20 20 20 63 68 61 72 20 2a 70 4b 65 79        char *pKey
d0b0: 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 70  ;.  .          p
d0c0: 4b 65 79 20 3d 20 28 63 68 61 72 20 2a 29 73 71  Key = (char *)sq
d0d0: 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66  lite3IndexKeyinf
d0e0: 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b  o(pParse, pIdx);
d0f0: 0a 20 20 20 20 20 20 20 20 20 20 69 41 64 64 72  .          iAddr
d100: 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e   = sqlite3CodeOn
d110: 63 65 28 70 50 61 72 73 65 29 3b 0a 20 20 0a 20  ce(pParse);.  . 
d120: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d130: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
d140: 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54 61 62 2c  _OpenRead, iTab,
d150: 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62   pIdx->tnum, iDb
d160: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d180: 20 70 4b 65 79 2c 50 34 5f 4b 45 59 49 4e 46 4f   pKey,P4_KEYINFO
d190: 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20  _HANDOFF);.     
d1a0: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
d1b0: 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d  ((v, "%s", pIdx-
d1c0: 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
d1d0: 20 20 20 20 61 73 73 65 72 74 28 20 49 4e 5f 49      assert( IN_I
d1e0: 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
d1f0: 3d 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  == IN_INDEX_INDE
d200: 58 5f 41 53 43 2b 31 20 29 3b 0a 20 20 20 20 20  X_ASC+1 );.     
d210: 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f       eType = IN_
d220: 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20  INDEX_INDEX_ASC 
d230: 2b 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  + pIdx->aSortOrd
d240: 65 72 5b 30 5d 3b 0a 0a 20 20 20 20 20 20 20 20  er[0];..        
d250: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
d260: 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b  pHere(v, iAddr);
d270: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
d280: 72 4e 6f 74 46 6f 75 6e 64 20 26 26 20 21 70 54  rNotFound && !pT
d290: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e  ab->aCol[iCol].n
d2a0: 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  otNull ){.      
d2b0: 20 20 20 20 20 20 2a 70 72 4e 6f 74 46 6f 75 6e        *prNotFoun
d2c0: 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
d2d0: 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  em;.            
d2e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d2f0: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
d300: 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 29 3b 0a 20   *prNotFound);. 
d310: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d320: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
d330: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 54   }.  }..  if( eT
d340: 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ype==0 ){.    /*
d350: 20 43 6f 75 6c 64 20 6e 6f 74 20 66 6f 75 6e 64   Could not found
d360: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62   an existing tab
d370: 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 75  le or index to u
d380: 73 65 20 61 73 20 74 68 65 20 52 48 53 20 62 2d  se as the RHS b-
d390: 74 72 65 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20  tree..    ** We 
d3a0: 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 67 65 6e  will have to gen
d3b0: 65 72 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72  erate an ephemer
d3c0: 61 6c 20 74 61 62 6c 65 20 74 6f 20 64 6f 20 74  al table to do t
d3d0: 68 65 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20  he job..    */. 
d3e0: 20 20 20 75 33 32 20 73 61 76 65 64 4e 51 75 65     u32 savedNQue
d3f0: 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d  ryLoop = pParse-
d400: 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20  >nQueryLoop;.   
d410: 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c   int rMayHaveNul
d420: 6c 20 3d 20 30 3b 0a 20 20 20 20 65 54 79 70 65  l = 0;.    eType
d430: 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b   = IN_INDEX_EPH;
d440: 0a 20 20 20 20 69 66 28 20 70 72 4e 6f 74 46 6f  .    if( prNotFo
d450: 75 6e 64 20 29 7b 0a 20 20 20 20 20 20 2a 70 72  und ){.      *pr
d460: 4e 6f 74 46 6f 75 6e 64 20 3d 20 72 4d 61 79 48  NotFound = rMayH
d470: 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72  aveNull = ++pPar
d480: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
d490: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d4a0: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
d4b0: 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 29 3b 0a 20   *prNotFound);. 
d4c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d4d0: 74 65 73 74 63 61 73 65 28 20 70 50 61 72 73 65  testcase( pParse
d4e0: 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3e 30 20 29  ->nQueryLoop>0 )
d4f0: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
d500: 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 30 3b 0a  nQueryLoop = 0;.
d510: 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 70 4c        if( pX->pL
d520: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26  eft->iColumn<0 &
d530: 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
d540: 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c  ty(pX, EP_xIsSel
d550: 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
d560: 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
d570: 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20 7d 0a  _ROWID;.      }.
d580: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
d590: 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
d5a0: 50 61 72 73 65 2c 20 70 58 2c 20 72 4d 61 79 48  Parse, pX, rMayH
d5b0: 61 76 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d  aveNull, eType==
d5c0: 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b  IN_INDEX_ROWID);
d5d0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75  .    pParse->nQu
d5e0: 65 72 79 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e  eryLoop = savedN
d5f0: 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c  QueryLoop;.  }el
d600: 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61 62  se{.    pX->iTab
d610: 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 20  le = iTab;.  }. 
d620: 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d   return eType;.}
d630: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
d640: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
d650: 20 73 63 61 6c 61 72 20 73 75 62 71 75 65 72 69   scalar subqueri
d660: 65 73 20 75 73 65 64 20 61 73 20 61 20 73 75 62  es used as a sub
d670: 71 75 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  query expression
d680: 2c 20 45 58 49 53 54 53 2c 0a 2a 2a 20 6f 72 20  , EXISTS,.** or 
d690: 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 45  IN operators.  E
d6a0: 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  xamples:.**.**  
d6b0: 20 20 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f     (SELECT a FRO
d6c0: 4d 20 62 29 20 20 20 20 20 20 20 20 20 20 2d 2d  M b)          --
d6d0: 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20   subquery.**    
d6e0: 20 45 58 49 53 54 53 20 28 53 45 4c 45 43 54 20   EXISTS (SELECT 
d6f0: 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45  a FROM b)   -- E
d700: 58 49 53 54 53 20 73 75 62 71 75 65 72 79 0a 2a  XISTS subquery.*
d710: 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c 35 2c  *     x IN (4,5,
d720: 31 31 29 20 20 20 20 20 20 20 20 20 20 20 20 20  11)             
d730: 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   -- IN operator 
d740: 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72 69 67  with list on rig
d750: 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20  ht-hand side.** 
d760: 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54      x IN (SELECT
d770: 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20 2d   a FROM b)     -
d780: 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  - IN operator wi
d790: 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74  th subquery on t
d7a0: 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54  he right.**.** T
d7b0: 68 65 20 70 45 78 70 72 20 70 61 72 61 6d 65 74  he pExpr paramet
d7c0: 65 72 20 64 65 73 63 72 69 62 65 73 20 74 68 65  er describes the
d7d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
d7e0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 49 4e   contains the IN
d7f0: 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  .** operator or 
d800: 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  subquery..**.** 
d810: 49 66 20 70 61 72 61 6d 65 74 65 72 20 69 73 52  If parameter isR
d820: 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  owid is non-zero
d830: 2c 20 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f  , then expressio
d840: 6e 20 70 45 78 70 72 20 69 73 20 67 75 61 72 61  n pExpr is guara
d850: 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 6f  nteed.** to be o
d860: 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 72 6f 77  f the form "<row
d870: 69 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20 3f 29  id> IN (?, ?, ?)
d880: 22 2c 20 77 68 65 72 65 20 3c 72 6f 77 69 64 3e  ", where <rowid>
d890: 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a   is a reference.
d8a0: 2a 2a 20 74 6f 20 73 6f 6d 65 20 69 6e 74 65 67  ** to some integ
d8b0: 65 72 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 6f 66  er key column of
d8c0: 20 61 20 74 61 62 6c 65 20 42 2d 54 72 65 65 2e   a table B-Tree.
d8d0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 75   In this case, u
d8e0: 73 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20  se an.** intkey 
d8f0: 42 2d 54 72 65 65 20 74 6f 20 73 74 6f 72 65 20  B-Tree to store 
d900: 74 68 65 20 73 65 74 20 6f 66 20 49 4e 28 2e 2e  the set of IN(..
d910: 2e 29 20 76 61 6c 75 65 73 20 69 6e 73 74 65 61  .) values instea
d920: 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a  d of the usual.*
d930: 2a 20 28 73 6c 6f 77 65 72 29 20 76 61 72 69 61  * (slower) varia
d940: 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 73 20  ble length keys 
d950: 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  B-Tree..**.** If
d960: 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 69 73   rMayHaveNull is
d970: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 61 74 20   non-zero, that 
d980: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6f  means that the o
d990: 70 65 72 61 74 69 6f 6e 20 69 73 20 61 6e 20 49  peration is an I
d9a0: 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20 53 45 4c 45  N.** (not a SELE
d9b0: 43 54 20 6f 72 20 45 58 49 53 54 53 29 20 61 6e  CT or EXISTS) an
d9c0: 64 20 74 68 61 74 20 74 68 65 20 52 48 53 20 6d  d that the RHS m
d9d0: 69 67 68 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55  ight contains NU
d9e0: 4c 4c 73 2e 0a 2a 2a 20 46 75 72 74 68 65 72 6d  LLs..** Furtherm
d9f0: 6f 72 65 2c 20 74 68 65 20 49 4e 20 69 73 20 69  ore, the IN is i
da00: 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  n a WHERE clause
da10: 20 61 6e 64 20 74 68 61 74 20 77 65 20 72 65 61   and that we rea
da20: 6c 6c 79 20 77 61 6e 74 0a 2a 2a 20 74 6f 20 69  lly want.** to i
da30: 74 65 72 61 74 65 20 6f 76 65 72 20 74 68 65 20  terate over the 
da40: 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
da50: 65 72 61 74 6f 72 20 69 6e 20 6f 72 64 65 72 20  erator in order 
da60: 74 6f 20 71 75 69 63 6b 6c 79 20 6c 6f 63 61 74  to quickly locat
da70: 65 0a 2a 2a 20 61 6c 6c 20 63 6f 72 72 65 73 70  e.** all corresp
da80: 6f 6e 64 69 6e 67 20 4c 48 53 20 65 6c 65 6d 65  onding LHS eleme
da90: 6e 74 73 2e 20 20 41 6c 6c 20 74 68 69 73 20 72  nts.  All this r
daa0: 6f 75 74 69 6e 65 20 64 6f 65 73 20 69 73 20 69  outine does is i
dab0: 6e 69 74 69 61 6c 69 7a 65 0a 2a 2a 20 74 68 65  nitialize.** the
dac0: 20 72 65 67 69 73 74 65 72 20 67 69 76 65 6e 20   register given 
dad0: 62 79 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  by rMayHaveNull 
dae0: 74 6f 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e  to NULL.  Callin
daf0: 67 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20  g routines will 
db00: 74 61 6b 65 0a 2a 2a 20 63 61 72 65 20 6f 66 20  take.** care of 
db10: 63 68 61 6e 67 69 6e 67 20 74 68 69 73 20 72 65  changing this re
db20: 67 69 73 74 65 72 20 76 61 6c 75 65 20 74 6f 20  gister value to 
db30: 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 74 68 65 20  non-NULL if the 
db40: 52 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65  RHS is NULL-free
db50: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48  ..**.** If rMayH
db60: 61 76 65 4e 75 6c 6c 20 69 73 20 7a 65 72 6f 2c  aveNull is zero,
db70: 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   that means that
db80: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
db90: 20 62 65 69 6e 67 20 75 73 65 64 0a 2a 2a 20 66   being used.** f
dba0: 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  or membership te
dbb0: 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 54 68 65  sting only.  The
dbc0: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
dbd0: 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 0a   initialize any.
dbe0: 2a 2a 20 72 65 67 69 73 74 65 72 73 20 74 6f 20  ** registers to 
dbf0: 69 6e 64 69 63 61 74 65 20 74 68 65 20 70 72 65  indicate the pre
dc00: 73 65 6e 63 65 20 6f 72 20 61 62 73 65 6e 63 65  sence or absence
dc10: 20 6f 66 20 4e 55 4c 4c 73 20 6f 6e 20 74 68 65   of NULLs on the
dc20: 20 52 48 53 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20   RHS..**.** For 
dc30: 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53  a SELECT or EXIS
dc40: 54 53 20 6f 70 65 72 61 74 6f 72 2c 20 72 65 74  TS operator, ret
dc50: 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
dc60: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 0a   that holds the.
dc70: 2a 2a 20 72 65 73 75 6c 74 2e 20 20 46 6f 72 20  ** result.  For 
dc80: 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f 72 20  IN operators or 
dc90: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
dca0: 72 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20 76  rs, the return v
dcb0: 61 6c 75 65 20 69 73 20 30 2e 0a 2a 2f 0a 23 69  alue is 0..*/.#i
dcc0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
dcd0: 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73  T_SUBQUERY.int s
dce0: 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
dcf0: 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
dd00: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
dd10: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
dd20: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
dd30: 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  pr,            /
dd40: 2a 20 54 68 65 20 49 4e 2c 20 53 45 4c 45 43 54  * The IN, SELECT
dd50: 2c 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72  , or EXISTS oper
dd60: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 4d  ator */.  int rM
dd70: 61 79 48 61 76 65 4e 75 6c 6c 2c 20 20 20 20 20  ayHaveNull,     
dd80: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68    /* Register th
dd90: 61 74 20 72 65 63 6f 72 64 73 20 77 68 65 74 68  at records wheth
dda0: 65 72 20 4e 55 4c 4c 73 20 65 78 69 73 74 20 69  er NULLs exist i
ddb0: 6e 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69  n RHS */.  int i
ddc0: 73 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 20  sRowid          
ddd0: 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 4c     /* If true, L
dde0: 48 53 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f  HS of IN operato
ddf0: 72 20 69 73 20 61 20 72 6f 77 69 64 20 2a 2f 0a  r is a rowid */.
de00: 29 7b 0a 20 20 69 6e 74 20 74 65 73 74 41 64 64  ){.  int testAdd
de10: 72 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  r = -1;         
de20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
de30: 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64  One-time test ad
de40: 64 72 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72  dress */.  int r
de50: 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Reg = 0;        
de60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de70: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73     /* Register s
de80: 74 6f 72 69 6e 67 20 72 65 73 75 6c 74 69 6e 67  toring resulting
de90: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
dea0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
deb0: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 4e 45  Parse);.  if( NE
dec0: 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75  VER(v==0) ) retu
ded0: 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45  rn 0;.  sqlite3E
dee0: 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
def0: 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  rse);..  /* This
df00: 20 63 6f 64 65 20 6d 75 73 74 20 62 65 20 72 75   code must be ru
df10: 6e 20 69 6e 20 69 74 73 20 65 6e 74 69 72 65 74  n in its entiret
df20: 79 20 65 76 65 72 79 20 74 69 6d 65 20 69 74 20  y every time it 
df30: 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20  is encountered. 
df40: 20 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20 74 68   ** if any of th
df50: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74  e following is t
df60: 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  rue:.  **.  **  
df70: 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68    *  The right-h
df80: 61 6e 64 20 73 69 64 65 20 69 73 20 61 20 63 6f  and side is a co
df90: 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72  rrelated subquer
dfa0: 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65  y.  **    *  The
dfb0: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
dfc0: 20 69 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f   is an expressio
dfd0: 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e  n list containin
dfe0: 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a  g variables.  **
dff0: 20 20 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e      *  We are in
e000: 73 69 64 65 20 61 20 74 72 69 67 67 65 72 0a 20  side a trigger. 
e010: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20   **.  ** If all 
e020: 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65  of the above are
e030: 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20   false, then we 
e040: 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64  can run this cod
e050: 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a  e just once.  **
e060: 20 73 61 76 65 20 74 68 65 20 72 65 73 75 6c 74   save the result
e070: 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68 65  s, and reuse the
e080: 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20   same result on 
e090: 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63  subsequent invoc
e0a0: 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ations..  */.  i
e0b0: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
e0c0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61  rty(pExpr, EP_Va
e0d0: 72 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  rSelect) ){.    
e0e0: 74 65 73 74 41 64 64 72 20 3d 20 73 71 6c 69 74  testAddr = sqlit
e0f0: 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73  e3CodeOnce(pPars
e100: 65 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  e);.  }..#ifndef
e110: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
e120: 4c 41 49 4e 0a 20 20 69 66 28 20 70 50 61 72 73  LAIN.  if( pPars
e130: 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b  e->explain==2 ){
e140: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20  .    char *zMsg 
e150: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
e160: 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  (.        pParse
e170: 2d 3e 64 62 2c 20 22 45 58 45 43 55 54 45 20 25  ->db, "EXECUTE %
e180: 73 25 73 20 53 55 42 51 55 45 52 59 20 25 64 22  s%s SUBQUERY %d"
e190: 2c 20 74 65 73 74 41 64 64 72 3e 3d 30 3f 22 22  , testAddr>=0?""
e1a0: 3a 22 43 4f 52 52 45 4c 41 54 45 44 20 22 2c 0a  :"CORRELATED ",.
e1b0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
e1c0: 70 3d 3d 54 4b 5f 49 4e 3f 22 4c 49 53 54 22 3a  p==TK_IN?"LIST":
e1d0: 22 53 43 41 4c 41 52 22 2c 20 70 50 61 72 73 65  "SCALAR", pParse
e1e0: 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 0a  ->iNextSelectId.
e1f0: 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
e200: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
e210: 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72  OP_Explain, pPar
e220: 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30  se->iSelectId, 0
e230: 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59  , 0, zMsg, P4_DY
e240: 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 23 65 6e 64  NAMIC);.  }.#end
e250: 69 66 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45  if..  switch( pE
e260: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
e270: 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
e280: 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79     char affinity
e290: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
e2a0: 2a 20 41 66 66 69 6e 69 74 79 20 6f 66 20 74 68  * Affinity of th
e2b0: 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
e2c0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
e2d0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
e2e0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
e2f0: 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  of OP_OpenEpheme
e300: 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
e310: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
e320: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
e330: 65 66 74 3b 20 2f 2a 20 74 68 65 20 4c 48 53 20  eft; /* the LHS 
e340: 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
e350: 6f 72 20 2a 2f 0a 20 20 20 20 20 20 4b 65 79 49  or */.      KeyI
e360: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
e370: 30 3b 20 20 20 20 20 20 2f 2a 20 4b 65 79 20 69  0;      /* Key i
e380: 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 0a 20  nformation */.. 
e390: 20 20 20 20 20 69 66 28 20 72 4d 61 79 48 61 76       if( rMayHav
e3a0: 65 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  eNull ){.       
e3b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e3c0: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
e3d0: 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 29 3b  , rMayHaveNull);
e3e0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
e3f0: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
e400: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
e410: 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Left);..      /*
e420: 20 57 68 65 74 68 65 72 20 74 68 69 73 20 69 73   Whether this is
e430: 20 61 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54   an 'x IN(SELECT
e440: 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49  ...)' or an 'x I
e450: 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20  N(<exprlist>)'. 
e460: 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69       ** expressi
e470: 6f 6e 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64  on it is handled
e480: 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e 20 20   the same way.  
e490: 41 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  An ephemeral tab
e4a0: 6c 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20  le is .      ** 
e4b0: 66 69 6c 6c 65 64 20 77 69 74 68 20 73 69 6e 67  filled with sing
e4c0: 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65 78 20 6b  le-field index k
e4d0: 65 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67  eys representing
e4e0: 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20   the results.   
e4f0: 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53     ** from the S
e500: 45 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65 78  ELECT or the <ex
e510: 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a  prlist>..      *
e520: 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
e530: 65 20 27 78 27 20 65 78 70 72 65 73 73 69 6f 6e  e 'x' expression
e540: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c   is a column val
e550: 75 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45 43  ue, or the SELEC
e560: 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74  T....      ** st
e570: 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20  atement returns 
e580: 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20  a column value, 
e590: 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74  then the affinit
e5a0: 79 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20 20  y of that.      
e5b0: 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65  ** column is use
e5c0: 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69  d to build the i
e5d0: 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f  ndex keys. If bo
e5e0: 74 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a 20  th 'x' and the. 
e5f0: 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e       ** SELECT..
e600: 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20  . statement are 
e610: 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75  columns, then nu
e620: 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 20 69  meric affinity i
e630: 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20  s used.      ** 
e640: 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e  if either column
e650: 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20   has NUMERIC or 
e660: 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74 79  INTEGER affinity
e670: 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20 20  . If neither.   
e680: 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68     ** 'x' nor th
e690: 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  e 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 0a 20 20 20 20 20 20 2a  affinity.      *
e6d0: 2a 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20  * is used..     
e6e0: 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d   */.      pExpr-
e6f0: 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65  >iTable = pParse
e700: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
e710: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
e720: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
e730: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 45  penEphemeral, pE
e740: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 21 69 73  xpr->iTable, !is
e750: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66  Rowid);.      if
e760: 28 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 3d 3d  ( rMayHaveNull==
e770: 30 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 43  0 ) sqlite3VdbeC
e780: 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45  hangeP5(v, BTREE
e790: 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20  _UNORDERED);.   
e7a0: 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 69 73     pKeyInfo = is
e7b0: 52 6f 77 69 64 20 3f 20 30 20 3a 20 73 71 6c 69  Rowid ? 0 : sqli
e7c0: 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
e7d0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 31 29 3b 0a  pParse->db, 1);.
e7e0: 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
e7f0: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
e800: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
e810: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61  ){.        /* Ca
e820: 73 65 20 31 3a 20 20 20 20 20 65 78 70 72 20 49  se 1:     expr I
e830: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20  N (SELECT ...). 
e840: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
e850: 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    ** Generate co
e860: 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  de to write the 
e870: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
e880: 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74  elect into the t
e890: 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20  emporary.       
e8a0: 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61   ** table alloca
e8b0: 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61  ted and opened a
e8c0: 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bove..        */
e8d0: 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 44  .        SelectD
e8e0: 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20  est dest;.      
e8f0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
e900: 73 74 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73  st;..        ass
e910: 65 72 74 28 20 21 69 73 52 6f 77 69 64 20 29 3b  ert( !isRowid );
e920: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e930: 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
e940: 64 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 70  dest, SRT_Set, p
e950: 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  Expr->iTable);. 
e960: 20 20 20 20 20 20 20 64 65 73 74 2e 61 66 66 53         dest.affS
e970: 64 73 74 20 3d 20 28 75 38 29 61 66 66 69 6e 69  dst = (u8)affini
e980: 74 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ty;.        asse
e990: 72 74 28 20 28 70 45 78 70 72 2d 3e 69 54 61 62  rt( (pExpr->iTab
e9a0: 6c 65 26 30 78 30 30 30 30 46 46 46 46 29 3d 3d  le&0x0000FFFF)==
e9b0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b  pExpr->iTable );
e9c0: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
e9d0: 78 2e 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69  x.pSelect->iLimi
e9e0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 74  t = 0;.        t
e9f0: 65 73 74 63 61 73 65 28 20 70 4b 65 79 49 6e 66  estcase( pKeyInf
ea00: 6f 3d 3d 30 20 29 3b 20 2f 2a 20 43 61 75 73 65  o==0 ); /* Cause
ea10: 64 20 62 79 20 4f 4f 4d 20 69 6e 20 73 71 6c 69  d by OOM in sqli
ea20: 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
ea30: 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  ) */.        if(
ea40: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
ea50: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 78 2e  Parse, pExpr->x.
ea60: 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 20  pSelect, &dest) 
ea70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
ea80: 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73  ite3DbFree(pPars
ea90: 65 2d 3e 64 62 2c 20 70 4b 65 79 49 6e 66 6f 29  e->db, pKeyInfo)
eaa0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
eab0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 0;.        }.
eac0: 20 20 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d          pEList =
ead0: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
eae0: 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20  t->pEList;.     
eaf0: 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49     assert( pKeyI
eb00: 6e 66 6f 21 3d 30 20 29 3b 20 2f 2a 20 4f 4f 4d  nfo!=0 ); /* OOM
eb10: 20 77 69 6c 6c 20 63 61 75 73 65 20 65 78 69 74   will cause exit
eb20: 20 61 66 74 65 72 20 73 71 6c 69 74 65 33 53 65   after sqlite3Se
eb30: 6c 65 63 74 28 29 20 2a 2f 0a 20 20 20 20 20 20  lect() */.      
eb40: 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
eb50: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  !=0 );.        a
eb60: 73 73 65 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e  ssert( pEList->n
eb70: 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 20 20  Expr>0 );.      
eb80: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c    pKeyInfo->aCol
eb90: 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 42 69  l[0] = sqlite3Bi
eba0: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
ebb0: 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
ebc0: 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20 20 20  ->pLeft,.       
ebd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec00: 20 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70    pEList->a[0].p
ec10: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Expr);.      }el
ec20: 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 45  se if( ALWAYS(pE
ec30: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29  xpr->x.pList!=0)
ec40: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
ec50: 61 73 65 20 32 3a 20 20 20 20 20 65 78 70 72 20  ase 2:     expr 
ec60: 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20  IN (exprlist).  
ec70: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
ec80: 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70   ** For each exp
ec90: 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61  ression, build a
eca0: 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d  n index key from
ecb0: 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   the evaluation 
ecc0: 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  and.        ** s
ecd0: 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20 74  tore it in the t
ece0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
ecf0: 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63  If <expr> is a c
ed00: 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a  olumn, then use.
ed10: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
ed20: 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79  columns affinity
ed30: 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69   when building i
ed40: 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65  ndex keys. If <e
ed50: 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20  xpr> is not.    
ed60: 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c      ** a column,
ed70: 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66   use numeric aff
ed80: 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a  inity..        *
ed90: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  /.        int i;
eda0: 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
edb0: 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
edc0: 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20  ->x.pList;.     
edd0: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
ede0: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
edf0: 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20          int r1, 
ee00: 72 32 2c 20 72 33 3b 0a 0a 20 20 20 20 20 20 20  r2, r3;..       
ee10: 20 69 66 28 20 21 61 66 66 69 6e 69 74 79 20 29   if( !affinity )
ee20: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 69  {.          affi
ee30: 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
ee40: 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
ee50: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4b  }.        if( pK
ee60: 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
ee70: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43      pKeyInfo->aC
ee80: 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33  oll[0] = sqlite3
ee90: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
eea0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
eeb0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
eec0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68        /* Loop th
eed0: 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
eee0: 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69  ssion in <exprli
eef0: 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  st>. */.        
ef00: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
ef10: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
ef20: 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c          r2 = sql
ef30: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
ef40: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
ef50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ef60: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
ef70: 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 66 6f   r2);.        fo
ef80: 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72  r(i=pList->nExpr
ef90: 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
efa0: 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65  ; i>0; i--, pIte
efb0: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
efc0: 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49 74 65  Expr *pE2 = pIte
efd0: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
efe0: 20 20 20 20 69 6e 74 20 69 56 61 6c 54 6f 49 6e      int iValToIn
eff0: 73 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  s;..          /*
f000: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
f010: 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61  on is not consta
f020: 6e 74 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  nt then we will 
f030: 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20  need to.        
f040: 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 65    ** disable the
f050: 20 74 65 73 74 20 74 68 61 74 20 77 61 73 20 67   test that was g
f060: 65 6e 65 72 61 74 65 64 20 61 62 6f 76 65 20 74  enerated above t
f070: 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65 0a 20  hat makes sure. 
f080: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73           ** this
f090: 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63 75   code only execu
f0a0: 74 65 73 20 6f 6e 63 65 2e 20 20 42 65 63 61 75  tes once.  Becau
f0b0: 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e  se for a non-con
f0c0: 73 74 61 6e 74 0a 20 20 20 20 20 20 20 20 20 20  stant.          
f0d0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77 65  ** expression we
f0e0: 20 6e 65 65 64 20 74 6f 20 72 65 72 75 6e 20 74   need to rerun t
f0f0: 68 69 73 20 63 6f 64 65 20 65 61 63 68 20 74 69  his code each ti
f100: 6d 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  me..          */
f110: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 74  .          if( t
f120: 65 73 74 41 64 64 72 3e 3d 30 20 26 26 20 21 73  estAddr>=0 && !s
f130: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
f140: 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20  tant(pE2) ){.   
f150: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
f160: 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
f170: 28 76 2c 20 74 65 73 74 41 64 64 72 29 3b 0a 20  (v, testAddr);. 
f180: 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 41             testA
f190: 64 64 72 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  ddr = -1;.      
f1a0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
f1b0: 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
f1c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
f1d0: 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74  insert it into t
f1e0: 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f  he temp table */
f1f0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
f200: 73 52 6f 77 69 64 20 26 26 20 73 71 6c 69 74 65  sRowid && sqlite
f210: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
f220: 45 32 2c 20 26 69 56 61 6c 54 6f 49 6e 73 29 20  E2, &iValToIns) 
f230: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
f240: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
f250: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 49 6e 74  (v, OP_InsertInt
f260: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
f270: 20 72 32 2c 20 69 56 61 6c 54 6f 49 6e 73 29 3b   r2, iValToIns);
f280: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
f290: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 33  {.            r3
f2a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
f2b0: 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
f2c0: 20 70 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20   pE2, r1);.     
f2d0: 20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77         if( isRow
f2e0: 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
f2f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f300: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp2(v, OP_Must
f310: 42 65 49 6e 74 2c 20 72 33 2c 0a 20 20 20 20 20  BeInt, r3,.     
f320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f330: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
f340: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
f350: 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 20  r(v)+2);.       
f360: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
f370: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
f380: 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54  nsert, pExpr->iT
f390: 61 62 6c 65 2c 20 72 32 2c 20 72 33 29 3b 0a 20  able, r2, r3);. 
f3a0: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
f3b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
f3c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f3d0: 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
f3e0: 72 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c 20 26  rd, r3, 1, r2, &
f3f0: 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20  affinity, 1);.  
f400: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
f410: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
f420: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
f430: 65 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20 20 20  e, r3, 1);.     
f440: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
f450: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f460: 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 45 78 70  _IdxInsert, pExp
f470: 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 29 3b 0a  r->iTable, r2);.
f480: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
f490: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f4a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
f4b0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
f4c0: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
f4d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
f4e0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
f4f0: 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  rse, r2);.      
f500: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79  }.      if( pKey
f510: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
f520: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
f530: 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 76 6f  eP4(v, addr, (vo
f540: 69 64 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  id *)pKeyInfo, P
f550: 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
f560: 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  F);.      }.    
f570: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
f580: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53      case TK_EXIS
f590: 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  TS:.    case TK_
f5a0: 53 45 4c 45 43 54 3a 0a 20 20 20 20 64 65 66 61  SELECT:.    defa
f5b0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ult: {.      /* 
f5c0: 49 66 20 74 68 69 73 20 68 61 73 20 74 6f 20 62  If this has to b
f5d0: 65 20 61 20 73 63 61 6c 61 72 20 53 45 4c 45 43  e a scalar SELEC
f5e0: 54 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64  T.  Generate cod
f5f0: 65 20 74 6f 20 70 75 74 20 74 68 65 0a 20 20 20  e to put the.   
f600: 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74     ** value of t
f610: 68 69 73 20 73 65 6c 65 63 74 20 69 6e 20 61 20  his select in a 
f620: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
f630: 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65  record the numbe
f640: 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  r.      ** of th
f650: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e  e memory cell in
f660: 20 69 43 6f 6c 75 6d 6e 2e 20 20 49 66 20 74 68   iColumn.  If th
f670: 69 73 20 69 73 20 61 6e 20 45 58 49 53 54 53 2c  is is an EXISTS,
f680: 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20   write.      ** 
f690: 61 6e 20 69 6e 74 65 67 65 72 20 30 20 28 6e 6f  an integer 0 (no
f6a0: 74 20 65 78 69 73 74 73 29 20 6f 72 20 31 20 28  t exists) or 1 (
f6b0: 65 78 69 73 74 73 29 20 69 6e 74 6f 20 61 20 6d  exists) into a m
f6c0: 65 6d 6f 72 79 20 63 65 6c 6c 0a 20 20 20 20 20  emory cell.     
f6d0: 20 2a 2a 20 61 6e 64 20 72 65 63 6f 72 64 20 74   ** and record t
f6e0: 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  hat memory cell 
f6f0: 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20  in iColumn..    
f700: 20 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63    */.      Selec
f710: 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 20 20 20  t *pSel;        
f720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f730: 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   /* SELECT state
f740: 6d 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a  ment to encode *
f750: 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65  /.      SelectDe
f760: 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 20 20  st dest;        
f770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f780: 20 48 6f 77 20 74 6f 20 64 65 61 6c 20 77 69 74   How to deal wit
f790: 68 20 53 45 4c 45 43 74 20 72 65 73 75 6c 74 20  h SELECt result 
f7a0: 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61  */..      testca
f7b0: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
f7c0: 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20  K_EXISTS );.    
f7d0: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
f7e0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
f7f0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
f800: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
f810: 45 58 49 53 54 53 20 7c 7c 20 70 45 78 70 72 2d  EXISTS || pExpr-
f820: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
f830: 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
f840: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
f850: 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
f860: 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 70  lect) );.      p
f870: 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  Sel = pExpr->x.p
f880: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 73 71  Select;.      sq
f890: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
f8a0: 6e 69 74 28 26 64 65 73 74 2c 20 30 2c 20 2b 2b  nit(&dest, 0, ++
f8b0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20  pParse->nMem);. 
f8c0: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
f8d0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
f8e0: 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44  .        dest.eD
f8f0: 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20  est = SRT_Mem;. 
f900: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
f910: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
f920: 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 53 44  ull, 0, dest.iSD
f930: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56  Parm);.        V
f940: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
f950: 49 6e 69 74 20 73 75 62 71 75 65 72 79 20 72 65  Init subquery re
f960: 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d  sult"));.      }
f970: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 65  else{.        de
f980: 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 45  st.eDest = SRT_E
f990: 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73  xists;.        s
f9a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f9b0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
f9c0: 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29  0, dest.iSDParm)
f9d0: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
f9e0: 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20  mment((v, "Init 
f9f0: 45 58 49 53 54 53 20 72 65 73 75 6c 74 22 29 29  EXISTS result"))
fa00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
fa10: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
fa20: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53  e(pParse->db, pS
fa30: 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20  el->pLimit);.   
fa40: 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20     pSel->pLimit 
fa50: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
fa60: 50 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45 47 45  Parse, TK_INTEGE
fa70: 52 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  R, 0, 0,.       
fa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa90: 20 20 20 20 20 20 20 20 20 20 20 26 73 71 6c 69             &sqli
faa0: 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 29  te3IntTokens[1])
fab0: 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 69 4c  ;.      pSel->iL
fac0: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
fad0: 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
fae0: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20  t(pParse, pSel, 
faf0: 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  &dest) ){.      
fb00: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
fb10: 20 20 7d 0a 20 20 20 20 20 20 72 52 65 67 20 3d    }.      rReg =
fb20: 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20   dest.iSDParm;. 
fb30: 20 20 20 20 20 45 78 70 72 53 65 74 49 72 72 65       ExprSetIrre
fb40: 64 75 63 69 62 6c 65 28 70 45 78 70 72 29 3b 0a  ducible(pExpr);.
fb50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
fb60: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 74 65   }.  }..  if( te
fb70: 73 74 41 64 64 72 3e 3d 30 20 29 7b 0a 20 20 20  stAddr>=0 ){.   
fb80: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
fb90: 48 65 72 65 28 76 2c 20 74 65 73 74 41 64 64 72  Here(v, testAddr
fba0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
fbb0: 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
fbc0: 72 73 65 2c 20 31 29 3b 0a 0a 20 20 72 65 74 75  rse, 1);..  retu
fbd0: 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69  rn rReg;.}.#endi
fbe0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
fbf0: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69  _SUBQUERY */..#i
fc00: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
fc10: 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
fc20: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
fc30: 6f 72 20 61 6e 20 49 4e 20 65 78 70 72 65 73 73  or an IN express
fc40: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ion..**.**      
fc50: 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  x IN (SELECT ...
fc60: 29 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28  ).**      x IN (
fc70: 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e  value, value, ..
fc80: 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66  .).**.** The lef
fc90: 74 2d 68 61 6e 64 20 73 69 64 65 20 28 4c 48 53  t-hand side (LHS
fca0: 29 20 69 73 20 61 20 73 63 61 6c 61 72 20 65 78  ) is a scalar ex
fcb0: 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 65 20 72  pression.  The r
fcc0: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28  ight-hand side (
fcd0: 52 48 53 29 0a 2a 2a 20 69 73 20 61 6e 20 61 72  RHS).** is an ar
fce0: 72 61 79 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d  ray of zero or m
fcf0: 6f 72 65 20 76 61 6c 75 65 73 2e 20 20 54 68 65  ore values.  The
fd00: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
fd10: 72 75 65 20 69 66 20 74 68 65 20 4c 48 53 20 69  rue if the LHS i
fd20: 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77  s.** contained w
fd30: 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20  ithin the RHS.  
fd40: 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  The value of the
fd50: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75   expression is u
fd60: 6e 6b 6e 6f 77 6e 20 28 4e 55 4c 4c 29 0a 2a 2a  nknown (NULL).**
fd70: 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 4e   if the LHS is N
fd80: 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 4c 48  ULL or if the LH
fd90: 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  S is not contain
fda0: 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52 48  ed within the RH
fdb0: 53 20 61 6e 64 20 74 68 65 0a 2a 2a 20 52 48 53  S and the.** RHS
fdc0: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
fdd0: 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65   more NULL value
fde0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
fdf0: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
fe00: 63 6f 64 65 20 77 69 6c 6c 20 6a 75 6d 70 20 74  code will jump t
fe10: 6f 20 64 65 73 74 49 66 46 61 6c 73 65 20 69 66  o destIfFalse if
fe20: 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20   the LHS is not 
fe30: 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  .** contained wi
fe40: 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49  thin the RHS.  I
fe50: 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77  f due to NULLs w
fe60: 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69  e cannot determi
fe70: 6e 65 20 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a  ne if the LHS.**
fe80: 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e   is contained in
fe90: 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 6a 75   the RHS then ju
fea0: 6d 70 20 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c  mp to destIfNull
feb0: 2e 20 20 49 66 20 74 68 65 20 4c 48 53 20 69 73  .  If the LHS is
fec0: 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69   contained.** wi
fed0: 74 68 69 6e 20 74 68 65 20 52 48 53 20 74 68 65  thin the RHS the
fee0: 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a  n fall through..
fef0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
ff00: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
ff10: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
ff20: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
ff30: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
ff40: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
ff50: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
ff60: 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  r,          /* T
ff70: 68 65 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e  he IN expression
ff80: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66   */.  int destIf
ff90: 46 61 6c 73 65 2c 20 20 20 20 20 20 2f 2a 20 4a  False,      /* J
ffa0: 75 6d 70 20 68 65 72 65 20 69 66 20 4c 48 53 20  ump here if LHS 
ffb0: 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
ffc0: 20 69 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20   in the RHS */. 
ffd0: 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20   int destIfNull 
ffe0: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
fff0: 65 72 65 20 69 66 20 74 68 65 20 72 65 73 75 6c  ere if the resul
10000 74 73 20 61 72 65 20 75 6e 6b 6e 6f 77 6e 20 64  ts are unknown d
10010 75 65 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29  ue to NULLs */.)
10020 7b 0a 20 20 69 6e 74 20 72 52 68 73 48 61 73 4e  {.  int rRhsHasN
10030 75 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20 52 65 67  ull = 0;  /* Reg
10040 69 73 74 65 72 20 74 68 61 74 20 69 73 20 74 72  ister that is tr
10050 75 65 20 69 66 20 52 48 53 20 63 6f 6e 74 61 69  ue if RHS contai
10060 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 2a  ns NULL values *
10070 2f 0a 20 20 63 68 61 72 20 61 66 66 69 6e 69 74  /.  char affinit
10080 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d  y;        /* Com
10090 70 61 72 69 73 6f 6e 20 61 66 66 69 6e 69 74 79  parison affinity
100a0 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74   to use */.  int
100b0 20 65 54 79 70 65 3b 20 20 20 20 20 20 20 20 20   eType;         
100c0 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 68     /* Type of th
100d0 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 72  e RHS */.  int r
100e0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
100f0 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73   /* Temporary us
10100 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  e register */.  
10110 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
10120 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65        /* Stateme
10130 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  nt under constru
10140 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43  ction */..  /* C
10150 6f 6d 70 75 74 65 20 74 68 65 20 52 48 53 2e 20  ompute the RHS. 
10160 20 20 41 66 74 65 72 20 74 68 69 73 20 73 74 65    After this ste
10170 70 2c 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  p, the table wit
10180 68 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 70 45  h cursor.  ** pE
10190 78 70 72 2d 3e 69 54 61 62 6c 65 20 77 69 6c 6c  xpr->iTable will
101a0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
101b0 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75  lues that make u
101c0 70 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a  p the RHS..  */.
101d0 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
101e0 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76  dbe;.  assert( v
101f0 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20  !=0 );       /* 
10200 4f 4f 4d 20 64 65 74 65 63 74 65 64 20 70 72 69  OOM detected pri
10210 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  or to this routi
10220 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  ne */.  VdbeNoop
10230 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67  Comment((v, "beg
10240 69 6e 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 20  in IN expr"));. 
10250 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   eType = sqlite3
10260 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72  FindInIndex(pPar
10270 73 65 2c 20 70 45 78 70 72 2c 20 26 72 52 68 73  se, pExpr, &rRhs
10280 48 61 73 4e 75 6c 6c 29 3b 0a 0a 20 20 2f 2a 20  HasNull);..  /* 
10290 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 61  Figure out the a
102a0 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20 74  ffinity to use t
102b0 6f 20 63 72 65 61 74 65 20 61 20 6b 65 79 20 66  o create a key f
102c0 72 6f 6d 20 74 68 65 20 72 65 73 75 6c 74 73 0a  rom the results.
102d0 20 20 2a 2a 20 6f 66 20 74 68 65 20 65 78 70 72    ** of the expr
102e0 65 73 73 69 6f 6e 2e 20 61 66 66 69 6e 69 74 79  ession. affinity
102f0 53 74 72 20 73 74 6f 72 65 73 20 61 20 73 74 61  Str stores a sta
10300 74 69 63 20 73 74 72 69 6e 67 20 73 75 69 74 61  tic string suita
10310 62 6c 65 20 66 6f 72 0a 20 20 2a 2a 20 50 34 20  ble for.  ** P4 
10320 6f 66 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  of OP_MakeRecord
10330 2e 0a 20 20 2a 2f 0a 20 20 61 66 66 69 6e 69 74  ..  */.  affinit
10340 79 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66  y = comparisonAf
10350 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 0a  finity(pExpr);..
10360 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4c 48    /* Code the LH
10370 53 2c 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72  S, the <expr> fr
10380 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e  om "<expr> IN (.
10390 2e 2e 29 22 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ..)"..  */.  sql
103a0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
103b0 68 28 70 50 61 72 73 65 29 3b 0a 20 20 72 31 20  h(pParse);.  r1 
103c0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
103d0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73  Reg(pParse);.  s
103e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
103f0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
10400 65 66 74 2c 20 72 31 29 3b 0a 0a 20 20 2f 2a 20  eft, r1);..  /* 
10410 49 66 20 74 68 65 20 4c 48 53 20 69 73 20 4e 55  If the LHS is NU
10420 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  LL, then the res
10430 75 6c 74 20 69 73 20 65 69 74 68 65 72 20 66 61  ult is either fa
10440 6c 73 65 20 6f 72 20 4e 55 4c 4c 20 64 65 70 65  lse or NULL depe
10450 6e 64 69 6e 67 0a 20 20 2a 2a 20 6f 6e 20 77 68  nding.  ** on wh
10460 65 74 68 65 72 20 74 68 65 20 52 48 53 20 69 73  ether the RHS is
10470 20 65 6d 70 74 79 20 6f 72 20 6e 6f 74 2c 20 72   empty or not, r
10480 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 2a  espectively..  *
10490 2f 0a 20 20 69 66 28 20 64 65 73 74 49 66 4e 75  /.  if( destIfNu
104a0 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73 65 20  ll==destIfFalse 
104b0 29 7b 0a 20 20 20 20 2f 2a 20 53 68 6f 72 74 63  ){.    /* Shortc
104c0 75 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f  ut for the commo
104d0 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65  n case where the
104e0 20 66 61 6c 73 65 20 61 6e 64 20 4e 55 4c 4c 20   false and NULL 
104f0 6f 75 74 63 6f 6d 65 73 20 61 72 65 0a 20 20 20  outcomes are.   
10500 20 2a 2a 20 74 68 65 20 73 61 6d 65 2e 20 2a 2f   ** the same. */
10510 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10520 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
10530 75 6c 6c 2c 20 72 31 2c 20 64 65 73 74 49 66 4e  ull, r1, destIfN
10540 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ull);.  }else{. 
10550 20 20 20 69 6e 74 20 61 64 64 72 31 20 3d 20 73     int addr1 = s
10560 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
10570 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
10580 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r1);.    sqlite3
10590 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
105a0 5f 52 65 77 69 6e 64 2c 20 70 45 78 70 72 2d 3e  _Rewind, pExpr->
105b0 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61  iTable, destIfFa
105c0 6c 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  lse);.    sqlite
105d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
105e0 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49  P_Goto, 0, destI
105f0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69  fNull);.    sqli
10600 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
10610 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 7d 0a 0a  v, addr1);.  }..
10620 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f    if( eType==IN_
10630 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20  INDEX_ROWID ){. 
10640 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
10650 73 65 2c 20 74 68 65 20 52 48 53 20 69 73 20 74  se, the RHS is t
10660 68 65 20 52 4f 57 49 44 20 6f 66 20 74 61 62 6c  he ROWID of tabl
10670 65 20 62 2d 74 72 65 65 0a 20 20 20 20 2a 2f 0a  e b-tree.    */.
10680 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10690 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp2(v, OP_Must
106a0 42 65 49 6e 74 2c 20 72 31 2c 20 64 65 73 74 49  BeInt, r1, destI
106b0 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 73 71 6c  fFalse);.    sql
106c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
106d0 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20  , OP_NotExists, 
106e0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64  pExpr->iTable, d
106f0 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31 29 3b  estIfFalse, r1);
10700 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
10710 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
10720 68 65 20 52 48 53 20 69 73 20 61 6e 20 69 6e 64  he RHS is an ind
10730 65 78 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a  ex b-tree..    *
10740 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
10750 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66  eAddOp4(v, OP_Af
10760 66 69 6e 69 74 79 2c 20 72 31 2c 20 31 2c 20 30  finity, r1, 1, 0
10770 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b  , &affinity, 1);
10780 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
10790 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74  set membership t
107a0 65 73 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  est fails, then 
107b0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
107c0 65 20 0a 20 20 20 20 2a 2a 20 22 78 20 49 4e 20  e .    ** "x IN 
107d0 28 2e 2e 2e 29 22 20 65 78 70 72 65 73 73 69 6f  (...)" expressio
107e0 6e 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  n must be either
107f0 20 30 20 6f 72 20 4e 55 4c 4c 2e 20 49 66 20 74   0 or NULL. If t
10800 68 65 20 73 65 74 0a 20 20 20 20 2a 2a 20 63 6f  he set.    ** co
10810 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 20 76  ntains no NULL v
10820 61 6c 75 65 73 2c 20 74 68 65 6e 20 74 68 65 20  alues, then the 
10830 72 65 73 75 6c 74 20 69 73 20 30 2e 20 49 66 20  result is 0. If 
10840 74 68 65 20 73 65 74 20 0a 20 20 20 20 2a 2a 20  the set .    ** 
10850 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
10860 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73  more NULL values
10870 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
10880 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  t of the.    ** 
10890 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6c  expression is al
108a0 73 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a  so NULL..    */.
108b0 20 20 20 20 69 66 28 20 72 52 68 73 48 61 73 4e      if( rRhsHasN
108c0 75 6c 6c 3d 3d 30 20 7c 7c 20 64 65 73 74 49 66  ull==0 || destIf
108d0 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c  False==destIfNul
108e0 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  l ){.      /* Th
108f0 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69  is branch runs i
10900 66 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 61 74  f it is known at
10910 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 74 68   compile time th
10920 61 74 20 74 68 65 20 52 48 53 0a 20 20 20 20 20  at the RHS.     
10930 20 2a 2a 20 63 61 6e 6e 6f 74 20 63 6f 6e 74 61   ** cannot conta
10940 69 6e 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 20  in NULL values. 
10950 54 68 69 73 20 68 61 70 70 65 6e 73 20 61 73 20  This happens as 
10960 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20  the result.     
10970 20 2a 2a 20 6f 66 20 61 20 22 4e 4f 54 20 4e 55   ** of a "NOT NU
10980 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  LL" constraint i
10990 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  n the database s
109a0 63 68 65 6d 61 2e 0a 20 20 20 20 20 20 2a 2a 0a  chema..      **.
109b0 20 20 20 20 20 20 2a 2a 20 41 6c 73 6f 20 72 75        ** Also ru
109c0 6e 20 74 68 69 73 20 62 72 61 6e 63 68 20 69 66  n this branch if
109d0 20 4e 55 4c 4c 20 69 73 20 65 71 75 69 76 61 6c   NULL is equival
109e0 65 6e 74 20 74 6f 20 46 41 4c 53 45 0a 20 20 20  ent to FALSE.   
109f0 20 20 20 2a 2a 20 66 6f 72 20 74 68 69 73 20 70     ** for this p
10a00 61 72 74 69 63 75 6c 61 72 20 49 4e 20 6f 70 65  articular IN ope
10a10 72 61 74 6f 72 2e 0a 20 20 20 20 20 20 2a 2f 0a  rator..      */.
10a20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10a30 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
10a40 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78 70 72  _NotFound, pExpr
10a50 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66  ->iTable, destIf
10a60 46 61 6c 73 65 2c 20 72 31 2c 20 31 29 3b 0a 0a  False, r1, 1);..
10a70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10a80 20 2f 2a 20 49 6e 20 74 68 69 73 20 62 72 61 6e   /* In this bran
10a90 63 68 2c 20 74 68 65 20 52 48 53 20 6f 66 20 74  ch, the RHS of t
10aa0 68 65 20 49 4e 20 6d 69 67 68 74 20 63 6f 6e 74  he IN might cont
10ab0 61 69 6e 20 61 20 4e 55 4c 4c 20 61 6e 64 0a 20  ain a NULL and. 
10ac0 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 65 73       ** the pres
10ad0 65 6e 63 65 20 6f 66 20 61 20 4e 55 4c 4c 20 6f  ence of a NULL o
10ae0 6e 20 74 68 65 20 52 48 53 20 6d 61 6b 65 73 20  n the RHS makes 
10af0 61 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20  a difference in 
10b00 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 75 74  the.      ** out
10b10 63 6f 6d 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  come..      */. 
10b20 20 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 2c       int j1, j2,
10b30 20 6a 33 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46   j3;..      /* F
10b40 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65  irst check to se
10b50 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20  e if the LHS is 
10b60 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
10b70 20 52 48 53 2e 20 20 49 66 20 73 6f 2c 0a 20 20   RHS.  If so,.  
10b80 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
10b90 70 72 65 73 65 6e 63 65 20 6f 66 20 4e 55 4c 4c  presence of NULL
10ba0 73 20 69 6e 20 74 68 65 20 52 48 53 20 64 6f 65  s in the RHS doe
10bb0 73 20 6e 6f 74 20 6d 61 74 74 65 72 2c 20 73 6f  s not matter, so
10bc0 20 6a 75 6d 70 0a 20 20 20 20 20 20 2a 2a 20 6f   jump.      ** o
10bd0 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63  ver all of the c
10be0 6f 64 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ode that follows
10bf0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
10c00 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j1 = sqlite3Vdb
10c10 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
10c20 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  _Found, pExpr->i
10c30 54 61 62 6c 65 2c 20 30 2c 20 72 31 2c 20 31 29  Table, 0, r1, 1)
10c40 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 48 65 72 65  ;..      /* Here
10c50 20 77 65 20 62 65 67 69 6e 20 67 65 6e 65 72 61   we begin genera
10c60 74 69 6e 67 20 63 6f 64 65 20 74 68 61 74 20 72  ting code that r
10c70 75 6e 73 20 69 66 20 74 68 65 20 4c 48 53 20 69  uns if the LHS i
10c80 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 63  s not.      ** c
10c90 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
10ca0 74 68 65 20 52 48 53 2e 20 20 47 65 6e 65 72 61  the RHS.  Genera
10cb0 74 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  te additional co
10cc0 64 65 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  de that.      **
10cd0 20 74 65 73 74 73 20 74 68 65 20 52 48 53 20 66   tests the RHS f
10ce0 6f 72 20 4e 55 4c 4c 73 2e 20 20 49 66 20 74 68  or NULLs.  If th
10cf0 65 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 61  e RHS contains a
10d00 20 4e 55 4c 4c 20 74 68 65 6e 0a 20 20 20 20 20   NULL then.     
10d10 20 2a 2a 20 6a 75 6d 70 20 74 6f 20 64 65 73 74   ** jump to dest
10d20 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 72  IfNull.  If ther
10d30 65 20 61 72 65 20 6e 6f 20 4e 55 4c 4c 73 20 69  e are no NULLs i
10d40 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 0a 20  n the RHS then. 
10d50 20 20 20 20 20 2a 2a 20 6a 75 6d 70 20 74 6f 20       ** jump to 
10d60 64 65 73 74 49 66 46 61 6c 73 65 2e 0a 20 20 20  destIfFalse..   
10d70 20 20 20 2a 2f 0a 20 20 20 20 20 20 6a 32 20 3d     */.      j2 =
10d80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10d90 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  p1(v, OP_NotNull
10da0 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a  , rRhsHasNull);.
10db0 20 20 20 20 20 20 6a 33 20 3d 20 73 71 6c 69 74        j3 = sqlit
10dc0 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
10dd0 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78  v, OP_Found, pEx
10de0 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72  pr->iTable, 0, r
10df0 52 68 73 48 61 73 4e 75 6c 6c 2c 20 31 29 3b 0a  RhsHasNull, 1);.
10e00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10e10 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
10e20 74 65 67 65 72 2c 20 2d 31 2c 20 72 52 68 73 48  teger, -1, rRhsH
10e30 61 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  asNull);.      s
10e40 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
10e50 72 65 28 76 2c 20 6a 33 29 3b 0a 20 20 20 20 20  re(v, j3);.     
10e60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10e70 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
10e80 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 31 29   rRhsHasNull, 1)
10e90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10ea0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
10eb0 32 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75  2);..      /* Ju
10ec0 6d 70 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70  mp to the approp
10ed0 72 69 61 74 65 20 74 61 72 67 65 74 20 64 65 70  riate target dep
10ee0 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
10ef0 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20 20 20 2a  r or not.      *
10f00 2a 20 74 68 65 20 52 48 53 20 63 6f 6e 74 61 69  * the RHS contai
10f10 6e 73 20 61 20 4e 55 4c 4c 0a 20 20 20 20 20 20  ns a NULL.      
10f20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
10f30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10f40 5f 49 66 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c  _If, rRhsHasNull
10f50 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
10f60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10f70 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
10f80 6f 2c 20 30 2c 20 64 65 73 74 49 66 46 61 6c 73  o, 0, destIfFals
10f90 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68  e);..      /* Th
10fa0 65 20 4f 50 5f 46 6f 75 6e 64 20 61 74 20 74 68  e OP_Found at th
10fb0 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20 62 72  e top of this br
10fc0 61 6e 63 68 20 6a 75 6d 70 73 20 68 65 72 65 20  anch jumps here 
10fd0 77 68 65 6e 20 74 72 75 65 2c 20 0a 20 20 20 20  when true, .    
10fe0 20 20 2a 2a 20 63 61 75 73 69 6e 67 20 74 68 65    ** causing the
10ff0 20 6f 76 65 72 61 6c 6c 20 49 4e 20 65 78 70 72   overall IN expr
11000 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 69 6f  ession evaluatio
11010 6e 20 74 6f 20 66 61 6c 6c 20 74 68 72 6f 75 67  n to fall throug
11020 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
11030 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
11040 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20  pHere(v, j1);.  
11050 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
11060 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
11070 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 73  pParse, r1);.  s
11080 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
11090 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20  op(pParse, 1);. 
110a0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
110b0 20 22 65 6e 64 20 49 4e 20 65 78 70 72 22 29 29   "end IN expr"))
110c0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
110d0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
110e0 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 75 70  RY */../*.** Dup
110f0 6c 69 63 61 74 65 20 61 6e 20 38 2d 62 79 74 65  licate an 8-byte
11100 20 76 61 6c 75 65 0a 2a 2f 0a 73 74 61 74 69 63   value.*/.static
11110 20 63 68 61 72 20 2a 64 75 70 38 62 79 74 65 73   char *dup8bytes
11120 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20  (Vdbe *v, const 
11130 63 68 61 72 20 2a 69 6e 29 7b 0a 20 20 63 68 61  char *in){.  cha
11140 72 20 2a 6f 75 74 20 3d 20 73 71 6c 69 74 65 33  r *out = sqlite3
11150 44 62 4d 61 6c 6c 6f 63 52 61 77 28 73 71 6c 69  DbMallocRaw(sqli
11160 74 65 33 56 64 62 65 44 62 28 76 29 2c 20 38 29  te3VdbeDb(v), 8)
11170 3b 0a 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20  ;.  if( out ){. 
11180 20 20 20 6d 65 6d 63 70 79 28 6f 75 74 2c 20 69     memcpy(out, i
11190 6e 2c 20 38 29 3b 0a 20 20 7d 0a 20 20 72 65 74  n, 8);.  }.  ret
111a0 75 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 23 69 66 6e  urn out;.}..#ifn
111b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
111c0 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f  FLOATING_POINT./
111d0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
111e0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
111f0 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66  t will put the f
11200 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a  loating point.**
11210 20 76 61 6c 75 65 20 64 65 73 63 72 69 62 65 64   value described
11220 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e   by z[0..n-1] in
11230 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d  to register iMem
11240 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20  ..**.** The z[] 
11250 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62  string will prob
11260 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f  ably not be zero
11270 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75  -terminated.  Bu
11280 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63  t the .** z[n] c
11290 68 61 72 61 63 74 65 72 20 69 73 20 67 75 61 72  haracter is guar
112a0 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d  anteed to be som
112b0 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73  ething that does
112c0 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b   not look.** lik
112d0 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69  e the continuati
112e0 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  on of the number
112f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11300 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a   codeReal(Vdbe *
11310 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  v, const char *z
11320 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67  , int negateFlag
11330 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69  , int iMem){.  i
11340 66 28 20 41 4c 57 41 59 53 28 7a 21 3d 30 29 20  f( ALWAYS(z!=0) 
11350 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61  ){.    double va
11360 6c 75 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lue;.    char *z
11370 56 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74  V;.    sqlite3At
11380 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71  oF(z, &value, sq
11390 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
113a0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a  , SQLITE_UTF8);.
113b0 20 20 20 20 61 73 73 65 72 74 28 20 21 73 71 6c      assert( !sql
113c0 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75 65 29  ite3IsNaN(value)
113d0 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20 41   ); /* The new A
113e0 74 6f 46 20 6e 65 76 65 72 20 72 65 74 75 72 6e  toF never return
113f0 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66 28  s NaN */.    if(
11400 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76 61   negateFlag ) va
11410 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20  lue = -value;.  
11420 20 20 7a 56 20 3d 20 64 75 70 38 62 79 74 65 73    zV = dup8bytes
11430 28 76 2c 20 28 63 68 61 72 2a 29 26 76 61 6c 75  (v, (char*)&valu
11440 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
11450 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
11460 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30  Real, 0, iMem, 0
11470 2c 20 7a 56 2c 20 50 34 5f 52 45 41 4c 29 3b 0a  , zV, P4_REAL);.
11480 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
11490 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
114a0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
114b0 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 69  t will put the i
114c0 6e 74 65 67 65 72 20 64 65 73 63 72 69 62 65 20  nteger describe 
114d0 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e  by.** text z[0..
114e0 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74  n-1] into regist
114f0 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45  er iMem..**.** E
11500 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 69 73 20  xpr.u.zToken is 
11510 61 6c 77 61 79 73 20 55 54 46 38 20 61 6e 64 20  always UTF8 and 
11520 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e  zero-terminated.
11530 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11540 63 6f 64 65 49 6e 74 65 67 65 72 28 50 61 72 73  codeInteger(Pars
11550 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
11560 2a 70 45 78 70 72 2c 20 69 6e 74 20 6e 65 67 46  *pExpr, int negF
11570 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a  lag, int iMem){.
11580 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
11590 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28  se->pVdbe;.  if(
115a0 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20   pExpr->flags & 
115b0 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20  EP_IntValue ){. 
115c0 20 20 20 69 6e 74 20 69 20 3d 20 70 45 78 70 72     int i = pExpr
115d0 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20  ->u.iValue;.    
115e0 61 73 73 65 72 74 28 20 69 3e 3d 30 20 29 3b 0a  assert( i>=0 );.
115f0 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20      if( negFlag 
11600 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20 73 71  ) i = -i;.    sq
11610 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11620 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
11630 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65  , iMem);.  }else
11640 7b 0a 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20  {.    int c;.   
11650 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20 20 20   i64 value;.    
11660 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
11670 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
11680 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d  .    assert( z!=
11690 30 20 29 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c  0 );.    c = sql
116a0 69 74 65 33 41 74 6f 69 36 34 28 7a 2c 20 26 76  ite3Atoi64(z, &v
116b0 61 6c 75 65 2c 20 73 71 6c 69 74 65 33 53 74 72  alue, sqlite3Str
116c0 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54 45  len30(z), SQLITE
116d0 5f 55 54 46 38 29 3b 0a 20 20 20 20 69 66 28 20  _UTF8);.    if( 
116e0 63 3d 3d 30 20 7c 7c 20 28 63 3d 3d 32 20 26 26  c==0 || (c==2 &&
116f0 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20 20 20   negFlag) ){.   
11700 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20 20     char *zV;.   
11710 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29     if( negFlag )
11720 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d 32 20 3f  { value = c==2 ?
11730 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20   SMALLEST_INT64 
11740 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20 20 20  : -value; }.    
11750 20 20 7a 56 20 3d 20 64 75 70 38 62 79 74 65 73    zV = dup8bytes
11760 28 76 2c 20 28 63 68 61 72 2a 29 26 76 61 6c 75  (v, (char*)&valu
11770 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
11780 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
11790 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d  P_Int64, 0, iMem
117a0 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 49 4e 54 36  , 0, zV, P4_INT6
117b0 34 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23  4);.    }else{.#
117c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
117d0 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
117e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
117f0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
11800 6f 76 65 72 73 69 7a 65 64 20 69 6e 74 65 67 65  oversized intege
11810 72 3a 20 25 73 25 73 22 2c 20 6e 65 67 46 6c 61  r: %s%s", negFla
11820 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a 29  g ? "-" : "", z)
11830 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 63 6f  ;.#else.      co
11840 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e 65 67  deReal(v, z, neg
11850 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 23 65 6e  Flag, iMem);.#en
11860 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  dif.    }.  }.}.
11870 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 63  ./*.** Clear a c
11880 61 63 68 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73  ache entry..*/.s
11890 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 68 65  tatic void cache
118a0 45 6e 74 72 79 43 6c 65 61 72 28 50 61 72 73 65  EntryClear(Parse
118b0 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74   *pParse, struct
118c0 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 29 7b 0a   yColCache *p){.
118d0 20 20 69 66 28 20 70 2d 3e 74 65 6d 70 52 65 67    if( p->tempReg
118e0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72   ){.    if( pPar
118f0 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72  se->nTempReg<Arr
11900 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61  aySize(pParse->a
11910 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20  TempReg) ){.    
11920 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52    pParse->aTempR
11930 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  eg[pParse->nTemp
11940 52 65 67 2b 2b 5d 20 3d 20 70 2d 3e 69 52 65 67  Reg++] = p->iReg
11950 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74  ;.    }.    p->t
11960 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 7d 0a  empReg = 0;.  }.
11970 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64  }.../*.** Record
11980 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   in the column c
11990 61 63 68 65 20 74 68 61 74 20 61 20 70 61 72 74  ache that a part
119a0 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20 66 72  icular column fr
119b0 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69 63 75 6c  om a.** particul
119c0 61 72 20 74 61 62 6c 65 20 69 73 20 73 74 6f 72  ar table is stor
119d0 65 64 20 69 6e 20 61 20 70 61 72 74 69 63 75 6c  ed in a particul
119e0 61 72 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a  ar register..*/.
119f0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
11a00 43 61 63 68 65 53 74 6f 72 65 28 50 61 72 73 65  CacheStore(Parse
11a10 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54   *pParse, int iT
11a20 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e  ab, int iCol, in
11a30 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t iReg){.  int i
11a40 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72 75 3b 0a  ;.  int minLru;.
11a50 20 20 69 6e 74 20 69 64 78 4c 72 75 3b 0a 20 20    int idxLru;.  
11a60 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
11a70 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *p;..  assert( 
11a80 69 52 65 67 3e 30 20 29 3b 20 20 2f 2a 20 52 65  iReg>0 );  /* Re
11a90 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 61  gister numbers a
11aa0 72 65 20 61 6c 77 61 79 73 20 70 6f 73 69 74 69  re always positi
11ab0 76 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ve */.  assert( 
11ac0 69 43 6f 6c 3e 3d 2d 31 20 26 26 20 69 43 6f 6c  iCol>=-1 && iCol
11ad0 3c 33 32 37 36 38 20 29 3b 20 20 2f 2a 20 46 69  <32768 );  /* Fi
11ae0 6e 69 74 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62  nite column numb
11af0 65 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  ers */..  /* The
11b00 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61   SQLITE_ColumnCa
11b10 63 68 65 20 66 6c 61 67 20 64 69 73 61 62 6c 65  che flag disable
11b20 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  s the column cac
11b30 68 65 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  he.  This is use
11b40 64 0a 20 20 2a 2a 20 66 6f 72 20 74 65 73 74 69  d.  ** for testi
11b50 6e 67 20 6f 6e 6c 79 20 2d 20 74 6f 20 76 65 72  ng only - to ver
11b60 69 66 79 20 74 68 61 74 20 53 51 4c 69 74 65 20  ify that SQLite 
11b70 61 6c 77 61 79 73 20 67 65 74 73 20 74 68 65 20  always gets the 
11b80 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 2a 2a  same answer.  **
11b90 20 77 69 74 68 20 61 6e 64 20 77 69 74 68 6f 75   with and withou
11ba0 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  t the column cac
11bb0 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4f  he..  */.  if( O
11bc0 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62  ptimizationDisab
11bd0 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  led(pParse->db, 
11be0 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63  SQLITE_ColumnCac
11bf0 68 65 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  he) ) return;.. 
11c00 20 2f 2a 20 46 69 72 73 74 20 72 65 70 6c 61 63   /* First replac
11c10 65 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65  e any existing e
11c20 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ntry..  **.  ** 
11c30 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 77 61  Actually, the wa
11c40 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  y the column cac
11c50 68 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  he is currently 
11c60 75 73 65 64 2c 20 77 65 20 61 72 65 20 67 75 61  used, we are gua
11c70 72 61 6e 74 65 65 64 0a 20 20 2a 2a 20 74 68 61  ranteed.  ** tha
11c80 74 20 74 68 65 20 6f 62 6a 65 63 74 20 77 69 6c  t the object wil
11c90 6c 20 6e 65 76 65 72 20 61 6c 72 65 61 64 79 20  l never already 
11ca0 62 65 20 69 6e 20 63 61 63 68 65 2e 20 20 56 65  be in cache.  Ve
11cb0 72 69 66 79 20 74 68 69 73 20 67 75 61 72 61 6e  rify this guaran
11cc0 74 65 65 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  tee..  */.#ifnde
11cd0 66 20 4e 44 45 42 55 47 0a 20 20 66 6f 72 28 69  f NDEBUG.  for(i
11ce0 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
11cf0 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
11d00 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
11d10 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 61 73 73  +, p++){.    ass
11d20 65 72 74 28 20 70 2d 3e 69 52 65 67 3d 3d 30 20  ert( p->iReg==0 
11d30 7c 7c 20 70 2d 3e 69 54 61 62 6c 65 21 3d 69 54  || p->iTable!=iT
11d40 61 62 20 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e  ab || p->iColumn
11d50 21 3d 69 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65  !=iCol );.  }.#e
11d60 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 69 6e 64 20  ndif..  /* Find 
11d70 61 6e 20 65 6d 70 74 79 20 73 6c 6f 74 20 61 6e  an empty slot an
11d80 64 20 72 65 70 6c 61 63 65 20 69 74 20 2a 2f 0a  d replace it */.
11d90 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
11da0 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
11db0 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
11dc0 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
11dd0 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d      if( p->iReg=
11de0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69  =0 ){.      p->i
11df0 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e  Level = pParse->
11e00 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20  iCacheLevel;.   
11e10 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69     p->iTable = i
11e20 54 61 62 3b 0a 20 20 20 20 20 20 70 2d 3e 69 43  Tab;.      p->iC
11e30 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20  olumn = iCol;.  
11e40 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52      p->iReg = iR
11e50 65 67 3b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d  eg;.      p->tem
11e60 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  pReg = 0;.      
11e70 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d  p->lru = pParse-
11e80 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20  >iCacheCnt++;.  
11e90 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
11ea0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6c  }.  }..  /* Repl
11eb0 61 63 65 20 74 68 65 20 6c 61 73 74 20 72 65 63  ace the last rec
11ec0 65 6e 74 6c 79 20 75 73 65 64 20 2a 2f 0a 20 20  ently used */.  
11ed0 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66 66 66 66  minLru = 0x7ffff
11ee0 66 66 66 3b 0a 20 20 69 64 78 4c 72 75 20 3d 20  fff;.  idxLru = 
11ef0 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  -1;.  for(i=0, p
11f00 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
11f10 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
11f20 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
11f30 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6c  +){.    if( p->l
11f40 72 75 3c 6d 69 6e 4c 72 75 20 29 7b 0a 20 20 20  ru<minLru ){.   
11f50 20 20 20 69 64 78 4c 72 75 20 3d 20 69 3b 0a 20     idxLru = i;. 
11f60 20 20 20 20 20 6d 69 6e 4c 72 75 20 3d 20 70 2d       minLru = p-
11f70 3e 6c 72 75 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  >lru;.    }.  }.
11f80 20 20 69 66 28 20 41 4c 57 41 59 53 28 69 64 78    if( ALWAYS(idx
11f90 4c 72 75 3e 3d 30 29 20 29 7b 0a 20 20 20 20 70  Lru>=0) ){.    p
11fa0 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c   = &pParse->aCol
11fb0 43 61 63 68 65 5b 69 64 78 4c 72 75 5d 3b 0a 20  Cache[idxLru];. 
11fc0 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70     p->iLevel = p
11fd0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
11fe0 65 6c 3b 0a 20 20 20 20 70 2d 3e 69 54 61 62 6c  el;.    p->iTabl
11ff0 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 2d  e = iTab;.    p-
12000 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b  >iColumn = iCol;
12010 0a 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 69  .    p->iReg = i
12020 52 65 67 3b 0a 20 20 20 20 70 2d 3e 74 65 6d 70  Reg;.    p->temp
12030 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  Reg = 0;.    p->
12040 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43  lru = pParse->iC
12050 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 72  acheCnt++;.    r
12060 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  eturn;.  }.}../*
12070 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61  .** Indicate tha
12080 74 20 72 65 67 69 73 74 65 72 73 20 62 65 74 77  t registers betw
12090 65 65 6e 20 69 52 65 67 2e 2e 69 52 65 67 2b 6e  een iReg..iReg+n
120a0 52 65 67 2d 31 20 61 72 65 20 62 65 69 6e 67 20  Reg-1 are being 
120b0 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 2a 2a 20  overwritten..** 
120c0 50 75 72 67 65 20 74 68 65 20 72 61 6e 67 65 20  Purge the range 
120d0 6f 66 20 72 65 67 69 73 74 65 72 73 20 66 72 6f  of registers fro
120e0 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  m the column cac
120f0 68 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  he..*/.void sqli
12100 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
12110 76 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ve(Parse *pParse
12120 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20  , int iReg, int 
12130 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  nReg){.  int i;.
12140 20 20 69 6e 74 20 69 4c 61 73 74 20 3d 20 69 52    int iLast = iR
12150 65 67 20 2b 20 6e 52 65 67 20 2d 20 31 3b 0a 20  eg + nReg - 1;. 
12160 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
12170 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  e *p;.  for(i=0,
12180 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
12190 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
121a0 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
121b0 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20  p++){.    int r 
121c0 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69  = p->iReg;.    i
121d0 66 28 20 72 3e 3d 69 52 65 67 20 26 26 20 72 3c  f( r>=iReg && r<
121e0 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  =iLast ){.      
121f0 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28  cacheEntryClear(
12200 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
12210 20 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20    p->iReg = 0;. 
12220 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
12230 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 63  * Remember the c
12240 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 63 61  urrent column ca
12250 63 68 65 20 63 6f 6e 74 65 78 74 2e 20 20 41 6e  che context.  An
12260 79 20 6e 65 77 20 65 6e 74 72 69 65 73 20 61 64  y new entries ad
12270 64 65 64 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20  ded.** added to 
12280 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
12290 20 61 66 74 65 72 20 74 68 69 73 20 63 61 6c 6c   after this call
122a0 20 61 72 65 20 72 65 6d 6f 76 65 64 20 77 68 65   are removed whe
122b0 6e 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70  n the.** corresp
122c0 6f 6e 64 69 6e 67 20 70 6f 70 20 6f 63 63 75 72  onding pop occur
122d0 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
122e0 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
122f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
12300 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65    pParse->iCache
12310 4c 65 76 65 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a  Level++;.}../*.*
12320 2a 20 52 65 6d 6f 76 65 20 66 72 6f 6d 20 74 68  * Remove from th
12330 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61  e column cache a
12340 6e 79 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  ny entries that 
12350 77 65 72 65 20 61 64 64 65 64 20 73 69 6e 63 65  were added since
12360 20 74 68 65 0a 2a 2a 20 74 68 65 20 70 72 65 76   the.** the prev
12370 69 6f 75 73 20 4e 20 50 75 73 68 20 6f 70 65 72  ious N Push oper
12380 61 74 69 6f 6e 73 2e 20 20 49 6e 20 6f 74 68 65  ations.  In othe
12390 72 20 77 6f 72 64 73 2c 20 72 65 73 74 6f 72 65  r words, restore
123a0 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 74 6f   the cache.** to
123b0 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61   the state it wa
123c0 73 20 69 6e 20 4e 20 50 75 73 68 65 73 20 61 67  s in N Pushes ag
123d0 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  o..*/.void sqlit
123e0 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 50  e3ExprCachePop(P
123f0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
12400 74 20 4e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  t N){.  int i;. 
12410 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
12420 65 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  e *p;.  assert( 
12430 4e 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  N>0 );.  assert(
12440 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
12450 65 76 65 6c 3e 3d 4e 20 29 3b 0a 20 20 70 50 61  evel>=N );.  pPa
12460 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
12470 20 2d 3d 20 4e 3b 0a 20 20 66 6f 72 28 69 3d 30   -= N;.  for(i=0
12480 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
12490 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
124a0 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
124b0 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
124c0 2d 3e 69 52 65 67 20 26 26 20 70 2d 3e 69 4c 65  ->iReg && p->iLe
124d0 76 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43 61 63  vel>pParse->iCac
124e0 68 65 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20 20  heLevel ){.     
124f0 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72   cacheEntryClear
12500 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
12510 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a     p->iReg = 0;.
12520 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
12530 2a 2a 20 57 68 65 6e 20 61 20 63 61 63 68 65 64  ** When a cached
12540 20 63 6f 6c 75 6d 6e 20 69 73 20 72 65 75 73 65   column is reuse
12550 64 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  d, make sure tha
12560 74 20 69 74 73 20 72 65 67 69 73 74 65 72 20 69  t its register i
12570 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20 61  s.** no longer a
12580 76 61 69 6c 61 62 6c 65 20 61 73 20 61 20 74 65  vailable as a te
12590 6d 70 20 72 65 67 69 73 74 65 72 2e 20 20 74 69  mp register.  ti
125a0 63 6b 65 74 20 23 33 38 37 39 3a 20 20 74 68 61  cket #3879:  tha
125b0 74 20 73 61 6d 65 0a 2a 2a 20 72 65 67 69 73 74  t same.** regist
125c0 65 72 20 6d 69 67 68 74 20 62 65 20 69 6e 20 74  er might be in t
125d0 68 65 20 63 61 63 68 65 20 69 6e 20 6d 75 6c 74  he cache in mult
125e0 69 70 6c 65 20 70 6c 61 63 65 73 2c 20 73 6f 20  iple places, so 
125f0 62 65 20 73 75 72 65 20 74 6f 0a 2a 2a 20 67 65  be sure to.** ge
12600 74 20 74 68 65 6d 20 61 6c 6c 2e 0a 2a 2f 0a 73  t them all..*/.s
12610 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
12620 65 33 45 78 70 72 43 61 63 68 65 50 69 6e 52 65  e3ExprCachePinRe
12630 67 69 73 74 65 72 28 50 61 72 73 65 20 2a 70 50  gister(Parse *pP
12640 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b  arse, int iReg){
12650 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
12660 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
12670 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
12680 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
12690 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
126a0 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
126b0 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67  .    if( p->iReg
126c0 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20  ==iReg ){.      
126d0 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a  p->tempReg = 0;.
126e0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
126f0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
12700 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65 20   to extract the 
12710 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 43 6f  value of the iCo
12720 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  l-th column of a
12730 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20   table..*/.void 
12740 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
12750 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28  etColumnOfTable(
12760 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
12770 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 75     /* The VDBE u
12780 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
12790 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  n */.  Table *pT
127a0 61 62 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61  ab,    /* The ta
127b0 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
127c0 68 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e  he value */.  in
127d0 74 20 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a  t iTabCur,    /*
127e0 20 54 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20   The cursor for 
127f0 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
12800 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20  int iCol,       
12810 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
12820 63 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61 63  column to extrac
12830 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75  t */.  int regOu
12840 74 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63  t      /* Extrac
12850 74 20 74 68 65 20 76 61 6c 75 64 20 69 6e 74 6f  t the valud into
12860 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
12870 2f 0a 29 7b 0a 20 20 69 66 28 20 69 43 6f 6c 3c  /.){.  if( iCol<
12880 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61 62 2d  0 || iCol==pTab-
12890 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 73 71  >iPKey ){.    sq
128a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
128b0 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61  v, OP_Rowid, iTa
128c0 62 43 75 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20  bCur, regOut);. 
128d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
128e0 6f 70 20 3d 20 49 73 56 69 72 74 75 61 6c 28 70  op = IsVirtual(p
128f0 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d  Tab) ? OP_VColum
12900 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20  n : OP_Column;. 
12910 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12920 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54 61 62  dOp3(v, op, iTab
12930 43 75 72 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75  Cur, iCol, regOu
12940 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43  t);.  }.  if( iC
12950 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ol>=0 ){.    sql
12960 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c  ite3ColumnDefaul
12970 74 28 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c 2c  t(v, pTab, iCol,
12980 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a   regOut);.  }.}.
12990 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
129a0 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
129b0 78 74 72 61 63 74 20 74 68 65 20 69 43 6f 6c 75  xtract the iColu
129c0 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f  mn-th column fro
129d0 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61 62 20  m.** table pTab 
129e0 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 63 6f  and store the co
129f0 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 61 20  lumn value in a 
12a00 72 65 67 69 73 74 65 72 2e 20 20 41 6e 20 65 66  register.  An ef
12a10 66 6f 72 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20  fort.** is made 
12a20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c  to store the col
12a30 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72 65 67  umn value in reg
12a40 69 73 74 65 72 20 69 52 65 67 2c 20 62 75 74 20  ister iReg, but 
12a50 74 68 69 73 20 69 73 0a 2a 2a 20 6e 6f 74 20 67  this is.** not g
12a60 75 61 72 61 6e 74 65 65 64 2e 20 20 54 68 65 20  uaranteed.  The 
12a70 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
12a80 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20  column value is 
12a90 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
12aa0 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e  There must be an
12ab0 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 6f 20   open cursor to 
12ac0 70 54 61 62 20 69 6e 20 69 54 61 62 6c 65 20 77  pTab in iTable w
12ad0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
12ae0 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 20  .** is called.  
12af0 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65  If iColumn<0 the
12b00 6e 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61  n code is genera
12b10 74 65 64 20 74 68 61 74 20 65 78 74 72 61 63 74  ted that extract
12b20 73 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a  s the rowid..*/.
12b30 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
12b40 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20  odeGetColumn(.  
12b50 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
12b60 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
12b70 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
12b80 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62  context */.  Tab
12b90 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a  le *pTab,     /*
12ba0 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
12bb0 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65  the table we are
12bc0 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f   reading from */
12bd0 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20  .  int iColumn, 
12be0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
12bf0 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  the table column
12c00 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
12c10 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75  ,      /* The cu
12c20 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
12c30 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
12c40 69 6e 74 20 69 52 65 67 2c 20 20 20 20 20 20 20  int iReg,       
12c50 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74   /* Store result
12c60 73 20 68 65 72 65 20 2a 2f 0a 20 20 75 38 20 70  s here */.  u8 p
12c70 35 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  5            /* 
12c80 50 35 20 76 61 6c 75 65 20 66 6f 72 20 4f 50 5f  P5 value for OP_
12c90 43 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 56  Column */.){.  V
12ca0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
12cb0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
12cc0 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
12cd0 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28 69  che *p;..  for(i
12ce0 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
12cf0 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
12d00 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
12d10 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
12d20 20 70 2d 3e 69 52 65 67 3e 30 20 26 26 20 70 2d   p->iReg>0 && p-
12d30 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20  >iTable==iTable 
12d40 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69  && p->iColumn==i
12d50 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
12d60 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d  p->lru = pParse-
12d70 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20  >iCacheCnt++;.  
12d80 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
12d90 61 63 68 65 50 69 6e 52 65 67 69 73 74 65 72 28  achePinRegister(
12da0 70 50 61 72 73 65 2c 20 70 2d 3e 69 52 65 67 29  pParse, p->iReg)
12db0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
12dc0 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20  ->iReg;.    }.  
12dd0 7d 20 20 0a 20 20 61 73 73 65 72 74 28 20 76 21  }  .  assert( v!
12de0 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  =0 );.  sqlite3E
12df0 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
12e00 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c  OfTable(v, pTab,
12e10 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e   iTable, iColumn
12e20 2c 20 69 52 65 67 29 3b 0a 20 20 69 66 28 20 70  , iReg);.  if( p
12e30 35 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  5 ){.    sqlite3
12e40 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
12e50 70 35 29 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 20  p5);.  }else{   
12e60 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
12e70 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73  CacheStore(pPars
12e80 65 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75  e, iTable, iColu
12e90 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 7d 0a 20  mn, iReg);.  }. 
12ea0 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a   return iReg;.}.
12eb0 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 6c 6c  ./*.** Clear all
12ec0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 65 6e   column cache en
12ed0 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tries..*/.void s
12ee0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
12ef0 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50 61 72  lear(Parse *pPar
12f00 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  se){.  int i;.  
12f10 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
12f20 20 2a 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c   *p;..  for(i=0,
12f30 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
12f40 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
12f50 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
12f60 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
12f70 3e 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20 63  >iReg ){.      c
12f80 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70  acheEntryClear(p
12f90 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20  Parse, p);.     
12fa0 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20   p->iReg = 0;.  
12fb0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
12fc0 20 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   Record the fact
12fd0 20 74 68 61 74 20 61 6e 20 61 66 66 69 6e 69 74   that an affinit
12fe0 79 20 63 68 61 6e 67 65 20 68 61 73 20 6f 63 63  y change has occ
12ff0 75 72 72 65 64 20 6f 6e 20 69 43 6f 75 6e 74 0a  urred on iCount.
13000 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73 74 61  ** registers sta
13010 72 74 69 6e 67 20 77 69 74 68 20 69 53 74 61 72  rting with iStar
13020 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
13030 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
13040 69 74 79 43 68 61 6e 67 65 28 50 61 72 73 65 20  ityChange(Parse 
13050 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 53 74  *pParse, int iSt
13060 61 72 74 2c 20 69 6e 74 20 69 43 6f 75 6e 74 29  art, int iCount)
13070 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  {.  sqlite3ExprC
13080 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73  acheRemove(pPars
13090 65 2c 20 69 53 74 61 72 74 2c 20 69 43 6f 75 6e  e, iStart, iCoun
130a0 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  t);.}../*.** Gen
130b0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f  erate code to mo
130c0 76 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ve content from 
130d0 72 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e  registers iFrom.
130e0 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a  ..iFrom+nReg-1.*
130f0 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69  * over to iTo..i
13100 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70 20  To+nReg-1. Keep 
13110 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
13120 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a   up-to-date..*/.
13130 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
13140 43 6f 64 65 4d 6f 76 65 28 50 61 72 73 65 20 2a  CodeMove(Parse *
13150 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f  pParse, int iFro
13160 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20  m, int iTo, int 
13170 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  nReg){.  int i;.
13180 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
13190 68 65 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  he *p;.  assert(
131a0 20 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52 65 67   iFrom>=iTo+nReg
131b0 20 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65 67 3c 3d   || iFrom+nReg<=
131c0 69 54 6f 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  iTo );.  sqlite3
131d0 56 64 62 65 41 64 64 4f 70 33 28 70 50 61 72 73  VdbeAddOp3(pPars
131e0 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76  e->pVdbe, OP_Mov
131f0 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e  e, iFrom, iTo, n
13200 52 65 67 2d 31 29 3b 0a 20 20 66 6f 72 28 69 3d  Reg-1);.  for(i=
13210 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
13220 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
13230 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
13240 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  , p++){.    int 
13250 78 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20  x = p->iReg;.   
13260 20 69 66 28 20 78 3e 3d 69 46 72 6f 6d 20 26 26   if( x>=iFrom &&
13270 20 78 3c 69 46 72 6f 6d 2b 6e 52 65 67 20 29 7b   x<iFrom+nReg ){
13280 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 2b  .      p->iReg +
13290 3d 20 69 54 6f 2d 69 46 72 6f 6d 3b 0a 20 20 20  = iTo-iFrom;.   
132a0 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65   }.  }.}..#if de
132b0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
132c0 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
132d0 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54  QLITE_COVERAGE_T
132e0 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
132f0 6e 20 74 72 75 65 20 69 66 20 61 6e 79 20 72 65  n true if any re
13300 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 72 61  gister in the ra
13310 6e 67 65 20 69 46 72 6f 6d 2e 2e 69 54 6f 20 28  nge iFrom..iTo (
13320 69 6e 63 6c 75 73 69 76 65 29 0a 2a 2a 20 69 73  inclusive).** is
13330 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66   used as part of
13340 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
13350 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
13360 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 77 69  utine is used wi
13370 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 61 6e  thin assert() an
13380 64 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63  d testcase() mac
13390 72 6f 73 20 6f 6e 6c 79 0a 2a 2a 20 61 6e 64 20  ros only.** and 
133a0 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20  does not appear 
133b0 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 62 75 69 6c  in a normal buil
133c0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
133d0 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63   usedAsColumnCac
133e0 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  he(Parse *pParse
133f0 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74  , int iFrom, int
13400 20 69 54 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   iTo){.  int i;.
13410 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
13420 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30  he *p;.  for(i=0
13430 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
13440 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
13450 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
13460 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72   p++){.    int r
13470 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20   = p->iReg;.    
13480 69 66 28 20 72 3e 3d 69 46 72 6f 6d 20 26 26 20  if( r>=iFrom && 
13490 72 3c 3d 69 54 6f 20 29 20 72 65 74 75 72 6e 20  r<=iTo ) return 
134a0 31 3b 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a  1;    /*NO_TEST*
134b0 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  /.  }.  return 0
134c0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
134d0 4c 49 54 45 5f 44 45 42 55 47 20 7c 7c 20 53 51  LITE_DEBUG || SQ
134e0 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45  LITE_COVERAGE_TE
134f0 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ST */../*.** Gen
13500 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
13510 74 68 65 20 63 75 72 72 65 6e 74 20 56 64 62 65  the current Vdbe
13520 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
13530 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73   given.** expres
13540 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20 74  sion.  Attempt t
13550 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  o store the resu
13560 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  lts in register 
13570 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74  "target"..** Ret
13580 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
13590 20 77 68 65 72 65 20 72 65 73 75 6c 74 73 20 61   where results a
135a0 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  re stored..**.**
135b0 20 57 69 74 68 20 74 68 69 73 20 72 6f 75 74 69   With this routi
135c0 6e 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ne, there is no 
135d0 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 72  guarantee that r
135e0 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62  esults will.** b
135f0 65 20 73 74 6f 72 65 64 20 69 6e 20 74 61 72 67  e stored in targ
13600 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  et.  The result 
13610 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65 64 20  might be stored 
13620 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  in some other.**
13630 20 72 65 67 69 73 74 65 72 20 69 66 20 69 74 20   register if it 
13640 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f  is convenient to
13650 20 64 6f 20 73 6f 2e 20 20 54 68 65 20 63 61 6c   do so.  The cal
13660 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
13670 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65 20   must check the 
13680 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20  return code and 
13690 6d 6f 76 65 20 74 68 65 20 72 65 73 75 6c 74 73  move the results
136a0 20 74 6f 20 74 68 65 20 64 65 73 69 72 65 64 0a   to the desired.
136b0 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a  ** register..*/.
136c0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
136d0 6f 64 65 54 61 72 67 65 74 28 50 61 72 73 65 20  odeTarget(Parse 
136e0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
136f0 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
13700 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
13710 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f  Parse->pVdbe;  /
13720 2a 20 54 68 65 20 56 4d 20 75 6e 64 65 72 20 63  * The VM under c
13730 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
13740 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
13750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
13760 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20 63  e opcode being c
13770 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  oded */.  int in
13780 52 65 67 20 3d 20 74 61 72 67 65 74 3b 20 20 20  Reg = target;   
13790 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 73      /* Results s
137a0 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65  tored in registe
137b0 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74  r inReg */.  int
137c0 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 20   regFree1 = 0;  
137d0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e         /* If non
137e0 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20  -zero free this 
137f0 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
13800 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46  er */.  int regF
13810 72 65 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20  ree2 = 0;       
13820 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f    /* If non-zero
13830 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f   free this tempo
13840 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f  rary register */
13850 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72  .  int r1, r2, r
13860 33 2c 20 72 34 3b 20 20 20 20 20 20 20 2f 2a 20  3, r4;       /* 
13870 56 61 72 69 6f 75 73 20 72 65 67 69 73 74 65 72  Various register
13880 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 73 71   numbers */.  sq
13890 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
138a0 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64  se->db; /* The d
138b0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
138c0 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  on */..  assert(
138d0 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72   target>0 && tar
138e0 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65  get<=pParse->nMe
138f0 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  m );.  if( v==0 
13900 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
13910 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
13920 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72  cFailed );.    r
13930 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
13940 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a  if( pExpr==0 ){.
13950 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c      op = TK_NULL
13960 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
13970 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
13980 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20   }.  switch( op 
13990 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
139a0 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  GG_COLUMN: {.   
139b0 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67     AggInfo *pAgg
139c0 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41  Info = pExpr->pA
139d0 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74  ggInfo;.      st
139e0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
139f0 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e   *pCol = &pAggIn
13a00 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e  fo->aCol[pExpr->
13a10 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28  iAgg];.      if(
13a20 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65   !pAggInfo->dire
13a30 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  ctMode ){.      
13a40 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e    assert( pCol->
13a50 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20  iMem>0 );.      
13a60 20 20 69 6e 52 65 67 20 3d 20 70 43 6f 6c 2d 3e    inReg = pCol->
13a70 69 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 62 72  iMem;.        br
13a80 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
13a90 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75   if( pAggInfo->u
13aa0 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a  seSortingIdx ){.
13ab0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13ac0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
13ad0 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f  Column, pAggInfo
13ae0 2d 3e 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62  ->sortingIdxPTab
13af0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b10 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
13b20 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  umn, target);.  
13b30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13b40 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74     }.      /* Ot
13b50 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68  herwise, fall th
13b60 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43  ru into the TK_C
13b70 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20  OLUMN case */.  
13b80 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
13b90 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
13ba0 69 6e 74 20 69 54 61 62 20 3d 20 70 45 78 70 72  int iTab = pExpr
13bb0 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
13bc0 69 66 28 20 69 54 61 62 3c 30 20 29 7b 0a 20 20  if( iTab<0 ){.  
13bd0 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
13be0 2d 3e 63 6b 42 61 73 65 3e 30 20 29 7b 0a 20 20  ->ckBase>0 ){.  
13bf0 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
13c00 61 74 69 6e 67 20 43 48 45 43 4b 20 63 6f 6e 73  ating CHECK cons
13c10 74 72 61 69 6e 74 73 20 6f 72 20 69 6e 73 65 72  traints or inser
13c20 74 69 6e 67 20 69 6e 74 6f 20 70 61 72 74 69 61  ting into partia
13c30 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  l index */.     
13c40 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78       inReg = pEx
13c50 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70 50  pr->iColumn + pP
13c60 61 72 73 65 2d 3e 63 6b 42 61 73 65 3b 0a 20 20  arse->ckBase;.  
13c70 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
13c80 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
13c90 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
13ca0 69 6e 67 20 66 72 6f 6d 20 61 20 70 61 72 74 69  ing from a parti
13cb0 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  al index */.    
13cc0 20 20 20 20 20 20 69 54 61 62 20 3d 20 70 50 61        iTab = pPa
13cd0 72 73 65 2d 3e 69 50 61 72 74 49 64 78 54 61 62  rse->iPartIdxTab
13ce0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13cf0 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20    }.      inReg 
13d00 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
13d10 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73  eGetColumn(pPars
13d20 65 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a  e, pExpr->pTab,.
13d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
13d50 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69  Expr->iColumn, i
13d60 54 61 62 2c 20 74 61 72 67 65 74 2c 0a 20 20 20  Tab, target,.   
13d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d80 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
13d90 72 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 20 20 62  r->op2);.      b
13da0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
13db0 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
13dc0 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74   {.      codeInt
13dd0 65 67 65 72 28 70 50 61 72 73 65 2c 20 70 45 78  eger(pParse, pEx
13de0 70 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  pr, 0, target);.
13df0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13e00 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
13e10 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
13e20 50 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54  POINT.    case T
13e30 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  K_FLOAT: {.     
13e40 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
13e50 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
13e60 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
13e70 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28  .      codeReal(
13e80 76 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  v, pExpr->u.zTok
13e90 65 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  en, 0, target);.
13ea0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13eb0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
13ec0 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
13ed0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
13ee0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
13ef0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
13f00 65 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e) );.      sqli
13f10 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
13f20 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
13f30 74 61 72 67 65 74 2c 20 30 2c 20 70 45 78 70 72  target, 0, pExpr
13f40 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a  ->u.zToken, 0);.
13f50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13f60 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
13f70 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ULL: {.      sql
13f80 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13f90 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
13fa0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65  rget);.      bre
13fb0 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
13fc0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c  f SQLITE_OMIT_BL
13fd0 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63  OB_LITERAL.    c
13fe0 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20  ase TK_BLOB: {. 
13ff0 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
14000 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
14010 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c  .      char *zBl
14020 6f 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ob;.      assert
14030 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
14040 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
14050 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
14060 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
14070 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20  .zToken[0]=='x' 
14080 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  || pExpr->u.zTok
14090 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20  en[0]=='X' );.  
140a0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
140b0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d  r->u.zToken[1]==
140c0 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 20  '\'' );.      z 
140d0 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  = &pExpr->u.zTok
140e0 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d  en[2];.      n =
140f0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
14100 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 61  (z) - 1;.      a
14110 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27  ssert( z[n]=='\'
14120 27 20 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62  ' );.      zBlob
14130 20 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42   = sqlite3HexToB
14140 6c 6f 62 28 73 71 6c 69 74 65 33 56 64 62 65 44  lob(sqlite3VdbeD
14150 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  b(v), z, n);.   
14160 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14170 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c  dOp4(v, OP_Blob,
14180 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c   n/2, target, 0,
14190 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d   zBlob, P4_DYNAM
141a0 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  IC);.      break
141b0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
141c0 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
141d0 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  BLE: {.      ass
141e0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
141f0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
14200 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
14210 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
14220 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b  ->u.zToken!=0 );
14230 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14240 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
14250 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  ]!=0 );.      sq
14260 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14270 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20  v, OP_Variable, 
14280 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  pExpr->iColumn, 
14290 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69  target);.      i
142a0 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  f( pExpr->u.zTok
142b0 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20  en[1]!=0 ){.    
142c0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
142d0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  r->u.zToken[0]==
142e0 27 3f 27 20 0a 20 20 20 20 20 20 20 20 20 20 20  '?' .           
142f0 20 20 7c 7c 20 73 74 72 63 6d 70 28 70 45 78 70    || strcmp(pExp
14300 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 50 61  r->u.zToken, pPa
14310 72 73 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72  rse->azVar[pExpr
14320 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 29 3d 3d 30  ->iColumn-1])==0
14330 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
14340 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
14350 76 2c 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 61  v, -1, pParse->a
14360 7a 56 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  zVar[pExpr->iCol
14370 75 6d 6e 2d 31 5d 2c 20 50 34 5f 53 54 41 54 49  umn-1], P4_STATI
14380 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  C);.      }.    
14390 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
143a0 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53     case TK_REGIS
143b0 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52  TER: {.      inR
143c0 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  eg = pExpr->iTab
143d0 6c 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  le;.      break;
143e0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
143f0 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20 69  TK_AS: {.      i
14400 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
14410 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
14420 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
14430 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  t, target);.    
14440 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
14450 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14460 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65  IT_CAST.    case
14470 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20   TK_CAST: {.    
14480 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
14490 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20   of the form:   
144a0 43 41 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f  CAST(pLeft AS to
144b0 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ken) */.      in
144c0 74 20 61 66 66 2c 20 74 6f 5f 6f 70 3b 0a 20 20  t aff, to_op;.  
144d0 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
144e0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
144f0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
14500 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b  >pLeft, target);
14510 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
14520 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
14530 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
14540 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 66 66  ue) );.      aff
14550 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69   = sqlite3Affini
14560 74 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e  tyType(pExpr->u.
14570 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 74  zToken);.      t
14580 6f 5f 6f 70 20 3d 20 61 66 66 20 2d 20 53 51 4c  o_op = aff - SQL
14590 49 54 45 5f 41 46 46 5f 54 45 58 54 20 2b 20 4f  ITE_AFF_TEXT + O
145a0 50 5f 54 6f 54 65 78 74 3b 0a 20 20 20 20 20 20  P_ToText;.      
145b0 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f  assert( to_op==O
145c0 50 5f 54 6f 54 65 78 74 20 20 20 20 7c 7c 20 61  P_ToText    || a
145d0 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ff!=SQLITE_AFF_T
145e0 45 58 54 20 20 20 20 29 3b 0a 20 20 20 20 20 20  EXT    );.      
145f0 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f  assert( to_op==O
14600 50 5f 54 6f 42 6c 6f 62 20 20 20 20 7c 7c 20 61  P_ToBlob    || a
14610 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff!=SQLITE_AFF_N
14620 4f 4e 45 20 20 20 20 29 3b 0a 20 20 20 20 20 20  ONE    );.      
14630 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f  assert( to_op==O
14640 50 5f 54 6f 4e 75 6d 65 72 69 63 20 7c 7c 20 61  P_ToNumeric || a
14650 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff!=SQLITE_AFF_N
14660 55 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 20 20  UMERIC );.      
14670 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f  assert( to_op==O
14680 50 5f 54 6f 49 6e 74 20 20 20 20 20 7c 7c 20 61  P_ToInt     || a
14690 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ff!=SQLITE_AFF_I
146a0 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 20 20  NTEGER );.      
146b0 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f  assert( to_op==O
146c0 50 5f 54 6f 52 65 61 6c 20 20 20 20 7c 7c 20 61  P_ToReal    || a
146d0 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ff!=SQLITE_AFF_R
146e0 45 41 4c 20 20 20 20 29 3b 0a 20 20 20 20 20 20  EAL    );.      
146f0 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d  testcase( to_op=
14700 3d 4f 50 5f 54 6f 54 65 78 74 20 29 3b 0a 20 20  =OP_ToText );.  
14710 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f      testcase( to
14720 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 29  _op==OP_ToBlob )
14730 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14740 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75  ( to_op==OP_ToNu
14750 6d 65 72 69 63 20 29 3b 0a 20 20 20 20 20 20 74  meric );.      t
14760 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d  estcase( to_op==
14770 4f 50 5f 54 6f 49 6e 74 20 29 3b 0a 20 20 20 20  OP_ToInt );.    
14780 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f    testcase( to_o
14790 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 29 3b 0a  p==OP_ToReal );.
147a0 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21        if( inReg!
147b0 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20  =target ){.     
147c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
147d0 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
147e0 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29  , inReg, target)
147f0 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  ;.        inReg 
14800 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  = target;.      
14810 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
14820 64 62 65 41 64 64 4f 70 31 28 76 2c 20 74 6f 5f  dbeAddOp1(v, to_
14830 6f 70 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20  op, inReg);.    
14840 20 20 74 65 73 74 63 61 73 65 28 20 75 73 65 64    testcase( used
14850 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50  AsColumnCache(pP
14860 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52  arse, inReg, inR
14870 65 67 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  eg) );.      sql
14880 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
14890 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
148a0 73 65 2c 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20  se, inReg, 1);. 
148b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
148c0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
148d0 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a  TE_OMIT_CAST */.
148e0 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
148f0 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
14900 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
14910 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
14920 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
14930 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
14940 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
14950 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a  TK_LT==OP_Lt );.
14960 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
14970 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20  _LE==OP_Le );.  
14980 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
14990 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20  T==OP_Gt );.    
149a0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d    assert( TK_GE=
149b0 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20  =OP_Ge );.      
149c0 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f  assert( TK_EQ==O
149d0 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Eq );.      as
149e0 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f  sert( TK_NE==OP_
149f0 4e 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Ne );.      test
14a00 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20  case( op==TK_LT 
14a10 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14a20 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a  e( op==TK_LE );.
14a30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14a40 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20  op==TK_GT );.   
14a50 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
14a60 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20  =TK_GE );.      
14a70 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
14a80 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _EQ );.      tes
14a90 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45  tcase( op==TK_NE
14aa0 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
14ab0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
14ac0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
14ad0 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
14ae0 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
14af0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
14b00 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
14b10 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
14b20 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64  ree2);.      cod
14b30 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
14b40 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
14b50 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
14b60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14b70 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65      r1, r2, inRe
14b80 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50  g, SQLITE_STOREP
14b90 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  2);.      testca
14ba0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
14bb0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14bc0 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
14bd0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
14be0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
14bf0 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
14c00 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  _ISNOT: {.      
14c10 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
14c20 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _IS );.      tes
14c30 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
14c40 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20  NOT );.      r1 
14c50 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
14c60 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
14c70 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
14c80 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
14c90 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
14ca0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
14cb0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
14cc0 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
14cd0 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29  op = (op==TK_IS)
14ce0 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45   ? TK_EQ : TK_NE
14cf0 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
14d00 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
14d10 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
14d20 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
14d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
14d40 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51  1, r2, inReg, SQ
14d50 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 7c 20 53  LITE_STOREP2 | S
14d60 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
14d70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
14d80 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
14d90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
14da0 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
14db0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
14dc0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
14dd0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
14de0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55  .    case TK_PLU
14df0 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
14e00 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  TAR:.    case TK
14e10 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65  _MINUS:.    case
14e20 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73   TK_REM:.    cas
14e30 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20  e TK_BITAND:.   
14e40 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a   case TK_BITOR:.
14e50 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53      case TK_SLAS
14e60 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  H:.    case TK_L
14e70 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20  SHIFT:.    case 
14e80 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20  TK_RSHIFT: .    
14e90 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20  case TK_CONCAT: 
14ea0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
14eb0 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29  TK_AND==OP_And )
14ec0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14ed0 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a  TK_OR==OP_Or );.
14ee0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
14ef0 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b  _PLUS==OP_Add );
14f00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
14f10 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74  K_MINUS==OP_Subt
14f20 72 61 63 74 20 29 3b 0a 20 20 20 20 20 20 61 73  ract );.      as
14f30 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50  sert( TK_REM==OP
14f40 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 0a 20 20  _Remainder );.  
14f50 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
14f60 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64  ITAND==OP_BitAnd
14f70 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14f80 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42  ( TK_BITOR==OP_B
14f90 69 74 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73  itOr );.      as
14fa0 73 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d  sert( TK_SLASH==
14fb0 4f 50 5f 44 69 76 69 64 65 20 29 3b 0a 20 20 20  OP_Divide );.   
14fc0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53     assert( TK_LS
14fd0 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65  HIFT==OP_ShiftLe
14fe0 66 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ft );.      asse
14ff0 72 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f  rt( TK_RSHIFT==O
15000 50 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b 0a  P_ShiftRight );.
15010 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
15020 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63  _CONCAT==OP_Conc
15030 61 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  at );.      test
15040 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44  case( op==TK_AND
15050 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
15060 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b  se( op==TK_OR );
15070 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15080 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a   op==TK_PLUS );.
15090 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
150a0 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a  op==TK_MINUS );.
150b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
150c0 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20  op==TK_REM );.  
150d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
150e0 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20  ==TK_BITAND );. 
150f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
15100 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20  p==TK_BITOR );. 
15110 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
15120 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20  p==TK_SLASH );. 
15130 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
15140 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a  p==TK_LSHIFT );.
15150 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15160 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b  op==TK_RSHIFT );
15170 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15180 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29   op==TK_CONCAT )
15190 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
151a0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
151b0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
151c0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
151d0 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
151e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
151f0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
15200 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
15210 65 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e2);.      sqlit
15220 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
15230 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67  op, r2, r1, targ
15240 65 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  et);.      testc
15250 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
15260 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
15270 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
15280 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
15290 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
152a0 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20  K_UMINUS: {.    
152b0 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
152c0 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
152d0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66      assert( pLef
152e0 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t );.      if( p
152f0 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54  Left->op==TK_INT
15300 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20  EGER ){.        
15310 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61 72  codeInteger(pPar
15320 73 65 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74 61  se, pLeft, 1, ta
15330 72 67 65 74 29 3b 0a 23 69 66 6e 64 65 66 20 53  rget);.#ifndef S
15340 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
15350 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20  ING_POINT.      
15360 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74 2d  }else if( pLeft-
15370 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b  >op==TK_FLOAT ){
15380 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
15390 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
153a0 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
153b0 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
153c0 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c 65   codeReal(v, pLe
153d0 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c  ft->u.zToken, 1,
153e0 20 74 61 72 67 65 74 29 3b 0a 23 65 6e 64 69 66   target);.#endif
153f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
15400 20 20 20 20 20 20 72 65 67 46 72 65 65 31 20 3d        regFree1 =
15410 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
15420 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
15430 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15440 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15450 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 31 29  _Integer, 0, r1)
15460 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73  ;.        r2 = s
15470 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
15480 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
15490 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
154a0 65 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e2);.        sql
154b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
154c0 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72  , OP_Subtract, r
154d0 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a  2, r1, target);.
154e0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
154f0 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
15500 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
15510 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20  nReg = target;. 
15520 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15530 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  }.    case TK_BI
15540 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54  TNOT:.    case T
15550 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61  K_NOT: {.      a
15560 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54  ssert( TK_BITNOT
15570 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 0a 20  ==OP_BitNot );. 
15580 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
15590 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20  NOT==OP_Not );. 
155a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
155b0 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a  p==TK_BITNOT );.
155c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
155d0 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20  op==TK_NOT );.  
155e0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
155f0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
15600 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
15610 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
15620 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
15630 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
15640 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67      inReg = targ
15650 65 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  et;.      sqlite
15660 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
15670 70 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20  p, r1, inReg);. 
15680 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15690 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
156a0 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
156b0 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
156c0 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
156d0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53     assert( TK_IS
156e0 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  NULL==OP_IsNull 
156f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
15700 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f   TK_NOTNULL==OP_
15710 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20  NotNull );.     
15720 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
15730 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  K_ISNULL );.    
15740 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
15750 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20  TK_NOTNULL );.  
15760 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15770 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
15780 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  ger, 1, target);
15790 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
157a0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
157b0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
157c0 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
157d0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
157e0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
157f0 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
15800 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
15810 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20  v, op, r1);.    
15820 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15830 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
15840 2c 20 74 61 72 67 65 74 2c 20 2d 31 29 3b 0a 20  , target, -1);. 
15850 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15860 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
15870 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
15880 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
15890 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20  K_AGG_FUNCTION: 
158a0 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20  {.      AggInfo 
158b0 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e  *pInfo = pExpr->
158c0 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
158d0 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a  if( pInfo==0 ){.
158e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
158f0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
15900 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
15910 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
15920 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
15930 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20  pParse, "misuse 
15940 6f 66 20 61 67 67 72 65 67 61 74 65 3a 20 25 73  of aggregate: %s
15950 28 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ()", pExpr->u.zT
15960 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  oken);.      }el
15970 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65  se{.        inRe
15980 67 20 3d 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63  g = pInfo->aFunc
15990 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d  [pExpr->iAgg].iM
159a0 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  em;.      }.    
159b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
159c0 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54     case TK_CONST
159d0 5f 46 55 4e 43 3a 0a 20 20 20 20 63 61 73 65 20  _FUNC:.    case 
159e0 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  TK_FUNCTION: {. 
159f0 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
15a00 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c  Farg;       /* L
15a10 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ist of function 
15a20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
15a30 20 20 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20     int nFarg;   
15a40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
15a50 62 65 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ber of function 
15a60 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
15a70 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
15a80 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
15a90 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69   function defini
15aa0 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  tion object */. 
15ab0 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20 20       int nId;   
15ac0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
15ad0 65 6e 67 74 68 20 6f 66 20 74 68 65 20 66 75 6e  ength of the fun
15ae0 63 74 69 6f 6e 20 6e 61 6d 65 20 69 6e 20 62 79  ction name in by
15af0 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  tes */.      con
15b00 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20  st char *zId;   
15b10 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74      /* The funct
15b20 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ion name */.    
15b30 20 20 69 6e 74 20 63 6f 6e 73 74 4d 61 73 6b 20    int constMask 
15b40 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4d 61 73 6b  = 0;     /* Mask
15b50 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67   of function arg
15b60 75 6d 65 6e 74 73 20 74 68 61 74 20 61 72 65 20  uments that are 
15b70 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20  constant */.    
15b80 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
15b90 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
15ba0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
15bb0 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64    u8 enc = ENC(d
15bc0 62 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  b);      /* The 
15bd0 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 75 73  text encoding us
15be0 65 64 20 62 79 20 74 68 69 73 20 64 61 74 61 62  ed by this datab
15bf0 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c  ase */.      Col
15c00 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b  lSeq *pColl = 0;
15c10 20 20 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69      /* A collati
15c20 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a  ng sequence */..
15c30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
15c40 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
15c50 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
15c60 63 74 29 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ct) );.      tes
15c70 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f  tcase( op==TK_CO
15c80 4e 53 54 5f 46 55 4e 43 20 29 3b 0a 20 20 20 20  NST_FUNC );.    
15c90 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
15ca0 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  TK_FUNCTION );. 
15cb0 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
15cc0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
15cd0 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
15ce0 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d  .        pFarg =
15cf0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
15d00 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d  .        pFarg =
15d10 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
15d20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
15d30 46 61 72 67 20 3d 20 70 46 61 72 67 20 3f 20 70  Farg = pFarg ? p
15d40 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b  Farg->nExpr : 0;
15d50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
15d60 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
15d70 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
15d80 75 65 29 20 29 3b 0a 20 20 20 20 20 20 7a 49 64  ue) );.      zId
15d90 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b   = pExpr->u.zTok
15da0 65 6e 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d 20  en;.      nId = 
15db0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
15dc0 7a 49 64 29 3b 0a 20 20 20 20 20 20 70 44 65 66  zId);.      pDef
15dd0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
15de0 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20  nction(db, zId, 
15df0 6e 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c  nId, nFarg, enc,
15e00 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
15e10 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Def==0 ){.      
15e20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
15e30 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f  g(pParse, "unkno
15e40 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a  wn function: %.*
15e50 73 28 29 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b  s()", nId, zId);
15e60 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
15e70 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
15e80 2a 20 41 74 74 65 6d 70 74 20 61 20 64 69 72 65  * Attempt a dire
15e90 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ct implementatio
15ea0 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69  n of the built-i
15eb0 6e 20 43 4f 41 4c 45 53 43 45 28 29 20 61 6e 64  n COALESCE() and
15ec0 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c  .      ** IFNULL
15ed0 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54  () functions.  T
15ee0 68 69 73 20 61 76 6f 69 64 73 20 75 6e 6e 65 63  his avoids unnec
15ef0 65 73 73 61 72 79 20 65 76 61 6c 61 74 69 6f 6e  essary evalation
15f00 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61 72 67   of.      ** arg
15f10 75 6d 65 6e 74 73 20 70 61 73 74 20 74 68 65 20  uments past the 
15f20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61  first non-NULL a
15f30 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a  rgument..      *
15f40 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  /.      if( pDef
15f50 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
15f60 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53  LITE_FUNC_COALES
15f70 43 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  CE ){.        in
15f80 74 20 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20  t endCoalesce = 
15f90 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
15fa0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
15fb0 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d   assert( nFarg>=
15fc0 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  2 );.        sql
15fd0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
15fe0 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d  rse, pFarg->a[0]
15ff0 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
16000 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31  .        for(i=1
16010 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b  ; i<nFarg; i++){
16020 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
16030 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16040 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67  OP_NotNull, targ
16050 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29  et, endCoalesce)
16060 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
16070 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
16080 76 65 28 70 50 61 72 73 65 2c 20 74 61 72 67 65  ve(pParse, targe
16090 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  t, 1);.         
160a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
160b0 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
160c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
160d0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
160e0 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78   pFarg->a[i].pEx
160f0 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
16100 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
16110 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
16120 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  e, 1);.        }
16130 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16140 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
16150 28 76 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29  (v, endCoalesce)
16160 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
16170 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20  .      }...     
16180 20 69 66 28 20 70 46 61 72 67 20 29 7b 0a 20 20   if( pFarg ){.  
16190 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
161a0 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
161b0 50 61 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a 0a  Parse, nFarg);..
161c0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
161d0 65 6e 67 74 68 28 29 20 61 6e 64 20 74 79 70 65  ength() and type
161e0 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 77  of() functions w
161f0 69 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67  ith a column arg
16200 75 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a  ument,.        *
16210 2a 20 73 65 74 20 74 68 65 20 50 35 20 70 61 72  * set the P5 par
16220 61 6d 65 74 65 72 20 74 6f 20 74 68 65 20 4f 50  ameter to the OP
16230 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74  _Column opcode t
16240 6f 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41  o OPFLAG_LENGTHA
16250 52 47 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  RG.        ** or
16260 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52   OPFLAG_TYPEOFAR
16270 47 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20  G respectively, 
16280 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73  to avoid unneces
16290 73 61 72 79 20 64 61 74 61 0a 20 20 20 20 20 20  sary data.      
162a0 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20    ** loading..  
162b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
162c0 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63   if( (pDef->func
162d0 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f  Flags & (SQLITE_
162e0 46 55 4e 43 5f 4c 45 4e 47 54 48 7c 53 51 4c 49  FUNC_LENGTH|SQLI
162f0 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29 29  TE_FUNC_TYPEOF))
16300 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
16310 20 75 38 20 65 78 70 72 4f 70 3b 0a 20 20 20 20   u8 exprOp;.    
16320 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46        assert( nF
16330 61 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  arg==1 );.      
16340 20 20 20 20 61 73 73 65 72 74 28 20 70 46 61 72      assert( pFar
16350 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30  g->a[0].pExpr!=0
16360 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78   );.          ex
16370 70 72 4f 70 20 3d 20 70 46 61 72 67 2d 3e 61 5b  prOp = pFarg->a[
16380 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20  0].pExpr->op;.  
16390 20 20 20 20 20 20 20 20 69 66 28 20 65 78 70 72          if( expr
163a0 4f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  Op==TK_COLUMN ||
163b0 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f   exprOp==TK_AGG_
163c0 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
163d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51        assert( SQ
163e0 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48  LITE_FUNC_LENGTH
163f0 3d 3d 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41  ==OPFLAG_LENGTHA
16400 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  RG );.          
16410 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
16420 5f 46 55 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f 50  _FUNC_TYPEOF==OP
16430 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20 29  FLAG_TYPEOFARG )
16440 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ;.            te
16450 73 74 63 61 73 65 28 20 28 70 44 65 66 2d 3e 66  stcase( (pDef->f
16460 75 6e 63 46 6c 61 67 73 26 7e 53 51 4c 49 54 45  uncFlags&~SQLITE
16470 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 29 0a 20  _FUNC_ENCMASK). 
16480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16490 20 20 20 20 20 20 3d 3d 53 51 4c 49 54 45 5f 46        ==SQLITE_F
164a0 55 4e 43 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20  UNC_LENGTH );.  
164b0 20 20 20 20 20 20 20 20 20 20 70 46 61 72 67 2d            pFarg-
164c0 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 32  >a[0].pExpr->op2
164d0 20 3d 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61   = pDef->funcFla
164e0 67 73 26 7e 53 51 4c 49 54 45 5f 46 55 4e 43 5f  gs&~SQLITE_FUNC_
164f0 45 4e 43 4d 41 53 4b 3b 0a 20 20 20 20 20 20 20  ENCMASK;.       
16500 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a     }.        }..
16510 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
16520 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
16530 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 54 69 63  rse);     /* Tic
16540 6b 65 74 20 32 65 61 32 34 32 35 64 33 34 62 65  ket 2ea2425d34be
16550 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
16560 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
16570 69 73 74 28 70 50 61 72 73 65 2c 20 70 46 61 72  ist(pParse, pFar
16580 67 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20  g, r1, 1);.     
16590 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
165a0 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31  chePop(pParse, 1
165b0 29 3b 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32  );   /* Ticket 2
165c0 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20  ea2425d34be */. 
165d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
165e0 20 20 20 20 72 31 20 3d 20 30 3b 0a 20 20 20 20      r1 = 0;.    
165f0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
16600 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
16610 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f  ABLE.      /* Po
16620 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20  ssibly overload 
16630 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20  the function if 
16640 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
16650 6e 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  nt is.      ** a
16660 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63   virtual table c
16670 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a  olumn..      **.
16680 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66        ** For inf
16690 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49  ix functions (LI
166a0 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50  KE, GLOB, REGEXP
166b0 2c 20 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65  , and MATCH) use
166c0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65   the.      ** se
166d0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e  cond argument, n
166e0 6f 74 20 74 68 65 20 66 69 72 73 74 2c 20 61 73  ot the first, as
166f0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   the argument to
16700 20 74 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a   test to.      *
16710 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 61  * see if it is a
16720 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72   column in a vir
16730 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69  tual table.  Thi
16740 73 20 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73  s is done becaus
16750 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c  e.      ** the l
16760 65 66 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69  eft operand of i
16770 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28  nfix functions (
16780 74 68 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77  the operand we w
16790 61 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ant to.      ** 
167a0 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64  control overload
167b0 69 6e 67 29 20 65 6e 64 73 20 75 70 20 61 73 20  ing) ends up as 
167c0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
167d0 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20  ent to the.     
167e0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54   ** function.  T
167f0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41  he expression "A
16800 20 67 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69   glob B" is equi
16810 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20  valent to .     
16820 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20   ** "glob(B,A). 
16830 20 57 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20   We want to use 
16840 74 68 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62  the A in "A glob
16850 20 42 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20   B" to test.    
16860 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f    ** for functio
16870 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20  n overloading.  
16880 42 75 74 20 77 65 20 75 73 65 20 74 68 65 20 42  But we use the B
16890 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42   term in "glob(B
168a0 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ,A)"..      */. 
168b0 20 20 20 20 20 69 66 28 20 6e 46 61 72 67 3e 3d       if( nFarg>=
168c0 32 20 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61  2 && (pExpr->fla
168d0 67 73 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e  gs & EP_InfixFun
168e0 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  c) ){.        pD
168f0 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  ef = sqlite3Vtab
16900 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e  OverloadFunction
16910 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67  (db, pDef, nFarg
16920 2c 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45  , pFarg->a[1].pE
16930 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  xpr);.      }els
16940 65 20 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b  e if( nFarg>0 ){
16950 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
16960 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c  sqlite3VtabOverl
16970 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  oadFunction(db, 
16980 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61  pDef, nFarg, pFa
16990 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  rg->a[0].pExpr);
169a0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
169b0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
169c0 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  <nFarg; i++){.  
169d0 20 20 20 20 20 20 69 66 28 20 69 3c 33 32 20 26        if( i<32 &
169e0 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
169f0 6f 6e 73 74 61 6e 74 28 70 46 61 72 67 2d 3e 61  onstant(pFarg->a
16a00 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [i].pExpr) ){.  
16a10 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73          constMas
16a20 6b 20 7c 3d 20 28 31 3c 3c 69 29 3b 0a 20 20 20  k |= (1<<i);.   
16a30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
16a40 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c  f( (pDef->funcFl
16a50 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
16a60 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26  C_NEEDCOLL)!=0 &
16a70 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  & !pColl ){.    
16a80 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
16a90 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
16aa0 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
16ab0 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
16ac0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
16ad0 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
16ae0 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
16af0 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20  E_FUNC_NEEDCOLL 
16b00 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ){.        if( !
16b10 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
16b20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a  db->pDfltColl; .
16b30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16b40 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
16b50 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30  CollSeq, 0, 0, 0
16b60 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  , (char *)pColl,
16b70 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
16b80 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
16b90 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
16ba0 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 63 6f   OP_Function, co
16bb0 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74 61 72  nstMask, r1, tar
16bc0 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  get,.           
16bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
16be0 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46 55 4e  ar*)pDef, P4_FUN
16bf0 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73 71 6c  CDEF);.      sql
16c00 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
16c10 28 76 2c 20 28 75 38 29 6e 46 61 72 67 29 3b 0a  (v, (u8)nFarg);.
16c20 20 20 20 20 20 20 69 66 28 20 6e 46 61 72 67 20        if( nFarg 
16c30 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
16c40 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
16c50 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e  ge(pParse, r1, n
16c60 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Farg);.      }. 
16c70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16c80 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
16c90 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
16ca0 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
16cb0 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
16cc0 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 74  ELECT: {.      t
16cd0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
16ce0 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20  EXISTS );.      
16cf0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
16d00 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20  _SELECT );.     
16d10 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
16d20 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
16d30 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20  arse, pExpr, 0, 
16d40 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
16d50 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
16d60 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
16d70 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d  nt destIfFalse =
16d80 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
16d90 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
16da0 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d  int destIfNull =
16db0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
16dc0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
16dd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16de0 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
16df0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
16e00 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
16e10 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  N(pParse, pExpr,
16e20 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65   destIfFalse, de
16e30 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
16e40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16e50 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
16e60 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 1, target);.  
16e70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
16e80 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
16e90 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20  estIfFalse);.   
16ea0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16eb0 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
16ec0 6d 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a 20  m, target, 0);. 
16ed0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16ee0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
16ef0 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
16f00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16f10 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
16f20 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
16f30 2f 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  /...    /*.    *
16f40 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79  *    x BETWEEN y
16f50 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20   AND z.    **.  
16f60 20 20 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75    ** This is equ
16f70 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a  ivalent to.    *
16f80 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79  *.    **    x>=y
16f90 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a   AND x<=z.    **
16fa0 0a 20 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f  .    ** X is sto
16fb0 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
16fc0 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73  eft..    ** Y is
16fd0 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
16fe0 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
16ff0 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73  xpr..    ** Z is
17000 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
17010 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ->pList->a[1].pE
17020 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xpr..    */.    
17030 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
17040 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70   {.      Expr *p
17050 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
17060 65 66 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63  eft;.      struc
17070 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
17080 2a 70 4c 49 74 65 6d 20 3d 20 70 45 78 70 72 2d  *pLItem = pExpr-
17090 3e 78 2e 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  >x.pList->a;.   
170a0 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
170b0 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b  = pLItem->pExpr;
170c0 0a 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ..      r1 = sql
170d0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
170e0 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
170f0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
17100 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
17110 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
17120 65 2c 20 70 52 69 67 68 74 2c 20 26 72 65 67 46  e, pRight, &regF
17130 72 65 65 32 29 3b 0a 20 20 20 20 20 20 74 65 73  ree2);.      tes
17140 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
17150 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
17160 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
17170 30 20 29 3b 0a 20 20 20 20 20 20 72 33 20 3d 20  0 );.      r3 = 
17180 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
17190 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
171a0 20 72 34 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r4 = sqlite3Get
171b0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
171c0 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
171d0 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
171e0 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c  , pRight, OP_Ge,
171f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17200 20 20 20 72 31 2c 20 72 32 2c 20 72 33 2c 20 53     r1, r2, r3, S
17210 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a  QLITE_STOREP2);.
17220 20 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a        pLItem++;.
17230 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70        pRight = p
17240 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  LItem->pExpr;.  
17250 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
17260 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
17270 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20  , regFree2);.   
17280 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
17290 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
172a0 73 65 2c 20 70 52 69 67 68 74 2c 20 26 72 65 67  se, pRight, &reg
172b0 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 74 65  Free2);.      te
172c0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
172d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64  ==0 );.      cod
172e0 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
172f0 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
17300 4f 50 5f 4c 65 2c 20 72 31 2c 20 72 32 2c 20 72  OP_Le, r1, r2, r
17310 34 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50  4, SQLITE_STOREP
17320 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
17330 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
17340 50 5f 41 6e 64 2c 20 72 33 2c 20 72 34 2c 20 74  P_And, r3, r4, t
17350 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
17360 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
17370 52 65 67 28 70 50 61 72 73 65 2c 20 72 33 29 3b  Reg(pParse, r3);
17380 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
17390 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
173a0 72 73 65 2c 20 72 34 29 3b 0a 20 20 20 20 20 20  rse, r4);.      
173b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
173c0 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45   case TK_COLLATE
173d0 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  : .    case TK_U
173e0 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e  PLUS: {.      in
173f0 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
17400 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
17410 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
17420 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
17430 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
17440 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47     case TK_TRIGG
17450 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ER: {.      /* I
17460 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20  f the opcode is 
17470 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e  TK_TRIGGER, then
17480 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
17490 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20  is a reference. 
174a0 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c       ** to a col
174b0 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a  umn in the new.*
174c0 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f   or old.* pseudo
174d0 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c  -tables availabl
174e0 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72  e to.      ** tr
174f0 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20  igger programs. 
17500 49 6e 20 74 68 69 73 20 63 61 73 65 20 45 78 70  In this case Exp
17510 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20  r.iTable is set 
17520 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20  to 1 for the.   
17530 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75     ** new.* pseu
17540 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66  do-table, or 0 f
17550 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65  or the old.* pse
17560 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e  udo-table. Expr.
17570 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a  iColumn.      **
17580 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63   is set to the c
17590 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65  olumn of the pse
175a0 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61  udo-table to rea
175b0 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20  d, or to -1 to. 
175c0 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65       ** read the
175d0 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20   rowid field..  
175e0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
175f0 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
17600 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73  s implemented us
17610 69 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20  ing an OP_Param 
17620 6f 70 63 6f 64 65 2e 20 54 68 65 20 70 31 0a 20  opcode. The p1. 
17630 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65       ** paramete
17640 72 20 69 73 20 73 65 74 20 74 6f 20 30 20 66 6f  r is set to 0 fo
17650 72 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72  r an old.rowid r
17660 65 66 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20  eference, or to 
17670 28 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20 74  (i+1).      ** t
17680 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e 6f 74  o reference anot
17690 68 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  her column of th
176a0 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  e old.* pseudo-t
176b0 61 62 6c 65 2c 20 77 68 65 72 65 20 0a 20 20 20  able, where .   
176c0 20 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69     ** i is the i
176d0 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75  ndex of the colu
176e0 6d 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f  mn. For a new.ro
176f0 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 70  wid reference, p
17700 31 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 73 65  1 is.      ** se
17710 74 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72  t to (n+1), wher
17720 65 20 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e n is the numbe
17730 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
17740 65 61 63 68 20 70 73 65 75 64 6f 2d 74 61 62 6c  each pseudo-tabl
17750 65 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  e..      ** For 
17760 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
17770 6e 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20  ny other column 
17780 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70 73 65  in the new.* pse
17790 75 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20  udo-table, p1.  
177a0 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f      ** is set to
177b0 20 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65 20   (n+2+i), where 
177c0 6e 20 61 6e 64 20 69 20 61 72 65 20 61 73 20 64  n and i are as d
177d0 65 66 69 6e 65 64 20 70 72 65 76 69 6f 75 73 6c  efined previousl
177e0 79 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20  y. For.      ** 
177f0 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
17800 74 61 62 6c 65 20 6f 6e 20 77 68 69 63 68 20 74  table on which t
17810 72 69 67 67 65 72 73 20 61 72 65 20 62 65 69 6e  riggers are bein
17820 67 20 66 69 72 65 64 20 69 73 0a 20 20 20 20 20  g fired is.     
17830 20 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73 3a   ** declared as:
17840 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
17850 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
17860 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
17870 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
17880 65 6e 20 70 31 20 69 73 20 69 6e 74 65 72 70 72  en p1 is interpr
17890 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  eted as follows:
178a0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
178b0 2a 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20  **   p1==0   -> 
178c0 20 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20     old.rowid    
178d0 20 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e   p1==3   ->    n
178e0 65 77 2e 72 6f 77 69 64 0a 20 20 20 20 20 20 2a  ew.rowid.      *
178f0 2a 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20  *   p1==1   ->  
17900 20 20 6f 6c 64 2e 61 20 20 20 20 20 20 20 20 20    old.a         
17910 70 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65  p1==4   ->    ne
17920 77 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20 20 70  w.a.      **   p
17930 31 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64  1==2   ->    old
17940 2e 62 20 20 20 20 20 20 20 20 20 70 31 3d 3d 35  .b         p1==5
17950 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20     ->    new.b  
17960 20 20 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20       .      */. 
17970 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
17980 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a   = pExpr->pTab;.
17990 20 20 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70        int p1 = p
179a0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28  Expr->iTable * (
179b0 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20  pTab->nCol+1) + 
179c0 31 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  1 + pExpr->iColu
179d0 6d 6e 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  mn;..      asser
179e0 74 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t( pExpr->iTable
179f0 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54  ==0 || pExpr->iT
17a00 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20  able==1 );.     
17a10 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
17a20 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70  iColumn>=-1 && p
17a30 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54  Expr->iColumn<pT
17a40 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  ab->nCol );.    
17a50 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
17a60 69 50 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70 72  iPKey<0 || pExpr
17a70 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d  ->iColumn!=pTab-
17a80 3e 69 50 4b 65 79 20 29 3b 0a 20 20 20 20 20 20  >iPKey );.      
17a90 61 73 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26  assert( p1>=0 &&
17aa0 20 70 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a   p1<(pTab->nCol*
17ab0 32 2b 32 29 20 29 3b 0a 0a 20 20 20 20 20 20 73  2+2) );..      s
17ac0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17ad0 28 76 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31  (v, OP_Param, p1
17ae0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
17af0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
17b00 20 22 25 73 2e 25 73 20 2d 3e 20 24 25 64 22 2c   "%s.%s -> $%d",
17b10 0a 20 20 20 20 20 20 20 20 28 70 45 78 70 72 2d  .        (pExpr-
17b20 3e 69 54 61 62 6c 65 20 3f 20 22 6e 65 77 22 20  >iTable ? "new" 
17b30 3a 20 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20 20  : "old"),.      
17b40 20 20 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d    (pExpr->iColum
17b50 6e 3c 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20  n<0 ? "rowid" : 
17b60 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f  pExpr->pTab->aCo
17b70 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  l[pExpr->iColumn
17b80 5d 2e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20  ].zName),.      
17b90 20 20 74 61 72 67 65 74 0a 20 20 20 20 20 20 29    target.      )
17ba0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
17bb0 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
17bc0 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20  _POINT.      /* 
17bd0 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61  If the column ha
17be0 73 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2c  s REAL affinity,
17bf0 20 69 74 20 6d 61 79 20 63 75 72 72 65 6e 74 6c   it may currentl
17c00 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61  y be stored as a
17c10 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67  n.      ** integ
17c20 65 72 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c 41  er. Use OP_RealA
17c30 66 66 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20  ffinity to make 
17c40 73 75 72 65 20 69 74 20 69 73 20 72 65 61 6c 6c  sure it is reall
17c50 79 20 72 65 61 6c 2e 20 20 2a 2f 0a 20 20 20 20  y real.  */.    
17c60 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
17c70 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20 20  lumn>=0 .       
17c80 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45  && pTab->aCol[pE
17c90 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66  xpr->iColumn].af
17ca0 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
17cb0 46 46 5f 52 45 41 4c 0a 20 20 20 20 20 20 29 7b  FF_REAL.      ){
17cc0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17cd0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
17ce0 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20 74  _RealAffinity, t
17cf0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  arget);.      }.
17d00 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65  #endif.      bre
17d10 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20  ak;.    }...    
17d20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41  /*.    ** Form A
17d30 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20  :.    **   CASE 
17d40 78 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72  x WHEN e1 THEN r
17d50 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72  1 WHEN e2 THEN r
17d60 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48  2 ... WHEN eN TH
17d70 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44  EN rN ELSE y END
17d80 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
17d90 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20  orm B:.    **   
17da0 43 41 53 45 20 57 48 45 4e 20 65 31 20 54 48 45  CASE WHEN e1 THE
17db0 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45  N r1 WHEN e2 THE
17dc0 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e  N r2 ... WHEN eN
17dd0 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20   THEN rN ELSE y 
17de0 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  END.    **.    *
17df0 2a 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20  * Form A is can 
17e00 62 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69  be transformed i
17e10 6e 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65  nto the equivale
17e20 6e 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c  nt form B as fol
17e30 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43  lows:.    **   C
17e40 41 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48  ASE WHEN x=e1 TH
17e50 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20  EN r1 WHEN x=e2 
17e60 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20  THEN r2 ....    
17e70 2a 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20 78  **        WHEN x
17e80 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45  =eN THEN rN ELSE
17e90 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20   y END.    **.  
17ea0 20 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78    ** X (if it ex
17eb0 69 73 74 73 29 20 69 73 20 69 6e 20 70 45 78 70  ists) is in pExp
17ec0 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a  r->pLeft..    **
17ed0 20 59 20 69 73 20 69 6e 20 74 68 65 20 6c 61 73   Y is in the las
17ee0 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78  t element of pEx
17ef0 70 72 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20 70  pr->x.pList if p
17f00 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
17f10 45 78 70 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f  Expr is.    ** o
17f20 64 64 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c  dd.  The Y is al
17f30 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66  so optional.  If
17f40 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
17f50 6c 65 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69  lements in x.pLi
17f60 73 74 0a 20 20 20 20 2a 2a 20 69 73 20 65 76 65  st.    ** is eve
17f70 6e 2c 20 74 68 65 6e 20 59 20 69 73 20 6f 6d 69  n, then Y is omi
17f80 74 74 65 64 20 61 6e 64 20 74 68 65 20 22 6f 74  tted and the "ot
17f90 68 65 72 77 69 73 65 22 20 72 65 73 75 6c 74 20  herwise" result 
17fa0 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20  is NULL..    ** 
17fb0 45 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e  Ei is in pExpr->
17fc0 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e  pList->a[i*2] an
17fd0 64 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70  d Ri is pExpr->p
17fe0 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a  List->a[i*2+1]..
17ff0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
18000 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
18010 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68  expression is th
18020 65 20 52 69 20 66 6f 72 20 74 68 65 20 66 69 72  e Ri for the fir
18030 73 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a  st matching Ei,.
18040 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65      ** or if the
18050 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e  re is no matchin
18060 67 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74  g Ei, the ELSE t
18070 65 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65  erm Y, or if the
18080 72 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20  re is.    ** no 
18090 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e  ELSE term, NULL.
180a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
180b0 75 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d  ult: assert( op=
180c0 3d 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20  =TK_CASE ); {.  
180d0 20 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c      int endLabel
180e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
180f0 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61        /* GOTO la
18100 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43  bel for end of C
18110 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20  ASE stmt */.    
18120 20 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20    int nextCase; 
18130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18140 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65      /* GOTO labe
18150 6c 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20  l for next WHEN 
18160 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
18170 69 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20  int nExpr;      
18180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18190 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f    /* 2x number o
181a0 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a  f WHEN terms */.
181b0 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20        int i;    
181c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181d0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
181e0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
181f0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
18200 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
18210 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48     /* List of WH
18220 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  EN terms */.    
18230 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
18240 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65  t_item *aListele
18250 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20  m;  /* Array of 
18260 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  WHEN terms */.  
18270 20 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61      Expr opCompa
18280 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  re;             
18290 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d        /* The X==
182a0 45 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  Ei expression */
182b0 0a 20 20 20 20 20 20 45 78 70 72 20 63 61 63 68  .      Expr cach
182c0 65 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eX;             
182d0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68           /* Cach
182e0 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20 58 20  ed expression X 
182f0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
18300 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
18310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
18320 65 20 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  e X expression *
18330 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 54  /.      Expr *pT
18340 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  est = 0;        
18350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d            /* X==
18360 45 69 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a  Ei (form A) or j
18370 75 73 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20  ust Ei (form B) 
18380 2a 2f 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c  */.      VVA_ONL
18390 59 28 20 69 6e 74 20 69 43 61 63 68 65 4c 65 76  Y( int iCacheLev
183a0 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  el = pParse->iCa
183b0 63 68 65 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20  cheLevel; )..   
183c0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
183d0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
183e0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
183f0 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69   && pExpr->x.pLi
18400 73 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  st );.      asse
18410 72 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  rt(pExpr->x.pLis
18420 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20  t->nExpr > 0);. 
18430 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45       pEList = pE
18440 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
18450 20 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20      aListelem = 
18460 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  pEList->a;.     
18470 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d   nExpr = pEList-
18480 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e  >nExpr;.      en
18490 64 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33  dLabel = sqlite3
184a0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
184b0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 20  ;.      if( (pX 
184c0 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21  = pExpr->pLeft)!
184d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61  =0 ){.        ca
184e0 63 68 65 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20  cheX = *pX;.    
184f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
18500 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
18510 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
18520 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ase( pX->op==TK_
18530 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 20 20  REGISTER );.    
18540 20 20 20 20 63 61 63 68 65 58 2e 69 54 61 62 6c      cacheX.iTabl
18550 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  e = sqlite3ExprC
18560 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
18570 70 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  pX, &regFree1);.
18580 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
18590 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
185a0 0a 20 20 20 20 20 20 20 20 63 61 63 68 65 58 2e  .        cacheX.
185b0 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52  op = TK_REGISTER
185c0 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70  ;.        opComp
185d0 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a  are.op = TK_EQ;.
185e0 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72          opCompar
185f0 65 2e 70 4c 65 66 74 20 3d 20 26 63 61 63 68 65  e.pLeft = &cache
18600 58 3b 0a 20 20 20 20 20 20 20 20 70 54 65 73 74  X;.        pTest
18610 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a 20   = &opCompare;. 
18620 20 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74         /* Ticket
18630 20 62 33 35 31 64 39 35 66 39 63 64 35 65 66 31   b351d95f9cd5ef1
18640 37 65 39 64 39 64 62 61 65 31 38 66 35 63 61 38  7e9d9dbae18f5ca8
18650 36 31 31 31 39 30 30 30 31 3a 0a 20 20 20 20 20  611190001:.     
18660 20 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20     ** The value 
18670 69 6e 20 72 65 67 46 72 65 65 31 20 6d 69 67 68  in regFree1 migh
18680 74 20 67 65 74 20 53 43 6f 70 79 2d 65 64 20 69  t get SCopy-ed i
18690 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 72 65 73  nto the file res
186a0 75 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ult..        ** 
186b0 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  So make sure tha
186c0 74 20 74 68 65 20 72 65 67 46 72 65 65 31 20 72  t the regFree1 r
186d0 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 20 72  egister is not r
186e0 65 75 73 65 64 20 66 6f 72 20 6f 74 68 65 72 0a  eused for other.
186f0 20 20 20 20 20 20 20 20 2a 2a 20 70 75 72 70 6f          ** purpo
18700 73 65 73 20 61 6e 64 20 70 6f 73 73 69 62 6c 79  ses and possibly
18710 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a   overwritten.  *
18720 2f 0a 20 20 20 20 20 20 20 20 72 65 67 46 72 65  /.        regFre
18730 65 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  e1 = 0;.      }.
18740 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
18750 3c 6e 45 78 70 72 2d 31 3b 20 69 3d 69 2b 32 29  <nExpr-1; i=i+2)
18760 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
18770 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
18780 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
18790 69 66 28 20 70 58 20 29 7b 0a 20 20 20 20 20 20  if( pX ){.      
187a0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 73      assert( pTes
187b0 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
187c0 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 52 69 67    opCompare.pRig
187d0 68 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69  ht = aListelem[i
187e0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
187f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18800 20 20 70 54 65 73 74 20 3d 20 61 4c 69 73 74 65    pTest = aListe
18810 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  lem[i].pExpr;.  
18820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18830 6e 65 78 74 43 61 73 65 20 3d 20 73 71 6c 69 74  nextCase = sqlit
18840 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
18850 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  v);.        test
18860 63 61 73 65 28 20 70 54 65 73 74 2d 3e 6f 70 3d  case( pTest->op=
18870 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
18880 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
18890 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
188a0 20 70 54 65 73 74 2c 20 6e 65 78 74 43 61 73 65   pTest, nextCase
188b0 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
188c0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 74 65  ULL);.        te
188d0 73 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c 65  stcase( aListele
188e0 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70  m[i+1].pExpr->op
188f0 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
18900 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
18910 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e   aListelem[i+1].
18920 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45  pExpr->op==TK_RE
18930 47 49 53 54 45 52 20 29 3b 0a 20 20 20 20 20 20  GISTER );.      
18940 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
18950 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65  e(pParse, aListe
18960 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20  lem[i+1].pExpr, 
18970 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
18980 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18990 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
189a0 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20  , endLabel);.   
189b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
189c0 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c  CachePop(pParse,
189d0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   1);.        sql
189e0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
189f0 61 62 65 6c 28 76 2c 20 6e 65 78 74 43 61 73 65  abel(v, nextCase
18a00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
18a10 20 69 66 28 20 28 6e 45 78 70 72 26 31 29 21 3d   if( (nExpr&1)!=
18a20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
18a30 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
18a40 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
18a50 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
18a60 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  de(pParse, pELis
18a70 74 2d 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e 70 45  t->a[nExpr-1].pE
18a80 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
18a90 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
18aa0 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
18ab0 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 1);.      }els
18ac0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
18ad0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18ae0 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67  OP_Null, 0, targ
18af0 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  et);.      }.   
18b00 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
18b10 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
18b20 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 0a 20  Parse->nErr>0 . 
18b30 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
18b40 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
18b50 3d 3d 69 43 61 63 68 65 4c 65 76 65 6c 20 29 3b  ==iCacheLevel );
18b60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
18b70 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
18b80 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20  , endLabel);.   
18b90 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
18ba0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18bb0 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20  MIT_TRIGGER.    
18bc0 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b  case TK_RAISE: {
18bd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
18be0 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
18bf0 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20  OE_Rollback .   
18c00 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72          || pExpr
18c10 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41  ->affinity==OE_A
18c20 62 6f 72 74 0a 20 20 20 20 20 20 20 20 20 20 20  bort.           
18c30 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  || pExpr->affini
18c40 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20  ty==OE_Fail.    
18c50 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
18c60 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67  >affinity==OE_Ig
18c70 6e 6f 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  nore.      );.  
18c80 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d      if( !pParse-
18c90 3e 70 54 72 69 67 67 65 72 54 61 62 20 29 7b 0a  >pTriggerTab ){.
18ca0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
18cb0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
18cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cd0 20 20 20 20 20 20 20 22 52 41 49 53 45 28 29 20         "RAISE() 
18ce0 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  may only be used
18cf0 20 77 69 74 68 69 6e 20 61 20 74 72 69 67 67 65   within a trigge
18d00 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20  r-program");.   
18d10 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
18d20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
18d30 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
18d40 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20  ==OE_Abort ){.  
18d50 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79        sqlite3May
18d60 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20  Abort(pParse);. 
18d70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
18d80 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
18d90 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
18da0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
18db0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66     if( pExpr->af
18dc0 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72  finity==OE_Ignor
18dd0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
18de0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a  ite3VdbeAddOp4(.
18df0 20 20 20 20 20 20 20 20 20 20 20 20 76 2c 20 4f              v, O
18e00 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f  P_Halt, SQLITE_O
18e10 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 30 2c  K, OE_Ignore, 0,
18e20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
18e30 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ,0);.      }else
18e40 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
18e50 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
18e60 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43  pParse, SQLITE_C
18e70 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45  ONSTRAINT_TRIGGE
18e80 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  R,.             
18e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ea0 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
18eb0 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
18ec0 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  n, 0);.      }..
18ed0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18ee0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
18ef0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
18f00 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
18f10 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
18f20 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
18f30 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
18f40 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 52  2);.  return inR
18f50 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  eg;.}../*.** Gen
18f60 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76  erate code to ev
18f70 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65 73  aluate an expres
18f80 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 74  sion and store t
18f90 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e  he results.** in
18fa0 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e 20 20  to a register.  
18fb0 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  Return the regis
18fc0 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65 72 65  ter number where
18fd0 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20   the results.** 
18fe0 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a  are stored..**.*
18ff0 2a 20 49 66 20 74 68 65 20 72 65 67 69 73 74 65  * If the registe
19000 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  r is a temporary
19010 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20 63   register that c
19020 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61 74 65  an be deallocate
19030 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74 65  d,.** then write
19040 20 69 74 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f   its number into
19050 20 2a 70 52 65 67 2e 20 20 49 66 20 74 68 65 20   *pReg.  If the 
19060 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20  result register 
19070 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70  is not.** a temp
19080 6f 72 61 72 79 2c 20 74 68 65 6e 20 73 65 74 20  orary, then set 
19090 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a  *pReg to zero..*
190a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
190b0 72 43 6f 64 65 54 65 6d 70 28 50 61 72 73 65 20  rCodeTemp(Parse 
190c0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
190d0 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 65 67 29  Expr, int *pReg)
190e0 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c  {.  int r1 = sql
190f0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
19100 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 32  Parse);.  int r2
19110 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
19120 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
19130 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 69   pExpr, r1);.  i
19140 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20  f( r2==r1 ){.   
19150 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20 20 7d   *pReg = r1;.  }
19160 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
19170 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
19180 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
19190 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20 7d 0a   *pReg = 0;.  }.
191a0 20 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a    return r2;.}..
191b0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
191c0 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76  ode that will ev
191d0 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f  aluate expressio
191e0 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72  n pExpr and stor
191f0 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73  e the.** results
19200 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72   in register tar
19210 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74  get.  The result
19220 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  s are guaranteed
19230 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e   to appear.** in
19240 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
19250 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19260 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a  ExprCode(Parse *
19270 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
19280 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
19290 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a  {.  int inReg;..
192a0 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
192b0 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50  >0 && target<=pP
192c0 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  arse->nMem );.  
192d0 69 66 28 20 70 45 78 70 72 20 26 26 20 70 45 78  if( pExpr && pEx
192e0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  pr->op==TK_REGIS
192f0 54 45 52 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  TER ){.    sqlit
19300 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
19310 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43  rse->pVdbe, OP_C
19320 6f 70 79 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  opy, pExpr->iTab
19330 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d  le, target);.  }
19340 65 6c 73 65 7b 0a 20 20 20 20 69 6e 52 65 67 20  else{.    inReg 
19350 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
19360 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
19370 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
19380 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
19390 73 65 2d 3e 70 56 64 62 65 20 7c 7c 20 70 50 61  se->pVdbe || pPa
193a0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
193b0 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28  ailed );.    if(
193c0 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 26   inReg!=target &
193d0 26 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20  & pParse->pVdbe 
193e0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
193f0 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73  VdbeAddOp2(pPars
19400 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f  e->pVdbe, OP_SCo
19410 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65  py, inReg, targe
19420 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
19430 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 7d  return target;.}
19440 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
19450 20 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75   code that evalu
19460 74 65 73 20 74 68 65 20 67 69 76 65 6e 20 65 78  tes the given ex
19470 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74  pression and put
19480 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  s the result.** 
19490 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
194a0 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d  et..**.** Also m
194b0 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
194c0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73  e expression res
194d0 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65  ults into anothe
194e0 72 20 22 63 61 63 68 65 22 20 72 65 67 69 73 74  r "cache" regist
194f0 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79  er.** and modify
19500 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
19510 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  so that the next
19520 20 74 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c   time it is eval
19530 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65  uated,.** the re
19540 73 75 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f  sult is a copy o
19550 66 20 74 68 65 20 63 61 63 68 65 20 72 65 67 69  f the cache regi
19560 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ster..**.** This
19570 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
19580 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73   for expressions
19590 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20 6d   that are used m
195a0 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65  ultiple .** time
195b0 73 2e 20 20 54 68 65 79 20 61 72 65 20 65 76 61  s.  They are eva
195c0 6c 75 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20  luated once and 
195d0 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
195e0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  he expression.**
195f0 20 61 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a   are reused..*/.
19600 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
19610 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61 72 73  odeAndCache(Pars
19620 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
19630 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
19640 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  et){.  Vdbe *v =
19650 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
19660 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 20 20 69    int inReg;.  i
19670 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
19680 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
19690 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
196a0 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
196b0 30 20 29 3b 0a 20 20 2f 2a 20 54 68 69 73 20 72  0 );.  /* This r
196c0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
196d0 20 66 6f 72 20 74 65 72 6d 73 20 74 6f 20 49 4e   for terms to IN
196e0 53 45 52 54 20 6f 72 20 55 50 44 41 54 45 2e 20  SERT or UPDATE. 
196f0 20 41 6e 64 20 74 68 65 20 6f 6e 6c 79 0a 20 20   And the only.  
19700 2a 2a 20 6f 74 68 65 72 20 70 6c 61 63 65 20 77  ** other place w
19710 68 65 72 65 20 65 78 70 72 65 73 73 69 6f 6e 73  here expressions
19720 20 63 61 6e 20 62 65 20 63 6f 6e 76 65 72 74 65   can be converte
19730 64 20 69 6e 74 6f 20 54 4b 5f 52 45 47 49 53 54  d into TK_REGIST
19740 45 52 20 69 73 0a 20 20 2a 2a 20 69 6e 20 57 48  ER is.  ** in WH
19750 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
19760 73 73 69 6e 67 2e 20 20 53 6f 20 61 73 20 63 75  ssing.  So as cu
19770 72 72 65 6e 74 6c 79 20 69 6d 70 6c 65 6d 65 6e  rrently implemen
19780 74 65 64 2c 20 74 68 65 72 65 20 69 73 0a 20 20  ted, there is.  
19790 2a 2a 20 6e 6f 20 77 61 79 20 66 6f 72 20 61 20  ** no way for a 
197a0 54 4b 5f 52 45 47 49 53 54 45 52 20 74 6f 20 65  TK_REGISTER to e
197b0 78 69 73 74 20 68 65 72 65 2e 20 20 42 75 74 20  xist here.  But 
197c0 69 74 20 73 65 65 6d 73 20 70 72 75 64 65 6e 74  it seems prudent
197d0 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 74 68   to.  ** keep th
197e0 65 20 41 4c 57 41 59 53 28 29 20 69 6e 20 63 61  e ALWAYS() in ca
197f0 73 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  se the condition
19800 73 20 61 62 6f 76 65 20 63 68 61 6e 67 65 20 77  s above change w
19810 69 74 68 20 66 75 74 75 72 65 0a 20 20 2a 2a 20  ith future.  ** 
19820 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 6f 72  modifications or
19830 20 65 6e 68 61 6e 63 65 6d 65 6e 74 73 2e 20 2a   enhancements. *
19840 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  /.  if( ALWAYS(p
19850 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47  Expr->op!=TK_REG
19860 49 53 54 45 52 29 20 29 7b 20 20 0a 20 20 20 20  ISTER) ){  .    
19870 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 20 20 69 4d  int iMem;.    iM
19880 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
19890 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
198a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
198b0 5f 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 69 4d  _Copy, inReg, iM
198c0 65 6d 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  em);.    pExpr->
198d0 69 54 61 62 6c 65 20 3d 20 69 4d 65 6d 3b 0a 20  iTable = iMem;. 
198e0 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20     pExpr->op2 = 
198f0 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 70  pExpr->op;.    p
19900 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45  Expr->op = TK_RE
19910 47 49 53 54 45 52 3b 0a 20 20 7d 0a 20 20 72 65  GISTER;.  }.  re
19920 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 23  turn inReg;.}..#
19930 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
19940 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58  E_ENABLE_TREE_EX
19950 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e  PLAIN)./*.** Gen
19960 65 72 61 74 65 20 61 20 68 75 6d 61 6e 2d 72 65  erate a human-re
19970 61 64 61 62 6c 65 20 65 78 70 6c 61 6e 61 74 69  adable explanati
19980 6f 6e 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  on of an express
19990 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69  ion tree..*/.voi
199a0 64 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e  d sqlite3Explain
199b0 45 78 70 72 28 56 64 62 65 20 2a 70 4f 75 74 2c  Expr(Vdbe *pOut,
199c0 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
199d0 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
199e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
199f0 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20 63  e opcode being c
19a00 6f 64 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  oded */.  const 
19a10 63 68 61 72 20 2a 7a 42 69 6e 4f 70 20 3d 20 30  char *zBinOp = 0
19a20 3b 20 20 20 2f 2a 20 42 69 6e 61 72 79 20 6f 70  ;   /* Binary op
19a30 65 72 61 74 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73  erator */.  cons
19a40 74 20 63 68 61 72 20 2a 7a 55 6e 69 4f 70 20 3d  t char *zUniOp =
19a50 20 30 3b 20 20 20 2f 2a 20 55 6e 61 72 79 20 6f   0;   /* Unary o
19a60 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 66 28  perator */.  if(
19a70 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20   pExpr==0 ){.   
19a80 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20   op = TK_NULL;. 
19a90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d   }else{.    op =
19aa0 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a   pExpr->op;.  }.
19ab0 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
19ac0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
19ad0 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
19ae0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
19af0 69 6e 74 66 28 70 4f 75 74 2c 20 22 41 47 47 7b  intf(pOut, "AGG{
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 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
19b20 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  le, pExpr->iColu
19b30 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  mn);.      break
19b40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
19b50 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
19b60 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
19b70 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20  Table<0 ){.     
19b80 20 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20     /* This only 
19b90 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 64  happens when cod
19ba0 69 6e 67 20 63 68 65 63 6b 20 63 6f 6e 73 74 72  ing check constr
19bb0 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  aints */.       
19bc0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
19bd0 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 43 4f 4c  rintf(pOut, "COL
19be0 55 4d 4e 28 25 64 29 22 2c 20 70 45 78 70 72 2d  UMN(%d)", pExpr-
19bf0 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  >iColumn);.     
19c00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
19c10 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
19c20 69 6e 74 66 28 70 4f 75 74 2c 20 22 7b 25 64 3a  intf(pOut, "{%d:
19c30 25 64 7d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  %d}",.          
19c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c50 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
19c60 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
19c70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
19c80 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
19c90 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
19ca0 52 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  R: {.      if( p
19cb0 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
19cc0 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20  _IntValue ){.   
19cd0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
19ce0 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
19cf0 22 25 64 22 2c 20 70 45 78 70 72 2d 3e 75 2e 69  "%d", pExpr->u.i
19d00 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 7d 65  Value);.      }e
19d10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
19d20 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
19d30 66 28 70 4f 75 74 2c 20 22 25 73 22 2c 20 70 45  f(pOut, "%s", pE
19d40 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
19d50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
19d60 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
19d70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
19d80 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
19d90 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
19da0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
19db0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
19dc0 75 74 2c 22 25 73 22 2c 20 70 45 78 70 72 2d 3e  ut,"%s", pExpr->
19dd0 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
19de0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
19df0 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
19e00 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
19e10 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
19e20 72 69 6e 74 66 28 70 4f 75 74 2c 22 25 51 22 2c  rintf(pOut,"%Q",
19e30 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
19e40 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
19e50 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
19e60 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  K_NULL: {.      
19e70 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
19e80 69 6e 74 66 28 70 4f 75 74 2c 22 4e 55 4c 4c 22  intf(pOut,"NULL"
19e90 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
19ea0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
19eb0 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c  LITE_OMIT_BLOB_L
19ec0 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20  ITERAL.    case 
19ed0 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TK_BLOB: {.     
19ee0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
19ef0 72 69 6e 74 66 28 70 4f 75 74 2c 22 25 73 22 2c  rintf(pOut,"%s",
19f00 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
19f10 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
19f20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
19f30 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
19f40 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
19f50 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
19f60 70 4f 75 74 2c 22 56 41 52 49 41 42 4c 45 28 25  pOut,"VARIABLE(%
19f70 73 2c 25 64 29 22 2c 0a 20 20 20 20 20 20 20 20  s,%d)",.        
19f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f90 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b     pExpr->u.zTok
19fa0 65 6e 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  en, pExpr->iColu
19fb0 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  mn);.      break
19fc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
19fd0 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a   TK_REGISTER: {.
19fe0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
19ff0 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1a000 22 52 45 47 49 53 54 45 52 28 25 64 29 22 2c 20  "REGISTER(%d)", 
1a010 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a  pExpr->iTable);.
1a020 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1a030 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
1a040 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  S: {.      sqlit
1a050 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f  e3ExplainExpr(pO
1a060 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  ut, pExpr->pLeft
1a070 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1a080 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1a090 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20  LITE_OMIT_CAST. 
1a0a0 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a     case TK_CAST:
1a0b0 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72   {.      /* Expr
1a0c0 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66  essions of the f
1a0d0 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66  orm:   CAST(pLef
1a0e0 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20  t AS token) */. 
1a0f0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1a100 2a 7a 41 66 66 20 3d 20 22 75 6e 6b 22 3b 0a 20  *zAff = "unk";. 
1a110 20 20 20 20 20 73 77 69 74 63 68 28 20 73 71 6c       switch( sql
1a120 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
1a130 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
1a140 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  ) ){.        cas
1a150 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  e SQLITE_AFF_TEX
1a160 54 3a 20 20 20 20 7a 41 66 66 20 3d 20 22 54 45  T:    zAff = "TE
1a170 58 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  XT";     break;.
1a180 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
1a190 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3a 20 20 20  ITE_AFF_NONE:   
1a1a0 20 7a 41 66 66 20 3d 20 22 4e 4f 4e 45 22 3b 20   zAff = "NONE"; 
1a1b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1a1c0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
1a1d0 46 46 5f 4e 55 4d 45 52 49 43 3a 20 7a 41 66 66  FF_NUMERIC: zAff
1a1e0 20 3d 20 22 4e 55 4d 45 52 49 43 22 3b 20 20 62   = "NUMERIC";  b
1a1f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
1a200 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  se SQLITE_AFF_IN
1a210 54 45 47 45 52 3a 20 7a 41 66 66 20 3d 20 22 49  TEGER: zAff = "I
1a220 4e 54 45 47 45 52 22 3b 20 20 62 72 65 61 6b 3b  NTEGER";  break;
1a230 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
1a240 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3a 20 20  LITE_AFF_REAL:  
1a250 20 20 7a 41 66 66 20 3d 20 22 52 45 41 4c 22 3b    zAff = "REAL";
1a260 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a270 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1a280 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1a290 4f 75 74 2c 20 22 43 41 53 54 2d 25 73 28 22 2c  Out, "CAST-%s(",
1a2a0 20 7a 41 66 66 29 3b 0a 20 20 20 20 20 20 73 71   zAff);.      sq
1a2b0 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
1a2c0 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c  (pOut, pExpr->pL
1a2d0 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
1a2e0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1a2f0 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20 20 20  (pOut, ")");.   
1a300 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1a310 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1a320 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20  _OMIT_CAST */.  
1a330 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20    case TK_LT:   
1a340 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4c 54 22     zBinOp = "LT"
1a350 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
1a360 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20   case TK_LE:    
1a370 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4c 45 22 3b    zBinOp = "LE";
1a380 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a390 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20  case TK_GT:     
1a3a0 20 7a 42 69 6e 4f 70 20 3d 20 22 47 54 22 3b 20   zBinOp = "GT"; 
1a3b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1a3c0 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20  ase TK_GE:      
1a3d0 7a 42 69 6e 4f 70 20 3d 20 22 47 45 22 3b 20 20  zBinOp = "GE";  
1a3e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1a3f0 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 7a  se TK_NE:      z
1a400 42 69 6e 4f 70 20 3d 20 22 4e 45 22 3b 20 20 20  BinOp = "NE";   
1a410 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1a420 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 7a 42  e TK_EQ:      zB
1a430 69 6e 4f 70 20 3d 20 22 45 51 22 3b 20 20 20 20  inOp = "EQ";    
1a440 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1a450 20 54 4b 5f 49 53 3a 20 20 20 20 20 20 7a 42 69   TK_IS:      zBi
1a460 6e 4f 70 20 3d 20 22 49 53 22 3b 20 20 20 20 20  nOp = "IS";     
1a470 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1a480 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 7a 42 69 6e  TK_ISNOT:   zBin
1a490 4f 70 20 3d 20 22 49 53 4e 4f 54 22 3b 20 20 62  Op = "ISNOT";  b
1a4a0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1a4b0 4b 5f 41 4e 44 3a 20 20 20 20 20 7a 42 69 6e 4f  K_AND:     zBinO
1a4c0 70 20 3d 20 22 41 4e 44 22 3b 20 20 20 20 62 72  p = "AND";    br
1a4d0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1a4e0 5f 4f 52 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70  _OR:      zBinOp
1a4f0 20 3d 20 22 4f 52 22 3b 20 20 20 20 20 62 72 65   = "OR";     bre
1a500 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1a510 50 4c 55 53 3a 20 20 20 20 7a 42 69 6e 4f 70 20  PLUS:    zBinOp 
1a520 3d 20 22 41 44 44 22 3b 20 20 20 20 62 72 65 61  = "ADD";    brea
1a530 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  k;.    case TK_S
1a540 54 41 52 3a 20 20 20 20 7a 42 69 6e 4f 70 20 3d  TAR:    zBinOp =
1a550 20 22 4d 55 4c 22 3b 20 20 20 20 62 72 65 61 6b   "MUL";    break
1a560 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49  ;.    case TK_MI
1a570 4e 55 53 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20  NUS:   zBinOp = 
1a580 22 53 55 42 22 3b 20 20 20 20 62 72 65 61 6b 3b  "SUB";    break;
1a590 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d  .    case TK_REM
1a5a0 3a 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22  :     zBinOp = "
1a5b0 52 45 4d 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  REM";    break;.
1a5c0 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41      case TK_BITA
1a5d0 4e 44 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22 42  ND:  zBinOp = "B
1a5e0 49 54 41 4e 44 22 3b 20 62 72 65 61 6b 3b 0a 20  ITAND"; break;. 
1a5f0 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52     case TK_BITOR
1a600 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 42 49  :   zBinOp = "BI
1a610 54 4f 52 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  TOR";  break;.  
1a620 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a    case TK_SLASH:
1a630 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 44 49 56     zBinOp = "DIV
1a640 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
1a650 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a   case TK_LSHIFT:
1a660 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4c 53 48 49    zBinOp = "LSHI
1a670 46 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  FT"; break;.    
1a680 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20  case TK_RSHIFT: 
1a690 20 7a 42 69 6e 4f 70 20 3d 20 22 52 53 48 49 46   zBinOp = "RSHIF
1a6a0 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  T"; break;.    c
1a6b0 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 20  ase TK_CONCAT:  
1a6c0 7a 42 69 6e 4f 70 20 3d 20 22 43 4f 4e 43 41 54  zBinOp = "CONCAT
1a6d0 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63  "; break;..    c
1a6e0 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 20  ase TK_UMINUS:  
1a6f0 7a 55 6e 69 4f 70 20 3d 20 22 55 4d 49 4e 55 53  zUniOp = "UMINUS
1a700 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
1a710 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 20 20 7a  se TK_UPLUS:   z
1a720 55 6e 69 4f 70 20 3d 20 22 55 50 4c 55 53 22 3b  UniOp = "UPLUS";
1a730 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1a740 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 7a 55  e TK_BITNOT:  zU
1a750 6e 69 4f 70 20 3d 20 22 42 49 54 4e 4f 54 22 3b  niOp = "BITNOT";
1a760 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1a770 20 54 4b 5f 4e 4f 54 3a 20 20 20 20 20 7a 55 6e   TK_NOT:     zUn
1a780 69 4f 70 20 3d 20 22 4e 4f 54 22 3b 20 20 20 20  iOp = "NOT";    
1a790 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1a7a0 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 7a 55 6e 69  TK_ISNULL:  zUni
1a7b0 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22 3b 20 62  Op = "ISNULL"; b
1a7c0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1a7d0 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 55 6e 69 4f  K_NOTNULL: zUniO
1a7e0 70 20 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20 62  p = "NOTNULL"; b
1a7f0 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
1a800 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20  TK_COLLATE: {.  
1a810 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1a820 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78  inExpr(pOut, pEx
1a830 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
1a840 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1a850 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 2e 43 4f  Printf(pOut,".CO
1a860 4c 4c 41 54 45 28 25 73 29 22 2c 70 45 78 70 72  LLATE(%s)",pExpr
1a870 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
1a880 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1a890 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
1a8a0 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63  _FUNCTION:.    c
1a8b0 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e  ase TK_CONST_FUN
1a8c0 43 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  C:.    case TK_F
1a8d0 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
1a8e0 20 45 78 70 72 4c 69 73 74 20 2a 70 46 61 72 67   ExprList *pFarg
1a8f0 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ;       /* List 
1a900 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  of function argu
1a910 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  ments */.      i
1a920 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
1a930 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b  ty(pExpr, EP_Tok
1a940 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  enOnly) ){.     
1a950 20 20 20 70 46 61 72 67 20 3d 20 30 3b 0a 20 20     pFarg = 0;.  
1a960 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a970 20 20 20 70 46 61 72 67 20 3d 20 70 45 78 70 72     pFarg = pExpr
1a980 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20  ->x.pList;.     
1a990 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d   }.      if( op=
1a9a0 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
1a9b0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1a9c0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1a9d0 28 70 4f 75 74 2c 20 22 41 47 47 5f 46 55 4e 43  (pOut, "AGG_FUNC
1a9e0 54 49 4f 4e 25 64 3a 25 73 28 22 2c 0a 20 20 20  TION%d:%s(",.   
1a9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa00 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1aa10 3e 6f 70 32 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  >op2, pExpr->u.z
1aa20 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65  Token);.      }e
1aa30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
1aa40 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1aa50 66 28 70 4f 75 74 2c 20 22 46 55 4e 43 54 49 4f  f(pOut, "FUNCTIO
1aa60 4e 3a 25 73 28 22 2c 20 70 45 78 70 72 2d 3e 75  N:%s(", pExpr->u
1aa70 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
1aa80 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46 61 72  }.      if( pFar
1aa90 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
1aaa0 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c  ite3ExplainExprL
1aab0 69 73 74 28 70 4f 75 74 2c 20 70 46 61 72 67 29  ist(pOut, pFarg)
1aac0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1aad0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1aae0 69 6e 74 66 28 70 4f 75 74 2c 20 22 29 22 29 3b  intf(pOut, ")");
1aaf0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1ab00 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1ab10 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1ab20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
1ab30 53 54 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  STS: {.      sql
1ab40 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1ab50 66 28 70 4f 75 74 2c 20 22 45 58 49 53 54 53 28  f(pOut, "EXISTS(
1ab60 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ");.      sqlite
1ab70 33 45 78 70 6c 61 69 6e 53 65 6c 65 63 74 28 70  3ExplainSelect(p
1ab80 4f 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53  Out, pExpr->x.pS
1ab90 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73 71  elect);.      sq
1aba0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1abb0 74 66 28 70 4f 75 74 2c 22 29 22 29 3b 0a 20 20  tf(pOut,")");.  
1abc0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1abd0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
1abe0 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ECT: {.      sql
1abf0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1ac00 66 28 70 4f 75 74 2c 20 22 28 22 29 3b 0a 20 20  f(pOut, "(");.  
1ac10 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1ac20 69 6e 53 65 6c 65 63 74 28 70 4f 75 74 2c 20 70  inSelect(pOut, p
1ac30 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29  Expr->x.pSelect)
1ac40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1ac50 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1ac60 74 2c 20 22 29 22 29 3b 0a 20 20 20 20 20 20 62  t, ")");.      b
1ac70 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1ac80 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
1ac90 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1aca0 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1acb0 49 4e 28 22 29 3b 0a 20 20 20 20 20 20 73 71 6c  IN(");.      sql
1acc0 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
1acd0 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65  pOut, pExpr->pLe
1ace0 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
1acf0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1ad00 70 4f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20  pOut, ",");.    
1ad10 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
1ad20 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1ad30 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
1ad40 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1ad50 6c 61 69 6e 53 65 6c 65 63 74 28 70 4f 75 74 2c  lainSelect(pOut,
1ad60 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
1ad70 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
1ad80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ad90 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28  ExplainExprList(
1ada0 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70  pOut, pExpr->x.p
1adb0 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  List);.      }. 
1adc0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1add0 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1ade0 22 29 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ")");.      brea
1adf0 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
1ae00 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
1ae10 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
1ae20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42  /*.    **    x B
1ae30 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20  ETWEEN y AND z. 
1ae40 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
1ae50 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  s is equivalent 
1ae60 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  to.    **.    **
1ae70 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d      x>=y AND x<=
1ae80 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  z.    **.    ** 
1ae90 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  X is stored in p
1aea0 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20  Expr->pLeft..   
1aeb0 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20   ** Y is stored 
1aec0 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  in pExpr->pList-
1aed0 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20  >a[0].pExpr..   
1aee0 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20   ** Z is stored 
1aef0 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  in pExpr->pList-
1af00 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20  >a[1].pExpr..   
1af10 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
1af20 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
1af30 20 45 78 70 72 20 2a 70 58 20 3d 20 70 45 78 70   Expr *pX = pExp
1af40 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
1af50 45 78 70 72 20 2a 70 59 20 3d 20 70 45 78 70 72  Expr *pY = pExpr
1af60 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ->x.pList->a[0].
1af70 70 45 78 70 72 3b 0a 20 20 20 20 20 20 45 78 70  pExpr;.      Exp
1af80 72 20 2a 70 5a 20 3d 20 70 45 78 70 72 2d 3e 78  r *pZ = pExpr->x
1af90 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  .pList->a[1].pEx
1afa0 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
1afb0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1afc0 4f 75 74 2c 20 22 42 45 54 57 45 45 4e 28 22 29  Out, "BETWEEN(")
1afd0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1afe0 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c  xplainExpr(pOut,
1aff0 20 70 58 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   pX);.      sqli
1b000 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1b010 28 70 4f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20  (pOut, ",");.   
1b020 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1b030 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 59 29 3b  nExpr(pOut, pY);
1b040 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1b050 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1b060 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 73 71  , ",");.      sq
1b070 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
1b080 28 70 4f 75 74 2c 20 70 5a 29 3b 0a 20 20 20 20  (pOut, pZ);.    
1b090 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1b0a0 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 29 22  Printf(pOut, ")"
1b0b0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1b0c0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1b0d0 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20 20 20  K_TRIGGER: {.   
1b0e0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 63     /* If the opc
1b0f0 6f 64 65 20 69 73 20 54 4b 5f 54 52 49 47 47 45  ode is TK_TRIGGE
1b100 52 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72  R, then the expr
1b110 65 73 73 69 6f 6e 20 69 73 20 61 20 72 65 66 65  ession is a refe
1b120 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 74  rence.      ** t
1b130 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  o a column in th
1b140 65 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a  e new.* or old.*
1b150 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 73 20 61   pseudo-tables a
1b160 76 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20  vailable to.    
1b170 20 20 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f    ** trigger pro
1b180 67 72 61 6d 73 2e 20 49 6e 20 74 68 69 73 20 63  grams. In this c
1b190 61 73 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20  ase Expr.iTable 
1b1a0 69 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20  is set to 1 for 
1b1b0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77  the.      ** new
1b1c0 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c  .* pseudo-table,
1b1d0 20 6f 72 20 30 20 66 6f 72 20 74 68 65 20 6f 6c   or 0 for the ol
1b1e0 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  d.* pseudo-table
1b1f0 2e 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20  . Expr.iColumn. 
1b200 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74       ** is set t
1b210 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  o the column of 
1b220 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  the pseudo-table
1b230 20 74 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f 20   to read, or to 
1b240 2d 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72  -1 to.      ** r
1b250 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 66 69  ead the rowid fi
1b260 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  eld..      */.  
1b270 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1b280 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1b290 25 73 28 25 64 29 22 2c 20 0a 20 20 20 20 20 20  %s(%d)", .      
1b2a0 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
1b2b0 65 20 3f 20 22 4e 45 57 22 20 3a 20 22 4f 4c 44  e ? "NEW" : "OLD
1b2c0 22 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ", pExpr->iColum
1b2d0 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
1b2e0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1b2f0 54 4b 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20 20  TK_CASE: {.     
1b300 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1b310 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 43 41 53  rintf(pOut, "CAS
1b320 45 28 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  E(");.      sqli
1b330 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70  te3ExplainExpr(p
1b340 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  Out, pExpr->pLef
1b350 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1b360 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1b370 4f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20  Out, ",");.     
1b380 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
1b390 78 70 72 4c 69 73 74 28 70 4f 75 74 2c 20 70 45  xprList(pOut, pE
1b3a0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  xpr->x.pList);. 
1b3b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b3c0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1b3d0 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20  _OMIT_TRIGGER.  
1b3e0 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a    case TK_RAISE:
1b3f0 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63   {.      const c
1b400 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 22 75 6e  har *zType = "un
1b410 6b 22 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68  k";.      switch
1b420 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  ( pExpr->affinit
1b430 79 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  y ){.        cas
1b440 65 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3a 20 20  e OE_Rollback:  
1b450 20 7a 54 79 70 65 20 3d 20 22 72 6f 6c 6c 62 61   zType = "rollba
1b460 63 6b 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ck";  break;.   
1b470 20 20 20 20 20 63 61 73 65 20 4f 45 5f 41 62 6f       case OE_Abo
1b480 72 74 3a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  rt:      zType =
1b490 20 22 61 62 6f 72 74 22 3b 20 20 20 20 20 62 72   "abort";     br
1b4a0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
1b4b0 65 20 4f 45 5f 46 61 69 6c 3a 20 20 20 20 20 20  e OE_Fail:      
1b4c0 20 7a 54 79 70 65 20 3d 20 22 66 61 69 6c 22 3b   zType = "fail";
1b4d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b4e0 20 20 20 20 20 63 61 73 65 20 4f 45 5f 49 67 6e       case OE_Ign
1b4f0 6f 72 65 3a 20 20 20 20 20 7a 54 79 70 65 20 3d  ore:     zType =
1b500 20 22 69 67 6e 6f 72 65 22 3b 20 20 20 20 62 72   "ignore";    br
1b510 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1b520 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1b530 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 52  nPrintf(pOut, "R
1b540 41 49 53 45 2d 25 73 28 25 73 29 22 2c 20 7a 54  AISE-%s(%s)", zT
1b550 79 70 65 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ype, pExpr->u.zT
1b560 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  oken);.      bre
1b570 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
1b580 0a 20 20 7d 0a 20 20 69 66 28 20 7a 42 69 6e 4f  .  }.  if( zBinO
1b590 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
1b5a0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1b5b0 75 74 2c 22 25 73 28 22 2c 20 7a 42 69 6e 4f 70  ut,"%s(", zBinOp
1b5c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1b5d0 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20  plainExpr(pOut, 
1b5e0 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
1b5f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1b600 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 2c 22  nPrintf(pOut,","
1b610 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1b620 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20  plainExpr(pOut, 
1b630 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
1b640 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1b650 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 29  inPrintf(pOut,")
1b660 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ");.  }else if( 
1b670 7a 55 6e 69 4f 70 20 29 7b 0a 20 20 20 20 73 71  zUniOp ){.    sq
1b680 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1b690 74 66 28 70 4f 75 74 2c 22 25 73 28 22 2c 20 7a  tf(pOut,"%s(", z
1b6a0 55 6e 69 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69  UniOp);.    sqli
1b6b0 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70  te3ExplainExpr(p
1b6c0 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  Out, pExpr->pLef
1b6d0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
1b6e0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1b6f0 74 2c 22 29 22 29 3b 0a 20 20 7d 0a 7d 0a 23 65  t,")");.  }.}.#e
1b700 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
1b710 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52  SQLITE_ENABLE_TR
1b720 45 45 5f 45 58 50 4c 41 49 4e 29 20 2a 2f 0a 0a  EE_EXPLAIN) */..
1b730 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1b740 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45  TE_ENABLE_TREE_E
1b750 58 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65  XPLAIN)./*.** Ge
1b760 6e 65 72 61 74 65 20 61 20 68 75 6d 61 6e 2d 72  nerate a human-r
1b770 65 61 64 61 62 6c 65 20 65 78 70 6c 61 6e 61 74  eadable explanat
1b780 69 6f 6e 20 6f 66 20 61 6e 20 65 78 70 72 65 73  ion of an expres
1b790 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f  sion list..*/.vo
1b7a0 69 64 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69  id sqlite3Explai
1b7b0 6e 45 78 70 72 4c 69 73 74 28 56 64 62 65 20 2a  nExprList(Vdbe *
1b7c0 70 4f 75 74 2c 20 45 78 70 72 4c 69 73 74 20 2a  pOut, ExprList *
1b7d0 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
1b7e0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1b7f0 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  || pList->nExpr=
1b800 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
1b810 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1b820 4f 75 74 2c 20 22 28 65 6d 70 74 79 2d 6c 69 73  Out, "(empty-lis
1b830 74 29 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  t)");.    return
1b840 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c  ;.  }else if( pL
1b850 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 7b  ist->nExpr==1 ){
1b860 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
1b870 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 4c  ainExpr(pOut, pL
1b880 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
1b890 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
1b8a0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73  qlite3ExplainPus
1b8b0 68 28 70 4f 75 74 29 3b 0a 20 20 20 20 66 6f 72  h(pOut);.    for
1b8c0 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
1b8d0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
1b8e0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1b8f0 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 69 74  Printf(pOut, "it
1b900 65 6d 5b 25 64 5d 20 3d 20 22 2c 20 69 29 3b 0a  em[%d] = ", i);.
1b910 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1b920 6c 61 69 6e 50 75 73 68 28 70 4f 75 74 29 3b 0a  lainPush(pOut);.
1b930 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1b940 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70  lainExpr(pOut, p
1b950 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
1b960 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1b970 45 78 70 6c 61 69 6e 50 6f 70 28 70 4f 75 74 29  ExplainPop(pOut)
1b980 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  ;.      if( pLis
1b990 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b  t->a[i].zName ){
1b9a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b9b0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1b9c0 75 74 2c 20 22 20 41 53 20 25 73 22 2c 20 70 4c  ut, " AS %s", pL
1b9d0 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
1b9e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b9f0 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  if( pList->a[i].
1ba00 62 53 70 61 6e 49 73 54 61 62 20 29 7b 0a 20 20  bSpanIsTab ){.  
1ba10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1ba20 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1ba30 20 22 20 28 25 73 29 22 2c 20 70 4c 69 73 74 2d   " (%s)", pList-
1ba40 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20  >a[i].zSpan);.  
1ba50 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1ba60 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  i<pList->nExpr-1
1ba70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1ba80 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 4f 75  te3ExplainNL(pOu
1ba90 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
1baa0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
1bab0 6c 61 69 6e 50 6f 70 28 70 4f 75 74 29 3b 0a 20  lainPop(pOut);. 
1bac0 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
1bad0 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a  QLITE_DEBUG */..
1bae0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
1baf0 45 20 69 66 20 70 45 78 70 72 20 69 73 20 61 6e  E if pExpr is an
1bb00 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73   constant expres
1bb10 73 69 6f 6e 20 74 68 61 74 20 69 73 20 61 70 70  sion that is app
1bb20 72 6f 70 72 69 61 74 65 0a 2a 2a 20 66 6f 72 20  ropriate.** for 
1bb30 66 61 63 74 6f 72 69 6e 67 20 6f 75 74 20 6f 66  factoring out of
1bb40 20 61 20 6c 6f 6f 70 2e 20 20 41 70 70 72 6f 70   a loop.  Approp
1bb50 72 69 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  riate expression
1bb60 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  s are:.**.**    
1bb70 2a 20 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f  *  Any expressio
1bb80 6e 20 74 68 61 74 20 65 76 61 6c 75 61 74 65 73  n that evaluates
1bb90 20 74 6f 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20   to two or more 
1bba0 6f 70 63 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  opcodes..**.**  
1bbb0 20 20 2a 20 20 41 6e 79 20 4f 50 5f 49 6e 74 65    *  Any OP_Inte
1bbc0 67 65 72 2c 20 4f 50 5f 52 65 61 6c 2c 20 4f 50  ger, OP_Real, OP
1bbd0 5f 53 74 72 69 6e 67 2c 20 4f 50 5f 42 6c 6f 62  _String, OP_Blob
1bbe0 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 0a 2a 2a 20 20  , OP_Null, .**  
1bbf0 20 20 20 20 20 6f 72 20 4f 50 5f 56 61 72 69 61       or OP_Varia
1bc00 62 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ble that does no
1bc10 74 20 6e 65 65 64 20 74 6f 20 62 65 20 70 6c 61  t need to be pla
1bc20 63 65 64 20 69 6e 20 61 20 0a 2a 2a 20 20 20 20  ced in a .**    
1bc30 20 20 20 73 70 65 63 69 66 69 63 20 72 65 67 69     specific regi
1bc40 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  ster..**.** Ther
1bc50 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e  e is no point in
1bc60 20 66 61 63 74 6f 72 69 6e 67 20 6f 75 74 20 73   factoring out s
1bc70 69 6e 67 6c 65 2d 69 6e 73 74 72 75 63 74 69 6f  ingle-instructio
1bc80 6e 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 65 78  n constant.** ex
1bc90 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 6e  pressions that n
1bca0 65 65 64 20 74 6f 20 62 65 20 70 6c 61 63 65 64  eed to be placed
1bcb0 20 69 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72   in a particular
1bcc0 20 72 65 67 69 73 74 65 72 2e 20 20 0a 2a 2a 20   register.  .** 
1bcd0 57 65 20 63 6f 75 6c 64 20 66 61 63 74 6f 72 20  We could factor 
1bce0 74 68 65 6d 20 6f 75 74 2c 20 62 75 74 20 74 68  them out, but th
1bcf0 65 6e 20 77 65 20 77 6f 75 6c 64 20 65 6e 64 20  en we would end 
1bd00 75 70 20 61 64 64 69 6e 67 20 61 6e 0a 2a 2a 20  up adding an.** 
1bd10 4f 50 5f 53 43 6f 70 79 20 69 6e 73 74 72 75 63  OP_SCopy instruc
1bd20 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 74 68 65  tion to move the
1bd30 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20   value into the 
1bd40 63 6f 72 72 65 63 74 20 72 65 67 69 73 74 65 72  correct register
1bd50 0a 2a 2a 20 6c 61 74 65 72 2e 20 20 57 65 20 6d  .** later.  We m
1bd60 69 67 68 74 20 61 73 20 77 65 6c 6c 20 6a 75 73  ight as well jus
1bd70 74 20 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e  t use the origin
1bd80 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61  al instruction a
1bd90 6e 64 0a 2a 2a 20 61 76 6f 69 64 20 74 68 65 20  nd.** avoid the 
1bda0 4f 50 5f 53 43 6f 70 79 2e 0a 2a 2f 0a 73 74 61  OP_SCopy..*/.sta
1bdb0 74 69 63 20 69 6e 74 20 69 73 41 70 70 72 6f 70  tic int isApprop
1bdc0 72 69 61 74 65 46 6f 72 46 61 63 74 6f 72 69 6e  riateForFactorin
1bdd0 67 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  g(Expr *p){.  if
1bde0 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73  ( !sqlite3ExprIs
1bdf0 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
1be00 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  p) ){.    return
1be10 20 30 3b 20 20 2f 2a 20 4f 6e 6c 79 20 63 6f 6e   0;  /* Only con
1be20 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  stant expression
1be30 73 20 61 72 65 20 61 70 70 72 6f 70 72 69 61 74  s are appropriat
1be40 65 20 66 6f 72 20 66 61 63 74 6f 72 69 6e 67 20  e for factoring 
1be50 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d  */.  }.  if( (p-
1be60 3e 66 6c 61 67 73 20 26 20 45 50 5f 46 69 78 65  >flags & EP_Fixe
1be70 64 44 65 73 74 29 3d 3d 30 20 29 7b 0a 20 20 20  dDest)==0 ){.   
1be80 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41   return 1;  /* A
1be90 6e 79 20 63 6f 6e 73 74 61 6e 74 20 77 69 74 68  ny constant with
1bea0 6f 75 74 20 61 20 66 69 78 65 64 20 64 65 73 74  out a fixed dest
1beb0 69 6e 61 74 69 6f 6e 20 69 73 20 61 70 70 72 6f  ination is appro
1bec0 70 72 69 61 74 65 20 2a 2f 0a 20 20 7d 0a 20 20  priate */.  }.  
1bed0 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  while( p->op==TK
1bee0 5f 55 50 4c 55 53 20 29 20 70 20 3d 20 70 2d 3e  _UPLUS ) p = p->
1bef0 70 4c 65 66 74 3b 0a 20 20 73 77 69 74 63 68 28  pLeft;.  switch(
1bf00 20 70 2d 3e 6f 70 20 29 7b 0a 23 69 66 6e 64 65   p->op ){.#ifnde
1bf10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c  f SQLITE_OMIT_BL
1bf20 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63  OB_LITERAL.    c
1bf30 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 23 65 6e  ase TK_BLOB:.#en
1bf40 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  dif.    case TK_
1bf50 56 41 52 49 41 42 4c 45 3a 0a 20 20 20 20 63 61  VARIABLE:.    ca
1bf60 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20  se TK_INTEGER:. 
1bf70 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
1bf80 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55  :.    case TK_NU
1bf90 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
1bfa0 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20  STRING: {.      
1bfb0 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
1bfc0 3d 54 4b 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20  =TK_BLOB );.    
1bfd0 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f    testcase( p->o
1bfe0 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29  p==TK_VARIABLE )
1bff0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1c000 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  ( p->op==TK_INTE
1c010 47 45 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73  GER );.      tes
1c020 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
1c030 5f 46 4c 4f 41 54 20 29 3b 0a 20 20 20 20 20 20  _FLOAT );.      
1c040 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
1c050 3d 54 4b 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  =TK_NULL );.    
1c060 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f    testcase( p->o
1c070 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 3b 0a  p==TK_STRING );.
1c080 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 2d        /* Single-
1c090 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f 6e 73  instruction cons
1c0a0 74 61 6e 74 73 20 77 69 74 68 20 61 20 66 69 78  tants with a fix
1c0b0 65 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 61  ed destination a
1c0c0 72 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 74 74  re.      ** bett
1c0d0 65 72 20 64 6f 6e 65 20 69 6e 2d 6c 69 6e 65 2e  er done in-line.
1c0e0 20 20 49 66 20 77 65 20 66 61 63 74 6f 72 20 74    If we factor t
1c0f0 68 65 6d 2c 20 74 68 65 79 20 77 69 6c 6c 20 6a  hem, they will j
1c100 75 73 74 20 65 6e 64 0a 20 20 20 20 20 20 2a 2a  ust end.      **
1c110 20 75 70 20 67 65 6e 65 72 61 74 69 6e 67 20 61   up generating a
1c120 6e 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 6d 6f  n OP_SCopy to mo
1c130 76 65 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20  ve the value to 
1c140 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  the destination.
1c150 20 20 20 20 20 20 2a 2a 20 72 65 67 69 73 74 65        ** registe
1c160 72 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  r. */.      retu
1c170 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
1c180 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
1c190 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  {.      if( p->p
1c1a0 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f  Left->op==TK_FLO
1c1b0 41 54 20 7c 7c 20 70 2d 3e 70 4c 65 66 74 2d 3e  AT || p->pLeft->
1c1c0 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29  op==TK_INTEGER )
1c1d0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1c1e0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1c1f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1c200 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
1c210 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c220 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
1c230 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 45 78  .}../*.** If pEx
1c240 70 72 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  pr is a constant
1c250 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
1c260 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
1c270 66 6f 72 0a 2a 2a 20 66 61 63 74 6f 72 69 6e 67  for.** factoring
1c280 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2c 20   out of a loop, 
1c290 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20 74 68  then evaluate th
1c2a0 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
1c2b0 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 20  into a register 
1c2c0 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 68 65 20  and convert the 
1c2d0 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 74 6f 20  expression into 
1c2e0 61 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 2a 2a  a TK_REGISTER.**
1c2f0 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a   expression..*/.
1c300 73 74 61 74 69 63 20 69 6e 74 20 65 76 61 6c 43  static int evalC
1c310 6f 6e 73 74 45 78 70 72 28 57 61 6c 6b 65 72 20  onstExpr(Walker 
1c320 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
1c330 70 45 78 70 72 29 7b 0a 20 20 50 61 72 73 65 20  pExpr){.  Parse 
1c340 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65  *pParse = pWalke
1c350 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 77 69  r->pParse;.  swi
1c360 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
1c370 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  {.    case TK_IN
1c380 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  :.    case TK_RE
1c390 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20  GISTER: {.      
1c3a0 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
1c3b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1c3c0 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20   TK_COLLATE: {. 
1c3d0 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
1c3e0 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  Continue;.    }.
1c3f0 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
1c400 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  TION:.    case T
1c410 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a  K_AGG_FUNCTION:.
1c420 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53      case TK_CONS
1c430 54 5f 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20  T_FUNC: {.      
1c440 2f 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73  /* The arguments
1c450 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 68   to a function h
1c460 61 76 65 20 61 20 66 69 78 65 64 20 64 65 73 74  ave a fixed dest
1c470 69 6e 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  ination..      *
1c480 2a 20 4d 61 72 6b 20 74 68 65 6d 20 74 68 69 73  * Mark them this
1c490 20 77 61 79 20 74 6f 20 61 76 6f 69 64 20 67 65   way to avoid ge
1c4a0 6e 65 72 61 74 65 64 20 75 6e 6e 65 65 64 65 64  nerated unneeded
1c4b0 20 4f 50 5f 53 43 6f 70 79 0a 20 20 20 20 20 20   OP_SCopy.      
1c4c0 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e  ** instructions.
1c4d0 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
1c4e0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
1c4f0 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
1c500 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
1c510 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1c520 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
1c530 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
1c540 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
1c550 20 20 20 20 20 69 6e 74 20 69 20 3d 20 70 4c 69       int i = pLi
1c560 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
1c570 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
1c580 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
1c590 20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20   pList->a;.     
1c5a0 20 20 20 66 6f 72 28 3b 20 69 3e 30 3b 20 69 2d     for(; i>0; i-
1c5b0 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
1c5c0 20 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59         if( ALWAY
1c5d0 53 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 20  S(pItem->pExpr) 
1c5e0 29 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e  ) pItem->pExpr->
1c5f0 66 6c 61 67 73 20 7c 3d 20 45 50 5f 46 69 78 65  flags |= EP_Fixe
1c600 64 44 65 73 74 3b 0a 20 20 20 20 20 20 20 20 7d  dDest;.        }
1c610 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
1c620 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
1c630 20 20 69 66 28 20 69 73 41 70 70 72 6f 70 72 69    if( isAppropri
1c640 61 74 65 46 6f 72 46 61 63 74 6f 72 69 6e 67 28  ateForFactoring(
1c650 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 69 6e  pExpr) ){.    in
1c660 74 20 72 31 20 3d 20 2b 2b 70 50 61 72 73 65 2d  t r1 = ++pParse-
1c670 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 74 20 72  >nMem;.    int r
1c680 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
1c690 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
1c6a0 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20  , pExpr, r1);.  
1c6b0 20 20 2f 2a 20 49 66 20 72 32 21 3d 72 31 2c 20    /* If r2!=r1, 
1c6c0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65  it means that re
1c6d0 67 69 73 74 65 72 20 72 31 20 69 73 20 6e 65 76  gister r1 is nev
1c6e0 65 72 20 75 73 65 64 2e 20 20 54 68 61 74 20 69  er used.  That i
1c6f0 73 20 68 61 72 6d 6c 65 73 73 0a 20 20 20 20 2a  s harmless.    *
1c700 2a 20 62 75 74 20 73 75 62 6f 70 74 69 6d 61 6c  * but suboptimal
1c710 2c 20 73 6f 20 77 65 20 77 61 6e 74 20 74 6f 20  , so we want to 
1c720 6b 6e 6f 77 20 61 62 6f 75 74 20 74 68 65 20 73  know about the s
1c730 69 74 75 61 74 69 6f 6e 20 74 6f 20 66 69 78 20  ituation to fix 
1c740 69 74 2e 0a 20 20 20 20 2a 2a 20 48 65 6e 63 65  it..    ** Hence
1c750 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
1c760 73 73 65 72 74 3a 20 2a 2f 0a 20 20 20 20 61 73  ssert: */.    as
1c770 73 65 72 74 28 20 72 32 3d 3d 72 31 20 29 3b 0a  sert( r2==r1 );.
1c780 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 20 3d      pExpr->op2 =
1c790 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20   pExpr->op;.    
1c7a0 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52  pExpr->op = TK_R
1c7b0 45 47 49 53 54 45 52 3b 0a 20 20 20 20 70 45 78  EGISTER;.    pEx
1c7c0 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 72 32 3b  pr->iTable = r2;
1c7d0 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
1c7e0 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 72 65 74  Prune;.  }.  ret
1c7f0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
1c800 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 65 76  ;.}../*.** Preev
1c810 61 6c 75 61 74 65 20 63 6f 6e 73 74 61 6e 74 20  aluate constant 
1c820 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77  subexpressions w
1c830 69 74 68 69 6e 20 70 45 78 70 72 20 61 6e 64 20  ithin pExpr and 
1c840 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73  store the.** res
1c850 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72  ults in register
1c860 73 2e 20 20 4d 6f 64 69 66 79 20 70 45 78 70 72  s.  Modify pExpr
1c870 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6e   so that the con
1c880 73 74 61 6e 74 20 73 75 62 65 78 70 72 65 73 69  stant subexpresi
1c890 6f 6e 73 0a 2a 2a 20 61 72 65 20 54 4b 5f 52 45  ons.** are TK_RE
1c8a0 47 49 53 54 45 52 20 6f 70 63 6f 64 65 73 20 74  GISTER opcodes t
1c8b0 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65  hat refer to the
1c8c0 20 70 72 65 63 6f 6d 70 75 74 65 64 20 76 61 6c   precomputed val
1c8d0 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ues..**.** This 
1c8e0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
1c8f0 6f 70 20 69 66 20 74 68 65 20 6a 75 6d 70 20 74  op if the jump t
1c900 6f 20 74 68 65 20 63 6f 6f 6b 69 65 2d 63 68 65  o the cookie-che
1c910 63 6b 20 63 6f 64 65 20 68 61 73 0a 2a 2a 20 61  ck code has.** a
1c920 6c 72 65 61 64 79 20 6f 63 63 75 72 2e 20 20 53  lready occur.  S
1c930 69 6e 63 65 20 74 68 65 20 63 6f 6f 6b 69 65 2d  ince the cookie-
1c940 63 68 65 63 6b 20 6a 75 6d 70 20 69 73 20 67 65  check jump is ge
1c950 6e 65 72 61 74 65 64 20 70 72 69 6f 72 20 74 6f  nerated prior to
1c960 0a 2a 2a 20 61 6e 79 20 6f 74 68 65 72 20 73 65  .** any other se
1c970 72 69 6f 75 73 20 70 72 6f 63 65 73 73 69 6e 67  rious processing
1c980 2c 20 74 68 69 73 20 63 68 65 63 6b 20 65 6e 73  , this check ens
1c990 75 72 65 73 20 74 68 61 74 20 74 68 65 72 65 20  ures that there 
1c9a0 69 73 20 6e 6f 0a 2a 2a 20 77 61 79 20 74 6f 20  is no.** way to 
1c9b0 61 63 63 69 64 65 6e 74 6c 79 20 62 79 70 61 73  accidently bypas
1c9c0 73 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 69  s the constant i
1c9d0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 73 2e 0a  nitializations..
1c9e0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1c9f0 6e 65 20 69 73 20 61 6c 73 6f 20 61 20 6e 6f 2d  ne is also a no-
1ca00 6f 70 20 69 66 20 74 68 65 20 53 51 4c 49 54 45  op if the SQLITE
1ca10 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 20  _FactorOutConst 
1ca20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20  optimization.** 
1ca30 69 73 20 64 69 73 61 62 6c 65 64 20 76 69 61 20  is disabled via 
1ca40 74 68 65 20 73 71 6c 69 74 65 33 5f 74 65 73 74  the sqlite3_test
1ca50 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1ca60 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a  TESTCTRL_OPTIMIZ
1ca70 41 54 49 4f 4e 53 29 0a 2a 2a 20 69 6e 74 65 72  ATIONS).** inter
1ca80 66 61 63 65 2e 20 20 54 68 69 73 20 61 6c 6c 6f  face.  This allo
1ca90 77 73 20 74 65 73 74 20 6c 6f 67 69 63 20 74 6f  ws test logic to
1caa0 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
1cab0 20 73 61 6d 65 20 61 6e 73 77 65 72 20 69 73 0a   same answer is.
1cac0 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 6f 72 20  ** obtained for 
1cad0 71 75 65 72 69 65 73 20 72 65 67 61 72 64 6c 65  queries regardle
1cae0 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72  ss of whether or
1caf0 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 73 20 61   not constants a
1cb00 72 65 0a 2a 2a 20 70 72 65 63 6f 6d 70 75 74 65  re.** precompute
1cb10 64 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 73  d into registers
1cb20 20 6f 72 20 69 66 20 74 68 65 79 20 61 72 65 20   or if they are 
1cb30 69 6e 73 65 72 74 65 64 20 69 6e 2d 6c 69 6e 65  inserted in-line
1cb40 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1cb50 33 45 78 70 72 43 6f 64 65 43 6f 6e 73 74 61 6e  3ExprCodeConstan
1cb60 74 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ts(Parse *pParse
1cb70 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
1cb80 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 69 66    Walker w;.  if
1cb90 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  ( pParse->cookie
1cba0 47 6f 74 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20  Goto ) return;. 
1cbb0 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f   if( Optimizatio
1cbc0 6e 44 69 73 61 62 6c 65 64 28 70 50 61 72 73 65  nDisabled(pParse
1cbd0 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 46 61 63  ->db, SQLITE_Fac
1cbe0 74 6f 72 4f 75 74 43 6f 6e 73 74 29 20 29 20 72  torOutConst) ) r
1cbf0 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28  eturn;.  memset(
1cc00 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
1cc10 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  );.  w.xExprCall
1cc20 62 61 63 6b 20 3d 20 65 76 61 6c 43 6f 6e 73 74  back = evalConst
1cc30 45 78 70 72 3b 0a 20 20 77 2e 70 50 61 72 73 65  Expr;.  w.pParse
1cc40 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c   = pParse;.  sql
1cc50 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
1cc60 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a   pExpr);.}.../*.
1cc70 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1cc80 20 74 68 61 74 20 70 75 73 68 65 73 20 74 68 65   that pushes the
1cc90 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20   value of every 
1cca0 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67  element of the g
1ccb0 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  iven.** expressi
1ccc0 6f 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 73  on list into a s
1ccd0 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73  equence of regis
1cce0 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 61  ters beginning a
1ccf0 74 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20  t target..**.** 
1cd00 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
1cd10 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65 76  r of elements ev
1cd20 61 6c 75 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  aluated..*/.int 
1cd30 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
1cd40 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65  xprList(.  Parse
1cd50 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
1cd60 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
1cd70 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1cd80 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68 65 20  pList,   /* The 
1cd90 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
1cda0 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
1cdb0 20 69 6e 74 20 74 61 72 67 65 74 2c 20 20 20 20   int target,    
1cdc0 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
1cdd0 77 72 69 74 65 20 72 65 73 75 6c 74 73 20 2a 2f  write results */
1cde0 0a 20 20 69 6e 74 20 64 6f 48 61 72 64 43 6f 70  .  int doHardCop
1cdf0 79 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 61 20  y     /* Make a 
1ce00 68 61 72 64 20 63 6f 70 79 20 6f 66 20 65 76 65  hard copy of eve
1ce10 72 79 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b  ry element */.){
1ce20 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
1ce30 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1ce40 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 61 73    int i, n;.  as
1ce50 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29  sert( pList!=0 )
1ce60 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67  ;.  assert( targ
1ce70 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  et>0 );.  assert
1ce80 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21  ( pParse->pVdbe!
1ce90 3d 30 20 29 3b 20 20 2f 2a 20 4e 65 76 65 72 20  =0 );  /* Never 
1cea0 67 65 74 73 20 74 68 69 73 20 66 61 72 20 6f 74  gets this far ot
1ceb0 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 6e 20 3d  herwise */.  n =
1cec0 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
1ced0 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
1cee0 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69  ->a, i=0; i<n; i
1cef0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
1cf00 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
1cf10 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pItem->pExpr;.  
1cf20 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 73 71    int inReg = sq
1cf30 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
1cf40 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
1cf50 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  r, target+i);.  
1cf60 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72    if( inReg!=tar
1cf70 67 65 74 2b 69 20 29 7b 0a 20 20 20 20 20 20 73  get+i ){.      s
1cf80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1cf90 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
1cfa0 64 6f 48 61 72 64 43 6f 70 79 20 3f 20 4f 50 5f  doHardCopy ? OP_
1cfb0 43 6f 70 79 20 3a 20 4f 50 5f 53 43 6f 70 79 2c  Copy : OP_SCopy,
1cfc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cfd0 20 20 20 20 20 20 20 20 20 69 6e 52 65 67 2c 20           inReg, 
1cfe0 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 7d  target+i);.    }
1cff0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
1d000 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1d010 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 42 45  te code for a BE
1d020 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2e 0a  TWEEN operator..
1d030 2a 2a 0a 2a 2a 20 20 20 20 78 20 42 45 54 57 45  **.**    x BETWE
1d040 45 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a  EN y AND z.**.**
1d050 20 54 68 65 20 61 62 6f 76 65 20 69 73 20 65 71   The above is eq
1d060 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 2a 2a 0a  uivalent to .**.
1d070 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78  **    x>=y AND x
1d080 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 69  <=z.**.** Code i
1d090 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b 69 6e  t as such, takin
1d0a0 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74 68 65  g care to do the
1d0b0 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65   common subexpre
1d0c0 73 73 69 6f 6e 0a 2a 2a 20 65 6c 65 6d 65 6e 74  ssion.** element
1d0d0 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2f 0a 73  ation of x..*/.s
1d0e0 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 43  tatic void exprC
1d0f0 6f 64 65 42 65 74 77 65 65 6e 28 0a 20 20 50 61  odeBetween(.  Pa
1d100 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1d110 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
1d120 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
1d130 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
1d140 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a   *pExpr,      /*
1d150 20 54 68 65 20 42 45 54 57 45 45 4e 20 65 78 70   The BETWEEN exp
1d160 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ression */.  int
1d170 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f   dest,         /
1d180 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74  * Jump here if t
1d190 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e  he jump is taken
1d1a0 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66   */.  int jumpIf
1d1b0 54 72 75 65 2c 20 20 20 2f 2a 20 54 61 6b 65 20  True,   /* Take 
1d1c0 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20  the jump if the 
1d1d0 42 45 54 57 45 45 4e 20 69 73 20 74 72 75 65 20  BETWEEN is true 
1d1e0 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e  */.  int jumpIfN
1d1f0 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20 74  ull    /* Take t
1d200 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42  he jump if the B
1d210 45 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20 2a  ETWEEN is NULL *
1d220 2f 0a 29 7b 0a 20 20 45 78 70 72 20 65 78 70 72  /.){.  Expr expr
1d230 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  And;     /* The 
1d240 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 69 6e 20  AND operator in 
1d250 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20 20   x>=y AND x<=z  
1d260 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c 65  */.  Expr compLe
1d270 66 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 20 78  ft;    /* The  x
1d280 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45  >=y  term */.  E
1d290 78 70 72 20 63 6f 6d 70 52 69 67 68 74 3b 20 20  xpr compRight;  
1d2a0 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20 74   /* The  x<=z  t
1d2b0 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 65 78  erm */.  Expr ex
1d2c0 70 72 58 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  prX;       /* Th
1d2d0 65 20 20 78 20 20 73 75 62 65 78 70 72 65 73 73  e  x  subexpress
1d2e0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ion */.  int reg
1d2f0 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54 65  Free1 = 0; /* Te
1d300 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65 67 69  mporary use regi
1d310 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ster */..  asser
1d320 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1d330 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
1d340 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 65 78  sSelect) );.  ex
1d350 70 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c  prX = *pExpr->pL
1d360 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 6f  eft;.  exprAnd.o
1d370 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 65 78  p = TK_AND;.  ex
1d380 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63  prAnd.pLeft = &c
1d390 6f 6d 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41  ompLeft;.  exprA
1d3a0 6e 64 2e 70 52 69 67 68 74 20 3d 20 26 63 6f 6d  nd.pRight = &com
1d3b0 70 52 69 67 68 74 3b 0a 20 20 63 6f 6d 70 4c 65  pRight;.  compLe
1d3c0 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20  ft.op = TK_GE;. 
1d3d0 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20   compLeft.pLeft 
1d3e0 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70  = &exprX;.  comp
1d3f0 4c 65 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45  Left.pRight = pE
1d400 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
1d410 30 5d 2e 70 45 78 70 72 3b 0a 20 20 63 6f 6d 70  0].pExpr;.  comp
1d420 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45  Right.op = TK_LE
1d430 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c  ;.  compRight.pL
1d440 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20  eft = &exprX;.  
1d450 63 6f 6d 70 52 69 67 68 74 2e 70 52 69 67 68 74  compRight.pRight
1d460 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
1d470 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
1d480 20 65 78 70 72 58 2e 69 54 61 62 6c 65 20 3d 20   exprX.iTable = 
1d490 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1d4a0 65 6d 70 28 70 50 61 72 73 65 2c 20 26 65 78 70  emp(pParse, &exp
1d4b0 72 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  rX, &regFree1);.
1d4c0 20 20 65 78 70 72 58 2e 6f 70 32 20 3d 20 65 78    exprX.op2 = ex
1d4d0 70 72 58 2e 6f 70 3b 0a 20 20 65 78 70 72 58 2e  prX.op;.  exprX.
1d4e0 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52  op = TK_REGISTER
1d4f0 3b 0a 20 20 69 66 28 20 6a 75 6d 70 49 66 54 72  ;.  if( jumpIfTr
1d500 75 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ue ){.    sqlite
1d510 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
1d520 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65  se, &exprAnd, de
1d530 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1d540 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
1d550 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1d560 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e  (pParse, &exprAn
1d570 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  d, dest, jumpIfN
1d580 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ull);.  }.  sqli
1d590 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1d5a0 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
1d5b0 65 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72  e1);..  /* Ensur
1d5c0 65 20 61 64 65 71 75 61 74 65 20 74 65 73 74 20  e adequate test 
1d5d0 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 74 65  coverage */.  te
1d5e0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72  stcase( jumpIfTr
1d5f0 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e  ue==0 && jumpIfN
1d600 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
1d610 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
1d620 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d  ase( jumpIfTrue=
1d630 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  =0 && jumpIfNull
1d640 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21  ==0 && regFree1!
1d650 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
1d660 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20  ( jumpIfTrue==0 
1d670 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  && jumpIfNull!=0
1d680 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20   && regFree1==0 
1d690 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a  );.  testcase( j
1d6a0 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20  umpIfTrue==0 && 
1d6b0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26  jumpIfNull!=0 &&
1d6c0 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a   regFree1!=0 );.
1d6d0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1d6e0 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d  IfTrue!=0 && jum
1d6f0 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
1d700 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74  gFree1==0 );.  t
1d710 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54  estcase( jumpIfT
1d720 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66  rue!=0 && jumpIf
1d730 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
1d740 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1!=0 );.  test
1d750 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65  case( jumpIfTrue
1d760 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  !=0 && jumpIfNul
1d770 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l!=0 && regFree1
1d780 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==0 );.  testcas
1d790 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30  e( jumpIfTrue!=0
1d7a0 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
1d7b0 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30  0 && regFree1!=0
1d7c0 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   );.}../*.** Gen
1d7d0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
1d7e0 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
1d7f0 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
1d800 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
1d810 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
1d820 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
1d830 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75  ssion is true bu
1d840 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63  t execution.** c
1d850 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68  ontinues straigh
1d860 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78  t thru if the ex
1d870 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73  pression is fals
1d880 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
1d890 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
1d8a0 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65  ates to NULL (ne
1d8b0 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66  ither true nor f
1d8c0 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74  alse), then.** t
1d8d0 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20  ake the jump if 
1d8e0 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66  the jumpIfNull f
1d8f0 6c 61 67 20 69 73 20 53 51 4c 49 54 45 5f 4a 55  lag is SQLITE_JU
1d900 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  MPIFNULL..**.** 
1d910 54 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64  This code depend
1d920 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68  s on the fact th
1d930 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e  at certain token
1d940 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f   values (ex: TK_
1d950 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73  EQ).** are the s
1d960 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61  ame as opcode va
1d970 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29  lues (ex: OP_Eq)
1d980 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20   that implement 
1d990 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
1d9a0 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20  g.** operation. 
1d9b0 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74   Special comment
1d9c0 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20  s in vdbe.c and 
1d9d0 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77  the mkopcodeh.aw
1d9e0 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74  k script in.** t
1d9f0 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20  he make process 
1da00 63 61 75 73 65 20 74 68 65 73 65 20 76 61 6c 75  cause these valu
1da10 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73  es to align.  As
1da20 73 65 72 74 28 29 73 20 69 6e 20 74 68 65 20 63  sert()s in the c
1da30 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72  ode.** below ver
1da40 69 66 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d  ify that the num
1da50 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64  bers are aligned
1da60 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76   correctly..*/.v
1da70 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49  oid sqlite3ExprI
1da80 66 54 72 75 65 28 50 61 72 73 65 20 2a 70 50 61  fTrue(Parse *pPa
1da90 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
1daa0 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20  , int dest, int 
1dab0 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56  jumpIfNull){.  V
1dac0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1dad0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70  >pVdbe;.  int op
1dae0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
1daf0 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree1 = 0;.  int 
1db00 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20  regFree2 = 0;.  
1db10 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61  int r1, r2;..  a
1db20 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c  ssert( jumpIfNul
1db30 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  l==SQLITE_JUMPIF
1db40 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75  NULL || jumpIfNu
1db50 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e  ll==0 );.  if( N
1db60 45 56 45 52 28 76 3d 3d 30 29 20 29 20 20 20 20  EVER(v==0) )    
1db70 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 78 69   return;  /* Exi
1db80 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63  stence of VDBE c
1db90 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72  hecked by caller
1dba0 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
1dbb0 70 45 78 70 72 3d 3d 30 29 20 29 20 72 65 74 75  pExpr==0) ) retu
1dbc0 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61 79 20 74  rn;  /* No way t
1dbd0 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 2a  his can happen *
1dbe0 2f 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e  /.  op = pExpr->
1dbf0 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  op;.  switch( op
1dc00 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
1dc10 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  AND: {.      int
1dc20 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   d2 = sqlite3Vdb
1dc30 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1dc40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1dc50 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1dc60 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1dc70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
1dc80 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
1dc90 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
1dca0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1dcb0 74 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c  t, d2,jumpIfNull
1dcc0 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55  ^SQLITE_JUMPIFNU
1dcd0 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  LL);.      sqlit
1dce0 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
1dcf0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1dd00 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
1dd10 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
1dd20 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1dd30 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20  abel(v, d2);.   
1dd40 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1dd50 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31  chePop(pParse, 1
1dd60 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1dd70 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1dd80 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 74 65  K_OR: {.      te
1dd90 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
1dda0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
1ddb0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
1ddc0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1ddd0 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
1dde0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1ddf0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
1de00 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1de10 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
1de20 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1de30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1de40 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
1de50 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1de60 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1de70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1de80 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
1de90 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1dea0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1deb0 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
1dec0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1ded0 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
1dee0 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
1def0 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
1df00 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
1df10 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
1df20 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
1df30 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f  assert( TK_LT==O
1df40 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Lt );.      as
1df50 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f  sert( TK_LE==OP_
1df60 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Le );.      asse
1df70 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  rt( TK_GT==OP_Gt
1df80 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1df90 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29  ( TK_GE==OP_Ge )
1dfa0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1dfb0 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a  TK_EQ==OP_Eq );.
1dfc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1dfd0 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20  _NE==OP_Ne );.  
1dfe0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1dff0 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20  ==TK_LT );.     
1e000 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1e010 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65  K_LE );.      te
1e020 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47  stcase( op==TK_G
1e030 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
1e040 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45 20 29  ase( op==TK_GE )
1e050 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e060 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20  ( op==TK_EQ );. 
1e070 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1e080 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20  p==TK_NE );.    
1e090 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1e0a0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1e0b0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1e0c0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1e0d0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1e0e0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1e0f0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1e100 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1e110 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1e120 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
1e130 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
1e140 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1e150 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
1e160 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
1e170 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
1e180 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   r2, dest, jumpI
1e190 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 74 65  fNull);.      te
1e1a0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1e1b0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
1e1c0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
1e1d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
1e1e0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1e1f0 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73  e TK_IS:.    cas
1e200 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20  e TK_ISNOT: {.  
1e210 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1e220 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20  ==TK_IS );.     
1e230 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1e240 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20  K_ISNOT );.     
1e250 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1e260 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1e270 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1e280 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1e290 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1e2a0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1e2b0 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
1e2c0 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
1e2d0 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b      op = (op==TK
1e2e0 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54  _IS) ? TK_EQ : T
1e2f0 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 63 6f 64 65  K_NE;.      code
1e300 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
1e310 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
1e320 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
1e330 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e340 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c     r1, r2, dest,
1e350 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b   SQLITE_NULLEQ);
1e360 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e370 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1e380 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e390 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
1e3a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e3b0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
1e3c0 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
1e3d0 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
1e3e0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53     assert( TK_IS
1e3f0 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  NULL==OP_IsNull 
1e400 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e410 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f   TK_NOTNULL==OP_
1e420 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20  NotNull );.     
1e430 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1e440 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  K_ISNULL );.    
1e450 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1e460 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20  TK_NOTNULL );.  
1e470 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1e480 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1e490 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1e4a0 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
1e4b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e4c0 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31  AddOp2(v, op, r1
1e4d0 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74  , dest);.      t
1e4e0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1e4f0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  1==0 );.      br
1e500 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1e510 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
1e520 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1e530 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1e540 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64  );.      exprCod
1e550 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c  eBetween(pParse,
1e560 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 31 2c   pExpr, dest, 1,
1e570 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1e580 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1e590 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e5a0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
1e5b0 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
1e5c0 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
1e5d0 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56  False = sqlite3V
1e5e0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1e5f0 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49  .      int destI
1e600 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e 75  fNull = jumpIfNu
1e610 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64 65 73 74  ll ? dest : dest
1e620 49 66 46 61 6c 73 65 3b 0a 20 20 20 20 20 20 73  IfFalse;.      s
1e630 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
1e640 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1e650 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73  destIfFalse, des
1e660 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
1e670 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e680 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
1e690 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71   dest);.      sq
1e6a0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1e6b0 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46  Label(v, destIfF
1e6c0 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65  alse);.      bre
1e6d0 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
1e6e0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
1e6f0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1e700 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1e710 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72  Parse, pExpr, &r
1e720 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1e730 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e740 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20  3(v, OP_If, r1, 
1e750 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1e760 21 3d 30 29 3b 0a 20 20 20 20 20 20 74 65 73 74  !=0);.      test
1e770 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1e780 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
1e790 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
1e7a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
1e7b0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  k;.    }.  }.  s
1e7c0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1e7d0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
1e7e0 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65  Free1);.  sqlite
1e7f0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1e800 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
1e810 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  );  .}../*.** Ge
1e820 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1e830 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
1e840 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
1e850 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
1e860 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
1e870 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
1e880 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20  ession is false 
1e890 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
1e8a0 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
1e8b0 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
1e8c0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
1e8d0 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ue..**.** If the
1e8e0 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
1e8f0 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e  uates to NULL (n
1e900 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20  either true nor 
1e910 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a  false) then.** j
1e920 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c  ump if jumpIfNul
1e930 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50  l is SQLITE_JUMP
1e940 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74  IFNULL or fall t
1e950 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66  hrough if jumpIf
1e960 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f  Null.** is 0..*/
1e970 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1e980 72 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a  rIfFalse(Parse *
1e990 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
1e9a0 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
1e9b0 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
1e9c0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1e9d0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
1e9e0 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72   op = 0;.  int r
1e9f0 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69  egFree1 = 0;.  i
1ea00 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  nt regFree2 = 0;
1ea10 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a  .  int r1, r2;..
1ea20 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66    assert( jumpIf
1ea30 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d  Null==SQLITE_JUM
1ea40 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49  PIFNULL || jumpI
1ea50 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  fNull==0 );.  if
1ea60 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
1ea70 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74  return; /* Exist
1ea80 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65  ence of VDBE che
1ea90 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a  cked by caller *
1eaa0 2f 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  /.  if( pExpr==0
1eab0 20 29 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20   )    return;.. 
1eac0 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   /* The value of
1ead0 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f   pExpr->op and o
1eae0 70 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73  p are related as
1eaf0 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
1eb00 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d   **       pExpr-
1eb10 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f  >op            o
1eb20 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d  p.  **       ---
1eb30 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20  ------          
1eb40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20  ----------.  ** 
1eb50 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20        TK_ISNULL 
1eb60 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e           OP_NotN
1eb70 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ull.  **       T
1eb80 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20  K_NOTNULL       
1eb90 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a    OP_IsNull.  **
1eba0 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20         TK_NE    
1ebb0 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a            OP_Eq.
1ebc0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51    **       TK_EQ
1ebd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
1ebe0 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Ne.  **       T
1ebf0 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20  K_GT            
1ec00 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20    OP_Le.  **    
1ec10 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20     TK_LE        
1ec20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a        OP_Gt.  **
1ec30 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20         TK_GE    
1ec40 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a            OP_Lt.
1ec50 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54    **       TK_LT
1ec60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
1ec70 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f  _Ge.  **.  ** Fo
1ec80 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f  r other values o
1ec90 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20  f pExpr->op, op 
1eca0 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64  is undefined and
1ecb0 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68   unused..  ** Th
1ecc0 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61  e value of TK_ a
1ecd0 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73  nd OP_ constants
1ece0 20 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75   are arranged su
1ecf0 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20  ch that we.  ** 
1ed00 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20  can compute the 
1ed10 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73  mapping above us
1ed20 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
1ed30 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20  g expression..  
1ed40 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72  ** Assert()s ver
1ed50 69 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d  ify that the com
1ed60 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72  putation is corr
1ed70 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d  ect..  */.  op =
1ed80 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b   ((pExpr->op+(TK
1ed90 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28  _ISNULL&1))^1)-(
1eda0 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20  TK_ISNULL&1);.. 
1edb0 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65   /* Verify corre
1edc0 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  ct alignment of 
1edd0 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73  TK_ and OP_ cons
1ede0 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73  tants.  */.  ass
1edf0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
1ee00 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d  TK_ISNULL || op=
1ee10 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20  =OP_NotNull );. 
1ee20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1ee30 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c  op!=TK_NOTNULL |
1ee40 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  | op==OP_IsNull 
1ee50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
1ee60 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c  pr->op!=TK_NE ||
1ee70 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20   op==OP_Eq );.  
1ee80 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
1ee90 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d  p!=TK_EQ || op==
1eea0 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Ne );.  asser
1eeb0 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
1eec0 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65  _LT || op==OP_Ge
1eed0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1eee0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c  xpr->op!=TK_LE |
1eef0 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20  | op==OP_Gt );. 
1ef00 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1ef10 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d  op!=TK_GT || op=
1ef20 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Le );.  asse
1ef30 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
1ef40 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  K_GE || op==OP_L
1ef50 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  t );..  switch( 
1ef60 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
1ef70 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a   case TK_AND: {.
1ef80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ef90 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1efa0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1efb0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
1efc0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1efd0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1efe0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1eff0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
1f000 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
1f010 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
1f020 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
1f030 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1f040 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20  e TK_OR: {.     
1f050 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65   int d2 = sqlite
1f060 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1f070 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1f080 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1f090 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1f0a0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
1f0b0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
1f0c0 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
1f0d0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1f0e0 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66  Left, d2, jumpIf
1f0f0 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50  Null^SQLITE_JUMP
1f100 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
1f110 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
1f120 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1f130 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
1f140 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1f150 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1f160 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29  olveLabel(v, d2)
1f170 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1f180 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
1f190 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72  se, 1);.      br
1f1a0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1f1b0 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
1f1c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1f1d0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1f1e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1f1f0 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
1f200 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
1f210 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1f220 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f230 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
1f240 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
1f250 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
1f260 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
1f270 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
1f280 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
1f290 51 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  Q: {.      testc
1f2a0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29  ase( op==TK_LT )
1f2b0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1f2c0 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20  ( op==TK_LE );. 
1f2d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1f2e0 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20  p==TK_GT );.    
1f2f0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1f300 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_GE );.      t
1f310 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1f320 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  EQ );.      test
1f330 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20  case( op==TK_NE 
1f340 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1f350 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1f360 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
1f370 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1f380 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1f390 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1f3a0 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
1f3b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1f3c0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1f3d0 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
1f3e0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64  ree2);.      cod
1f3f0 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
1f400 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
1f410 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
1f420 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f430 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74      r1, r2, dest
1f440 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1f450 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1f460 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1f470 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1f480 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
1f490 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f4a0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a      case TK_IS:.
1f4b0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
1f4c0 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  T: {.      testc
1f4d0 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
1f4e0 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74  TK_IS );.      t
1f4f0 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
1f500 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a  op==TK_ISNOT );.
1f510 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1f520 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1f530 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1f540 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1f550 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
1f560 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1f570 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1f580 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
1f590 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 70  );.      op = (p
1f5a0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29  Expr->op==TK_IS)
1f5b0 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51   ? TK_NE : TK_EQ
1f5c0 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
1f5d0 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
1f5e0 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
1f5f0 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
1f600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1f610 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 53 51 4c  1, r2, dest, SQL
1f620 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
1f630 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1f640 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1f650 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1f660 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
1f670 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1f680 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
1f690 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
1f6a0 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 74  TNULL: {.      t
1f6b0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1f6c0 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
1f6d0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1f6e0 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  _NOTNULL );.    
1f6f0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1f700 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1f710 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1f720 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1f730 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f740 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20  dOp2(v, op, r1, 
1f750 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
1f760 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1f770 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
1f780 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1f790 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
1f7a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f7b0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1f7c0 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42  .      exprCodeB
1f7d0 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70  etween(pParse, p
1f7e0 45 78 70 72 2c 20 64 65 73 74 2c 20 30 2c 20 6a  Expr, dest, 0, j
1f7f0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1f800 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1f810 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f820 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
1f830 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
1f840 20 20 20 20 69 66 28 20 6a 75 6d 70 49 66 4e 75      if( jumpIfNu
1f850 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ll ){.        sq
1f860 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
1f870 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
1f880 65 73 74 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  est, dest);.    
1f890 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f8a0 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20   int destIfNull 
1f8b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1f8c0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
1f8d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1f8e0 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78  deIN(pParse, pEx
1f8f0 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 49 66  pr, dest, destIf
1f900 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  Null);.        s
1f910 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1f920 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66  eLabel(v, destIf
1f930 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Null);.      }. 
1f940 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f950 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66  }.#endif.    def
1f960 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 31  ault: {.      r1
1f970 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1f980 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1f990 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29  Expr, &regFree1)
1f9a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1f9b0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1f9c0 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c  IfNot, r1, dest,
1f9d0 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b   jumpIfNull!=0);
1f9e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1f9f0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1fa00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fa10 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1fa20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1fa30 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1fa40 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1fa50 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
1fa60 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
1fa70 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1fa80 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a  e, regFree2);.}.
1fa90 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70  ./*.** Do a deep
1faa0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74   comparison of t
1fab0 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  wo expression tr
1fac0 65 65 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ees.  Return 0 i
1fad0 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70  f the two.** exp
1fae0 72 65 73 73 69 6f 6e 73 20 61 72 65 20 63 6f 6d  ressions are com
1faf0 70 6c 65 74 65 6c 79 20 69 64 65 6e 74 69 63 61  pletely identica
1fb00 6c 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  l.  Return 1 if 
1fb10 74 68 65 79 20 64 69 66 66 65 72 20 6f 6e 6c 79  they differ only
1fb20 0a 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41 54 45  .** by a COLLATE
1fb30 20 6f 70 65 72 61 74 6f 72 20 61 74 20 74 68 65   operator at the
1fb40 20 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52 65 74   top level.  Ret
1fb50 75 72 6e 20 32 20 69 66 20 74 68 65 72 65 20 61  urn 2 if there a
1fb60 72 65 20 64 69 66 66 65 72 65 6e 63 65 73 0a 2a  re differences.*
1fb70 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  * other than the
1fb80 20 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41   top-level COLLA
1fb90 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a  TE operator..**.
1fba0 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c 65  ** If any subele
1fbb0 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20 45  ment of pB has E
1fbc0 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29  xpr.iTable==(-1)
1fbd0 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f   then it is allo
1fbe0 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72  wed.** to compar
1fbf0 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65 71  e equal to an eq
1fc00 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74  uivalent element
1fc10 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70 72   in pA with Expr
1fc20 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a  .iTable==iTab..*
1fc30 2a 0a 2a 2a 20 54 68 65 20 70 41 20 73 69 64 65  *.** The pA side
1fc40 20 6d 69 67 68 74 20 62 65 20 75 73 69 6e 67 20   might be using 
1fc50 54 4b 5f 52 45 47 49 53 54 45 52 2e 20 20 49 66  TK_REGISTER.  If
1fc60 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73   that is the cas
1fc70 65 20 61 6e 64 20 70 42 20 69 73 0a 2a 2a 20 6e  e and pB is.** n
1fc80 6f 74 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49  ot using TK_REGI
1fc90 53 54 45 52 20 62 75 74 20 69 73 20 6f 74 68 65  STER but is othe
1fca0 72 77 69 73 65 20 65 71 75 69 76 61 6c 65 6e 74  rwise equivalent
1fcb0 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74  , then still ret
1fcc0 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d  urn 0..**.** Som
1fcd0 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75 74  etimes this rout
1fce0 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
1fcf0 32 20 65 76 65 6e 20 69 66 20 74 68 65 20 74 77  2 even if the tw
1fd00 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  o expressions.**
1fd10 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75 69   really are equi
1fd20 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20 63  valent.  If we c
1fd30 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61 74  annot prove that
1fd40 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
1fd50 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61   are.** identica
1fd60 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32 20 6a  l, we return 2 j
1fd70 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 20  ust to be safe. 
1fd80 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
1fd90 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 32  ine.** returns 2
1fda0 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f  , then you do no
1fdb0 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f  t really know fo
1fdc0 72 20 63 65 72 74 61 69 6e 20 69 66 20 74 68 65  r certain if the
1fdd0 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69   two.** expressi
1fde0 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  ons are the same
1fdf0 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20 67 65  .  But if you ge
1fe00 74 20 61 20 30 20 6f 72 20 31 20 72 65 74 75 72  t a 0 or 1 retur
1fe10 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63  n, then you.** c
1fe20 61 6e 20 62 65 20 73 75 72 65 20 74 68 65 20 65  an be sure the e
1fe30 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74  xpressions are t
1fe40 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68 65  he same.  In the
1fe50 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a 2a   places where.**
1fe60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1fe70 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20 6e   used, it does n
1fe80 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74 20 61  ot hurt to get a
1fe90 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68 61 74  n extra 2 - that
1fea0 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20 72  .** just might r
1feb0 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c  esult in some sl
1fec0 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f  ightly slower co
1fed0 64 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e 69  de.  But returni
1fee0 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65  ng.** an incorre
1fef0 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c 64 20  ct 0 or 1 could 
1ff00 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e  lead to a malfun
1ff10 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
1ff20 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
1ff30 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20  (Expr *pA, Expr 
1ff40 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a  *pB, int iTab){.
1ff50 20 20 69 66 28 20 70 41 3d 3d 30 7c 7c 70 42 3d    if( pA==0||pB=
1ff60 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1ff70 20 70 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b   pB==pA ? 0 : 2;
1ff80 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
1ff90 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1ffa0 70 41 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pA, EP_TokenOnly
1ffb0 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
1ffc0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1ffd0 61 73 50 72 6f 70 65 72 74 79 28 70 42 2c 20 45  asProperty(pB, E
1ffe0 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
1fff0 65 64 75 63 65 64 29 20 29 3b 0a 20 20 69 66 28  educed) );.  if(
20000 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
20010 28 70 41 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  (pA, EP_xIsSelec
20020 74 29 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f  t) || ExprHasPro
20030 70 65 72 74 79 28 70 42 2c 20 45 50 5f 78 49 73  perty(pB, EP_xIs
20040 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72  Select) ){.    r
20050 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69  eturn 2;.  }.  i
20060 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20  f( (pA->flags & 
20070 45 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70  EP_Distinct)!=(p
20080 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  B->flags & EP_Di
20090 73 74 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e  stinct) ) return
200a0 20 32 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70   2;.  if( pA->op
200b0 21 3d 70 42 2d 3e 6f 70 20 26 26 20 28 70 41 2d  !=pB->op && (pA-
200c0 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op!=TK_REGISTER
200d0 20 7c 7c 20 70 41 2d 3e 6f 70 32 21 3d 70 42 2d   || pA->op2!=pB-
200e0 3e 6f 70 29 20 29 7b 0a 20 20 20 20 69 66 28 20  >op) ){.    if( 
200f0 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41  pA->op==TK_COLLA
20100 54 45 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  TE && sqlite3Exp
20110 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65  rCompare(pA->pLe
20120 66 74 2c 20 70 42 2c 20 69 54 61 62 29 3c 32 20  ft, pB, iTab)<2 
20130 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
20140 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
20150 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   pB->op==TK_COLL
20160 41 54 45 20 26 26 20 73 71 6c 69 74 65 33 45 78  ATE && sqlite3Ex
20170 70 72 43 6f 6d 70 61 72 65 28 70 41 2c 20 70 42  prCompare(pA, pB
20180 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3c 32  ->pLeft, iTab)<2
20190 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
201a0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   1;.    }.    re
201b0 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66  turn 2;.  }.  if
201c0 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
201d0 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20  pare(pA->pLeft, 
201e0 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29  pB->pLeft, iTab)
201f0 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69   ) return 2;.  i
20200 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
20210 6d 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74  mpare(pA->pRight
20220 2c 20 70 42 2d 3e 70 52 69 67 68 74 2c 20 69 54  , pB->pRight, iT
20230 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ab) ) return 2;.
20240 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
20250 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 41 2d  rListCompare(pA-
20260 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d 3e 78 2e  >x.pList, pB->x.
20270 70 4c 69 73 74 2c 20 69 54 61 62 29 20 29 20 72  pList, iTab) ) r
20280 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 70  eturn 2;.  if( p
20290 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e  A->iColumn!=pB->
202a0 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e  iColumn ) return
202b0 20 32 3b 0a 20 20 69 66 28 20 70 41 2d 3e 69 54   2;.  if( pA->iT
202c0 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65  able!=pB->iTable
202d0 20 0a 20 20 20 26 26 20 70 41 2d 3e 6f 70 21 3d   .   && pA->op!=
202e0 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 20 26  TK_REGISTER.   &
202f0 26 20 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69  & (pA->iTable!=i
20300 54 61 62 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d  Tab || NEVER(pB-
20310 3e 69 54 61 62 6c 65 3e 3d 30 29 29 20 29 20 72  >iTable>=0)) ) r
20320 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 45  eturn 2;.  if( E
20330 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
20340 41 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  A, EP_IntValue) 
20350 29 7b 0a 20 20 20 20 69 66 28 20 21 45 78 70 72  ){.    if( !Expr
20360 48 61 73 50 72 6f 70 65 72 74 79 28 70 42 2c 20  HasProperty(pB, 
20370 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20  EP_IntValue) || 
20380 70 41 2d 3e 75 2e 69 56 61 6c 75 65 21 3d 70 42  pA->u.iValue!=pB
20390 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20  ->u.iValue ){.  
203a0 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
203b0 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
203c0 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pA->op!=TK_COLUM
203d0 4e 20 26 26 20 41 4c 57 41 59 53 28 70 41 2d 3e  N && ALWAYS(pA->
203e0 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op!=TK_AGG_COLUM
203f0 4e 29 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b  N) && pA->u.zTok
20400 65 6e 29 7b 0a 20 20 20 20 69 66 28 20 45 78 70  en){.    if( Exp
20410 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 42 2c  rHasProperty(pB,
20420 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c   EP_IntValue) ||
20430 20 4e 45 56 45 52 28 70 42 2d 3e 75 2e 7a 54 6f   NEVER(pB->u.zTo
20440 6b 65 6e 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  ken==0) ) return
20450 20 32 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63   2;.    if( strc
20460 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  mp(pA->u.zToken,
20470 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30  pB->u.zToken)!=0
20480 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
20490 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   pA->op==TK_COLL
204a0 41 54 45 20 3f 20 31 20 3a 20 32 3b 0a 20 20 20  ATE ? 1 : 2;.   
204b0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
204c0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  0;.}../*.** Comp
204d0 61 72 65 20 74 77 6f 20 45 78 70 72 4c 69 73 74  are two ExprList
204e0 20 6f 62 6a 65 63 74 73 2e 20 20 52 65 74 75 72   objects.  Retur
204f0 6e 20 30 20 69 66 20 74 68 65 79 20 61 72 65 20  n 0 if they are 
20500 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20 0a 2a  identical and .*
20510 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  * non-zero if th
20520 65 79 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79  ey differ in any
20530 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61   way..**.** If a
20540 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66  ny subelement of
20550 20 70 42 20 68 61 73 20 45 78 70 72 2e 69 54 61   pB has Expr.iTa
20560 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69  ble==(-1) then i
20570 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20  t is allowed.** 
20580 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c  to compare equal
20590 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e   to an equivalen
205a0 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20  t element in pA 
205b0 77 69 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65  with Expr.iTable
205c0 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68  ==iTab..**.** Th
205d0 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
205e0 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
205f0 20 66 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20   for equivalent 
20600 45 78 70 72 4c 69 73 74 73 2e 20 20 54 68 65 0a  ExprLists.  The.
20610 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65 71 75 65  ** only conseque
20620 6e 63 65 20 77 69 6c 6c 20 62 65 20 64 69 73 61  nce will be disa
20630 62 6c 65 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f  bled optimizatio
20640 6e 73 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f  ns.  But this ro
20650 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e 65  utine.** must ne
20660 76 65 72 20 72 65 74 75 72 6e 20 30 20 69 66 20  ver return 0 if 
20670 74 68 65 20 74 77 6f 20 45 78 70 72 4c 69 73 74  the two ExprList
20680 20 6f 62 6a 65 63 74 73 20 61 72 65 20 64 69 66   objects are dif
20690 66 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20  ferent, or.** a 
206a0 6d 61 6c 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  malfunction will
206b0 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54   result..**.** T
206c0 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73  wo NULL pointers
206d0 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
206e0 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65 2e 20  to be the same. 
206f0 20 42 75 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e   But a NULL poin
20700 74 65 72 0a 2a 2a 20 61 6c 77 61 79 73 20 64 69  ter.** always di
20710 66 66 65 72 73 20 66 72 6f 6d 20 61 20 6e 6f 6e  ffers from a non
20720 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a  -NULL pointer..*
20730 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
20740 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 45 78 70  rListCompare(Exp
20750 72 4c 69 73 74 20 2a 70 41 2c 20 45 78 70 72 4c  rList *pA, ExprL
20760 69 73 74 20 2a 70 42 2c 20 69 6e 74 20 69 54 61  ist *pB, int iTa
20770 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  b){.  int i;.  i
20780 66 28 20 70 41 3d 3d 30 20 26 26 20 70 42 3d 3d  f( pA==0 && pB==
20790 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
207a0 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d  if( pA==0 || pB=
207b0 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
207c0 20 69 66 28 20 70 41 2d 3e 6e 45 78 70 72 21 3d   if( pA->nExpr!=
207d0 70 42 2d 3e 6e 45 78 70 72 20 29 20 72 65 74 75  pB->nExpr ) retu
207e0 72 6e 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  rn 1;.  for(i=0;
207f0 20 69 3c 70 41 2d 3e 6e 45 78 70 72 3b 20 69 2b   i<pA->nExpr; i+
20800 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
20810 78 70 72 41 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e  xprA = pA->a[i].
20820 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20  pExpr;.    Expr 
20830 2a 70 45 78 70 72 42 20 3d 20 70 42 2d 3e 61 5b  *pExprB = pB->a[
20840 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
20850 28 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  ( pA->a[i].sortO
20860 72 64 65 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73  rder!=pB->a[i].s
20870 6f 72 74 4f 72 64 65 72 20 29 20 72 65 74 75 72  ortOrder ) retur
20880 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  n 1;.    if( sql
20890 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
208a0 70 45 78 70 72 41 2c 20 70 45 78 70 72 42 2c 20  pExprA, pExprB, 
208b0 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 31  iTab) ) return 1
208c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
208d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
208e0 6e 20 74 72 75 65 20 69 66 20 77 65 20 63 61 6e  n true if we can
208f0 20 70 72 6f 76 65 20 74 68 65 20 70 45 32 20 77   prove the pE2 w
20900 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 74 72  ill always be tr
20910 75 65 20 69 66 20 70 45 31 20 69 73 0a 2a 2a 20  ue if pE1 is.** 
20920 74 72 75 65 2e 20 20 52 65 74 75 72 6e 20 66 61  true.  Return fa
20930 6c 73 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74  lse if we cannot
20940 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 70 72   complete the pr
20950 6f 6f 66 20 6f 72 20 69 66 20 70 45 32 20 6d 69  oof or if pE2 mi
20960 67 68 74 0a 2a 2a 20 62 65 20 66 61 6c 73 65 2e  ght.** be false.
20970 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a    Examples:.**.*
20980 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 3d 35 20  *     pE1: x==5 
20990 20 20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20        pE2: x==5 
209a0 20 20 20 20 20 20 20 20 20 20 20 20 52 65 73 75              Resu
209b0 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20  lt: true.**     
209c0 70 45 31 3a 20 78 3e 30 20 20 20 20 20 20 20 20  pE1: x>0        
209d0 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20  pE2: x==5       
209e0 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61        Result: fa
209f0 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  lse.**     pE1: 
20a00 78 3d 32 31 20 20 20 20 20 20 20 70 45 32 3a 20  x=21       pE2: 
20a10 78 3d 32 31 20 4f 52 20 79 3d 34 33 20 20 20 20  x=21 OR y=43    
20a20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a   Result: true.**
20a30 20 20 20 20 20 70 45 31 3a 20 78 21 3d 31 32 33       pE1: x!=123
20a40 20 20 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e       pE2: x IS N
20a50 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c  OT NULL    Resul
20a60 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70  t: true.**     p
20a70 45 31 3a 20 78 21 3d 3f 31 20 20 20 20 20 20 70  E1: x!=?1      p
20a80 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c  E2: x IS NOT NUL
20a90 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75  L    Result: tru
20aa0 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20  e.**     pE1: x 
20ab0 49 53 20 4e 55 4c 4c 20 20 70 45 32 3a 20 78 20  IS NULL  pE2: x 
20ac0 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52  IS NOT NULL    R
20ad0 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20  esult: false.** 
20ae0 20 20 20 20 70 45 31 3a 20 78 20 49 53 20 3f 32      pE1: x IS ?2
20af0 20 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f      pE2: x IS NO
20b00 54 20 4e 55 4c 4c 20 20 20 20 52 65 75 73 6c 74  T NULL    Reuslt
20b10 3a 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68  : false.**.** Wh
20b20 65 6e 20 63 6f 6d 70 61 72 69 6e 67 20 54 4b 5f  en comparing TK_
20b30 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 62 65 74  COLUMN nodes bet
20b40 77 65 65 6e 20 70 45 31 20 61 6e 64 20 70 45 32  ween pE1 and pE2
20b50 2c 20 69 66 20 70 45 32 20 68 61 73 0a 2a 2a 20  , if pE2 has.** 
20b60 45 78 70 72 2e 69 54 61 62 6c 65 3c 30 20 74 68  Expr.iTable<0 th
20b70 65 6e 20 61 73 73 75 6d 65 20 61 20 74 61 62 6c  en assume a tabl
20b80 65 20 6e 75 6d 62 65 72 20 67 69 76 65 6e 20 62  e number given b
20b90 79 20 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 57 68  y iTab..**.** Wh
20ba0 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74  en in doubt, ret
20bb0 75 72 6e 20 66 61 6c 73 65 2e 20 20 52 65 74 75  urn false.  Retu
20bc0 72 6e 69 6e 67 20 74 72 75 65 20 6d 69 67 68 74  rning true might
20bd0 20 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61   give a performa
20be0 6e 63 65 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d 65  nce.** improveme
20bf0 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 66  nt.  Returning f
20c00 61 6c 73 65 20 6d 69 67 68 74 20 63 61 75 73 65  alse might cause
20c10 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72   a performance r
20c20 65 64 75 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a  eduction, but.**
20c30 20 69 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20   it will always 
20c40 67 69 76 65 20 74 68 65 20 63 6f 72 72 65 63 74  give the correct
20c50 20 61 6e 73 77 65 72 20 61 6e 64 20 69 73 20 68   answer and is h
20c60 65 6e 63 65 20 61 6c 77 61 79 73 20 73 61 66 65  ence always safe
20c70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
20c80 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
20c90 45 78 70 72 20 2a 70 45 31 2c 20 45 78 70 72 20  Expr *pE1, Expr 
20ca0 2a 70 45 32 2c 20 69 6e 74 20 69 54 61 62 29 7b  *pE2, int iTab){
20cb0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
20cc0 70 72 43 6f 6d 70 61 72 65 28 70 45 31 2c 20 70  prCompare(pE1, p
20cd0 45 32 2c 20 69 54 61 62 29 3d 3d 30 20 29 7b 0a  E2, iTab)==0 ){.
20ce0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
20cf0 7d 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d  }.  if( pE2->op=
20d00 3d 54 4b 5f 4f 52 0a 20 20 20 26 26 20 28 73 71  =TK_OR.   && (sq
20d10 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
20d20 45 78 70 72 28 70 45 31 2c 20 70 45 32 2d 3e 70  Expr(pE1, pE2->p
20d30 4c 65 66 74 2c 20 69 54 61 62 29 0a 20 20 20 20  Left, iTab).    
20d40 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
20d50 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78  te3ExprImpliesEx
20d60 70 72 28 70 45 31 2c 20 70 45 32 2d 3e 70 52 69  pr(pE1, pE2->pRi
20d70 67 68 74 2c 20 69 54 61 62 29 20 29 0a 20 20 29  ght, iTab) ).  )
20d80 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
20d90 20 20 7d 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f    }.  if( pE2->o
20da0 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20  p==TK_NOTNULL.  
20db0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
20dc0 6f 6d 70 61 72 65 28 70 45 31 2d 3e 70 4c 65 66  ompare(pE1->pLef
20dd0 74 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69  t, pE2->pLeft, i
20de0 54 61 62 29 3d 3d 30 0a 20 20 20 26 26 20 28 70  Tab)==0.   && (p
20df0 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c  E1->op!=TK_ISNUL
20e00 4c 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b  L && pE1->op!=TK
20e10 5f 49 53 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  _IS).  ){.    re
20e20 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
20e30 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
20e40 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
20e50 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
20e60 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20  ructure is used 
20e70 62 79 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b  by the tree walk
20e80 65 72 0a 2a 2a 20 74 6f 20 63 6f 75 6e 74 20 72  er.** to count r
20e90 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62  eferences to tab
20ea0 6c 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  le columns in th
20eb0 65 20 61 72 67 75 6d 65 6e 74 73 20 6f 66 20 61  e arguments of a
20ec0 6e 20 0a 2a 2a 20 61 67 67 72 65 67 61 74 65 20  n .** aggregate 
20ed0 66 75 6e 63 74 69 6f 6e 2c 20 69 6e 20 6f 72 64  function, in ord
20ee0 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  er to implement 
20ef0 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 75  the.** sqlite3Fu
20f00 6e 63 74 69 6f 6e 54 68 69 73 53 72 63 28 29 20  nctionThisSrc() 
20f10 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75  routine..*/.stru
20f20 63 74 20 53 72 63 43 6f 75 6e 74 20 7b 0a 20 20  ct SrcCount {.  
20f30 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20  SrcList *pSrc;  
20f40 20 2f 2a 20 4f 6e 65 20 70 61 72 74 69 63 75 6c   /* One particul
20f50 61 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  ar FROM clause i
20f60 6e 20 61 20 6e 65 73 74 65 64 20 71 75 65 72 79  n a nested query
20f70 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 68 69 73 3b   */.  int nThis;
20f80 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
20f90 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
20fa0 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 53 72  o columns in pSr
20fb0 63 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  cList */.  int n
20fc0 4f 74 68 65 72 3b 20 20 20 20 20 20 2f 2a 20 4e  Other;      /* N
20fd0 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
20fe0 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69  ces to columns i
20ff0 6e 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61  n other FROM cla
21000 75 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  uses */.};../*.*
21010 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
21020 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
21030 20 74 6f 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a   to columns..*/.
21040 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53  static int exprS
21050 72 63 43 6f 75 6e 74 28 57 61 6c 6b 65 72 20 2a  rcCount(Walker *
21060 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
21070 45 78 70 72 29 7b 0a 20 20 2f 2a 20 54 68 65 20  Expr){.  /* The 
21080 4e 45 56 45 52 28 29 20 6f 6e 20 74 68 65 20 73  NEVER() on the s
21090 65 63 6f 6e 64 20 74 65 72 6d 20 69 73 20 62 65  econd term is be
210a0 63 61 75 73 65 20 73 71 6c 69 74 65 33 46 75 6e  cause sqlite3Fun
210b0 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63  ctionUsesThisSrc
210c0 28 29 0a 20 20 2a 2a 20 69 73 20 61 6c 77 61 79  ().  ** is alway
210d0 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
210e0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
210f0 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20 61  zeAggregates() a
21100 6e 64 20 73 6f 20 74 68 65 0a 20 20 2a 2a 20 54  nd so the.  ** T
21110 4b 5f 43 4f 4c 55 4d 4e 73 20 68 61 76 65 20 6e  K_COLUMNs have n
21120 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 6e 76  ot yet been conv
21130 65 72 74 65 64 20 69 6e 74 6f 20 54 4b 5f 41 47  erted into TK_AG
21140 47 5f 43 4f 4c 55 4d 4e 2e 20 20 49 66 0a 20 20  G_COLUMN.  If.  
21150 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69  ** sqlite3Functi
21160 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 29 20  onUsesThisSrc() 
21170 69 73 20 75 73 65 64 20 64 69 66 66 65 72 65 6e  is used differen
21180 74 6c 79 20 69 6e 20 74 68 65 20 66 75 74 75 72  tly in the futur
21190 65 2c 20 74 68 65 0a 20 20 2a 2a 20 4e 45 56 45  e, the.  ** NEVE
211a0 52 28 29 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  R() will need to
211b0 20 62 65 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a   be removed. */.
211c0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
211d0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 4e 45  =TK_COLUMN || NE
211e0 56 45 52 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  VER(pExpr->op==T
211f0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 29 7b  K_AGG_COLUMN) ){
21200 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
21210 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20  struct SrcCount 
21220 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  *p = pWalker->u.
21230 70 53 72 63 43 6f 75 6e 74 3b 0a 20 20 20 20 53  pSrcCount;.    S
21240 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70  rcList *pSrc = p
21250 2d 3e 70 53 72 63 3b 0a 20 20 20 20 66 6f 72 28  ->pSrc;.    for(
21260 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72  i=0; i<pSrc->nSr
21270 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  c; i++){.      i
21280 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
21290 3d 3d 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75  ==pSrc->a[i].iCu
212a0 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  rsor ) break;.  
212b0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 70 53    }.    if( i<pS
212c0 72 63 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20  rc->nSrc ){.    
212d0 20 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20    p->nThis++;.  
212e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
212f0 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20 20 20  ->nOther++;.    
21300 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  }.  }.  return W
21310 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
21320 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
21330 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 61 72  if any of the ar
21340 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 70  guments to the p
21350 45 78 70 72 20 46 75 6e 63 74 69 6f 6e 20 72 65  Expr Function re
21360 66 65 72 65 6e 63 65 0a 2a 2a 20 70 53 72 63 4c  ference.** pSrcL
21370 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75  ist.  Return tru
21380 65 20 69 66 20 74 68 65 79 20 64 6f 2e 20 20 41  e if they do.  A
21390 6c 73 6f 20 72 65 74 75 72 6e 20 74 72 75 65 20  lso return true 
213a0 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a  if the function.
213b0 2a 2a 20 68 61 73 20 6e 6f 20 61 72 67 75 6d 65  ** has no argume
213c0 6e 74 73 20 6f 72 20 68 61 73 20 6f 6e 6c 79 20  nts or has only 
213d0 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e  constant argumen
213e0 74 73 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73  ts.  Return fals
213f0 65 20 69 66 20 70 45 78 70 72 0a 2a 2a 20 72 65  e if pExpr.** re
21400 66 65 72 65 6e 63 65 73 20 63 6f 6c 75 6d 6e 73  ferences columns
21410 20 62 75 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73   but not columns
21420 20 6f 66 20 74 61 62 6c 65 73 20 66 6f 75 6e 64   of tables found
21430 20 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2f   in pSrcList..*/
21440 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 75 6e 63  .int sqlite3Func
21450 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28  tionUsesThisSrc(
21460 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53 72 63  Expr *pExpr, Src
21470 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 29 7b  List *pSrcList){
21480 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73  .  Walker w;.  s
21490 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 63  truct SrcCount c
214a0 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  nt;.  assert( pE
214b0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
214c0 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 6d 65  FUNCTION );.  me
214d0 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
214e0 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70  of(w));.  w.xExp
214f0 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
21500 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77 2e 75 2e  SrcCount;.  w.u.
21510 70 53 72 63 43 6f 75 6e 74 20 3d 20 26 63 6e 74  pSrcCount = &cnt
21520 3b 0a 20 20 63 6e 74 2e 70 53 72 63 20 3d 20 70  ;.  cnt.pSrc = p
21530 53 72 63 4c 69 73 74 3b 0a 20 20 63 6e 74 2e 6e  SrcList;.  cnt.n
21540 54 68 69 73 20 3d 20 30 3b 0a 20 20 63 6e 74 2e  This = 0;.  cnt.
21550 6e 4f 74 68 65 72 20 3d 20 30 3b 0a 20 20 73 71  nOther = 0;.  sq
21560 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73  lite3WalkExprLis
21570 74 28 26 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70  t(&w, pExpr->x.p
21580 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  List);.  return 
21590 63 6e 74 2e 6e 54 68 69 73 3e 30 20 7c 7c 20 63  cnt.nThis>0 || c
215a0 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a  nt.nOther==0;.}.
215b0 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
215c0 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
215d0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
215e0 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
215f0 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20  the index of.** 
21600 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e  the new element.
21610 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74    Return a negat
21620 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61  ive number if ma
21630 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  lloc fails..*/.s
21640 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67  tatic int addAgg
21650 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74  InfoColumn(sqlit
21660 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20  e3 *db, AggInfo 
21670 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69  *pInfo){.  int i
21680 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20  ;.  pInfo->aCol 
21690 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
216a0 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64  locate(.       d
216b0 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d  b,.       pInfo-
216c0 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69  >aCol,.       si
216d0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c  zeof(pInfo->aCol
216e0 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49  [0]),.       &pI
216f0 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20  nfo->nColumn,.  
21700 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72       &i.  );.  r
21710 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a  eturn i;.}    ..
21720 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
21730 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70  element to the p
21740 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
21750 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
21760 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20  the index of.** 
21770 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e  the new element.
21780 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74    Return a negat
21790 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61  ive number if ma
217a0 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  lloc fails..*/.s
217b0 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67  tatic int addAgg
217c0 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74 65 33  InfoFunc(sqlite3
217d0 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70   *db, AggInfo *p
217e0 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Info){.  int i;.
217f0 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d    pInfo->aFunc =
21800 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c   sqlite3ArrayAll
21810 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62  ocate(.       db
21820 2c 20 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d  , .       pInfo-
21830 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 73  >aFunc,.       s
21840 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75  izeof(pInfo->aFu
21850 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26  nc[0]),.       &
21860 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20  pInfo->nFunc,.  
21870 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72       &i.  );.  r
21880 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a  eturn i;.}    ..
21890 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
218a0 65 20 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  e xExprCallback 
218b0 66 6f 72 20 61 20 74 72 65 65 20 77 61 6c 6b 65  for a tree walke
218c0 72 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 74  r.  It is used t
218d0 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73  o.** implement s
218e0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
218f0 65 41 67 67 72 65 67 61 74 65 73 28 29 2e 20 20  eAggregates().  
21900 53 65 65 20 73 71 6c 69 74 65 33 45 78 70 72 41  See sqlite3ExprA
21910 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
21920 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .** for addition
21930 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
21940 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e  */.static int an
21950 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28 57  alyzeAggregate(W
21960 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
21970 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
21980 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
21990 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c  text *pNC = pWal
219a0 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61  ker->u.pNC;.  Pa
219b0 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e  rse *pParse = pN
219c0 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72 63  C->pParse;.  Src
219d0 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d  List *pSrcList =
219e0 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a   pNC->pSrcList;.
219f0 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49    AggInfo *pAggI
21a00 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49  nfo = pNC->pAggI
21a10 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  nfo;..  switch( 
21a20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
21a30 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
21a40 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UMN:.    case TK
21a50 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
21a60 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
21a70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
21a80 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  UMN );.      tes
21a90 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
21aa0 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
21ab0 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
21ac0 20 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75   see if the colu
21ad0 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20  mn is in one of 
21ae0 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68  the tables in th
21af0 65 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20  e FROM.      ** 
21b00 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67  clause of the ag
21b10 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f  gregate query */
21b20 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
21b30 53 28 70 53 72 63 4c 69 73 74 21 3d 30 29 20 29  S(pSrcList!=0) )
21b40 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
21b50 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
21b60 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d  Item = pSrcList-
21b70 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  >a;.        for(
21b80 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d  i=0; i<pSrcList-
21b90 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
21ba0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
21bb0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
21bc0 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20  ol *pCol;.      
21bd0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
21be0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
21bf0 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
21c00 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
21c10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
21c20 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74  xpr->iTable==pIt
21c30 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20  em->iCursor ){. 
21c40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
21c50 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
21c60 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74  oint, it means t
21c70 68 61 74 20 70 45 78 70 72 20 72 65 66 65 72 73  hat pExpr refers
21c80 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20   to a table.    
21c90 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
21ca0 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  is in the FROM c
21cb0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67  lause of the agg
21cc0 72 65 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a  regate query.  .
21cd0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20              **. 
21ce0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61             ** Ma
21cf0 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  ke an entry for 
21d00 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41  the column in pA
21d10 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69  ggInfo->aCol[] i
21d20 66 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20  f there.        
21d30 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e      ** is not an
21d40 20 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72   entry there alr
21d50 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20  eady..          
21d60 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
21d70 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20   int k;.        
21d80 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49      pCol = pAggI
21d90 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  nfo->aCol;.     
21da0 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20         for(k=0; 
21db0 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  k<pAggInfo->nCol
21dc0 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b  umn; k++, pCol++
21dd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
21de0 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c   if( pCol->iTabl
21df0 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e==pExpr->iTable
21e00 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
21e10 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c        pCol->iCol
21e20 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn==pExpr->iCol
21e30 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
21e40 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
21e50 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
21e60 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
21e70 20 20 20 20 20 20 20 20 69 66 28 20 28 6b 3e 3d          if( (k>=
21e80 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
21e90 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n).             
21ea0 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e  && (k = addAggIn
21eb0 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d  foColumn(pParse-
21ec0 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e  >db, pAggInfo))>
21ed0 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0 .            
21ee0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
21ef0 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66   pCol = &pAggInf
21f00 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20  o->aCol[k];.    
21f10 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
21f20 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54  pTab = pExpr->pT
21f30 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab;.            
21f40 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d    pCol->iTable =
21f50 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
21f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
21f70 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45  ol->iColumn = pE
21f80 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
21f90 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
21fa0 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  ->iMem = ++pPars
21fb0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
21fc0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
21fd0 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  rterColumn = -1;
21fe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
21ff0 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  Col->pExpr = pEx
22000 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
22010 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e    if( pAggInfo->
22020 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
22030 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
22040 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  j, n;.          
22050 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
22060 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  pGB = pAggInfo->
22070 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  pGroupBy;.      
22080 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
22090 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
220a0 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a  pTerm = pGB->a;.
220b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220c0 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a  n = pGB->nExpr;.
220d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220e0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b  for(j=0; j<n; j+
220f0 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
22100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
22110 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d  xpr *pE = pTerm-
22120 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
22130 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
22140 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
22150 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70  && pE->iTable==p
22160 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a  Expr->iTable &&.
22170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22180 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d        pE->iColum
22190 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n==pExpr->iColum
221a0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
221b0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
221c0 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a  SorterColumn = j
221d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
221e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
221f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
22200 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22210 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
22220 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
22230 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74   if( pCol->iSort
22240 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  erColumn<0 ){.  
22250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
22260 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
22270 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53  n = pAggInfo->nS
22280 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a  ortingColumn++;.
22290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
222a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
222b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
222c0 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74  re is now an ent
222d0 72 79 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20  ry for pExpr in 
222e0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
222f0 20 28 65 69 74 68 65 72 0a 20 20 20 20 20 20 20   (either.       
22300 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20       ** because 
22310 69 74 20 77 61 73 20 74 68 65 72 65 20 62 65 66  it was there bef
22320 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65 20 77  ore or because w
22330 65 20 6a 75 73 74 20 63 72 65 61 74 65 64 20 69  e just created i
22340 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  t)..            
22350 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70  ** Convert the p
22360 45 78 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f  Expr to be a TK_
22370 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72  AGG_COLUMN refer
22380 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20  ring to that.   
22390 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67           ** pAgg
223a0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74  Info->aCol[] ent
223b0 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry..            
223c0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  */.            E
223d0 78 70 72 53 65 74 49 72 72 65 64 75 63 69 62 6c  xprSetIrreducibl
223e0 65 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  e(pExpr);.      
223f0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67        pExpr->pAg
22400 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f  gInfo = pAggInfo
22410 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
22420 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47  xpr->op = TK_AGG
22430 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20  _COLUMN;.       
22440 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
22450 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20 20 20   = (i16)k;.     
22460 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
22470 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64          } /* end
22480 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  if pExpr->iTable
22490 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ==pItem->iCursor
224a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a   */.        } /*
224b0 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70   end loop over p
224c0 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20  SrcList */.     
224d0 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
224e0 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d  WRC_Prune;.    }
224f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
22500 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
22510 20 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46     if( (pNC->ncF
22520 6c 61 67 73 20 26 20 4e 43 5f 49 6e 41 67 67 46  lags & NC_InAggF
22530 75 6e 63 29 3d 3d 30 0a 20 20 20 20 20 20 20 26  unc)==0.       &
22540 26 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65  & pWalker->walke
22550 72 44 65 70 74 68 3d 3d 70 45 78 70 72 2d 3e 6f  rDepth==pExpr->o
22560 70 32 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  p2.      ){.    
22570 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
22580 73 65 65 20 69 66 20 70 45 78 70 72 20 69 73 20  see if pExpr is 
22590 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61  a duplicate of a
225a0 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61 74 65  nother aggregate
225b0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e   .        ** fun
225c0 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6c  ction that is al
225d0 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 41 67  ready in the pAg
225e0 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  gInfo structure.
225f0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
22600 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
22610 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20  o_func *pItem = 
22620 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
22630 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
22640 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
22650 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  unc; i++, pItem+
22660 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
22670 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
22680 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70  pare(pItem->pExp
22690 72 2c 20 70 45 78 70 72 2c 20 2d 31 29 3d 3d 30  r, pExpr, -1)==0
226a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
226b0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
226c0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
226d0 20 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67       if( i>=pAgg
226e0 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20  Info->nFunc ){. 
226f0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70           /* pExp
22700 72 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20  r is original.  
22710 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79  Make a new entry
22720 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46   in pAggInfo->aF
22730 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20  unc[].          
22740 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  */.          u8 
22750 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65  enc = ENC(pParse
22760 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  ->db);.         
22770 20 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46   i = addAggInfoF
22780 75 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  unc(pParse->db, 
22790 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  pAggInfo);.     
227a0 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b       if( i>=0 ){
227b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
227c0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
227d0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
227e0 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
227f0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 20            pItem 
22800 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  = &pAggInfo->aFu
22810 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  nc[i];.         
22820 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
22830 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
22840 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d       pItem->iMem
22850 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
22860 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  m;.            a
22870 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
22880 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
22890 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
228a0 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
228b0 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65  ->pFunc = sqlite
228c0 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50  3FindFunction(pP
228d0 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20  arse->db,.      
228e0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
228f0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 73 71  pr->u.zToken, sq
22900 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 45  lite3Strlen30(pE
22910 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2c 0a  xpr->u.zToken),.
22920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22930 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73     pExpr->x.pLis
22940 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t ? pExpr->x.pLi
22950 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65  st->nExpr : 0, e
22960 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nc, 0);.        
22970 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66      if( pExpr->f
22980 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
22990 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ct ){.          
229a0 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74      pItem->iDist
229b0 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  inct = pParse->n
229c0 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Tab++;.         
229d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
229e0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
229f0 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20  Distinct = -1;. 
22a00 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
22a10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22a20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61   }.        /* Ma
22a30 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74  ke pExpr point t
22a40 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  o the appropriat
22a50 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  e pAggInfo->aFun
22a60 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20  c[] entry.      
22a70 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
22a80 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
22a90 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
22aa0 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
22ab0 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20  uced) );.       
22ac0 20 45 78 70 72 53 65 74 49 72 72 65 64 75 63 69   ExprSetIrreduci
22ad0 62 6c 65 28 70 45 78 70 72 29 3b 0a 20 20 20 20  ble(pExpr);.    
22ae0 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
22af0 3d 20 28 69 31 36 29 69 3b 0a 20 20 20 20 20 20  = (i16)i;.      
22b00 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66    pExpr->pAggInf
22b10 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20  o = pAggInfo;.  
22b20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
22b30 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 65  _Prune;.      }e
22b40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74  lse{.        ret
22b50 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
22b60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
22b70 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43    }.  return WRC
22b80 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61  _Continue;.}.sta
22b90 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41  tic int analyzeA
22ba0 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63  ggregatesInSelec
22bb0 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  t(Walker *pWalke
22bc0 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  r, Select *pSele
22bd0 63 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ct){.  UNUSED_PA
22be0 52 41 4d 45 54 45 52 28 70 57 61 6c 6b 65 72 29  RAMETER(pWalker)
22bf0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
22c00 45 54 45 52 28 70 53 65 6c 65 63 74 29 3b 0a 20  ETER(pSelect);. 
22c10 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
22c20 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  inue;.}../*.** A
22c30 6e 61 6c 79 7a 65 20 74 68 65 20 70 45 78 70 72  nalyze the pExpr
22c40 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b   expression look
22c50 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74  ing for aggregat
22c60 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a  e functions and.
22c70 2a 2a 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73  ** for variables
22c80 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
22c90 20 61 64 64 65 64 20 74 6f 20 41 67 67 49 6e 66   added to AggInf
22ca0 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 20 70 4e  o object that pN
22cb0 43 2d 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70  C->pAggInfo.** p
22cc0 6f 69 6e 74 73 20 74 6f 2e 20 20 41 64 64 69 74  oints to.  Addit
22cd0 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 61 72  ional entries ar
22ce0 65 20 6d 61 64 65 20 6f 6e 20 74 68 65 20 41 67  e made on the Ag
22cf0 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a  gInfo object as.
22d00 2a 2a 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  ** necessary..**
22d10 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
22d20 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
22d30 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65  called after the
22d40 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
22d50 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64  been.** analyzed
22d60 20 62 79 20 73 71 6c 69 74 65 33 52 65 73 6f 6c   by sqlite3Resol
22d70 76 65 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a  veExprNames()..*
22d80 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
22d90 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
22da0 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20  tes(NameContext 
22db0 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70  *pNC, Expr *pExp
22dc0 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  r){.  Walker w;.
22dd0 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
22de0 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e  sizeof(w));.  w.
22df0 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
22e00 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
22e10 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
22e20 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41  lback = analyzeA
22e30 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63  ggregatesInSelec
22e40 74 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70  t;.  w.u.pNC = p
22e50 4e 43 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e  NC;.  assert( pN
22e60 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30 20 29  C->pSrcList!=0 )
22e70 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
22e80 78 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a  xpr(&w, pExpr);.
22e90 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71  }../*.** Call sq
22ea0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
22eb0 41 67 67 72 65 67 61 74 65 73 28 29 20 66 6f 72  Aggregates() for
22ec0 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
22ed0 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65  n in an.** expre
22ee0 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74  ssion list.  Ret
22ef0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
22f00 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20  f errors..**.** 
22f10 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 66  If an error is f
22f20 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79 73  ound, the analys
22f30 69 73 20 69 73 20 63 75 74 20 73 68 6f 72 74 2e  is is cut short.
22f40 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
22f50 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
22f60 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  st(NameContext *
22f70 70 4e 43 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  pNC, ExprList *p
22f80 4c 69 73 74 29 7b 0a 20 20 73 74 72 75 63 74 20  List){.  struct 
22f90 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
22fa0 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
22fb0 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
22fc0 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
22fd0 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69  t->a, i=0; i<pLi
22fe0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  st->nExpr; i++, 
22ff0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
23000 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
23010 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 4e 43  zeAggregates(pNC
23020 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
23030 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
23040 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 73  .** Allocate a s
23050 69 6e 67 6c 65 20 6e 65 77 20 72 65 67 69 73 74  ingle new regist
23060 65 72 20 66 6f 72 20 75 73 65 20 74 6f 20 68 6f  er for use to ho
23070 6c 64 20 73 6f 6d 65 20 69 6e 74 65 72 6d 65 64  ld some intermed
23080 69 61 74 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a  iate result..*/.
23090 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65  int sqlite3GetTe
230a0 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70 50 61  mpReg(Parse *pPa
230b0 72 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72  rse){.  if( pPar
230c0 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20  se->nTempReg==0 
230d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 2b  ){.    return ++
230e0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
230f0 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73  }.  return pPars
23100 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50  e->aTempReg[--pP
23110 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b  arse->nTempReg];
23120 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f  .}../*.** Deallo
23130 63 61 74 65 20 61 20 72 65 67 69 73 74 65 72 2c  cate a register,
23140 20 6d 61 6b 69 6e 67 20 61 76 61 69 6c 61 62 6c   making availabl
23150 65 20 66 6f 72 20 72 65 75 73 65 20 66 6f 72 20  e for reuse for 
23160 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 75  some other.** pu
23170 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rpose..**.** If 
23180 61 20 72 65 67 69 73 74 65 72 20 69 73 20 63 75  a register is cu
23190 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 75 73  rrently being us
231a0 65 64 20 62 79 20 74 68 65 20 63 6f 6c 75 6d 6e  ed by the column
231b0 20 63 61 63 68 65 2c 20 74 68 65 6e 0a 2a 2a 20   cache, then.** 
231c0 74 68 65 20 64 61 6c 6c 6f 63 61 74 69 6f 6e 20  the dallocation 
231d0 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
231e0 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  l the column cac
231f0 68 65 20 6c 69 6e 65 20 74 68 61 74 20 75 73 65  he line that use
23200 73 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65  s.** the registe
23210 72 20 62 65 63 6f 6d 65 73 20 73 74 61 6c 65 2e  r becomes stale.
23220 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23230 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 50  ReleaseTempReg(P
23240 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
23250 74 20 69 52 65 67 29 7b 0a 20 20 69 66 28 20 69  t iReg){.  if( i
23260 52 65 67 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  Reg && pParse->n
23270 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a  TempReg<ArraySiz
23280 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  e(pParse->aTempR
23290 65 67 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  eg) ){.    int i
232a0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 79 43 6f  ;.    struct yCo
232b0 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 20 20 66  lCache *p;.    f
232c0 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
232d0 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
232e0 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
232f0 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
23300 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d     if( p->iReg==
23310 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20  iReg ){.        
23320 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 31 3b 0a  p->tempReg = 1;.
23330 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
23340 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
23350 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52    pParse->aTempR
23360 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  eg[pParse->nTemp
23370 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20  Reg++] = iReg;. 
23380 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
23390 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61  cate or dealloca
233a0 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52  te a block of nR
233b0 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72  eg consecutive r
233c0 65 67 69 73 74 65 72 73 0a 2a 2f 0a 69 6e 74 20  egisters.*/.int 
233d0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
233e0 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
233f0 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  e, int nReg){.  
23400 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 20 3d 20  int i, n;.  i = 
23410 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
23420 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d  g;.  n = pParse-
23430 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20 69 66  >nRangeReg;.  if
23440 28 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20  ( nReg<=n ){.   
23450 20 61 73 73 65 72 74 28 20 21 75 73 65 64 41 73   assert( !usedAs
23460 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72  ColumnCache(pPar
23470 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29 3b  se, i, i+n-1) );
23480 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61  .    pParse->iRa
23490 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a  ngeReg += nReg;.
234a0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e      pParse->nRan
234b0 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20  geReg -= nReg;. 
234c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20   }else{.    i = 
234d0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
234e0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
234f0 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20   += nReg;.  }.  
23500 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64  return i;.}.void
23510 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
23520 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a  empRange(Parse *
23530 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
23540 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 73  , int nReg){.  s
23550 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52  qlite3ExprCacheR
23560 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 52  emove(pParse, iR
23570 65 67 2c 20 6e 52 65 67 29 3b 0a 20 20 69 66 28  eg, nReg);.  if(
23580 20 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52   nReg>pParse->nR
23590 61 6e 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70  angeReg ){.    p
235a0 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
235b0 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61   = nReg;.    pPa
235c0 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d  rse->iRangeReg =
235d0 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   iReg;.  }.}../*
235e0 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d  .** Mark all tem
235f0 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73  porary registers
23600 20 61 73 20 62 65 69 6e 67 20 75 6e 61 76 61 69   as being unavai
23610 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 2e  lable for reuse.
23620 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23630 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68  ClearTempRegCach
23640 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
23650 7b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d  {.  pParse->nTem
23660 70 52 65 67 20 3d 20 30 3b 0a 20 20 70 50 61 72  pReg = 0;.  pPar
23670 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20  se->nRangeReg = 
23680 30 3b 0a 7d 0a                                   0;.}.