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

Artifact f4c7d2040f2125986102deefe801cbdb36abff49:


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 69 66 28 20 7a 43 20 29 7b 0a 20 20 20 20    if( zC ){.    
0a40: 54 6f 6b 65 6e 20 73 3b 0a 20 20 20 20 73 2e 7a  Token s;.    s.z
0a50: 20 3d 20 7a 43 3b 0a 20 20 20 20 73 2e 6e 20 3d   = zC;.    s.n =
0a60: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
0a70: 28 73 2e 7a 29 3b 0a 20 20 20 20 70 45 78 70 72  (s.z);.    pExpr
0a80: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 64   = sqlite3ExprAd
0a90: 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50  dCollateToken(pP
0aa0: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 73 29  arse, pExpr, &s)
0ab0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
0ac0: 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  Expr;.}../*.** S
0ad0: 6b 69 70 20 6f 76 65 72 20 61 6e 79 20 54 4b 5f  kip over any TK_
0ae0: 43 4f 4c 4c 41 54 45 20 61 6e 64 2f 6f 72 20 54  COLLATE and/or T
0af0: 4b 5f 41 53 20 6f 70 65 72 61 74 6f 72 73 20 61  K_AS operators a
0b00: 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 0a 2a 2a  t the root of.**
0b10: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a   an expression..
0b20: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
0b30: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
0b40: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
0b50: 77 68 69 6c 65 28 20 70 45 78 70 72 20 26 26 20  while( pExpr && 
0b60: 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43  (pExpr->op==TK_C
0b70: 4f 4c 4c 41 54 45 20 7c 7c 20 70 45 78 70 72 2d  OLLATE || pExpr-
0b80: 3e 6f 70 3d 3d 54 4b 5f 41 53 29 20 29 7b 0a 20  >op==TK_AS) ){. 
0b90: 20 20 20 70 45 78 70 72 20 3d 20 70 45 78 70 72     pExpr = pExpr
0ba0: 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20 72  ->pLeft;.  }.  r
0bb0: 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a  eturn pExpr;.}..
0bc0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
0bd0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
0be0: 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70 72  nce for the expr
0bf0: 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49 66  ession pExpr. If
0c00: 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20  .** there is no 
0c10: 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e  defined collatin
0c20: 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74 75  g sequence, retu
0c30: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  rn NULL..**.** T
0c40: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
0c50: 75 65 6e 63 65 20 6d 69 67 68 74 20 62 65 20 64  uence might be d
0c60: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 61 20 43  etermined by a C
0c70: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 0a  OLLATE operator.
0c80: 2a 2a 20 6f 72 20 62 79 20 74 68 65 20 70 72 65  ** or by the pre
0c90: 73 65 6e 63 65 20 6f 66 20 61 20 63 6f 6c 75 6d  sence of a colum
0ca0: 6e 20 77 69 74 68 20 61 20 64 65 66 69 6e 65 64  n with a defined
0cb0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
0cc0: 6e 63 65 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45 20  nce..** COLLATE 
0cd0: 6f 70 65 72 61 74 6f 72 73 20 74 61 6b 65 20 66  operators take f
0ce0: 69 72 73 74 20 70 72 65 63 65 64 65 6e 63 65 2e  irst precedence.
0cf0: 20 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 73 20    Left operands 
0d00: 74 61 6b 65 0a 2a 2a 20 70 72 65 63 65 64 65 6e  take.** preceden
0d10: 63 65 20 6f 76 65 72 20 72 69 67 68 74 20 6f 70  ce over right op
0d20: 65 72 61 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c 53  erands..*/.CollS
0d30: 65 71 20 2a 73 71 6c 69 74 65 33 45 78 70 72 43  eq *sqlite3ExprC
0d40: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
0d50: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
0d60: 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  r){.  sqlite3 *d
0d70: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
0d80: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
0d90: 20 3d 20 30 3b 0a 20 20 45 78 70 72 20 2a 70 20   = 0;.  Expr *p 
0da0: 3d 20 70 45 78 70 72 3b 0a 20 20 77 68 69 6c 65  = pExpr;.  while
0db0: 28 20 70 20 26 26 20 70 43 6f 6c 6c 3d 3d 30 20  ( p && pColl==0 
0dc0: 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  ){.    int op = 
0dd0: 70 2d 3e 6f 70 3b 0a 20 20 20 20 69 66 28 20 6f  p->op;.    if( o
0de0: 70 3d 3d 54 4b 5f 43 41 53 54 20 7c 7c 20 6f 70  p==TK_CAST || op
0df0: 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 7b 0a 20 20  ==TK_UPLUS ){.  
0e00: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74      p = p->pLeft
0e10: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
0e20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
0e30: 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 7c  op==TK_COLLATE |
0e40: 7c 20 28 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  | (op==TK_REGIST
0e50: 45 52 20 26 26 20 70 2d 3e 6f 70 32 3d 3d 54 4b  ER && p->op2==TK
0e60: 5f 43 4f 4c 4c 41 54 45 29 20 29 7b 0a 20 20 20  _COLLATE) ){.   
0e70: 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e     if( db->init.
0e80: 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20  busy ){.        
0e90: 2f 2a 20 44 6f 20 6e 6f 74 20 72 65 70 6f 72 74  /* Do not report
0ea0: 20 65 72 72 6f 72 73 20 77 68 65 6e 20 70 61 72   errors when par
0eb0: 73 69 6e 67 20 77 68 69 6c 65 20 74 68 65 20 73  sing while the s
0ec0: 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 20 20 20  chema */.       
0ed0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
0ee0: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
0ef0: 45 4e 43 28 64 62 29 2c 20 70 2d 3e 75 2e 7a 54  ENC(db), p->u.zT
0f00: 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  oken, 0);.      
0f10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
0f20: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65  Coll = sqlite3Ge
0f30: 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
0f40: 20 45 4e 43 28 64 62 29 2c 20 30 2c 20 70 2d 3e   ENC(db), 0, p->
0f50: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
0f60: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
0f70: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
0f80: 3e 70 54 61 62 21 3d 30 0a 20 20 20 20 20 26 26  >pTab!=0.     &&
0f90: 20 28 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c   (op==TK_AGG_COL
0fa0: 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f  UMN || op==TK_CO
0fb0: 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20 20 20 7c  LUMN.          |
0fc0: 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  | op==TK_REGISTE
0fd0: 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 54 52 49 47  R || op==TK_TRIG
0fe0: 47 45 52 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  GER).    ){.    
0ff0: 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47 49    /* op==TK_REGI
1000: 53 54 45 52 20 26 26 20 70 2d 3e 70 54 61 62 21  STER && p->pTab!
1010: 3d 30 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  =0 happens when 
1020: 70 45 78 70 72 20 77 61 73 20 6f 72 69 67 69 6e  pExpr was origin
1030: 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 61 20  ally.      ** a 
1040: 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74 20 77 61  TK_COLUMN but wa
1050: 73 20 70 72 65 76 69 6f 75 73 6c 79 20 65 76 61  s previously eva
1060: 6c 75 61 74 65 64 20 61 6e 64 20 63 61 63 68 65  luated and cache
1070: 64 20 69 6e 20 61 20 72 65 67 69 73 74 65 72 20  d in a register 
1080: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d  */.      int j =
1090: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20   p->iColumn;.   
10a0: 20 20 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20     if( j>=0 ){. 
10b0: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
10c0: 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 2d 3e 70 54  r *zColl = p->pT
10d0: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c  ab->aCol[j].zCol
10e0: 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  l;.        pColl
10f0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
1100: 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62  llSeq(db, ENC(db
1110: 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20  ), zColl, 0);.  
1120: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
1130: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
1140: 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43   p->flags & EP_C
1150: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
1160: 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 26 26 20  if( p->pLeft && 
1170: 28 70 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73  (p->pLeft->flags
1180: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21 3d   & EP_Collate)!=
1190: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 20 3d  0 ){.        p =
11a0: 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20   p->pLeft;.     
11b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11c0: 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20  p = p->pRight;. 
11d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
11e0: 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
11f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 73     }.  }.  if( s
1200: 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53  qlite3CheckCollS
1210: 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c  eq(pParse, pColl
1220: 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c 6c 20  ) ){ .    pColl 
1230: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1240: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pColl;.}../*.*
1250: 2a 20 70 45 78 70 72 20 69 73 20 61 6e 20 6f 70  * pExpr is an op
1260: 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61  erand of a compa
1270: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20  rison operator. 
1280: 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a 2a 20   aff2 is the.** 
1290: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66  type affinity of
12a0: 20 74 68 65 20 6f 74 68 65 72 20 6f 70 65 72 61   the other opera
12b0: 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  nd.  This routin
12c0: 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  e returns the.**
12d0: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
12e0: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
12f0: 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61  ed for the compa
1300: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a  rison operator..
1310: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 43  */.char sqlite3C
1320: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 45  ompareAffinity(E
1330: 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72  xpr *pExpr, char
1340: 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72 20 61   aff2){.  char a
1350: 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ff1 = sqlite3Exp
1360: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  rAffinity(pExpr)
1370: 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26 26 20  ;.  if( aff1 && 
1380: 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42  aff2 ){.    /* B
1390: 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74 68 65  oth sides of the
13a0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20   comparison are 
13b0: 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20  columns. If one 
13c0: 68 61 73 20 6e 75 6d 65 72 69 63 0a 20 20 20 20  has numeric.    
13d0: 2a 2a 20 61 66 66 69 6e 69 74 79 2c 20 75 73 65  ** affinity, use
13e0: 20 74 68 61 74 2e 20 4f 74 68 65 72 77 69 73 65   that. Otherwise
13f0: 20 75 73 65 20 6e 6f 20 61 66 66 69 6e 69 74 79   use no affinity
1400: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1410: 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69   sqlite3IsNumeri
1420: 63 41 66 66 69 6e 69 74 79 28 61 66 66 31 29 20  cAffinity(aff1) 
1430: 7c 7c 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65  || sqlite3IsNume
1440: 72 69 63 41 66 66 69 6e 69 74 79 28 61 66 66 32  ricAffinity(aff2
1450: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
1460: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  n SQLITE_AFF_NUM
1470: 45 52 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ERIC;.    }else{
1480: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1490: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
14a0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
14b0: 20 21 61 66 66 31 20 26 26 20 21 61 66 66 32 20   !aff1 && !aff2 
14c0: 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68 65  ){.    /* Neithe
14d0: 72 20 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f  r side of the co
14e0: 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20 63 6f  mparison is a co
14f0: 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61 72 65 20 74  lumn.  Compare t
1500: 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74  he.    ** result
1510: 73 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 20 20  s directly..    
1520: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
1530: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
1540: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f   }else{.    /* O
1550: 6e 65 20 73 69 64 65 20 69 73 20 61 20 63 6f 6c  ne side is a col
1560: 75 6d 6e 2c 20 74 68 65 20 6f 74 68 65 72 20 69  umn, the other i
1570: 73 20 6e 6f 74 2e 20 55 73 65 20 74 68 65 20 63  s not. Use the c
1580: 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 2e  olumns affinity.
1590: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
15a0: 61 66 66 31 3d 3d 30 20 7c 7c 20 61 66 66 32 3d  aff1==0 || aff2=
15b0: 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
15c0: 20 28 61 66 66 31 20 2b 20 61 66 66 32 29 3b 0a   (aff1 + aff2);.
15d0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78    }.}../*.** pEx
15e0: 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73  pr is a comparis
15f0: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 52 65  on operator.  Re
1600: 74 75 72 6e 20 74 68 65 20 74 79 70 65 20 61 66  turn the type af
1610: 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
1620: 6c 64 0a 2a 2a 20 62 65 20 61 70 70 6c 69 65 64  ld.** be applied
1630: 20 74 6f 20 62 6f 74 68 20 6f 70 65 72 61 6e 64   to both operand
1640: 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67  s prior to doing
1650: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   the comparison.
1660: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
1670: 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
1680: 74 79 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  ty(Expr *pExpr){
1690: 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 61  .  char aff;.  a
16a0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
16b0: 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72  ==TK_EQ || pExpr
16c0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70  ->op==TK_IN || p
16d0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20  Expr->op==TK_LT 
16e0: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  ||.          pEx
16f0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c  pr->op==TK_GT ||
1700: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
1710: 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  E || pExpr->op==
1720: 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20 20 20 20 20  TK_LE ||.       
1730: 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b     pExpr->op==TK
1740: 5f 4e 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _NE || pExpr->op
1750: 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72  ==TK_IS || pExpr
1760: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ->op==TK_ISNOT )
1770: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
1780: 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 61 66  r->pLeft );.  af
1790: 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  f = sqlite3ExprA
17a0: 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70  ffinity(pExpr->p
17b0: 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78  Left);.  if( pEx
17c0: 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20  pr->pRight ){.  
17d0: 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43    aff = sqlite3C
17e0: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
17f0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66  Expr->pRight, af
1800: 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  f);.  }else if( 
1810: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1820: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
1830: 65 63 74 29 20 29 7b 0a 20 20 20 20 61 66 66 20  ect) ){.    aff 
1840: 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
1850: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
1860: 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
1870: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61  t->a[0].pExpr, a
1880: 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ff);.  }else if(
1890: 20 21 61 66 66 20 29 7b 0a 20 20 20 20 61 66 66   !aff ){.    aff
18a0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
18b0: 4e 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  NE;.  }.  return
18c0: 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70   aff;.}../*.** p
18d0: 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72  Expr is a compar
18e0: 69 73 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  ison expression,
18f0: 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c 20 49   eg. '=', '<', I
1900: 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20 69  N(...) etc..** i
1910: 64 78 5f 61 66 66 69 6e 69 74 79 20 69 73 20 74  dx_affinity is t
1920: 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 61  he affinity of a
1930: 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e  n indexed column
1940: 2e 20 52 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a  . Return true.**
1950: 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 77 69   if the index wi
1960: 74 68 20 61 66 66 69 6e 69 74 79 20 69 64 78 5f  th affinity idx_
1970: 61 66 66 69 6e 69 74 79 20 6d 61 79 20 62 65 20  affinity may be 
1980: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
1990: 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72 69  t.** the compari
19a0: 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a 2a 2f  son in pExpr..*/
19b0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65  .int sqlite3Inde
19c0: 78 41 66 66 69 6e 69 74 79 4f 6b 28 45 78 70 72  xAffinityOk(Expr
19d0: 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20 69 64   *pExpr, char id
19e0: 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20 20 63  x_affinity){.  c
19f0: 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70 61 72  har aff = compar
1a00: 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78  isonAffinity(pEx
1a10: 70 72 29 3b 0a 20 20 73 77 69 74 63 68 28 20 61  pr);.  switch( a
1a20: 66 66 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  ff ){.    case S
1a30: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3a 0a  QLITE_AFF_NONE:.
1a40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1a50: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1a60: 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20 20 20  AFF_TEXT:.      
1a70: 72 65 74 75 72 6e 20 69 64 78 5f 61 66 66 69 6e  return idx_affin
1a80: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
1a90: 54 45 58 54 3b 0a 20 20 20 20 64 65 66 61 75 6c  TEXT;.    defaul
1aa0: 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
1ab0: 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63  sqlite3IsNumeric
1ac0: 41 66 66 69 6e 69 74 79 28 69 64 78 5f 61 66 66  Affinity(idx_aff
1ad0: 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  inity);.  }.}../
1ae0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1af0: 50 35 20 76 61 6c 75 65 20 74 68 61 74 20 73 68  P5 value that sh
1b00: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72  ould be used for
1b10: 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72   a binary compar
1b20: 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65 20 28  ison.** opcode (
1b30: 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20 65 74 63  OP_Eq, OP_Ge etc
1b40: 2e 29 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61  .) used to compa
1b50: 72 65 20 70 45 78 70 72 31 20 61 6e 64 20 70 45  re pExpr1 and pE
1b60: 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  xpr2..*/.static 
1b70: 75 38 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65  u8 binaryCompare
1b80: 50 35 28 45 78 70 72 20 2a 70 45 78 70 72 31 2c  P5(Expr *pExpr1,
1b90: 20 45 78 70 72 20 2a 70 45 78 70 72 32 2c 20 69   Expr *pExpr2, i
1ba0: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
1bb0: 20 20 75 38 20 61 66 66 20 3d 20 28 63 68 61 72    u8 aff = (char
1bc0: 29 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69  )sqlite3ExprAffi
1bd0: 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a 20 20  nity(pExpr2);.  
1be0: 61 66 66 20 3d 20 28 75 38 29 73 71 6c 69 74 65  aff = (u8)sqlite
1bf0: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
1c00: 28 70 45 78 70 72 31 2c 20 61 66 66 29 20 7c 20  (pExpr1, aff) | 
1c10: 28 75 38 29 6a 75 6d 70 49 66 4e 75 6c 6c 3b 0a  (u8)jumpIfNull;.
1c20: 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a    return aff;.}.
1c30: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1c40: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
1c50: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1c60: 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
1c70: 20 75 73 65 64 20 62 79 0a 2a 2a 20 61 20 62 69   used by.** a bi
1c80: 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20  nary comparison 
1c90: 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70 61 72 69  operator compari
1ca0: 6e 67 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69  ng pLeft and pRi
1cb0: 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ght..**.** If th
1cc0: 65 20 6c 65 66 74 20 68 61 6e 64 20 65 78 70 72  e left hand expr
1cd0: 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c  ession has a col
1ce0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1cf0: 74 79 70 65 2c 20 74 68 65 6e 20 69 74 20 69 73  type, then it is
1d00: 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68 65 72 77  .** used. Otherw
1d10: 69 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ise the collatio
1d20: 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  n sequence for t
1d30: 68 65 20 72 69 67 68 74 20 68 61 6e 64 20 65 78  he right hand ex
1d40: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 75  pression.** is u
1d50: 73 65 64 2c 20 6f 72 20 74 68 65 20 64 65 66 61  sed, or the defa
1d60: 75 6c 74 20 28 42 49 4e 41 52 59 29 20 69 66 20  ult (BINARY) if 
1d70: 6e 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69  neither expressi
1d80: 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69  on has a collati
1d90: 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a 2a 0a 2a  ng.** type..**.*
1da0: 2a 20 41 72 67 75 6d 65 6e 74 20 70 52 69 67 68  * Argument pRigh
1db0: 74 20 28 62 75 74 20 6e 6f 74 20 70 4c 65 66 74  t (but not pLeft
1dc0: 29 20 6d 61 79 20 62 65 20 61 20 6e 75 6c 6c 20  ) may be a null 
1dd0: 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74 68 69 73  pointer. In this
1de0: 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20   case,.** it is 
1df0: 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a  not considered..
1e00: 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69  */.CollSeq *sqli
1e10: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
1e20: 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61 72 73 65  CollSeq(.  Parse
1e30: 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45 78 70   *pParse, .  Exp
1e40: 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20 45 78 70  r *pLeft, .  Exp
1e50: 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 43  r *pRight.){.  C
1e60: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
1e70: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29   assert( pLeft )
1e80: 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 66  ;.  if( pLeft->f
1e90: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
1ea0: 65 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  e ){.    pColl =
1eb0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
1ec0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66  Seq(pParse, pLef
1ed0: 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  t);.  }else if( 
1ee0: 70 52 69 67 68 74 20 26 26 20 28 70 52 69 67 68  pRight && (pRigh
1ef0: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  t->flags & EP_Co
1f00: 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20 20 20  llate)!=0 ){.   
1f10: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
1f20: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
1f30: 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d  se, pRight);.  }
1f40: 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  else{.    pColl 
1f50: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
1f60: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65  lSeq(pParse, pLe
1f70: 66 74 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43  ft);.    if( !pC
1f80: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  oll ){.      pCo
1f90: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
1fa0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1fb0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20  pRight);.    }. 
1fc0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c   }.  return pCol
1fd0: 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  l;.}../*.** Gene
1fe0: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
1ff0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
2000: 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tor..*/.static i
2010: 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 0a  nt codeCompare(.
2020: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2030: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
2040: 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67 65 6e  ng (and code gen
2050: 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65 78 74  erating) context
2060: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
2070: 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  t,      /* The l
2080: 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  eft operand */. 
2090: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20   Expr *pRight,  
20a0: 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20     /* The right 
20b0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
20c0: 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20 20 2f   opcode,       /
20d0: 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * The comparison
20e0: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74   opcode */.  int
20f0: 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32 2c 20 2f   in1, int in2, /
2100: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
2110: 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 20  ng operands */. 
2120: 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20   int dest,      
2130: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
2140: 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20 69  if true.  */.  i
2150: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20  nt jumpIfNull   
2160: 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a 75 6d   /* If true, jum
2170: 70 20 69 66 20 65 69 74 68 65 72 20 6f 70 65 72  p if either oper
2180: 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29  and is NULL */.)
2190: 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20 20 69 6e  {.  int p5;.  in
21a0: 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c 6c 53 65  t addr;.  CollSe
21b0: 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20 3d 20 73  q *p4;..  p4 = s
21c0: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
21d0: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
21e0: 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
21f0: 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e 61 72 79  );.  p5 = binary
2200: 43 6f 6d 70 61 72 65 50 35 28 70 4c 65 66 74 2c  CompareP5(pLeft,
2210: 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49 66 4e   pRight, jumpIfN
2220: 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20 3d 20 73  ull);.  addr = s
2230: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2240: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
2250: 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20 64 65 73  opcode, in2, des
2260: 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20 20 20 20  t, in1,.        
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2280: 20 20 20 28 76 6f 69 64 2a 29 70 34 2c 20 50 34     (void*)p4, P4
2290: 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 73 71 6c  _COLLSEQ);.  sql
22a0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
22b0: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
22c0: 28 75 38 29 70 35 29 3b 0a 20 20 72 65 74 75 72  (u8)p5);.  retur
22d0: 6e 20 61 64 64 72 3b 0a 7d 0a 0a 23 69 66 20 53  n addr;.}..#if S
22e0: 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
22f0: 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 65  EPTH>0./*.** Che
2300: 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65 6e 74  ck that argument
2310: 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65 73 73   nHeight is less
2320: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
2330: 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a  o the maximum.**
2340: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74   expression dept
2350: 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20 69 74  h allowed. If it
2360: 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65 20 61   is not, leave a
2370: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
2380: 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f  in.** pParse..*/
2390: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
23a0: 43 68 65 63 6b 48 65 69 67 68 74 28 50 61 72 73  CheckHeight(Pars
23b0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e  e *pParse, int n
23c0: 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74 20 72  Height){.  int r
23d0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
23e0: 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20 3d 20   int mxHeight = 
23f0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d  pParse->db->aLim
2400: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
2410: 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20 20 69  EXPR_DEPTH];.  i
2420: 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48 65 69  f( nHeight>mxHei
2430: 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ght ){.    sqlit
2440: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2450: 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78 70 72  e, .       "Expr
2460: 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20 74  ession tree is t
2470: 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69 6d 75  oo large (maximu
2480: 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20 6d 78  m depth %d)", mx
2490: 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a 20 20  Height.    );.  
24a0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
24b0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
24c0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  n rc;.}../* The 
24d0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20  following three 
24e0: 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69 67 68  functions, heigh
24f0: 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69 67 68  tOfExpr(), heigh
2500: 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a  tOfExprList().**
2510: 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53 65 6c   and heightOfSel
2520: 65 63 74 28 29 2c 20 61 72 65 20 75 73 65 64 20  ect(), are used 
2530: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
2540: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 0a   maximum height.
2550: 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73  ** of any expres
2560: 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65  sion tree refere
2570: 6e 63 65 64 20 62 79 20 74 68 65 20 73 74 72 75  nced by the stru
2580: 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20  cture passed as 
2590: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61 72 67  the.** first arg
25a0: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ument..**.** If 
25b0: 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68 65 69  this maximum hei
25c0: 67 68 74 20 69 73 20 67 72 65 61 74 65 72 20 74  ght is greater t
25d0: 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
25e0: 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a 2a 2a  value pointed.**
25f0: 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68 74 2c   to by pnHeight,
2600: 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
2610: 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65 74 20  meter, then set 
2620: 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74 68 61  *pnHeight to tha
2630: 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73  t.** value..*/.s
2640: 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68  tatic void heigh
2650: 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a 70 2c  tOfExpr(Expr *p,
2660: 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b   int *pnHeight){
2670: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
2680: 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74 3e 2a  if( p->nHeight>*
2690: 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20  pnHeight ){.    
26a0: 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20 70 2d    *pnHeight = p-
26b0: 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20 7d 0a  >nHeight;.    }.
26c0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
26d0: 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69  d heightOfExprLi
26e0: 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20  st(ExprList *p, 
26f0: 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a  int *pnHeight){.
2700: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
2710: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
2720: 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69  0; i<p->nExpr; i
2730: 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69 67 68  ++){.      heigh
2740: 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69 5d 2e  tOfExpr(p->a[i].
2750: 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68 74 29  pExpr, pnHeight)
2760: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74  ;.    }.  }.}.st
2770: 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74  atic void height
2780: 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20  OfSelect(Select 
2790: 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68  *p, int *pnHeigh
27a0: 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  t){.  if( p ){. 
27b0: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28     heightOfExpr(
27c0: 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48 65 69  p->pWhere, pnHei
27d0: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
27e0: 4f 66 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e  OfExpr(p->pHavin
27f0: 67 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  g, pnHeight);.  
2800: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
2810: 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65 69 67  ->pLimit, pnHeig
2820: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
2830: 66 45 78 70 72 28 70 2d 3e 70 4f 66 66 73 65 74  fExpr(p->pOffset
2840: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
2850: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
2860: 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 70 6e 48  t(p->pEList, pnH
2870: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
2880: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
2890: 70 47 72 6f 75 70 42 79 2c 20 70 6e 48 65 69 67  pGroupBy, pnHeig
28a0: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
28b0: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72  fExprList(p->pOr
28c0: 64 65 72 42 79 2c 20 70 6e 48 65 69 67 68 74 29  derBy, pnHeight)
28d0: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53 65  ;.    heightOfSe
28e0: 6c 65 63 74 28 70 2d 3e 70 50 72 69 6f 72 2c 20  lect(p->pPrior, 
28f0: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 7d  pnHeight);.  }.}
2900: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
2910: 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72  Expr.nHeight var
2920: 69 61 62 6c 65 20 69 6e 20 74 68 65 20 73 74 72  iable in the str
2930: 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73  ucture passed as
2940: 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   an .** argument
2950: 2e 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  . An expression 
2960: 77 69 74 68 20 6e 6f 20 63 68 69 6c 64 72 65 6e  with no children
2970: 2c 20 45 78 70 72 2e 70 4c 69 73 74 20 6f 72 20  , Expr.pList or 
2980: 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c 65 63 74  .** Expr.pSelect
2990: 20 6d 65 6d 62 65 72 20 68 61 73 20 61 20 68 65   member has a he
29a0: 69 67 68 74 20 6f 66 20 31 2e 20 41 6e 79 20 6f  ight of 1. Any o
29b0: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 0a  ther expression.
29c0: 2a 2a 20 68 61 73 20 61 20 68 65 69 67 68 74 20  ** has a height 
29d0: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78  equal to the max
29e0: 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61  imum height of a
29f0: 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20 72 65 66  ny other .** ref
2a00: 65 72 65 6e 63 65 64 20 45 78 70 72 20 70 6c 75  erenced Expr plu
2a10: 73 20 6f 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  s one..*/.static
2a20: 20 76 6f 69 64 20 65 78 70 72 53 65 74 48 65 69   void exprSetHei
2a30: 67 68 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ght(Expr *p){.  
2a40: 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b  int nHeight = 0;
2a50: 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  .  heightOfExpr(
2a60: 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65 69 67  p->pLeft, &nHeig
2a70: 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f 66 45  ht);.  heightOfE
2a80: 78 70 72 28 70 2d 3e 70 52 69 67 68 74 2c 20 26  xpr(p->pRight, &
2a90: 6e 48 65 69 67 68 74 29 3b 0a 20 20 69 66 28 20  nHeight);.  if( 
2aa0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2ab0: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
2ac0: 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66   ){.    heightOf
2ad0: 53 65 6c 65 63 74 28 70 2d 3e 78 2e 70 53 65 6c  Select(p->x.pSel
2ae0: 65 63 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  ect, &nHeight);.
2af0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 68 65 69    }else{.    hei
2b00: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
2b10: 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 48 65 69 67  >x.pList, &nHeig
2b20: 68 74 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48  ht);.  }.  p->nH
2b30: 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68 74 20  eight = nHeight 
2b40: 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  + 1;.}../*.** Se
2b50: 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67  t the Expr.nHeig
2b60: 68 74 20 76 61 72 69 61 62 6c 65 20 75 73 69 6e  ht variable usin
2b70: 67 20 74 68 65 20 65 78 70 72 53 65 74 48 65 69  g the exprSetHei
2b80: 67 68 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20  ght() function. 
2b90: 49 66 0a 2a 2a 20 74 68 65 20 68 65 69 67 68 74  If.** the height
2ba0: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
2bb0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c   the maximum all
2bc0: 6f 77 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20  owed expression 
2bd0: 64 65 70 74 68 2c 0a 2a 2a 20 6c 65 61 76 65 20  depth,.** leave 
2be0: 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72  an error in pPar
2bf0: 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
2c00: 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74  te3ExprSetHeight
2c10: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2c20: 45 78 70 72 20 2a 70 29 7b 0a 20 20 65 78 70 72  Expr *p){.  expr
2c30: 53 65 74 48 65 69 67 68 74 28 70 29 3b 0a 20 20  SetHeight(p);.  
2c40: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
2c50: 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70  Height(pParse, p
2c60: 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f  ->nHeight);.}../
2c70: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2c80: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f  maximum height o
2c90: 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  f any expression
2ca0: 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64   tree referenced
2cb0: 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c 65 63  .** by the selec
2cc0: 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  t statement pass
2cd0: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
2ce0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
2cf0: 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68  3SelectExprHeigh
2d00: 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  t(Select *p){.  
2d10: 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b  int nHeight = 0;
2d20: 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63  .  heightOfSelec
2d30: 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  t(p, &nHeight);.
2d40: 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67 68 74    return nHeight
2d50: 3b 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66  ;.}.#else.  #def
2d60: 69 6e 65 20 65 78 70 72 53 65 74 48 65 69 67 68  ine exprSetHeigh
2d70: 74 28 79 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53  t(y).#endif /* S
2d80: 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
2d90: 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  EPTH>0 */../*.**
2da0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2db0: 20 74 68 65 20 63 6f 72 65 20 61 6c 6c 6f 63 61   the core alloca
2dc0: 74 6f 72 20 66 6f 72 20 45 78 70 72 20 6e 6f 64  tor for Expr nod
2dd0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 72  es..**.** Constr
2de0: 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65 73  uct a new expres
2df0: 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20 72 65  sion node and re
2e00: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
2e10: 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a  o it.  Memory.**
2e20: 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65 20 61   for this node a
2e30: 6e 64 20 66 6f 72 20 74 68 65 20 70 54 6f 6b 65  nd for the pToke
2e40: 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  n argument is a 
2e50: 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f  single allocatio
2e60: 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72  n.** obtained fr
2e70: 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  om sqlite3DbMall
2e80: 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c 6c 69  oc().  The calli
2e90: 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  ng function.** i
2ea0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
2eb0: 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 74 68  r making sure th
2ec0: 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c  e node eventuall
2ed0: 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a 2a 2a  y gets freed..**
2ee0: 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74 65 20 69  .** If dequote i
2ef0: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
2f00: 20 74 6f 6b 65 6e 20 28 69 66 20 69 74 20 65 78   token (if it ex
2f10: 69 73 74 73 29 20 69 73 20 64 65 71 75 6f 74 65  ists) is dequote
2f20: 64 2e 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74 65  d..** If dequote
2f30: 20 69 73 20 66 61 6c 73 65 2c 20 6e 6f 20 64 65   is false, no de
2f40: 71 75 6f 74 69 6e 67 20 69 73 20 70 65 72 66 6f  quoting is perfo
2f50: 72 6d 61 6e 63 65 2e 20 20 54 68 65 20 64 65 51  rmance.  The deQ
2f60: 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65  uote.** paramete
2f70: 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20  r is ignored if 
2f80: 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20 6f  pToken is NULL o
2f90: 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e 20 64  r if the token d
2fa0: 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70 65 61  oes not.** appea
2fb0: 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e 20  r to be quoted. 
2fc0: 20 49 66 20 74 68 65 20 71 75 6f 74 65 73 20 77   If the quotes w
2fd0: 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ere of the form 
2fe0: 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d 71 75  "..." (double-qu
2ff0: 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20 74 68  otes).** then th
3000: 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64 20 66  e EP_DblQuoted f
3010: 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68  lag is set on th
3020: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  e expression nod
3030: 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 61 6c  e..**.** Special
3040: 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d 3d 54   case:  If op==T
3050: 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20 70 54  K_INTEGER and pT
3060: 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f 20 61  oken points to a
3070: 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a 2a 20   string that.** 
3080: 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61 74 65  can be translate
3090: 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69 74 20  d into a 32-bit 
30a0: 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74 68  integer, then th
30b0: 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74 0a 2a  e token is not.*
30c0: 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e 7a 54  * stored in u.zT
30d0: 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64 2c 20  oken.  Instead, 
30e0: 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75  the integer valu
30f0: 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  es is written.**
3100: 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65 20 61   into u.iValue a
3110: 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56 61 6c  nd the EP_IntVal
3120: 75 65 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20  ue flag is set. 
3130: 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72 61 67   No extra storag
3140: 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65  e.** is allocate
3150: 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 69 6e  d to hold the in
3160: 74 65 67 65 72 20 74 65 78 74 20 61 6e 64 20 74  teger text and t
3170: 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61 67 20  he dequote flag 
3180: 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 45  is ignored..*/.E
3190: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
31a0: 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74 65 33  Alloc(.  sqlite3
31b0: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
31c0: 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 73   /* Handle for s
31d0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
31e0: 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e 75 6c  ro() (may be nul
31f0: 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  l) */.  int op, 
3200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3210: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70  /* Expression op
3220: 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  code */.  const 
3230: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20 20  Token *pToken,  
3240: 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d    /* Token argum
3250: 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65 20 4e  ent.  Might be N
3260: 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71  ULL */.  int deq
3270: 75 6f 74 65 20 20 20 20 20 20 20 20 20 20 20 20  uote            
3280: 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 71 75   /* True to dequ
3290: 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ote */.){.  Expr
32a0: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 45   *pNew;.  int nE
32b0: 78 74 72 61 20 3d 20 30 3b 0a 20 20 69 6e 74 20  xtra = 0;.  int 
32c0: 69 56 61 6c 75 65 20 3d 20 30 3b 0a 0a 20 20 69  iValue = 0;..  i
32d0: 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  f( pToken ){.   
32e0: 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 54 45   if( op!=TK_INTE
32f0: 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 7a  GER || pToken->z
3300: 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  ==0.          ||
3310: 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
3320: 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56 61  (pToken->z, &iVa
3330: 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lue)==0 ){.     
3340: 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b 65 6e   nExtra = pToken
3350: 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20 20 61 73 73  ->n+1;.      ass
3360: 65 72 74 28 20 69 56 61 6c 75 65 3e 3d 30 20 29  ert( iValue>=0 )
3370: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e  ;.    }.  }.  pN
3380: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
3390: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
33a0: 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74 72 61  eof(Expr)+nExtra
33b0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b  );.  if( pNew ){
33c0: 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20  .    pNew->op = 
33d0: 28 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e 65 77  (u8)op;.    pNew
33e0: 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20  ->iAgg = -1;.   
33f0: 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20   if( pToken ){. 
3400: 20 20 20 20 20 69 66 28 20 6e 45 78 74 72 61 3d       if( nExtra=
3410: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e  =0 ){.        pN
3420: 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ew->flags |= EP_
3430: 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20  IntValue;.      
3440: 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65    pNew->u.iValue
3450: 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20 20 20   = iValue;.     
3460: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3470: 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20 70  int c;.        p
3480: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20  New->u.zToken = 
3490: 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b  (char*)&pNew[1];
34a0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
34b0: 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 7c 7c   pToken->z!=0 ||
34c0: 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20 29 3b   pToken->n==0 );
34d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f  .        if( pTo
34e0: 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70 79 28  ken->n ) memcpy(
34f0: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  pNew->u.zToken, 
3500: 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65  pToken->z, pToke
3510: 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 70  n->n);.        p
3520: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54  New->u.zToken[pT
3530: 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20  oken->n] = 0;.  
3540: 20 20 20 20 20 20 69 66 28 20 64 65 71 75 6f 74        if( dequot
3550: 65 20 26 26 20 6e 45 78 74 72 61 3e 3d 33 20 0a  e && nExtra>=3 .
3560: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
3570: 28 28 63 20 3d 20 70 54 6f 6b 65 6e 2d 3e 7a 5b  ((c = pToken->z[
3580: 30 5d 29 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d  0])=='\'' || c==
3590: 27 22 27 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c  '"' || c=='[' ||
35a0: 20 63 3d 3d 27 60 27 29 20 29 7b 0a 20 20 20 20   c=='`') ){.    
35b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71        sqlite3Deq
35c0: 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f  uote(pNew->u.zTo
35d0: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ken);.          
35e0: 69 66 28 20 63 3d 3d 27 22 27 20 29 20 70 4e 65  if( c=='"' ) pNe
35f0: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 44  w->flags |= EP_D
3600: 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20 20 20  blQuoted;.      
3610: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
3620: 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  }.#if SQLITE_MAX
3630: 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20  _EXPR_DEPTH>0.  
3640: 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68 74 20    pNew->nHeight 
3650: 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a 20 20  = 1;.#endif  .  
3660: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
3670: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
3680: 74 65 20 61 20 6e 65 77 20 65 78 70 72 65 73 73  te a new express
3690: 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20 61 20  ion node from a 
36a0: 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 20  zero-terminated 
36b0: 74 6f 6b 65 6e 20 74 68 61 74 20 68 61 73 0a 2a  token that has.*
36c0: 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 64  * already been d
36d0: 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78 70 72  equoted..*/.Expr
36e0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28 0a 20   *sqlite3Expr(. 
36f0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
3700: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
3710: 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62  le for sqlite3Db
3720: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61  MallocZero() (ma
3730: 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20  y be null) */.  
3740: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
3750: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
3760: 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a  ssion opcode */.
3770: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
3780: 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54 6f 6b  oken      /* Tok
3790: 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69  en argument.  Mi
37a0: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29  ght be NULL */.)
37b0: 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20 20 78  {.  Token x;.  x
37c0: 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78  .z = zToken;.  x
37d0: 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20 73 71  .n = zToken ? sq
37e0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
37f0: 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20 20 72 65 74  oken) : 0;.  ret
3800: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41  urn sqlite3ExprA
3810: 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26 78 2c  lloc(db, op, &x,
3820: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74   0);.}../*.** At
3830: 74 61 63 68 20 73 75 62 74 72 65 65 73 20 70 4c  tach subtrees pL
3840: 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 20 74  eft and pRight t
3850: 6f 20 74 68 65 20 45 78 70 72 20 6e 6f 64 65 20  o the Expr node 
3860: 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pRoot..**.** If 
3870: 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61 74  pRoot==NULL that
3880: 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20 6d 65   means that a me
3890: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
38a0: 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
38b0: 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63  ed..** In that c
38c0: 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20  ase, delete the 
38d0: 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20 61  subtrees pLeft a
38e0: 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f  nd pRight..*/.vo
38f0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 74  id sqlite3ExprAt
3900: 74 61 63 68 53 75 62 74 72 65 65 73 28 0a 20 20  tachSubtrees(.  
3910: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 45  sqlite3 *db,.  E
3920: 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20 45 78  xpr *pRoot,.  Ex
3930: 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45 78 70  pr *pLeft,.  Exp
3940: 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 69  r *pRight.){.  i
3950: 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20  f( pRoot==0 ){. 
3960: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
3970: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
3980: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
3990: 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b  lete(db, pLeft);
39a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
39b0: 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68  Delete(db, pRigh
39c0: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
39d0: 20 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a 20   if( pRight ){. 
39e0: 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52 69 67       pRoot->pRig
39f0: 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20  ht = pRight;.   
3a00: 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20     pRoot->flags 
3a10: 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 20 26 20  |= EP_Collate & 
3a20: 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 3b 0a 20  pRight->flags;. 
3a30: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65     }.    if( pLe
3a40: 66 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f  ft ){.      pRoo
3a50: 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66 74  t->pLeft = pLeft
3a60: 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66  ;.      pRoot->f
3a70: 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61  lags |= EP_Colla
3a80: 74 65 20 26 20 70 4c 65 66 74 2d 3e 66 6c 61 67  te & pLeft->flag
3a90: 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 70  s;.    }.    exp
3aa0: 72 53 65 74 48 65 69 67 68 74 28 70 52 6f 6f 74  rSetHeight(pRoot
3ab0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
3ac0: 41 6c 6c 6f 63 61 74 65 20 61 20 45 78 70 72 20  Allocate a Expr 
3ad0: 6e 6f 64 65 20 77 68 69 63 68 20 6a 6f 69 6e 73  node which joins
3ae0: 20 61 73 20 6d 61 6e 79 20 61 73 20 74 77 6f 20   as many as two 
3af0: 73 75 62 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20  subtrees..**.** 
3b00: 4f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74  One or both of t
3b10: 68 65 20 73 75 62 74 72 65 65 73 20 63 61 6e 20  he subtrees can 
3b20: 62 65 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e  be NULL.  Return
3b30: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
3b40: 65 20 6e 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f  e new.** Expr no
3b50: 64 65 2e 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f  de.  Or, if an O
3b60: 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  OM error occurs,
3b70: 20 73 65 74 20 70 50 61 72 73 65 2d 3e 64 62 2d   set pParse->db-
3b80: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a  >mallocFailed,.*
3b90: 2a 20 66 72 65 65 20 74 68 65 20 73 75 62 74 72  * free the subtr
3ba0: 65 65 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  ees and return N
3bb0: 55 4c 4c 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ULL..*/.Expr *sq
3bc0: 6c 69 74 65 33 50 45 78 70 72 28 0a 20 20 50 61  lite3PExpr(.  Pa
3bd0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
3be0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
3bf0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
3c00: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
3c10: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
3c20: 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ion opcode */.  
3c30: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20  Expr *pLeft,    
3c40: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20          /* Left 
3c50: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70  operand */.  Exp
3c60: 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 20  r *pRight,      
3c70: 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70       /* Right op
3c80: 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  erand */.  const
3c90: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20   Token *pToken  
3ca0: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
3cb0: 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  oken */.){.  Exp
3cc0: 72 20 2a 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  r *p;.  if( op==
3cd0: 54 4b 5f 41 4e 44 20 26 26 20 70 4c 65 66 74 20  TK_AND && pLeft 
3ce0: 26 26 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20  && pRight ){.   
3cf0: 20 2f 2a 20 54 61 6b 65 20 61 64 76 61 6e 74 61   /* Take advanta
3d00: 67 65 20 6f 66 20 73 68 6f 72 74 2d 63 69 72 63  ge of short-circ
3d10: 75 69 74 20 66 61 6c 73 65 20 6f 70 74 69 6d 69  uit false optimi
3d20: 7a 61 74 69 6f 6e 20 66 6f 72 20 41 4e 44 20 2a  zation for AND *
3d30: 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  /.    p = sqlite
3d40: 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
3d50: 3e 64 62 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  >db, pLeft, pRig
3d60: 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ht);.  }else{.  
3d70: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70    p = sqlite3Exp
3d80: 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64  rAlloc(pParse->d
3d90: 62 2c 20 6f 70 2c 20 70 54 6f 6b 65 6e 2c 20 31  b, op, pToken, 1
3da0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
3db0: 70 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73  prAttachSubtrees
3dc0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20  (pParse->db, p, 
3dd0: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a  pLeft, pRight);.
3de0: 20 20 7d 0a 20 20 69 66 28 20 70 20 29 20 7b 0a    }.  if( p ) {.
3df0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
3e00: 68 65 63 6b 48 65 69 67 68 74 28 70 50 61 72 73  heckHeight(pPars
3e10: 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a  e, p->nHeight);.
3e20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
3e30: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
3e40: 31 20 69 66 20 61 6e 20 65 78 70 72 65 73 73 69  1 if an expressi
3e50: 6f 6e 20 6d 75 73 74 20 62 65 20 46 41 4c 53 45  on must be FALSE
3e60: 20 69 6e 20 61 6c 6c 20 63 61 73 65 73 20 61 6e   in all cases an
3e70: 64 20 30 20 69 66 20 74 68 65 0a 2a 2a 20 65 78  d 0 if the.** ex
3e80: 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 62  pression might b
3e90: 65 20 74 72 75 65 2e 20 20 54 68 69 73 20 69 73  e true.  This is
3ea0: 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
3eb0: 2e 20 20 49 66 20 69 73 20 4f 4b 20 74 6f 0a 2a  .  If is OK to.*
3ec0: 2a 20 72 65 74 75 72 6e 20 30 20 68 65 72 65 20  * return 0 here 
3ed0: 65 76 65 6e 20 69 66 20 74 68 65 20 65 78 70 72  even if the expr
3ee0: 65 73 73 69 6f 6e 20 72 65 61 6c 6c 79 20 69 73  ession really is
3ef0: 20 61 6c 77 61 79 73 20 66 61 6c 73 65 20 28 61   always false (a
3f00: 20 0a 2a 2a 20 66 61 6c 73 65 20 6e 65 67 61 74   .** false negat
3f10: 69 76 65 29 2e 20 20 42 75 74 20 69 74 20 69 73  ive).  But it is
3f20: 20 61 20 62 75 67 20 74 6f 20 72 65 74 75 72 6e   a bug to return
3f30: 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73   1 if the expres
3f40: 73 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20 62 65  sion.** might be
3f50: 20 74 72 75 65 20 69 6e 20 73 6f 6d 65 20 72 61   true in some ra
3f60: 72 65 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  re circumstances
3f70: 20 28 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69   (a false positi
3f80: 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ve.).**.** Note 
3f90: 74 68 61 74 20 69 66 20 74 68 65 20 65 78 70 72  that if the expr
3fa0: 65 73 73 69 6f 6e 20 69 73 20 70 61 72 74 20 6f  ession is part o
3fb0: 66 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 66 6f  f conditional fo
3fc0: 72 20 61 0a 2a 2a 20 4c 45 46 54 20 4a 4f 49 4e  r a.** LEFT JOIN
3fd0: 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74  , then we cannot
3fe0: 20 64 65 74 65 72 6d 69 6e 65 20 61 74 20 63 6f   determine at co
3ff0: 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68  mpile-time wheth
4000: 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 69 73 20  er or not.** is 
4010: 69 74 20 74 72 75 65 20 6f 72 20 66 61 6c 73 65  it true or false
4020: 2c 20 73 6f 20 61 6c 77 61 79 73 20 72 65 74 75  , so always retu
4030: 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rn 0..*/.static 
4040: 69 6e 74 20 65 78 70 72 41 6c 77 61 79 73 46 61  int exprAlwaysFa
4050: 6c 73 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  lse(Expr *p){.  
4060: 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69 66 28  int v = 0;.  if(
4070: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
4080: 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  (p, EP_FromJoin)
4090: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
40a0: 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  f( !sqlite3ExprI
40b0: 73 49 6e 74 65 67 65 72 28 70 2c 20 26 76 29 20  sInteger(p, &v) 
40c0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65  ) return 0;.  re
40d0: 74 75 72 6e 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a  turn v==0;.}../*
40e0: 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70  .** Join two exp
40f0: 72 65 73 73 69 6f 6e 73 20 75 73 69 6e 67 20 61  ressions using a
4100: 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20  n AND operator. 
4110: 20 49 66 20 65 69 74 68 65 72 20 65 78 70 72 65   If either expre
4120: 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c  ssion is.** NULL
4130: 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75  , then just retu
4140: 72 6e 20 74 68 65 20 6f 74 68 65 72 20 65 78 70  rn the other exp
4150: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  ression..**.** I
4160: 66 20 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68  f one side or th
4170: 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 41  e other of the A
4180: 4e 44 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62  ND is known to b
4190: 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e  e false, then in
41a0: 73 74 65 61 64 0a 2a 2a 20 6f 66 20 72 65 74 75  stead.** of retu
41b0: 72 6e 69 6e 67 20 61 6e 20 41 4e 44 20 65 78 70  rning an AND exp
41c0: 72 65 73 73 69 6f 6e 2c 20 6a 75 73 74 20 72 65  ression, just re
41d0: 74 75 72 6e 20 61 20 63 6f 6e 73 74 61 6e 74 20  turn a constant 
41e0: 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 0a  expression with.
41f0: 2a 2a 20 61 20 76 61 6c 75 65 20 6f 66 20 66 61  ** a value of fa
4200: 6c 73 65 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  lse..*/.Expr *sq
4210: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 73 71 6c  lite3ExprAnd(sql
4220: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
4230: 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69  pLeft, Expr *pRi
4240: 67 68 74 29 7b 0a 20 20 69 66 28 20 70 4c 65 66  ght){.  if( pLef
4250: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t==0 ){.    retu
4260: 72 6e 20 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c  rn pRight;.  }el
4270: 73 65 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30  se if( pRight==0
4280: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
4290: 4c 65 66 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Left;.  }else if
42a0: 28 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73  ( exprAlwaysFals
42b0: 65 28 70 4c 65 66 74 29 20 7c 7c 20 65 78 70 72  e(pLeft) || expr
42c0: 41 6c 77 61 79 73 46 61 6c 73 65 28 70 52 69 67  AlwaysFalse(pRig
42d0: 68 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ht) ){.    sqlit
42e0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
42f0: 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c   pLeft);.    sql
4300: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
4310: 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  b, pRight);.    
4320: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
4330: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49  prAlloc(db, TK_I
4340: 4e 54 45 47 45 52 2c 20 26 73 71 6c 69 74 65 33  NTEGER, &sqlite3
4350: 49 6e 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29  IntTokens[0], 0)
4360: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45  ;.  }else{.    E
4370: 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  xpr *pNew = sqli
4380: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
4390: 20 54 4b 5f 41 4e 44 2c 20 30 2c 20 30 29 3b 0a   TK_AND, 0, 0);.
43a0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
43b0: 74 74 61 63 68 53 75 62 74 72 65 65 73 28 64 62  ttachSubtrees(db
43c0: 2c 20 70 4e 65 77 2c 20 70 4c 65 66 74 2c 20 70  , pNew, pLeft, p
43d0: 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75  Right);.    retu
43e0: 72 6e 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a  rn pNew;.  }.}..
43f0: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
4400: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
4410: 20 6e 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63   node for a func
4420: 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70  tion with multip
4430: 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e  le.** arguments.
4440: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
4450: 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 50 61  3ExprFunction(Pa
4460: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
4470: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  rList *pList, To
4480: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
4490: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71  Expr *pNew;.  sq
44a0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
44b0: 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
44c0: 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e  ( pToken );.  pN
44d0: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
44e0: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 46 55 4e  Alloc(db, TK_FUN
44f0: 43 54 49 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31  CTION, pToken, 1
4500: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
4510: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
4520: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
4530: 2c 20 70 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f  , pList); /* Avo
4540: 69 64 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 77  id memory leak w
4550: 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73  hen malloc fails
4560: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30   */.    return 0
4570: 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e  ;.  }.  pNew->x.
4580: 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20  pList = pList;. 
4590: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
45a0: 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20  sProperty(pNew, 
45b0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
45c0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 65  .  sqlite3ExprSe
45d0: 74 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20  tHeight(pParse, 
45e0: 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20  pNew);.  return 
45f0: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  pNew;.}../*.** A
4600: 73 73 69 67 6e 20 61 20 76 61 72 69 61 62 6c 65  ssign a variable
4610: 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20 65 78   number to an ex
4620: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65 6e  pression that en
4630: 63 6f 64 65 73 20 61 20 77 69 6c 64 63 61 72 64  codes a wildcard
4640: 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69 67 69  .** in the origi
4650: 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  nal SQL statemen
4660: 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63  t.  .**.** Wildc
4670: 61 72 64 73 20 63 6f 6e 73 69 73 74 69 6e 67 20  ards consisting 
4680: 6f 66 20 61 20 73 69 6e 67 6c 65 20 22 3f 22 20  of a single "?" 
4690: 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65  are assigned the
46a0: 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c   next sequential
46b0: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  .** variable num
46c0: 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63  ber..**.** Wildc
46d0: 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ards of the form
46e0: 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73 69   "?nnn" are assi
46f0: 67 6e 65 64 20 74 68 65 20 6e 75 6d 62 65 72 20  gned the number 
4700: 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a  "nnn".  We make.
4710: 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20 69 73  ** sure "nnn" is
4720: 20 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f 20 61   not too be to a
4730: 76 6f 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66  void a denial of
4740: 20 73 65 72 76 69 63 65 20 61 74 74 61 63 6b 20   service attack 
4750: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20  when.** the SQL 
4760: 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20  statement comes 
4770: 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c  from an external
4780: 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57   source..**.** W
4790: 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20  ildcards of the 
47a0: 66 6f 72 6d 20 22 3a 61 61 61 22 2c 20 22 40 61  form ":aaa", "@a
47b0: 61 61 22 2c 20 6f 72 20 22 24 61 61 61 22 20 61  aa", or "$aaa" a
47c0: 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20  re assigned the 
47d0: 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61  same number.** a
47e0: 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 69  s the previous i
47f0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73  nstance of the s
4800: 61 6d 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f  ame wildcard.  O
4810: 72 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  r if this is the
4820: 20 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e   first.** instan
4830: 63 65 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61  ce of the wildca
4840: 72 64 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71  rd, the next seq
4850: 75 65 6e 69 61 6c 20 76 61 72 69 61 62 6c 65 20  uenial variable 
4860: 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73  number is.** ass
4870: 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  igned..*/.void s
4880: 71 6c 69 74 65 33 45 78 70 72 41 73 73 69 67 6e  qlite3ExprAssign
4890: 56 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20  VarNumber(Parse 
48a0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
48b0: 45 78 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  Expr){.  sqlite3
48c0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
48d0: 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
48e0: 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72  *z;..  if( pExpr
48f0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
4900: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
4910: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70  AnyProperty(pExp
4920: 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45  r, EP_IntValue|E
4930: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
4940: 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d  enOnly) );.  z =
4950: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
4960: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30  ;.  assert( z!=0
4970: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 5b   );.  assert( z[
4980: 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a  0]!=0 );.  if( z
4990: 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  [1]==0 ){.    /*
49a0: 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65   Wildcard of the
49b0: 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73 69   form "?".  Assi
49c0: 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72 69  gn the next vari
49d0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  able number */. 
49e0: 20 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d     assert( z[0]=
49f0: 3d 27 3f 27 20 29 3b 0a 20 20 20 20 70 45 78 70  ='?' );.    pExp
4a00: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e  r->iColumn = (yn
4a10: 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e  Var)(++pParse->n
4a20: 56 61 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Var);.  }else{. 
4a30: 20 20 20 79 6e 56 61 72 20 78 20 3d 20 30 3b 0a     ynVar x = 0;.
4a40: 20 20 20 20 75 33 32 20 6e 20 3d 20 73 71 6c 69      u32 n = sqli
4a50: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a  te3Strlen30(z);.
4a60: 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f      if( z[0]=='?
4a70: 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69  ' ){.      /* Wi
4a80: 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f  ldcard of the fo
4a90: 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76  rm "?nnn".  Conv
4aa0: 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20  ert "nnn" to an 
4ab0: 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20 20 20  integer and.    
4ac0: 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20 74    ** use it as t
4ad0: 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  he variable numb
4ae0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20  er */.      i64 
4af0: 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f 6b  i;.      int bOk
4b00: 20 3d 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f   = 0==sqlite3Ato
4b10: 69 36 34 28 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e  i64(&z[1], &i, n
4b20: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  -1, SQLITE_UTF8)
4b30: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ;.      pExpr->i
4b40: 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e  Column = x = (yn
4b50: 56 61 72 29 69 3b 0a 20 20 20 20 20 20 74 65 73  Var)i;.      tes
4b60: 74 63 61 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20  tcase( i==0 );. 
4b70: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
4b80: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==1 );.      tes
4b90: 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c  tcase( i==db->aL
4ba0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
4bb0: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
4bc0: 52 5d 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65  R]-1 );.      te
4bd0: 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61  stcase( i==db->a
4be0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
4bf0: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
4c00: 45 52 5d 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ER] );.      if(
4c10: 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c   bOk==0 || i<1 |
4c20: 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  | i>db->aLimit[S
4c30: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
4c40: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a  ABLE_NUMBER] ){.
4c50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
4c60: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
4c70: 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72  "variable number
4c80: 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
4c90: 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20   ?1 and ?%d",.  
4ca0: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 4c            db->aL
4cb0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
4cc0: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
4cd0: 52 5d 29 3b 0a 20 20 20 20 20 20 20 20 78 20 3d  R]);.        x =
4ce0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
4cf0: 20 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d 3e    if( i>pParse->
4d00: 6e 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20  nVar ){.        
4d10: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 28  pParse->nVar = (
4d20: 69 6e 74 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20  int)i;.      }. 
4d30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4d40: 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6c 69 6b  /* Wildcards lik
4d50: 65 20 22 3a 61 61 61 22 2c 20 22 24 61 61 61 22  e ":aaa", "$aaa"
4d60: 20 6f 72 20 22 40 61 61 61 22 2e 20 20 52 65 75   or "@aaa".  Reu
4d70: 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69  se the same vari
4d80: 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75  able.      ** nu
4d90: 6d 62 65 72 20 61 73 20 74 68 65 20 70 72 69 6f  mber as the prio
4da0: 72 20 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20  r appearance of 
4db0: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f  the same name, o
4dc0: 72 20 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20  r if the name.  
4dd0: 20 20 20 20 2a 2a 20 68 61 73 20 6e 65 76 65 72      ** has never
4de0: 20 61 70 70 65 61 72 65 64 20 62 65 66 6f 72 65   appeared before
4df0: 2c 20 72 65 75 73 65 20 74 68 65 20 73 61 6d 65  , reuse the same
4e00: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
4e10: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
4e20: 79 6e 56 61 72 20 69 3b 0a 20 20 20 20 20 20 66  ynVar i;.      f
4e30: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
4e40: 2d 3e 6e 7a 56 61 72 3b 20 69 2b 2b 29 7b 0a 20  ->nzVar; i++){. 
4e50: 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73         if( pPars
4e60: 65 2d 3e 61 7a 56 61 72 5b 69 5d 20 26 26 20 6d  e->azVar[i] && m
4e70: 65 6d 63 6d 70 28 70 50 61 72 73 65 2d 3e 61 7a  emcmp(pParse->az
4e80: 56 61 72 5b 69 5d 2c 7a 2c 6e 2b 31 29 3d 3d 30  Var[i],z,n+1)==0
4e90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45   ){.          pE
4ea0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78  xpr->iColumn = x
4eb0: 20 3d 20 28 79 6e 56 61 72 29 69 2b 31 3b 0a 20   = (ynVar)i+1;. 
4ec0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
4ed0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4ee0: 7d 0a 20 20 20 20 20 20 69 66 28 20 78 3d 3d 30  }.      if( x==0
4ef0: 20 29 20 78 20 3d 20 70 45 78 70 72 2d 3e 69 43   ) x = pExpr->iC
4f00: 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28  olumn = (ynVar)(
4f10: 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b  ++pParse->nVar);
4f20: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 78  .    }.    if( x
4f30: 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  >0 ){.      if( 
4f40: 78 3e 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 20  x>pParse->nzVar 
4f50: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
4f60: 2a 2a 61 3b 0a 20 20 20 20 20 20 20 20 61 20 3d  **a;.        a =
4f70: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
4f80: 63 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 7a  c(db, pParse->az
4f90: 56 61 72 2c 20 78 2a 73 69 7a 65 6f 66 28 61 5b  Var, x*sizeof(a[
4fa0: 30 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  0]));.        if
4fb0: 28 20 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( a==0 ) return;
4fc0: 20 20 2f 2a 20 45 72 72 6f 72 20 72 65 70 6f 72    /* Error repor
4fd0: 74 65 64 20 74 68 72 6f 75 67 68 20 64 62 2d 3e  ted through db->
4fe0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 2a 2f 0a  mallocFailed */.
4ff0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
5000: 61 7a 56 61 72 20 3d 20 61 3b 0a 20 20 20 20 20  azVar = a;.     
5010: 20 20 20 6d 65 6d 73 65 74 28 26 61 5b 70 50 61     memset(&a[pPa
5020: 72 73 65 2d 3e 6e 7a 56 61 72 5d 2c 20 30 2c 20  rse->nzVar], 0, 
5030: 28 78 2d 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72  (x-pParse->nzVar
5040: 29 2a 73 69 7a 65 6f 66 28 61 5b 30 5d 29 29 3b  )*sizeof(a[0]));
5050: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
5060: 3e 6e 7a 56 61 72 20 3d 20 78 3b 0a 20 20 20 20  >nzVar = x;.    
5070: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b    }.      if( z[
5080: 30 5d 21 3d 27 3f 27 20 7c 7c 20 70 50 61 72 73  0]!='?' || pPars
5090: 65 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 3d 3d 30  e->azVar[x-1]==0
50a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
50b0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 50  te3DbFree(db, pP
50c0: 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d  arse->azVar[x-1]
50d0: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
50e0: 65 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 20 3d 20  e->azVar[x-1] = 
50f0: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
5100: 28 64 62 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20  (db, z, n);.    
5110: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 20    }.    }.  } . 
5120: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 45   if( !pParse->nE
5130: 72 72 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 56  rr && pParse->nV
5140: 61 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  ar>db->aLimit[SQ
5150: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
5160: 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20  BLE_NUMBER] ){. 
5170: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
5180: 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
5190: 6d 61 6e 79 20 53 51 4c 20 76 61 72 69 61 62 6c  many SQL variabl
51a0: 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  es");.  }.}../*.
51b0: 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 64  ** Recursively d
51c0: 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73 73  elete an express
51d0: 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69  ion tree..*/.voi
51e0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  d sqlite3ExprDel
51f0: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
5200: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28   Expr *p){.  if(
5210: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
5220: 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
5230: 6b 3a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  k: Assert that t
5240: 68 65 20 49 6e 74 56 61 6c 75 65 20 69 73 20 6e  he IntValue is n
5250: 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 66 20 69  on-negative if i
5260: 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 61 73  t exists */.  as
5270: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
5280: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74  operty(p, EP_Int
5290: 56 61 6c 75 65 29 20 7c 7c 20 70 2d 3e 75 2e 69  Value) || p->u.i
52a0: 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 69 66  Value>=0 );.  if
52b0: 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f  ( !ExprHasAnyPro
52c0: 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65  perty(p, EP_Toke
52d0: 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 73 71  nOnly) ){.    sq
52e0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
52f0: 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20  db, p->pLeft);. 
5300: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
5310: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 52 69 67  lete(db, p->pRig
5320: 68 74 29 3b 0a 20 20 20 20 69 66 28 20 21 45 78  ht);.    if( !Ex
5330: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
5340: 20 45 50 5f 52 65 64 75 63 65 64 29 20 26 26 20   EP_Reduced) && 
5350: 28 70 2d 3e 66 6c 61 67 73 32 20 26 20 45 50 32  (p->flags2 & EP2
5360: 5f 4d 61 6c 6c 6f 63 65 64 54 6f 6b 65 6e 29 21  _MallocedToken)!
5370: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
5380: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
5390: 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
53a0: 7d 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  }.    if( ExprHa
53b0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
53c0: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
53d0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
53e0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78  tDelete(db, p->x
53f0: 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d  .pSelect);.    }
5400: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
5410: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
5420: 65 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74  e(db, p->x.pList
5430: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
5440: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
5450: 72 74 79 28 70 2c 20 45 50 5f 53 74 61 74 69 63  rty(p, EP_Static
5460: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
5470: 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20  DbFree(db, p);. 
5480: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
5490: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
54a0: 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64   bytes allocated
54b0: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
54c0: 69 6f 6e 20 73 74 72 75 63 74 75 72 65 20 0a 2a  ion structure .*
54d0: 2a 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  * passed as the 
54e0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
54f0: 54 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 6f  This is always o
5500: 6e 65 20 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53  ne of EXPR_FULLS
5510: 49 5a 45 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44  IZE,.** EXPR_RED
5520: 55 43 45 44 53 49 5a 45 20 6f 72 20 45 58 50 52  UCEDSIZE or EXPR
5530: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a  _TOKENONLYSIZE..
5540: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
5550: 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70  prStructSize(Exp
5560: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 45 78 70  r *p){.  if( Exp
5570: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
5580: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20  EP_TokenOnly) ) 
5590: 72 65 74 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45  return EXPR_TOKE
55a0: 4e 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28  NONLYSIZE;.  if(
55b0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
55c0: 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20  (p, EP_Reduced) 
55d0: 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f 52 45  ) return EXPR_RE
55e0: 44 55 43 45 44 53 49 5a 45 3b 0a 20 20 72 65 74  DUCEDSIZE;.  ret
55f0: 75 72 6e 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a  urn EXPR_FULLSIZ
5600: 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  E;.}../*.** The 
5610: 64 75 70 65 64 45 78 70 72 2a 53 69 7a 65 28 29  dupedExpr*Size()
5620: 20 72 6f 75 74 69 6e 65 73 20 65 61 63 68 20 72   routines each r
5630: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
5640: 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72   of bytes requir
5650: 65 64 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 61  ed.** to store a
5660: 20 63 6f 70 79 20 6f 66 20 61 6e 20 65 78 70 72   copy of an expr
5670: 65 73 73 69 6f 6e 20 6f 72 20 65 78 70 72 65 73  ession or expres
5680: 73 69 6f 6e 20 74 72 65 65 2e 20 20 54 68 65 79  sion tree.  They
5690: 20 64 69 66 66 65 72 20 69 6e 0a 2a 2a 20 68 6f   differ in.** ho
56a0: 77 20 6d 75 63 68 20 6f 66 20 74 68 65 20 74 72  w much of the tr
56b0: 65 65 20 69 73 20 6d 65 61 73 75 72 65 64 2e 0a  ee is measured..
56c0: 2a 2a 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45  **.**     dupedE
56d0: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20  xprStructSize() 
56e0: 20 20 20 20 53 69 7a 65 20 6f 66 20 6f 6e 6c 79      Size of only
56f0: 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74   the Expr struct
5700: 75 72 65 20 0a 2a 2a 20 20 20 20 20 64 75 70 65  ure .**     dupe
5710: 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 29 20  dExprNodeSize() 
5720: 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20 45 78        Size of Ex
5730: 70 72 20 2b 20 73 70 61 63 65 20 66 6f 72 20 74  pr + space for t
5740: 6f 6b 65 6e 0a 2a 2a 20 20 20 20 20 64 75 70 65  oken.**     dupe
5750: 64 45 78 70 72 53 69 7a 65 28 29 20 20 20 20 20  dExprSize()     
5760: 20 20 20 20 20 20 45 78 70 72 20 2b 20 74 6f 6b        Expr + tok
5770: 65 6e 20 2b 20 73 75 62 74 72 65 65 20 63 6f 6d  en + subtree com
5780: 70 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a  ponents.**.*****
5790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57d0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  ******.**.** The
57e0: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
57f0: 53 69 7a 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  Size() function 
5800: 72 65 74 75 72 6e 73 20 74 77 6f 20 76 61 6c 75  returns two valu
5810: 65 73 20 4f 52 2d 65 64 20 74 6f 67 65 74 68 65  es OR-ed togethe
5820: 72 3a 20 20 0a 2a 2a 20 28 31 29 20 74 68 65 20  r:  .** (1) the 
5830: 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66  space required f
5840: 6f 72 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  or a copy of the
5850: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20   Expr structure 
5860: 6f 6e 6c 79 20 61 6e 64 20 0a 2a 2a 20 28 32 29  only and .** (2)
5870: 20 74 68 65 20 45 50 5f 78 78 78 20 66 6c 61 67   the EP_xxx flag
5880: 73 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 20  s that indicate 
5890: 77 68 61 74 20 74 68 65 20 73 74 72 75 63 74 75  what the structu
58a0: 72 65 20 73 69 7a 65 20 73 68 6f 75 6c 64 20 62  re size should b
58b0: 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  e..** The return
58c0: 20 76 61 6c 75 65 73 20 69 73 20 61 6c 77 61 79   values is alway
58d0: 73 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20  s one of:.**.** 
58e0: 20 20 20 20 20 45 58 50 52 5f 46 55 4c 4c 53 49       EXPR_FULLSI
58f0: 5a 45 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f  ZE.**      EXPR_
5900: 52 45 44 55 43 45 44 53 49 5a 45 20 20 20 7c 20  REDUCEDSIZE   | 
5910: 45 50 5f 52 65 64 75 63 65 64 0a 2a 2a 20 20 20  EP_Reduced.**   
5920: 20 20 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c     EXPR_TOKENONL
5930: 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e  YSIZE | EP_Token
5940: 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  Only.**.** The s
5950: 69 7a 65 20 6f 66 20 74 68 65 20 73 74 72 75 63  ize of the struc
5960: 74 75 72 65 20 63 61 6e 20 62 65 20 66 6f 75 6e  ture can be foun
5970: 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65  d by masking the
5980: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
5990: 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
59a0: 20 77 69 74 68 20 30 78 66 66 66 2e 20 20 54 68   with 0xfff.  Th
59b0: 65 20 66 6c 61 67 73 20 63 61 6e 20 62 65 20 66  e flags can be f
59c0: 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20  ound by masking 
59d0: 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61  the.** return va
59e0: 6c 75 65 20 77 69 74 68 20 45 50 5f 52 65 64 75  lue with EP_Redu
59f0: 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ced|EP_TokenOnly
5a00: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
5a10: 74 20 77 69 74 68 20 66 6c 61 67 73 3d 3d 45 58  t with flags==EX
5a20: 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 74 68  PRDUP_REDUCE, th
5a30: 69 73 20 72 6f 75 74 69 6e 65 73 20 77 6f 72 6b  is routines work
5a40: 73 20 6f 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a  s on full-size.*
5a50: 2a 20 28 75 6e 72 65 64 75 63 65 64 29 20 45 78  * (unreduced) Ex
5a60: 70 72 20 6f 62 6a 65 63 74 73 20 61 73 20 74 68  pr objects as th
5a70: 65 79 20 6f 72 20 6f 72 69 67 69 6e 61 6c 6c 79  ey or originally
5a80: 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20   constructed by 
5a90: 74 68 65 20 70 61 72 73 65 72 2e 0a 2a 2a 20 44  the parser..** D
5aa0: 75 72 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  uring expression
5ab0: 20 61 6e 61 6c 79 73 69 73 2c 20 65 78 74 72 61   analysis, extra
5ac0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
5ad0: 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 6d 6f 76  computed and mov
5ae0: 65 64 20 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72  ed into.** later
5af0: 20 70 61 72 74 73 20 6f 66 20 74 65 68 20 45 78   parts of teh Ex
5b00: 70 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68  pr object and th
5b10: 61 74 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  at extra informa
5b20: 74 69 6f 6e 20 6d 69 67 68 74 20 67 65 74 20 63  tion might get c
5b30: 68 6f 70 70 65 64 0a 2a 2a 20 6f 66 66 20 69 66  hopped.** off if
5b40: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
5b50: 69 73 20 72 65 64 75 63 65 64 2e 20 20 4e 6f 74  is reduced.  Not
5b60: 65 20 61 6c 73 6f 20 74 68 61 74 20 69 74 20 64  e also that it d
5b70: 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a  oes not work to.
5b80: 2a 2a 20 6d 61 6b 65 20 61 20 45 58 50 52 44 55  ** make a EXPRDU
5b90: 50 5f 52 45 44 55 43 45 20 63 6f 70 79 20 6f 66  P_REDUCE copy of
5ba0: 20 61 20 72 65 64 75 63 65 64 20 65 78 70 72 65   a reduced expre
5bb0: 73 73 69 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e  ssion.  It is on
5bc0: 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72  ly legal.** to r
5bd0: 65 64 75 63 65 20 61 20 70 72 69 73 74 69 6e 65  educe a pristine
5be0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
5bf0: 20 66 72 6f 6d 20 74 68 65 20 70 61 72 73 65 72   from the parser
5c00: 2e 20 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  .  The implement
5c10: 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65  ation.** of dupe
5c20: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
5c30: 29 20 63 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70  ) contain multip
5c40: 6c 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74  le assert() stat
5c50: 65 6d 65 6e 74 73 20 74 68 61 74 20 61 74 74 65  ements that atte
5c60: 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63  mpt.** to enforc
5c70: 65 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  e this constrain
5c80: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
5c90: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
5ca0: 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e  Size(Expr *p, in
5cb0: 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20  t flags){.  int 
5cc0: 6e 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  nSize;.  assert(
5cd0: 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f   flags==EXPRDUP_
5ce0: 52 45 44 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d  REDUCE || flags=
5cf0: 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e  =0 ); /* Only on
5d00: 65 20 66 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c  e flag value all
5d10: 6f 77 65 64 20 2a 2f 0a 20 20 69 66 28 20 30 3d  owed */.  if( 0=
5d20: 3d 28 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f  =(flags&EXPRDUP_
5d30: 52 45 44 55 43 45 29 20 29 7b 0a 20 20 20 20 6e  REDUCE) ){.    n
5d40: 53 69 7a 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c  Size = EXPR_FULL
5d50: 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  SIZE;.  }else{. 
5d60: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
5d70: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
5d80: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
5d90: 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
5da0: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
5db0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
5dc0: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20  _FromJoin) ); . 
5dd0: 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 66     assert( (p->f
5de0: 6c 61 67 73 32 20 26 20 45 50 32 5f 4d 61 6c 6c  lags2 & EP2_Mall
5df0: 6f 63 65 64 54 6f 6b 65 6e 29 3d 3d 30 20 29 3b  ocedToken)==0 );
5e00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d  .    assert( (p-
5e10: 3e 66 6c 61 67 73 32 20 26 20 45 50 32 5f 49 72  >flags2 & EP2_Ir
5e20: 72 65 64 75 63 69 62 6c 65 29 3d 3d 30 20 29 3b  reducible)==0 );
5e30: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66  .    if( p->pLef
5e40: 74 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 20 7c  t || p->pRight |
5e50: 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a  | p->x.pList ){.
5e60: 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58        nSize = EX
5e70: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 7c  PR_REDUCEDSIZE |
5e80: 20 45 50 5f 52 65 64 75 63 65 64 3b 0a 20 20 20   EP_Reduced;.   
5e90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53   }else{.      nS
5ea0: 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e  ize = EXPR_TOKEN
5eb0: 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f  ONLYSIZE | EP_To
5ec0: 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20  kenOnly;.    }. 
5ed0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53 69 7a   }.  return nSiz
5ee0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
5ef0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
5f00: 73 20 74 68 65 20 73 70 61 63 65 20 69 6e 20 62  s the space in b
5f10: 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f  ytes required to
5f20: 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20   store the copy 
5f30: 0a 2a 2a 20 6f 66 20 74 68 65 20 45 78 70 72 20  .** of the Expr 
5f40: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20  structure and a 
5f50: 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72  copy of the Expr
5f60: 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67  .u.zToken string
5f70: 20 28 69 66 20 74 68 61 74 0a 2a 2a 20 73 74 72   (if that.** str
5f80: 69 6e 67 20 69 73 20 64 65 66 69 6e 65 64 2e 29  ing is defined.)
5f90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
5fa0: 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65  upedExprNodeSize
5fb0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c  (Expr *p, int fl
5fc0: 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  ags){.  int nByt
5fd0: 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72  e = dupedExprStr
5fe0: 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  uctSize(p, flags
5ff0: 29 20 26 20 30 78 66 66 66 3b 0a 20 20 69 66 28  ) & 0xfff;.  if(
6000: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
6010: 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  y(p, EP_IntValue
6020: 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  ) && p->u.zToken
6030: 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d   ){.    nByte +=
6040: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
6050: 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b  (p->u.zToken)+1;
6060: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f  .  }.  return RO
6070: 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a  UND8(nByte);.}..
6080: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
6090: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
60a0: 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 72 65   required to cre
60b0: 61 74 65 20 61 20 64 75 70 6c 69 63 61 74 65 20  ate a duplicate 
60c0: 6f 66 20 74 68 65 20 0a 2a 2a 20 65 78 70 72 65  of the .** expre
60d0: 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20  ssion passed as 
60e0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
60f0: 6e 74 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  nt. The second a
6100: 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20  rgument is a.** 
6110: 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20  mask containing 
6120: 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67  EXPRDUP_XXX flag
6130: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c  s..**.** The val
6140: 75 65 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c  ue returned incl
6150: 75 64 65 73 20 73 70 61 63 65 20 74 6f 20 63 72  udes space to cr
6160: 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74  eate a copy of t
6170: 68 65 20 45 78 70 72 20 73 74 72 75 63 74 0a 2a  he Expr struct.*
6180: 2a 20 69 74 73 65 6c 66 20 61 6e 64 20 74 68 65  * itself and the
6190: 20 62 75 66 66 65 72 20 72 65 66 65 72 72 65 64   buffer referred
61a0: 20 74 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a 54   to by Expr.u.zT
61b0: 6f 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a  oken, if any..**
61c0: 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44  .** If the EXPRD
61d0: 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69  UP_REDUCE flag i
61e0: 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
61f0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 63  return value inc
6200: 6c 75 64 65 73 20 0a 2a 2a 20 73 70 61 63 65 20  ludes .** space 
6210: 74 6f 20 64 75 70 6c 69 63 61 74 65 20 61 6c 6c  to duplicate all
6220: 20 45 78 70 72 20 6e 6f 64 65 73 20 69 6e 20 74   Expr nodes in t
6230: 68 65 20 74 72 65 65 20 66 6f 72 6d 65 64 20 62  he tree formed b
6240: 79 20 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a  y Expr.pLeft .**
6250: 20 61 6e 64 20 45 78 70 72 2e 70 52 69 67 68 74   and Expr.pRight
6260: 20 76 61 72 69 61 62 6c 65 73 20 28 62 75 74 20   variables (but 
6270: 6e 6f 74 20 66 6f 72 20 61 6e 79 20 73 74 72 75  not for any stru
6280: 63 74 75 72 65 73 20 70 6f 69 6e 74 65 64 20 74  ctures pointed t
6290: 6f 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64  o or .** descend
62a0: 65 64 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72  ed from the Expr
62b0: 2e 78 2e 70 4c 69 73 74 20 6f 72 20 45 78 70 72  .x.pList or Expr
62c0: 2e 78 2e 70 53 65 6c 65 63 74 20 76 61 72 69 61  .x.pSelect varia
62d0: 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  bles)..*/.static
62e0: 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 69   int dupedExprSi
62f0: 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  ze(Expr *p, int 
6300: 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42  flags){.  int nB
6310: 79 74 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  yte = 0;.  if( p
6320: 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20   ){.    nByte = 
6330: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
6340: 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  e(p, flags);.   
6350: 20 69 66 28 20 66 6c 61 67 73 26 45 58 50 52 44   if( flags&EXPRD
6360: 55 50 5f 52 45 44 55 43 45 20 29 7b 0a 20 20 20  UP_REDUCE ){.   
6370: 20 20 20 6e 42 79 74 65 20 2b 3d 20 64 75 70 65     nByte += dupe
6380: 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65  dExprSize(p->pLe
6390: 66 74 2c 20 66 6c 61 67 73 29 20 2b 20 64 75 70  ft, flags) + dup
63a0: 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 52  edExprSize(p->pR
63b0: 69 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ight, flags);.  
63c0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
63d0: 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nByte;.}../*.**
63e0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
63f0: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c  s similar to sql
6400: 69 74 65 33 45 78 70 72 44 75 70 28 29 2c 20 65  ite3ExprDup(), e
6410: 78 63 65 70 74 20 74 68 61 74 20 69 66 20 70 7a  xcept that if pz
6420: 42 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f  Buffer .** is no
6430: 74 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42  t NULL then *pzB
6440: 75 66 66 65 72 20 69 73 20 61 73 73 75 6d 65 64  uffer is assumed
6450: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62   to point to a b
6460: 75 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75  uffer large enou
6470: 67 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20  gh .** to store 
6480: 74 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70 72  the copy of expr
6490: 65 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f  ession p, the co
64a0: 70 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f  pies of p->u.zTo
64b0: 6b 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69  ken.** (if appli
64c0: 63 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65 20  cable), and the 
64d0: 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 2d  copies of the p-
64e0: 3e 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70 52  >pLeft and p->pR
64f0: 69 67 68 74 20 65 78 70 72 65 73 73 69 6f 6e 73  ight expressions
6500: 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65 66  ,.** if any. Bef
6510: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a  ore returning, *
6520: 70 7a 42 75 66 66 65 72 20 69 73 20 73 65 74 20  pzBuffer is set 
6530: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
6540: 65 20 70 61 73 73 65 64 20 74 68 65 0a 2a 2a 20  e passed the.** 
6550: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 62  portion of the b
6560: 75 66 66 65 72 20 63 6f 70 69 65 64 20 69 6e 74  uffer copied int
6570: 6f 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  o by this functi
6580: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78  on..*/.static Ex
6590: 70 72 20 2a 65 78 70 72 44 75 70 28 73 71 6c 69  pr *exprDup(sqli
65a0: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
65b0: 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 75 38 20  , int flags, u8 
65c0: 2a 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20 20 45  **pzBuffer){.  E
65d0: 78 70 72 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20  xpr *pNew = 0;  
65e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65f0: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
6600: 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 66 28 20  return */.  if( 
6610: 70 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  p ){.    const i
6620: 6e 74 20 69 73 52 65 64 75 63 65 64 20 3d 20 28  nt isReduced = (
6630: 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52 45  flags&EXPRDUP_RE
6640: 44 55 43 45 29 3b 0a 20 20 20 20 75 38 20 2a 7a  DUCE);.    u8 *z
6650: 41 6c 6c 6f 63 3b 0a 20 20 20 20 75 33 32 20 73  Alloc;.    u32 s
6660: 74 61 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a 0a  taticFlag = 0;..
6670: 20 20 20 20 61 73 73 65 72 74 28 20 70 7a 42 75      assert( pzBu
6680: 66 66 65 72 3d 3d 30 20 7c 7c 20 69 73 52 65 64  ffer==0 || isRed
6690: 75 63 65 64 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  uced );..    /* 
66a0: 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 72 65  Figure out where
66b0: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6e 65   to write the ne
66c0: 77 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  w Expr structure
66d0: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 7a 42  . */.    if( pzB
66e0: 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20 7a  uffer ){.      z
66f0: 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65  Alloc = *pzBuffe
6700: 72 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 46  r;.      staticF
6710: 6c 61 67 20 3d 20 45 50 5f 53 74 61 74 69 63 3b  lag = EP_Static;
6720: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6730: 20 20 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74    zAlloc = sqlit
6740: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
6750: 2c 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  , dupedExprSize(
6760: 70 2c 20 66 6c 61 67 73 29 29 3b 0a 20 20 20 20  p, flags));.    
6770: 7d 0a 20 20 20 20 70 4e 65 77 20 3d 20 28 45 78  }.    pNew = (Ex
6780: 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20  pr *)zAlloc;..  
6790: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
67a0: 20 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65 77 53      /* Set nNewS
67b0: 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ize to the size 
67c0: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
67d0: 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e  e structure poin
67e0: 74 65 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ted to.      ** 
67f0: 62 79 20 70 4e 65 77 2e 20 54 68 69 73 20 69 73  by pNew. This is
6800: 20 65 69 74 68 65 72 20 45 58 50 52 5f 46 55 4c   either EXPR_FUL
6810: 4c 53 49 5a 45 2c 20 45 58 50 52 5f 52 45 44 55  LSIZE, EXPR_REDU
6820: 43 45 44 53 49 5a 45 20 6f 72 0a 20 20 20 20 20  CEDSIZE or.     
6830: 20 2a 2a 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e   ** EXPR_TOKENON
6840: 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69  LYSIZE. nToken i
6850: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
6860: 62 65 72 20 6f 66 20 62 79 74 65 73 20 63 6f 6e  ber of bytes con
6870: 73 75 6d 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  sumed.      ** b
6880: 79 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68  y the copy of th
6890: 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74  e p->u.zToken st
68a0: 72 69 6e 67 20 28 69 66 20 61 6e 79 29 2e 0a 20  ring (if any).. 
68b0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
68c0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 6e 53 74  nst unsigned nSt
68d0: 72 75 63 74 53 69 7a 65 20 3d 20 64 75 70 65 64  ructSize = duped
68e0: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  ExprStructSize(p
68f0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  , flags);.      
6900: 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53 69  const int nNewSi
6910: 7a 65 20 3d 20 6e 53 74 72 75 63 74 53 69 7a 65  ze = nStructSize
6920: 20 26 20 30 78 66 66 66 3b 0a 20 20 20 20 20 20   & 0xfff;.      
6930: 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20  int nToken;.    
6940: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
6950: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74  operty(p, EP_Int
6960: 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a  Value) && p->u.z
6970: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  Token ){.       
6980: 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65   nToken = sqlite
6990: 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a  3Strlen30(p->u.z
69a0: 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20 20 20 20  Token) + 1;.    
69b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
69c0: 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 20   nToken = 0;.   
69d0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
69e0: 73 52 65 64 75 63 65 64 20 29 7b 0a 20 20 20 20  sReduced ){.    
69f0: 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72      assert( Expr
6a00: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
6a10: 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 20 29 3b  P_Reduced)==0 );
6a20: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
6a30: 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53  zAlloc, p, nNewS
6a40: 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ize);.      }els
6a50: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  e{.        int n
6a60: 53 69 7a 65 20 3d 20 65 78 70 72 53 74 72 75 63  Size = exprStruc
6a70: 74 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 20 20  tSize(p);.      
6a80: 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c    memcpy(zAlloc,
6a90: 20 70 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20   p, nSize);.    
6aa0: 20 20 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c      memset(&zAll
6ab0: 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58  oc[nSize], 0, EX
6ac0: 50 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a  PR_FULLSIZE-nSiz
6ad0: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  e);.      }..   
6ae0: 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 45 50     /* Set the EP
6af0: 5f 52 65 64 75 63 65 64 2c 20 45 50 5f 54 6f 6b  _Reduced, EP_Tok
6b00: 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45 50 5f 53  enOnly, and EP_S
6b10: 74 61 74 69 63 20 66 6c 61 67 73 20 61 70 70 72  tatic flags appr
6b20: 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20  opriately. */.  
6b30: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
6b40: 26 3d 20 7e 28 45 50 5f 52 65 64 75 63 65 64 7c  &= ~(EP_Reduced|
6b50: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
6b60: 53 74 61 74 69 63 29 3b 0a 20 20 20 20 20 20 70  Static);.      p
6b70: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 6e 53  New->flags |= nS
6b80: 74 72 75 63 74 53 69 7a 65 20 26 20 28 45 50 5f  tructSize & (EP_
6b90: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
6ba0: 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 70 4e 65  Only);.      pNe
6bb0: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 73 74 61 74  w->flags |= stat
6bc0: 69 63 46 6c 61 67 3b 0a 0a 20 20 20 20 20 20 2f  icFlag;..      /
6bd0: 2a 20 43 6f 70 79 20 74 68 65 20 70 2d 3e 75 2e  * Copy the p->u.
6be0: 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 2c 20 69  zToken string, i
6bf0: 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 20 20  f any. */.      
6c00: 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( nToken ){.  
6c10: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 6b        char *zTok
6c20: 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f  en = pNew->u.zTo
6c30: 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 7a 41  ken = (char*)&zA
6c40: 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d 3b 0a  lloc[nNewSize];.
6c50: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a          memcpy(z
6c60: 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f 6b  Token, p->u.zTok
6c70: 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20  en, nToken);.   
6c80: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
6c90: 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73 7c 70 4e  0==((p->flags|pN
6ca0: 65 77 2d 3e 66 6c 61 67 73 29 20 26 20 45 50 5f  ew->flags) & EP_
6cb0: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
6cc0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
6cd0: 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e 70 53 65   the pNew->x.pSe
6ce0: 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d 3e 78 2e  lect or pNew->x.
6cf0: 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e 20 2a 2f  pList member. */
6d00: 0a 20 20 20 20 20 20 20 20 69 66 28 20 45 78 70  .        if( Exp
6d10: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
6d20: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
6d30: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
6d40: 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  >x.pSelect = sql
6d50: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
6d60: 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20  , p->x.pSelect, 
6d70: 69 73 52 65 64 75 63 65 64 29 3b 0a 20 20 20 20  isReduced);.    
6d80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6d90: 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69       pNew->x.pLi
6da0: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
6db0: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 78  ListDup(db, p->x
6dc0: 2e 70 4c 69 73 74 2c 20 69 73 52 65 64 75 63 65  .pList, isReduce
6dd0: 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  d);.        }.  
6de0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
6df0: 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d 3e 70 4c  Fill in pNew->pL
6e00: 65 66 74 20 61 6e 64 20 70 4e 65 77 2d 3e 70 52  eft and pNew->pR
6e10: 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69  ight. */.      i
6e20: 66 28 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f  f( ExprHasAnyPro
6e30: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52  perty(pNew, EP_R
6e40: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
6e50: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
6e60: 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45  zAlloc += dupedE
6e70: 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66  xprNodeSize(p, f
6e80: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 69  lags);.        i
6e90: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
6ea0: 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75  ty(pNew, EP_Redu
6eb0: 63 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ced) ){.        
6ec0: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
6ed0: 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  exprDup(db, p->p
6ee0: 4c 65 66 74 2c 20 45 58 50 52 44 55 50 5f 52 45  Left, EXPRDUP_RE
6ef0: 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a  DUCE, &zAlloc);.
6f00: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
6f10: 70 52 69 67 68 74 20 3d 20 65 78 70 72 44 75 70  pRight = exprDup
6f20: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20  (db, p->pRight, 
6f30: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20  EXPRDUP_REDUCE, 
6f40: 26 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  &zAlloc);.      
6f50: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
6f60: 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20  pzBuffer ){.    
6f70: 20 20 20 20 20 20 2a 70 7a 42 75 66 66 65 72 20        *pzBuffer 
6f80: 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20  = zAlloc;.      
6f90: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
6fa0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  .        pNew->f
6fb0: 6c 61 67 73 32 20 3d 20 30 3b 0a 20 20 20 20 20  lags2 = 0;.     
6fc0: 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73 41     if( !ExprHasA
6fd0: 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  nyProperty(p, EP
6fe0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
6ff0: 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70           pNew->p
7000: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
7010: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65  prDup(db, p->pLe
7020: 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ft, 0);.        
7030: 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d    pNew->pRight =
7040: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
7050: 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 30  db, p->pRight, 0
7060: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
7070: 20 20 20 7d 0a 0a 20 20 20 20 7d 0a 20 20 7d 0a     }..    }.  }.
7080: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
7090: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
70a0: 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72  owing group of r
70b0: 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65  outines make dee
70c0: 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72  p copies of expr
70d0: 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72  essions,.** expr
70e0: 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44  ession lists, ID
70f0: 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65   lists, and sele
7100: 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20  ct statements.  
7110: 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a  The copies can.*
7120: 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28 62 79  * be deleted (by
7130: 20 62 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f   being passed to
7140: 20 74 68 65 69 72 20 72 65 73 70 65 63 74 69 76   their respectiv
7150: 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f  e ...Delete() ro
7160: 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f  utines).** witho
7170: 75 74 20 65 66 66 65 63 74 69 6e 67 20 74 68 65  ut effecting the
7180: 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a   originals..**.*
7190: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
71a0: 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73   list, ID, and s
71b0: 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65 74 75  ource lists retu
71c0: 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78 70  rn by sqlite3Exp
71d0: 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73  rListDup(),.** s
71e0: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28  qlite3IdListDup(
71f0: 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72  ), and sqlite3Sr
7200: 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e  cListDup() can n
7210: 6f 74 20 62 65 20 66 75 72 74 68 65 72 20 65 78  ot be further ex
7220: 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75  panded .** by su
7230: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
7240: 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70  o sqlite*ListApp
7250: 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a  end() routines..
7260: 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73  **.** Any tables
7270: 20 74 68 61 74 20 74 68 65 20 53 72 63 4c 69 73   that the SrcLis
7280: 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  t might point to
7290: 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61   are not duplica
72a0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ted..**.** The f
72b0: 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 63  lags parameter c
72c0: 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e  ontains a combin
72d0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45 58 50  ation of the EXP
72e0: 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a  RDUP_XXX flags..
72f0: 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55  ** If the EXPRDU
7300: 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73  P_REDUCE flag is
7310: 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 73   set, then the s
7320: 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65  tructure returne
7330: 64 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61  d is a.** trunca
7340: 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  ted version of t
7350: 68 65 20 75 73 75 61 6c 20 45 78 70 72 20 73 74  he usual Expr st
7360: 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c  ructure that wil
7370: 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a  l be stored as.*
7380: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e  * part of the in
7390: 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
73a0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61  tation of the da
73b0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a  tabase schema..*
73c0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
73d0: 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a  xprDup(sqlite3 *
73e0: 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74  db, Expr *p, int
73f0: 20 66 6c 61 67 73 29 7b 0a 20 20 72 65 74 75 72   flags){.  retur
7400: 6e 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2c  n exprDup(db, p,
7410: 20 66 6c 61 67 73 2c 20 30 29 3b 0a 7d 0a 45 78   flags, 0);.}.Ex
7420: 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45  prList *sqlite3E
7430: 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c 69 74  xprListDup(sqlit
7440: 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74  e3 *db, ExprList
7450: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
7460: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65  .  ExprList *pNe
7470: 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  w;.  struct Expr
7480: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
7490: 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69  , *pOldItem;.  i
74a0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30  nt i;.  if( p==0
74b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
74c0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
74d0: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
74e0: 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
74f0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
7500: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
7510: 69 45 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20  iECursor = 0;.  
7520: 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 69 20  pNew->nExpr = i 
7530: 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66  = p->nExpr;.  if
7540: 28 20 28 66 6c 61 67 73 20 26 20 45 58 50 52 44  ( (flags & EXPRD
7550: 55 50 5f 52 45 44 55 43 45 29 3d 3d 30 20 29 20  UP_REDUCE)==0 ) 
7560: 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 45  for(i=1; i<p->nE
7570: 78 70 72 3b 20 69 2b 3d 69 29 7b 7d 0a 20 20 70  xpr; i+=i){}.  p
7580: 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d  New->a = pItem =
7590: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
75a0: 52 61 77 28 64 62 2c 20 20 69 2a 73 69 7a 65 6f  Raw(db,  i*sizeo
75b0: 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20  f(p->a[0]) );.  
75c0: 69 66 28 20 70 49 74 65 6d 3d 3d 30 20 29 7b 0a  if( pItem==0 ){.
75d0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
75e0: 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20  e(db, pNew);.   
75f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20 0a   return 0;.  } .
7600: 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e    pOldItem = p->
7610: 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  a;.  for(i=0; i<
7620: 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  p->nExpr; i++, p
7630: 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d  Item++, pOldItem
7640: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
7650: 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74  OldExpr = pOldIt
7660: 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 70  em->pExpr;.    p
7670: 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71  Item->pExpr = sq
7680: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
7690: 20 70 4f 6c 64 45 78 70 72 2c 20 66 6c 61 67 73   pOldExpr, flags
76a0: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e  );.    pItem->zN
76b0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
76c0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
76d0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
76e0: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73  pItem->zSpan = s
76f0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
7700: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 53 70  b, pOldItem->zSp
7710: 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  an);.    pItem->
7720: 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64  sortOrder = pOld
7730: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b  Item->sortOrder;
7740: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65  .    pItem->done
7750: 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65 6d 2d   = 0;.    pItem-
7760: 3e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 70  >iOrderByCol = p
7770: 4f 6c 64 49 74 65 6d 2d 3e 69 4f 72 64 65 72 42  OldItem->iOrderB
7780: 79 43 6f 6c 3b 0a 20 20 20 20 70 49 74 65 6d 2d  yCol;.    pItem-
7790: 3e 69 41 6c 69 61 73 20 3d 20 70 4f 6c 64 49 74  >iAlias = pOldIt
77a0: 65 6d 2d 3e 69 41 6c 69 61 73 3b 0a 20 20 7d 0a  em->iAlias;.  }.
77b0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
77c0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f  ../*.** If curso
77d0: 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69  rs, triggers, vi
77e0: 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69  ews and subqueri
77f0: 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74  es are all omitt
7800: 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62  ed from.** the b
7810: 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20  uild, then none 
7820: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
7830: 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70   routines, excep
7840: 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65  t for .** sqlite
7850: 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61  3SelectDup(), ca
7860: 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c  n be called. sql
7870: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 20  ite3SelectDup() 
7880: 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20  is sometimes.** 
7890: 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55  called with a NU
78a0: 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  LL argument..*/.
78b0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
78c0: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
78d0: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
78e0: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20  E_OMIT_TRIGGER) 
78f0: 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  \. || !defined(S
7900: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
7910: 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71  ERY).SrcList *sq
7920: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28  lite3SrcListDup(
7930: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63  sqlite3 *db, Src
7940: 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61  List *p, int fla
7950: 67 73 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  gs){.  SrcList *
7960: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pNew;.  int i;. 
7970: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66   int nByte;.  if
7980: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
7990: 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  0;.  nByte = siz
79a0: 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53  eof(*p) + (p->nS
79b0: 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d  rc>0 ? sizeof(p-
79c0: 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72  >a[0]) * (p->nSr
79d0: 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65  c-1) : 0);.  pNe
79e0: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
79f0: 6c 6f 63 52 61 77 28 64 62 2c 20 6e 42 79 74 65  locRaw(db, nByte
7a00: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
7a10: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
7a20: 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65  pNew->nSrc = pNe
7a30: 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e  w->nAlloc = p->n
7a40: 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  Src;.  for(i=0; 
7a50: 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  i<p->nSrc; i++){
7a60: 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
7a70: 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74  ist_item *pNewIt
7a80: 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d  em = &pNew->a[i]
7a90: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  ;.    struct Src
7aa0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49  List_item *pOldI
7ab0: 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a  tem = &p->a[i];.
7ac0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
7ad0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
7ae0: 53 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65  Schema = pOldIte
7af0: 6d 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  m->pSchema;.    
7b00: 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62  pNewItem->zDatab
7b10: 61 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ase = sqlite3DbS
7b20: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
7b30: 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
7b40: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e      pNewItem->zN
7b50: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
7b60: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
7b70: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
7b80: 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  pNewItem->zAlias
7b90: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
7ba0: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
7bb0: 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e  >zAlias);.    pN
7bc0: 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ewItem->jointype
7bd0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69   = pOldItem->joi
7be0: 6e 74 79 70 65 3b 0a 20 20 20 20 70 4e 65 77 49  ntype;.    pNewI
7bf0: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70  tem->iCursor = p
7c00: 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  OldItem->iCursor
7c10: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
7c20: 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 70 4f  addrFillSub = pO
7c30: 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c  ldItem->addrFill
7c40: 53 75 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  Sub;.    pNewIte
7c50: 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 70  m->regReturn = p
7c60: 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  OldItem->regRetu
7c70: 72 6e 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  rn;.    pNewItem
7c80: 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 20 3d  ->isCorrelated =
7c90: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 43 6f 72   pOldItem->isCor
7ca0: 72 65 6c 61 74 65 64 3b 0a 20 20 20 20 70 4e 65  related;.    pNe
7cb0: 77 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74  wItem->viaCorout
7cc0: 69 6e 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  ine = pOldItem->
7cd0: 76 69 61 43 6f 72 6f 75 74 69 6e 65 3b 0a 20 20  viaCoroutine;.  
7ce0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 49 6e 64    pNewItem->zInd
7cf0: 65 78 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  ex = sqlite3DbSt
7d00: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
7d10: 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a 20 20 20 20  m->zIndex);.    
7d20: 70 4e 65 77 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64  pNewItem->notInd
7d30: 65 78 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  exed = pOldItem-
7d40: 3e 6e 6f 74 49 6e 64 65 78 65 64 3b 0a 20 20 20  >notIndexed;.   
7d50: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 6e 64 65   pNewItem->pInde
7d60: 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 49  x = pOldItem->pI
7d70: 6e 64 65 78 3b 0a 20 20 20 20 70 54 61 62 20 3d  ndex;.    pTab =
7d80: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20   pNewItem->pTab 
7d90: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62  = pOldItem->pTab
7da0: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29  ;.    if( pTab )
7db0: 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  {.      pTab->nR
7dc0: 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ef++;.    }.    
7dd0: 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63  pNewItem->pSelec
7de0: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
7df0: 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  tDup(db, pOldIte
7e00: 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61 67  m->pSelect, flag
7e10: 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  s);.    pNewItem
7e20: 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45  ->pOn = sqlite3E
7e30: 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  xprDup(db, pOldI
7e40: 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29  tem->pOn, flags)
7e50: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
7e60: 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  pUsing = sqlite3
7e70: 49 64 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f  IdListDup(db, pO
7e80: 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b  ldItem->pUsing);
7e90: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63  .    pNewItem->c
7ea0: 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65  olUsed = pOldIte
7eb0: 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a  m->colUsed;.  }.
7ec0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
7ed0: 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
7ee0: 49 64 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65  IdListDup(sqlite
7ef0: 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70  3 *db, IdList *p
7f00: 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65  ){.  IdList *pNe
7f10: 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  w;.  int i;.  if
7f20: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
7f30: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
7f40: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
7f50: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  b, sizeof(*pNew)
7f60: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
7f70: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
7f80: 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e  pNew->nId = p->n
7f90: 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  Id;.  pNew->a = 
7fa0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
7fb0: 61 77 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69  aw(db, p->nId*si
7fc0: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b  zeof(p->a[0]) );
7fd0: 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d  .  if( pNew->a==
7fe0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
7ff0: 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29  DbFree(db, pNew)
8000: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
8010: 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68    }.  /* Note th
8020: 61 74 20 62 65 63 61 75 73 65 20 74 68 65 20 73  at because the s
8030: 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63  ize of the alloc
8040: 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d  ation for p->a[]
8050: 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63   is not.  ** nec
8060: 65 73 73 61 72 69 6c 79 20 61 20 70 6f 77 65 72  essarily a power
8070: 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74 65 33   of two, sqlite3
8080: 49 64 4c 69 73 74 41 70 70 65 6e 64 28 29 20 6d  IdListAppend() m
8090: 61 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64  ay not be called
80a0: 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 75 70  .  ** on the dup
80b0: 6c 69 63 61 74 65 20 63 72 65 61 74 65 64 20 62  licate created b
80c0: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
80d0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
80e0: 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  <p->nId; i++){. 
80f0: 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
8100: 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20  _item *pNewItem 
8110: 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20  = &pNew->a[i];. 
8120: 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
8130: 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20  _item *pOldItem 
8140: 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  = &p->a[i];.    
8150: 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  pNewItem->zName 
8160: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
8170: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
8180: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77  zName);.    pNew
8190: 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64  Item->idx = pOld
81a0: 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20  Item->idx;.  }. 
81b0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
81c0: 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53  Select *sqlite3S
81d0: 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65 33  electDup(sqlite3
81e0: 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c   *db, Select *p,
81f0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53   int flags){.  S
8200: 65 6c 65 63 74 20 2a 70 4e 65 77 2c 20 2a 70 50  elect *pNew, *pP
8210: 72 69 6f 72 3b 0a 20 20 69 66 28 20 70 3d 3d 30  rior;.  if( p==0
8220: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
8230: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
8240: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
8250: 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
8260: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
8270: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c  n 0;.  pNew->pEL
8280: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
8290: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
82a0: 70 45 4c 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a  pEList, flags);.
82b0: 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73    pNew->pSrc = s
82c0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
82d0: 28 64 62 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c  (db, p->pSrc, fl
82e0: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57  ags);.  pNew->pW
82f0: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
8300: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 68  prDup(db, p->pWh
8310: 65 72 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  ere, flags);.  p
8320: 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  New->pGroupBy = 
8330: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
8340: 75 70 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70  up(db, p->pGroup
8350: 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  By, flags);.  pN
8360: 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71  ew->pHaving = sq
8370: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
8380: 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61   p->pHaving, fla
8390: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72  gs);.  pNew->pOr
83a0: 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
83b0: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
83c0: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 66 6c 61 67  ->pOrderBy, flag
83d0: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  s);.  pNew->op =
83e0: 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e   p->op;.  pNew->
83f0: 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 20  pPrior = pPrior 
8400: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
8410: 75 70 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72  up(db, p->pPrior
8420: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20  , flags);.  if( 
8430: 70 50 72 69 6f 72 20 29 20 70 50 72 69 6f 72 2d  pPrior ) pPrior-
8440: 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20  >pNext = pNew;. 
8450: 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30   pNew->pNext = 0
8460: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74  ;.  pNew->pLimit
8470: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
8480: 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c  p(db, p->pLimit,
8490: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
84a0: 3e 70 4f 66 66 73 65 74 20 3d 20 73 71 6c 69 74  >pOffset = sqlit
84b0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
84c0: 3e 70 4f 66 66 73 65 74 2c 20 66 6c 61 67 73 29  >pOffset, flags)
84d0: 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74  ;.  pNew->iLimit
84e0: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f   = 0;.  pNew->iO
84f0: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4e 65  ffset = 0;.  pNe
8500: 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d  w->selFlags = p-
8510: 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e 53 46 5f  >selFlags & ~SF_
8520: 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
8530: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d 6f 73   pNew->pRightmos
8540: 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 61  t = 0;.  pNew->a
8550: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
8560: 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64   -1;.  pNew->add
8570: 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d  rOpenEphm[1] = -
8580: 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  1;.  pNew->addrO
8590: 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b  penEphm[2] = -1;
85a0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
85b0: 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a  }.#else.Select *
85c0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
85d0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65  (sqlite3 *db, Se
85e0: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61  lect *p, int fla
85f0: 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  gs){.  assert( p
8600: 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
8610: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  0;.}.#endif.../*
8620: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
8630: 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e 64  ement to the end
8640: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
8650: 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69 73  n list.  If pLis
8660: 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c  t is.** initiall
8670: 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65  y NULL, then cre
8680: 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65 73  ate a new expres
8690: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
86a0: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
86b0: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63  ocation error oc
86c0: 63 75 72 73 2c 20 74 68 65 20 65 6e 74 69 72 65  curs, the entire
86d0: 20 6c 69 73 74 20 69 73 20 66 72 65 65 64 20 61   list is freed a
86e0: 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65  nd.** NULL is re
86f0: 74 75 72 6e 65 64 2e 20 20 49 66 20 6e 6f 6e 2d  turned.  If non-
8700: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
8710: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61  , then it is gua
8720: 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68 61 74 20  ranteed.** that 
8730: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 61  the new entry wa
8740: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61  s successfully a
8750: 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70 72  ppended..*/.Expr
8760: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70  List *sqlite3Exp
8770: 72 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 50  rListAppend(.  P
8780: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
8790: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
87a0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
87b0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
87c0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
87d0: 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e  o which to appen
87e0: 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  d. Might be NULL
87f0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
8800: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r             /*
8810: 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62   Expression to b
8820: 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69 67 68  e appended. Migh
8830: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
8840: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
8850: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
8860: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
8870: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
8880: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
8890: 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73  , sizeof(ExprLis
88a0: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
88b0: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
88c0: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
88d0: 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20   }.    pList->a 
88e0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
88f0: 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
8900: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
8910: 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 3d     if( pList->a=
8920: 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  =0 ) goto no_mem
8930: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70  ;.  }else if( (p
8940: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26 20 28 70  List->nExpr & (p
8950: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 29 3d  List->nExpr-1))=
8960: 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  =0 ){.    struct
8970: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
8980: 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  a;.    assert( p
8990: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
89a0: 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33  .    a = sqlite3
89b0: 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c  DbRealloc(db, pL
89c0: 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e  ist->a, pList->n
89d0: 45 78 70 72 2a 32 2a 73 69 7a 65 6f 66 28 70 4c  Expr*2*sizeof(pL
89e0: 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20  ist->a[0]));.   
89f0: 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20   if( a==0 ){.   
8a00: 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
8a10: 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d      }.    pList-
8a20: 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 61 73  >a = a;.  }.  as
8a30: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d  sert( pList->a!=
8a40: 30 20 29 3b 0a 20 20 69 66 28 20 31 20 29 7b 0a  0 );.  if( 1 ){.
8a50: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
8a60: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
8a70: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
8a80: 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20  t->nExpr++];.   
8a90: 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30   memset(pItem, 0
8aa0: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29  , sizeof(*pItem)
8ab0: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45  );.    pItem->pE
8ac0: 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d  xpr = pExpr;.  }
8ad0: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
8ae0: 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20  ..no_mem:     . 
8af0: 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e   /* Avoid leakin
8b00: 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c  g memory if mall
8b10: 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a  oc has failed. *
8b20: 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  /.  sqlite3ExprD
8b30: 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
8b40: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
8b50: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
8b60: 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ist);.  return 0
8b70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
8b80: 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e  he ExprList.a[].
8b90: 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20 6f 66  zName element of
8ba0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
8bb0: 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a  ly added item.**
8bc0: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
8bd0: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70  on list..**.** p
8be0: 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55  List might be NU
8bf0: 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20  LL following an 
8c00: 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20  OOM error.  But 
8c10: 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 65 76  pName should nev
8c20: 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20  er be.** NULL.  
8c30: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
8c40: 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68  cation fails, th
8c50: 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  e pParse->db->ma
8c60: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a  llocFailed flag.
8c70: 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f  ** is set..*/.vo
8c80: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
8c90: 73 74 53 65 74 4e 61 6d 65 28 0a 20 20 50 61 72  stSetName(.  Par
8ca0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
8cb0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
8cc0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
8cd0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
8ce0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
8cf0: 77 68 69 63 68 20 74 6f 20 61 64 64 20 74 68 65  which to add the
8d00: 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65   span. */.  Toke
8d10: 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20  n *pName,       
8d20: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f 20 62      /* Name to b
8d30: 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74  e added */.  int
8d40: 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20   dequote        
8d50: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
8d60: 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65 20 74  cause the name t
8d70: 6f 20 62 65 20 64 65 71 75 6f 74 65 64 20 2a 2f  o be dequoted */
8d80: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  .){.  assert( pL
8d90: 69 73 74 21 3d 30 20 7c 7c 20 70 50 61 72 73 65  ist!=0 || pParse
8da0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
8db0: 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
8dc0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75  List ){.    stru
8dd0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
8de0: 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 73 73   *pItem;.    ass
8df0: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
8e00: 72 3e 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d  r>0 );.    pItem
8e10: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
8e20: 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20  st->nExpr-1];.  
8e30: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
8e40: 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20  >zName==0 );.   
8e50: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
8e60: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
8e70: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61  (pParse->db, pNa
8e80: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29  me->z, pName->n)
8e90: 3b 0a 20 20 20 20 69 66 28 20 64 65 71 75 6f 74  ;.    if( dequot
8ea0: 65 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  e && pItem->zNam
8eb0: 65 20 29 20 73 71 6c 69 74 65 33 44 65 71 75 6f  e ) sqlite3Dequo
8ec0: 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  te(pItem->zName)
8ed0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
8ee0: 65 74 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e  et the ExprList.
8ef0: 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d 65 6e  a[].zSpan elemen
8f00: 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  t of the most re
8f10: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65  cently added ite
8f20: 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72  m.** on the expr
8f30: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
8f40: 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62  ** pList might b
8f50: 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67  e NULL following
8f60: 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20   an OOM error.  
8f70: 42 75 74 20 70 53 70 61 6e 20 73 68 6f 75 6c 64  But pSpan should
8f80: 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c   never be.** NUL
8f90: 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  L.  If a memory 
8fa0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
8fb0: 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62  , the pParse->db
8fc0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
8fd0: 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a  lag.** is set..*
8fe0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
8ff0: 70 72 4c 69 73 74 53 65 74 53 70 61 6e 28 0a 20  prListSetSpan(. 
9000: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9010: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
9020: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
9030: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
9040: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ,        /* List
9050: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64   to which to add
9060: 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20   the span. */.  
9070: 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61 6e 20  ExprSpan *pSpan 
9080: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
9090: 70 61 6e 20 74 6f 20 62 65 20 61 64 64 65 64 20  pan to be added 
90a0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
90b0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
90c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
90d0: 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  t!=0 || db->mall
90e0: 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20  ocFailed!=0 );. 
90f0: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
9100: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
9110: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
9120: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
9130: 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61  >nExpr-1];.    a
9140: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
9150: 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  xpr>0 );.    ass
9160: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
9170: 61 69 6c 65 64 20 7c 7c 20 70 49 74 65 6d 2d 3e  ailed || pItem->
9180: 70 45 78 70 72 3d 3d 70 53 70 61 6e 2d 3e 70 45  pExpr==pSpan->pE
9190: 78 70 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  xpr );.    sqlit
91a0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
91b0: 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  em->zSpan);.    
91c0: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73  pItem->zSpan = s
91d0: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
91e0: 64 62 2c 20 28 63 68 61 72 2a 29 70 53 70 61 6e  db, (char*)pSpan
91f0: 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20 20 20  ->zStart,.      
9200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
9220: 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20  nt)(pSpan->zEnd 
9230: 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29  - pSpan->zStart)
9240: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
9250: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
9260: 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20 63 6f  n list pEList co
9270: 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e  ntains more than
9280: 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73   iLimit elements
9290: 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72  ,.** leave an er
92a0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
92b0: 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Parse..*/.void s
92c0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 68  qlite3ExprListCh
92d0: 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61 72  eckLength(.  Par
92e0: 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 45 78  se *pParse,.  Ex
92f0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a  prList *pEList,.
9300: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
9310: 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74 20 6d  bject.){.  int m
9320: 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  x = pParse->db->
9330: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
9340: 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74  MIT_COLUMN];.  t
9350: 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20  estcase( pEList 
9360: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
9370: 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74 63 61  ==mx );.  testca
9380: 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  se( pEList && pE
9390: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b  List->nExpr==mx+
93a0: 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  1 );.  if( pELis
93b0: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
93c0: 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73 71 6c  pr>mx ){.    sql
93d0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
93e0: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63  rse, "too many c
93f0: 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a  olumns in %s", z
9400: 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  Object);.  }.}..
9410: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
9420: 65 6e 74 69 72 65 20 65 78 70 72 65 73 73 69 6f  entire expressio
9430: 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  n list..*/.void 
9440: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
9450: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
9460: 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  b, ExprList *pLi
9470: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
9480: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
9490: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
94a0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
94b0: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
94c0: 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 70  pList->a!=0 || p
94d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 29  List->nExpr==0 )
94e0: 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
94f0: 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70  ist->a, i=0; i<p
9500: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
9510: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
9520: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
9530: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78  e(db, pItem->pEx
9540: 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pr);.    sqlite3
9550: 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
9560: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ->zName);.    sq
9570: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9580: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20  pItem->zSpan);. 
9590: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
95a0: 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29  ee(db, pList->a)
95b0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
95c0: 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a  e(db, pList);.}.
95d0: 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  ./*.** These rou
95e0: 74 69 6e 65 73 20 61 72 65 20 57 61 6c 6b 65 72  tines are Walker
95f0: 20 63 61 6c 6c 62 61 63 6b 73 2e 20 20 57 61 6c   callbacks.  Wal
9600: 6b 65 72 2e 75 2e 70 69 20 69 73 20 61 20 70 6f  ker.u.pi is a po
9610: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 69  inter.** to an i
9620: 6e 74 65 67 65 72 2e 20 20 54 68 65 73 65 20 72  nteger.  These r
9630: 6f 75 74 69 6e 65 73 20 61 72 65 20 63 68 65 63  outines are chec
9640: 6b 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73 69  king an expressi
9650: 6f 6e 20 74 6f 20 73 65 65 0a 2a 2a 20 69 66 20  on to see.** if 
9660: 69 74 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  it is a constant
9670: 2e 20 20 53 65 74 20 2a 57 61 6c 6b 65 72 2e 75  .  Set *Walker.u
9680: 2e 70 69 20 74 6f 20 30 20 69 66 20 74 68 65 20  .pi to 0 if the 
9690: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a  expression is.**
96a0: 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a   not constant..*
96b0: 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 62  *.** These callb
96c0: 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ack routines are
96d0: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
96e0: 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  nt the following
96f0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69  :.**.**     sqli
9700: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
9710: 74 28 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  t().**     sqlit
9720: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
9730: 4e 6f 74 4a 6f 69 6e 28 29 0a 2a 2a 20 20 20 20  NotJoin().**    
9740: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
9750: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
9760: 28 29 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  ().**.*/.static 
9770: 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  int exprNodeIsCo
9780: 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70  nstant(Walker *p
9790: 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
97a0: 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70  xpr){..  /* If p
97b0: 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 69 73 20 33  Walker->u.i is 3
97c0: 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d 20 6f   then any term o
97d0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
97e0: 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72 6f 6d   that comes from
97f0: 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20  .  ** the ON or 
9800: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
9810: 20 61 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69   a join disquali
9820: 66 69 65 73 20 74 68 65 20 65 78 70 72 65 73 73  fies the express
9830: 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65  ion.  ** from be
9840: 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 63  ing considered c
9850: 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66  onstant. */.  if
9860: 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d  ( pWalker->u.i==
9870: 33 20 26 26 20 45 78 70 72 48 61 73 41 6e 79 50  3 && ExprHasAnyP
9880: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
9890: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
98a0: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20     pWalker->u.i 
98b0: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
98c0: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a  WRC_Abort;.  }..
98d0: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
98e0: 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  >op ){.    /* Co
98f0: 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e 73  nsider functions
9900: 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20   to be constant 
9910: 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72 67  if all their arg
9920: 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73 74  uments are const
9930: 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 70  ant.    ** and p
9940: 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 32 20 2a  Walker->u.i==2 *
9950: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  /.    case TK_FU
9960: 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66  NCTION:.      if
9970: 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d  ( pWalker->u.i==
9980: 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  2 ) return 0;.  
9990: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f      /* Fall thro
99a0: 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ugh */.    case 
99b0: 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20  TK_ID:.    case 
99c0: 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63  TK_COLUMN:.    c
99d0: 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
99e0: 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ION:.    case TK
99f0: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  _AGG_COLUMN:.   
9a00: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
9a10: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b  pr->op==TK_ID );
9a20: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
9a30: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
9a40: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74  OLUMN );.      t
9a50: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
9a60: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
9a70: 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ION );.      tes
9a80: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
9a90: 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
9aa0: 29 3b 0a 20 20 20 20 20 20 70 57 61 6c 6b 65 72  );.      pWalker
9ab0: 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 20 20 20  ->u.i = 0;.     
9ac0: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
9ad0: 74 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  t;.    default:.
9ae0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9af0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
9b00: 4c 45 43 54 20 29 3b 20 2f 2a 20 73 65 6c 65 63  LECT ); /* selec
9b10: 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20  tNodeIsConstant 
9b20: 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f  will disallow */
9b30: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
9b40: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
9b50: 58 49 53 54 53 20 29 3b 20 2f 2a 20 73 65 6c 65  XISTS ); /* sele
9b60: 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  ctNodeIsConstant
9b70: 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a   will disallow *
9b80: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  /.      return W
9b90: 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d  RC_Continue;.  }
9ba0: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  .}.static int se
9bb0: 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61  lectNodeIsConsta
9bc0: 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  nt(Walker *pWalk
9bd0: 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55  er, Select *NotU
9be0: 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  sed){.  UNUSED_P
9bf0: 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
9c00: 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  );.  pWalker->u.
9c10: 69 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  i = 0;.  return 
9c20: 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74 61  WRC_Abort;.}.sta
9c30: 74 69 63 20 69 6e 74 20 65 78 70 72 49 73 43 6f  tic int exprIsCo
9c40: 6e 73 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  nst(Expr *p, int
9c50: 20 69 6e 69 74 46 6c 61 67 29 7b 0a 20 20 57 61   initFlag){.  Wa
9c60: 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 75 2e 69 20  lker w;.  w.u.i 
9c70: 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20 20 77 2e  = initFlag;.  w.
9c80: 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
9c90: 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
9ca0: 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  nt;.  w.xSelectC
9cb0: 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74  allback = select
9cc0: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a  NodeIsConstant;.
9cd0: 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
9ce0: 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75  r(&w, p);.  retu
9cf0: 72 6e 20 77 2e 75 2e 69 3b 0a 7d 0a 0a 2f 2a 0a  rn w.u.i;.}../*.
9d00: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
9d10: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
9d20: 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70  urn 1 if the exp
9d30: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
9d40: 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20  ant.** and 0 if 
9d50: 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69  it involves vari
9d60: 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f  ables or functio
9d70: 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46  n calls..**.** F
9d80: 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
9d90: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
9da0: 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  , a double-quote
9db0: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61  d string (ex: "a
9dc0: 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  bc").** is consi
9dd0: 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65  dered a variable
9de0: 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75   but a single-qu
9df0: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
9e00: 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20   'abc') is.** a 
9e10: 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74  constant..*/.int
9e20: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
9e30: 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29 7b  nstant(Expr *p){
9e40: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
9e50: 43 6f 6e 73 74 28 70 2c 20 31 29 3b 0a 7d 0a 0a  Const(p, 1);.}..
9e60: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
9e70: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
9e80: 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
9e90: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
9ea0: 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 61 74 20 64  nstant.** that d
9eb0: 6f 65 73 20 6e 6f 20 6f 72 69 67 69 6e 61 74 65  oes no originate
9ec0: 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20   from the ON or 
9ed0: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
9ee0: 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75   a join..** Retu
9ef0: 72 6e 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c  rn 0 if it invol
9f00: 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72  ves variables or
9f10: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20   function calls 
9f20: 6f 72 20 74 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a  or terms from.**
9f30: 20 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20   an ON or USING 
9f40: 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  clause..*/.int s
9f50: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
9f60: 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72  tantNotJoin(Expr
9f70: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65   *p){.  return e
9f80: 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 33 29  xprIsConst(p, 3)
9f90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
9fa0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
9fb0: 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  ee.  Return 1 if
9fc0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9fd0: 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f  is constant.** o
9fe0: 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  r a function cal
9ff0: 6c 20 77 69 74 68 20 63 6f 6e 73 74 61 6e 74 20  l with constant 
a000: 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75  arguments.  Retu
a010: 72 6e 20 61 6e 64 20 30 20 69 66 20 74 68 65 72  rn and 0 if ther
a020: 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76 61 72  e.** are any var
a030: 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f  iables..**.** Fo
a040: 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
a050: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  f this function,
a060: 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64   a double-quoted
a070: 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62   string (ex: "ab
a080: 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64  c").** is consid
a090: 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65 20  ered a variable 
a0a0: 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f  but a single-quo
a0b0: 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
a0c0: 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63  'abc') is.** a c
a0d0: 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  onstant..*/.int 
a0e0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
a0f0: 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
a100: 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
a110: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
a120: 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  , 2);.}../*.** I
a130: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
a140: 20 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73 74   p codes a const
a150: 61 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61 74  ant integer that
a160: 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
a170: 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20  .** to fit in a 
a180: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20  32-bit integer, 
a190: 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75 74  return 1 and put
a1a0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
a1b0: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20  e integer.** in 
a1c0: 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68 65  *pValue.  If the
a1d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e   expression is n
a1e0: 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72  ot an integer or
a1f0: 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62 69   if it is too bi
a200: 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61  g.** to fit in a
a210: 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69   signed 32-bit i
a220: 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 30  nteger, return 0
a230: 20 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61 6c   and leave *pVal
a240: 75 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  ue unchanged..*/
a250: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
a260: 49 73 49 6e 74 65 67 65 72 28 45 78 70 72 20 2a  IsInteger(Expr *
a270: 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b  p, int *pValue){
a280: 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 0a  .  int rc = 0;..
a290: 20 20 2f 2a 20 49 66 20 61 6e 20 65 78 70 72 65    /* If an expre
a2a0: 73 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65  ssion is an inte
a2b0: 67 65 72 20 6c 69 74 65 72 61 6c 20 74 68 61 74  ger literal that
a2c0: 20 66 69 74 73 20 69 6e 20 61 20 73 69 67 6e 65   fits in a signe
a2d0: 64 20 33 32 2d 62 69 74 0a 20 20 2a 2a 20 69 6e  d 32-bit.  ** in
a2e0: 74 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20  teger, then the 
a2f0: 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67  EP_IntValue flag
a300: 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61   will have alrea
a310: 64 79 20 62 65 65 6e 20 73 65 74 20 2a 2f 0a 20  dy been set */. 
a320: 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d   assert( p->op!=
a330: 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 28 70  TK_INTEGER || (p
a340: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74  ->flags & EP_Int
a350: 56 61 6c 75 65 29 21 3d 30 0a 20 20 20 20 20 20  Value)!=0.      
a360: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47       || sqlite3G
a370: 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f  etInt32(p->u.zTo
a380: 6b 65 6e 2c 20 26 72 63 29 3d 3d 30 20 29 3b 0a  ken, &rc)==0 );.
a390: 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20  .  if( p->flags 
a3a0: 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
a3b0: 0a 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 70  .    *pValue = p
a3c0: 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20  ->u.iValue;.    
a3d0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
a3e0: 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
a3f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
a400: 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  US: {.      rc =
a410: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
a420: 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
a430: 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62  pValue);.      b
a440: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
a450: 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
a460: 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a 20  {.      int v;. 
a470: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
a480: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
a490: 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a 20  >pLeft, &v) ){. 
a4a0: 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d         *pValue =
a4b0: 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 63 20   -v;.        rc 
a4c0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
a4d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
a4e0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65      default: bre
a4f0: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
a500: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
a510: 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68  turn FALSE if th
a520: 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
a530: 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
a540: 73 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c  sion can be NULL
a550: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
a560: 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20  xpression might 
a570: 62 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68  be NULL or if th
a580: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
a590: 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74  too complex.** t
a5a0: 6f 20 74 65 6c 6c 20 72 65 74 75 72 6e 20 54 52  o tell return TR
a5b0: 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  UE.  .**.** This
a5c0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
a5d0: 20 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   as an optimizat
a5e0: 69 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f  ion, to skip OP_
a5f0: 49 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a  IsNull opcodes.*
a600: 2a 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74  * when we know t
a610: 68 61 74 20 61 20 76 61 6c 75 65 20 63 61 6e 6e  hat a value cann
a620: 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e  ot be NULL.  Hen
a630: 63 65 2c 20 61 20 66 61 6c 73 65 20 70 6f 73 69  ce, a false posi
a640: 74 69 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69  tive.** (returni
a650: 6e 67 20 54 52 55 45 20 77 68 65 6e 20 69 6e 20  ng TRUE when in 
a660: 66 61 63 74 20 74 68 65 20 65 78 70 72 65 73 73  fact the express
a670: 69 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20 62 65  ion can never be
a680: 20 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20   NULL) might.** 
a690: 62 65 20 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f  be a small perfo
a6a0: 72 6d 61 6e 63 65 20 68 69 74 20 62 75 74 20 69  rmance hit but i
a6b0: 73 20 6f 74 68 65 72 77 69 73 65 20 68 61 72 6d  s otherwise harm
a6c0: 6c 65 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74  less.  On the ot
a6d0: 68 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66  her.** hand, a f
a6e0: 61 6c 73 65 20 6e 65 67 61 74 69 76 65 20 28 72  alse negative (r
a6f0: 65 74 75 72 6e 69 6e 67 20 46 41 4c 53 45 20 77  eturning FALSE w
a700: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63  hen the result c
a710: 6f 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a  ould be NULL).**
a720: 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73   will likely res
a730: 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72  ult in an incorr
a740: 65 63 74 20 61 6e 73 77 65 72 2e 20 20 53 6f 20  ect answer.  So 
a750: 77 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72  when in doubt, r
a760: 65 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a  eturn.** TRUE..*
a770: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
a780: 72 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74  rCanBeNull(const
a790: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 75 38 20   Expr *p){.  u8 
a7a0: 6f 70 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e  op;.  while( p->
a7b0: 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20  op==TK_UPLUS || 
a7c0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53  p->op==TK_UMINUS
a7d0: 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74   ){ p = p->pLeft
a7e0: 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70  ; }.  op = p->op
a7f0: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52  ;.  if( op==TK_R
a800: 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70  EGISTER ) op = p
a810: 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28  ->op2;.  switch(
a820: 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
a830: 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20  TK_INTEGER:.    
a840: 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a  case TK_STRING:.
a850: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41      case TK_FLOA
a860: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  T:.    case TK_B
a870: 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75 72  LOB:.      retur
a880: 6e 20 30 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  n 0;.    default
a890: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  :.      return 1
a8a0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
a8b0: 65 6e 65 72 61 74 65 20 61 6e 20 4f 50 5f 49 73  enerate an OP_Is
a8c0: 4e 75 6c 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  Null instruction
a8d0: 20 74 68 61 74 20 74 65 73 74 73 20 72 65 67 69   that tests regi
a8e0: 73 74 65 72 20 69 52 65 67 20 61 6e 64 20 6a 75  ster iReg and ju
a8f0: 6d 70 73 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 69  mps.** to locati
a900: 6f 6e 20 69 44 65 73 74 20 69 66 20 74 68 65 20  on iDest if the 
a910: 76 61 6c 75 65 20 69 6e 20 69 52 65 67 20 69 73  value in iReg is
a920: 20 4e 55 4c 4c 2e 20 20 54 68 65 20 76 61 6c 75   NULL.  The valu
a930: 65 20 69 6e 20 69 52 65 67 20 0a 2a 2a 20 77 61  e in iReg .** wa
a940: 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 70 45  s computed by pE
a950: 78 70 72 2e 20 20 49 66 20 77 65 20 63 61 6e 20  xpr.  If we can 
a960: 6c 6f 6f 6b 20 61 74 20 70 45 78 70 72 20 61 74  look at pExpr at
a970: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 61 6e   compile-time an
a980: 64 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 20 74  d.** determine t
a990: 68 61 74 20 69 74 20 63 61 6e 20 6e 65 76 65 72  hat it can never
a9a0: 20 67 65 6e 65 72 61 74 65 20 61 20 4e 55 4c 4c   generate a NULL
a9b0: 2c 20 74 68 65 6e 20 74 68 65 20 4f 50 5f 49 73  , then the OP_Is
a9c0: 4e 75 6c 6c 20 6f 70 65 72 61 74 69 6f 6e 0a 2a  Null operation.*
a9d0: 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64  * can be omitted
a9e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
a9f0: 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a  3ExprCodeIsNullJ
aa00: 75 6d 70 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  ump(.  Vdbe *v, 
aa10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
aa20: 65 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e  e VDBE under con
aa30: 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 63  struction */.  c
aa40: 6f 6e 73 74 20 45 78 70 72 20 2a 70 45 78 70 72  onst Expr *pExpr
aa50: 2c 20 20 2f 2a 20 4f 6e 6c 79 20 67 65 6e 65 72  ,  /* Only gener
aa60: 61 74 65 20 4f 50 5f 49 73 4e 75 6c 6c 20 69 66  ate OP_IsNull if
aa70: 20 74 68 69 73 20 65 78 70 72 20 63 61 6e 20 62   this expr can b
aa80: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
aa90: 69 52 65 67 2c 20 20 20 20 20 20 20 20 20 20 20  iReg,           
aaa0: 2f 2a 20 54 65 73 74 20 74 68 65 20 76 61 6c 75  /* Test the valu
aab0: 65 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74  e in this regist
aac0: 65 72 20 66 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  er for NULL */. 
aad0: 20 69 6e 74 20 69 44 65 73 74 20 20 20 20 20 20   int iDest      
aae0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
aaf0: 65 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  e if the value i
ab00: 73 20 6e 75 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69  s null */.){.  i
ab10: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  f( sqlite3ExprCa
ab20: 6e 42 65 4e 75 6c 6c 28 70 45 78 70 72 29 20 29  nBeNull(pExpr) )
ab30: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
ab40: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
ab50: 4e 75 6c 6c 2c 20 69 52 65 67 2c 20 69 44 65 73  Null, iReg, iDes
ab60: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
ab70: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
ab80: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
ab90: 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61  sion is a consta
aba0: 6e 74 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62  nt which would b
abb0: 65 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 62  e.** unchanged b
abc0: 79 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 77 69  y OP_Affinity wi
abd0: 74 68 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  th the affinity 
abe0: 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63  given in the sec
abf0: 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  ond.** argument.
ac00: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
ac10: 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  ine is used to d
ac20: 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
ac30: 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 65 72  OP_Affinity oper
ac40: 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20  ation.** can be 
ac50: 6f 6d 69 74 74 65 64 2e 20 20 57 68 65 6e 20 69  omitted.  When i
ac60: 6e 20 64 6f 75 62 74 20 72 65 74 75 72 6e 20 46  n doubt return F
ac70: 41 4c 53 45 2e 20 20 41 20 66 61 6c 73 65 20 6e  ALSE.  A false n
ac80: 65 67 61 74 69 76 65 0a 2a 2a 20 69 73 20 68 61  egative.** is ha
ac90: 72 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c 73 65  rmless.  A false
aca0: 20 70 6f 73 69 74 69 76 65 2c 20 68 6f 77 65 76   positive, howev
acb0: 65 72 2c 20 63 61 6e 20 72 65 73 75 6c 74 20 69  er, can result i
acc0: 6e 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61  n the wrong.** a
acd0: 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  nswer..*/.int sq
ace0: 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f  lite3ExprNeedsNo
acf0: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 63  AffinityChange(c
ad00: 6f 6e 73 74 20 45 78 70 72 20 2a 70 2c 20 63 68  onst Expr *p, ch
ad10: 61 72 20 61 66 66 29 7b 0a 20 20 75 38 20 6f 70  ar aff){.  u8 op
ad20: 3b 0a 20 20 69 66 28 20 61 66 66 3d 3d 53 51 4c  ;.  if( aff==SQL
ad30: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 20 72  ITE_AFF_NONE ) r
ad40: 65 74 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65  eturn 1;.  while
ad50: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55  ( p->op==TK_UPLU
ad60: 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  S || p->op==TK_U
ad70: 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e  MINUS ){ p = p->
ad80: 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20  pLeft; }.  op = 
ad90: 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  p->op;.  if( op=
ada0: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f  =TK_REGISTER ) o
adb0: 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77  p = p->op2;.  sw
adc0: 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
add0: 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
ade0: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
adf0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
ae00: 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d  INTEGER || aff==
ae10: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
ae20: 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  IC;.    }.    ca
ae30: 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20  se TK_FLOAT: {. 
ae40: 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d       return aff=
ae50: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
ae60: 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
ae70: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
ae80: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53   }.    case TK_S
ae90: 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72  TRING: {.      r
aea0: 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54  eturn aff==SQLIT
aeb0: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
aec0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  }.    case TK_BL
aed0: 4f 42 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  OB: {.      retu
aee0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
aef0: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
af00: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
af10: 70 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20  p->iTable>=0 ); 
af20: 20 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65 20   /* p cannot be 
af30: 70 61 72 74 20 6f 66 20 61 20 43 48 45 43 4b 20  part of a CHECK 
af40: 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
af50: 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 43      return p->iC
af60: 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20  olumn<0.        
af70: 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54    && (aff==SQLIT
af80: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c  E_AFF_INTEGER ||
af90: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
afa0: 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d  _NUMERIC);.    }
afb0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
afc0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
afd0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
afe0: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
aff0: 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  f the given stri
b000: 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63  ng is a row-id c
b010: 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69  olumn name..*/.i
b020: 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69  nt sqlite3IsRowi
b030: 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  d(const char *z)
b040: 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  {.  if( sqlite3S
b050: 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49  trICmp(z, "_ROWI
b060: 44 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  D_")==0 ) return
b070: 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
b080: 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57  3StrICmp(z, "ROW
b090: 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ID")==0 ) return
b0a0: 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
b0b0: 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44  3StrICmp(z, "OID
b0c0: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
b0d0: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
b0e0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
b0f0: 75 65 20 69 66 20 77 65 20 61 72 65 20 61 62 6c  ue if we are abl
b100: 65 20 74 6f 20 74 68 65 20 49 4e 20 6f 70 65 72  e to the IN oper
b110: 61 74 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ator optimizatio
b120: 6e 20 6f 6e 20 61 0a 2a 2a 20 71 75 65 72 79 20  n on a.** query 
b130: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a  of the form.**.*
b140: 2a 20 20 20 20 20 20 20 78 20 49 4e 20 28 53 45  *       x IN (SE
b150: 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20  LECT ...).**.** 
b160: 57 68 65 72 65 20 74 68 65 20 53 45 4c 45 43 54  Where the SELECT
b170: 2e 2e 2e 20 63 6c 61 75 73 65 20 69 73 20 61 73  ... clause is as
b180: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68   specified by th
b190: 65 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74  e parameter to t
b1a0: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 0a  his.** routine..
b1b0: 2a 2a 0a 2a 2a 20 54 68 65 20 53 65 6c 65 63 74  **.** The Select
b1c0: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 69   object passed i
b1d0: 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
b1e0: 65 6e 20 70 72 65 70 72 6f 63 65 73 73 65 64 20  en preprocessed 
b1f0: 61 6e 64 20 6e 6f 0a 2a 2a 20 65 72 72 6f 72 73  and no.** errors
b200: 20 68 61 76 65 20 62 65 65 6e 20 66 6f 75 6e 64   have been found
b210: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
b220: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
b230: 59 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 43  Y.static int isC
b240: 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
b250: 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53  (Select *p){.  S
b260: 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20  rcList *pSrc;.  
b270: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
b280: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
b290: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
b2a0: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
b2b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 69 67            /* rig
b2c0: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
b2d0: 49 4e 20 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a  IN is SELECT */.
b2e0: 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
b2f0: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
b300: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
b310: 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
b320: 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65  T */.  if( p->se
b330: 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
b340: 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
b350: 74 65 29 20 29 7b 0a 20 20 20 20 74 65 73 74 63  te) ){.    testc
b360: 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ase( (p->selFlag
b370: 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
b380: 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
b390: 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a  =SF_Distinct );.
b3a0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
b3b0: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
b3c0: 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
b3d0: 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67  regate))==SF_Agg
b3e0: 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 72 65  regate );.    re
b3f0: 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49  turn 0; /* No DI
b400: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 61  STINCT keyword a
b410: 6e 64 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20  nd no aggregate 
b420: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d  functions */.  }
b430: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47  .  assert( p->pG
b440: 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20 20 20  roupBy==0 );    
b450: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
b460: 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61   no GROUP BY cla
b470: 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  use */.  if( p->
b480: 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20  pLimit ) return 
b490: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
b4a0: 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20  /* Has no LIMIT 
b4b0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 61 73 73 65  clause */.  asse
b4c0: 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d  rt( p->pOffset==
b4d0: 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0 );            
b4e0: 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54 20 6d     /* No LIMIT m
b4f0: 65 61 6e 73 20 6e 6f 20 4f 46 46 53 45 54 20 2a  eans no OFFSET *
b500: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72  /.  if( p->pWher
b510: 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
b520: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
b530: 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  s no WHERE claus
b540: 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d  e */.  pSrc = p-
b550: 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
b560: 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66   pSrc!=0 );.  if
b570: 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  ( pSrc->nSrc!=1 
b580: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
b590: 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 74       /* Single t
b5a0: 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75  erm in FROM clau
b5b0: 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63  se */.  if( pSrc
b5c0: 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29  ->a[0].pSelect )
b5d0: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f   return 0;     /
b5e0: 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61 20  * FROM is not a 
b5f0: 73 75 62 71 75 65 72 79 20 6f 72 20 76 69 65 77  subquery or view
b600: 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70 53 72   */.  pTab = pSr
b610: 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20  c->a[0].pTab;.  
b620: 69 66 28 20 4e 45 56 45 52 28 70 54 61 62 3d 3d  if( NEVER(pTab==
b630: 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  0) ) return 0;. 
b640: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70   assert( pTab->p
b650: 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20 20  Select==0 );    
b660: 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20          /* FROM 
b670: 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61 20  clause is not a 
b680: 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20 49 73  view */.  if( Is
b690: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20  Virtual(pTab) ) 
b6a0: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
b6b0: 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
b6c0: 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61  not a virtual ta
b6d0: 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20  ble */.  pEList 
b6e0: 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  = p->pEList;.  i
b6f0: 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  f( pEList->nExpr
b700: 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  !=1 ) return 0; 
b710: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 6f 6c        /* One col
b720: 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  umn in the resul
b730: 74 20 73 65 74 20 2a 2f 0a 20 20 69 66 28 20 70  t set */.  if( p
b740: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
b750: 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
b760: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20   ) return 0; /* 
b770: 52 65 73 75 6c 74 20 69 73 20 61 20 63 6f 6c 75  Result is a colu
b780: 6d 6e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31  mn */.  return 1
b790: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
b7a0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
b7b0: 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64  RY */../*.** Cod
b7c0: 65 20 61 6e 20 4f 50 5f 4f 6e 63 65 20 69 6e 73  e an OP_Once ins
b7d0: 74 72 75 63 74 69 6f 6e 20 61 6e 64 20 61 6c 6c  truction and all
b7e0: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
b7f0: 69 74 73 20 66 6c 61 67 2e 20 52 65 74 75 72 6e  its flag. Return
b800: 20 74 68 65 20 0a 2a 2a 20 61 64 64 72 65 73 73   the .** address
b810: 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74   of the new inst
b820: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  ruction..*/.int 
b830: 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
b840: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
b850: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
b860: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
b870: 65 29 3b 20 20 20 20 20 20 2f 2a 20 56 69 72 74  e);      /* Virt
b880: 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e  ual machine bein
b890: 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 72 65 74  g coded */.  ret
b8a0: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41  urn sqlite3VdbeA
b8b0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4f 6e 63 65  ddOp1(v, OP_Once
b8c0: 2c 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 2b  , pParse->nOnce+
b8d0: 2b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  +);.}../*.** Thi
b8e0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
b8f0: 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d  ed by the implem
b900: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
b910: 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f  IN (...) operato
b920: 72 2e 0a 2a 2a 20 54 68 65 20 70 58 20 70 61 72  r..** The pX par
b930: 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 65 78  ameter is the ex
b940: 70 72 65 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20  pression on the 
b950: 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
b960: 65 72 61 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a  erator, which.**
b970: 20 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72   might be either
b980: 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65   a list of expre
b990: 73 73 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 71  ssions or a subq
b9a0: 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  uery..**.** The 
b9b0: 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74  job of this rout
b9c0: 69 6e 65 20 69 73 20 74 6f 20 66 69 6e 64 20 6f  ine is to find o
b9d0: 72 20 63 72 65 61 74 65 20 61 20 62 2d 74 72 65  r create a b-tre
b9e0: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63 61  e object that ca
b9f0: 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 65 69 74  n.** be used eit
ba00: 68 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20  her to test for 
ba10: 6d 65 6d 62 65 72 73 68 69 70 20 69 6e 20 74 68  membership in th
ba20: 65 20 52 48 53 20 73 65 74 20 6f 72 20 74 6f 20  e RHS set or to 
ba30: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a  iterate through.
ba40: 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f  ** all members o
ba50: 66 20 74 68 65 20 52 48 53 20 73 65 74 2c 20 73  f the RHS set, s
ba60: 6b 69 70 70 69 6e 67 20 64 75 70 6c 69 63 61 74  kipping duplicat
ba70: 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73  es..**.** A curs
ba80: 6f 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20  or is opened on 
ba90: 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63  the b-tree objec
baa0: 74 20 74 68 61 74 20 74 68 65 20 52 48 53 20 6f  t that the RHS o
bab0: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
bac0: 72 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e 69 54 61  r.** and pX->iTa
bad0: 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ble is set to th
bae0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20  e index of that 
baf0: 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  cursor..**.** Th
bb00: 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
bb10: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
bb20: 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20  n indicates the 
bb30: 62 2d 74 72 65 65 20 74 79 70 65 2c 20 61 73 20  b-tree type, as 
bb40: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
bb50: 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20   IN_INDEX_ROWID 
bb60: 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
bb70: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74   opened on a dat
bb80: 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  abase table..** 
bb90: 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58    IN_INDEX_INDEX
bba0: 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61   - The cursor wa
bbb0: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61  s opened on a da
bbc0: 74 61 62 61 73 65 20 69 6e 64 65 78 2e 0a 2a 2a  tabase index..**
bbd0: 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20     IN_INDEX_EPH 
bbe0: 2d 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 77  -   The cursor w
bbf0: 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73  as opened on a s
bc00: 70 65 63 69 61 6c 6c 79 20 63 72 65 61 74 65 64  pecially created
bc10: 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20   and.**         
bc20: 20 20 20 20 20 20 20 20 20 20 20 70 6f 70 75 6c             popul
bc30: 61 74 65 64 20 65 70 68 65 72 65 6d 61 6c 20 74  ated epheremal t
bc40: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  able..**.** An e
bc50: 78 69 73 74 69 6e 67 20 62 2d 74 72 65 65 20 6d  xisting b-tree m
bc60: 69 67 68 74 20 62 65 20 75 73 65 64 20 69 66 20  ight be used if 
bc70: 74 68 65 20 52 48 53 20 65 78 70 72 65 73 73 69  the RHS expressi
bc80: 6f 6e 20 70 58 20 69 73 20 61 20 73 69 6d 70 6c  on pX is a simpl
bc90: 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 73 75  e.** subquery su
bca0: 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ch as:.**.**    
bcb0: 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e   SELECT <column>
bcc0: 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a   FROM <table>.**
bcd0: 0a 2a 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f  .** If the RHS o
bce0: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
bcf0: 72 20 69 73 20 61 20 6c 69 73 74 20 6f 72 20 61  r is a list or a
bd00: 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 73 75   more complex su
bd10: 62 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20  bquery, then.** 
bd20: 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
bd30: 6c 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  le might need to
bd40: 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 66 72   be generated fr
bd50: 6f 6d 20 74 68 65 20 52 48 53 20 61 6e 64 20 74  om the RHS and t
bd60: 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61 62 6c  hen.** pX->iTabl
bd70: 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20  e made to point 
bd80: 74 6f 20 74 68 65 20 65 70 68 65 72 6d 65 72 61  to the ephermera
bd90: 6c 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64 20  l table instead 
bda0: 6f 66 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e  of an.** existin
bdb0: 67 20 74 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a  g table.  .**.**
bdc0: 20 49 66 20 74 68 65 20 70 72 4e 6f 74 46 6f 75   If the prNotFou
bdd0: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
bde0: 30 2c 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72  0, then the b-tr
bdf0: 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ee will be used 
be00: 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68  to iterate.** th
be10: 72 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d 65  rough the set me
be20: 6d 62 65 72 73 2c 20 73 6b 69 70 70 69 6e 67 20  mbers, skipping 
be30: 61 6e 79 20 64 75 70 6c 69 63 61 74 65 73 2e 20  any duplicates. 
be40: 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 0a  In this case an.
be50: 2a 2a 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  ** epheremal tab
be60: 6c 65 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  le must be used 
be70: 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63  unless the selec
be80: 74 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20  ted <column> is 
be90: 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f  guaranteed.** to
bea0: 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74   be unique - eit
beb0: 68 65 72 20 62 65 63 61 75 73 65 20 69 74 20 69  her because it i
bec0: 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  s an INTEGER PRI
bed0: 4d 41 52 59 20 4b 45 59 20 6f 72 20 69 74 0a 2a  MARY KEY or it.*
bee0: 2a 20 68 61 73 20 61 20 55 4e 49 51 55 45 20 63  * has a UNIQUE c
bef0: 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20 55 4e 49  onstraint or UNI
bf00: 51 55 45 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  QUE index..**.**
bf10: 20 49 66 20 74 68 65 20 70 72 4e 6f 74 46 6f 75   If the prNotFou
bf20: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
bf30: 6e 6f 74 20 30 2c 20 74 68 65 6e 20 74 68 65 20  not 0, then the 
bf40: 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75  b-tree will be u
bf50: 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74  sed .** for fast
bf60: 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20   set membership 
bf70: 74 65 73 74 73 2e 20 49 6e 20 74 68 69 73 20 63  tests. In this c
bf80: 61 73 65 20 61 6e 20 65 70 68 65 72 65 6d 61 6c  ase an epheremal
bf90: 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a 20   table must .** 
bfa0: 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 3c  be used unless <
bfb0: 63 6f 6c 75 6d 6e 3e 20 69 73 20 61 6e 20 49 4e  column> is an IN
bfc0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
bfd0: 59 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 63 61  Y or an index ca
bfe0: 6e 20 0a 2a 2a 20 62 65 20 66 6f 75 6e 64 20 77  n .** be found w
bff0: 69 74 68 20 3c 63 6f 6c 75 6d 6e 3e 20 61 73 20  ith <column> as 
c000: 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f  its left-most co
c010: 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  lumn..**.** When
c020: 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 62   the b-tree is b
c030: 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 6d 65  eing used for me
c040: 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 2c 20  mbership tests, 
c050: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
c060: 74 69 6f 6e 0a 2a 2a 20 6e 65 65 64 73 20 74 6f  tion.** needs to
c070: 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72   know whether or
c080: 20 6e 6f 74 20 74 68 65 20 73 74 72 75 63 74 75   not the structu
c090: 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 53  re contains an S
c0a0: 51 4c 20 4e 55 4c 4c 20 0a 2a 2a 20 76 61 6c 75  QL NULL .** valu
c0b0: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  e in order to co
c0c0: 72 72 65 63 74 6c 79 20 65 76 61 6c 75 61 74 65  rrectly evaluate
c0d0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 69 6b   expressions lik
c0e0: 65 20 22 58 20 49 4e 20 28 59 2c 20 5a 29 22 2e  e "X IN (Y, Z)".
c0f0: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
c100: 61 6e 79 20 63 68 61 6e 63 65 20 74 68 61 74 20  any chance that 
c110: 74 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68 74 20  the (...) might 
c120: 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76  contain a NULL v
c130: 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69  alue at.** runti
c140: 6d 65 2c 20 74 68 65 6e 20 61 20 72 65 67 69 73  me, then a regis
c150: 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ter is allocated
c160: 20 61 6e 64 20 74 68 65 20 72 65 67 69 73 74 65   and the registe
c170: 72 20 6e 75 6d 62 65 72 20 77 72 69 74 74 65 6e  r number written
c180: 0a 2a 2a 20 74 6f 20 2a 70 72 4e 6f 74 46 6f 75  .** to *prNotFou
c190: 6e 64 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  nd. If there is 
c1a0: 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  no chance that t
c1b0: 68 65 20 28 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e  he (...) contain
c1c0: 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75  s a.** NULL valu
c1d0: 65 2c 20 74 68 65 6e 20 2a 70 72 4e 6f 74 46 6f  e, then *prNotFo
c1e0: 75 6e 64 20 69 73 20 6c 65 66 74 20 75 6e 63 68  und is left unch
c1f0: 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  anged..**.** If 
c200: 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c  a register is al
c210: 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 74 73 20  located and its 
c220: 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65 64 20  location stored 
c230: 69 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 2c 20  in *prNotFound, 
c240: 74 68 65 6e 0a 2a 2a 20 69 74 73 20 69 6e 69 74  then.** its init
c250: 69 61 6c 20 76 61 6c 75 65 20 69 73 20 4e 55 4c  ial value is NUL
c260: 4c 2e 20 20 49 66 20 74 68 65 20 28 2e 2e 2e 29  L.  If the (...)
c270: 20 64 6f 65 73 20 6e 6f 74 20 72 65 6d 61 69 6e   does not remain
c280: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72   constant.** for
c290: 20 74 68 65 20 64 75 72 61 74 69 6f 6e 20 6f 66   the duration of
c2a0: 20 74 68 65 20 71 75 65 72 79 20 28 69 2e 65 2e   the query (i.e.
c2b0: 20 74 68 65 20 53 45 4c 45 43 54 20 77 69 74 68   the SELECT with
c2c0: 69 6e 20 74 68 65 20 28 2e 2e 2e 29 0a 2a 2a 20  in the (...).** 
c2d0: 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  is a correlated 
c2e0: 73 75 62 71 75 65 72 79 29 20 74 68 65 6e 20 74  subquery) then t
c2f0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
c300: 61 6c 6c 6f 63 61 74 65 64 20 72 65 67 69 73 74  allocated regist
c310: 65 72 20 69 73 0a 2a 2a 20 72 65 73 65 74 20 74  er is.** reset t
c320: 6f 20 4e 55 4c 4c 20 65 61 63 68 20 74 69 6d 65  o NULL each time
c330: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
c340: 20 72 65 72 75 6e 2e 20 54 68 69 73 20 61 6c 6c   rerun. This all
c350: 6f 77 73 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65  ows the.** calle
c360: 72 20 74 6f 20 75 73 65 20 76 64 62 65 20 63 6f  r to use vdbe co
c370: 64 65 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  de equivalent to
c380: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
c390: 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 72 65 67 69  **.**   if( regi
c3a0: 73 74 65 72 3d 3d 4e 55 4c 4c 20 29 7b 0a 2a 2a  ster==NULL ){.**
c3b0: 20 20 20 20 20 68 61 73 5f 6e 75 6c 6c 20 3d 20       has_null = 
c3c0: 3c 74 65 73 74 20 69 66 20 64 61 74 61 20 73 74  <test if data st
c3d0: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
c3e0: 20 6e 75 6c 6c 3e 0a 2a 2a 20 20 20 20 20 72 65   null>.**     re
c3f0: 67 69 73 74 65 72 20 3d 20 31 0a 2a 2a 20 20 20  gister = 1.**   
c400: 7d 0a 2a 2a 0a 2a 2a 20 69 6e 20 6f 72 64 65 72  }.**.** in order
c410: 20 74 6f 20 61 76 6f 69 64 20 72 75 6e 6e 69 6e   to avoid runnin
c420: 67 20 74 68 65 20 3c 74 65 73 74 20 69 66 20 64  g the <test if d
c430: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 63 6f  ata structure co
c440: 6e 74 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a 20  ntains null>.** 
c450: 74 65 73 74 20 6d 6f 72 65 20 6f 66 74 65 6e 20  test more often 
c460: 74 68 61 6e 20 69 73 20 6e 65 63 65 73 73 61 72  than is necessar
c470: 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  y..*/.#ifndef SQ
c480: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
c490: 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69  RY.int sqlite3Fi
c4a0: 6e 64 49 6e 49 6e 64 65 78 28 50 61 72 73 65 20  ndInIndex(Parse 
c4b0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
c4c0: 58 2c 20 69 6e 74 20 2a 70 72 4e 6f 74 46 6f 75  X, int *prNotFou
c4d0: 6e 64 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  nd){.  Select *p
c4e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c500: 53 45 4c 45 43 54 20 74 6f 20 74 68 65 20 72 69  SELECT to the ri
c510: 67 68 74 20 6f 66 20 49 4e 20 6f 70 65 72 61 74  ght of IN operat
c520: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70  or */.  int eTyp
c530: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
c540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c550: 20 54 79 70 65 20 6f 66 20 52 48 53 20 74 61 62   Type of RHS tab
c560: 6c 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a  le. IN_INDEX_* *
c570: 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70  /.  int iTab = p
c580: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
c590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
c5a0: 73 6f 72 20 6f 66 20 74 68 65 20 52 48 53 20 74  sor of the RHS t
c5b0: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75  able */.  int mu
c5c0: 73 74 42 65 55 6e 69 71 75 65 20 3d 20 28 70 72  stBeUnique = (pr
c5d0: 4e 6f 74 46 6f 75 6e 64 3d 3d 30 29 3b 20 20 20  NotFound==0);   
c5e0: 2f 2a 20 54 72 75 65 20 69 66 20 52 48 53 20 6d  /* True if RHS m
c5f0: 75 73 74 20 62 65 20 75 6e 69 71 75 65 20 2a 2f  ust be unique */
c600: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
c610: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
c620: 73 65 29 3b 20 20 20 20 20 2f 2a 20 56 69 72 74  se);     /* Virt
c630: 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e  ual machine bein
c640: 67 20 63 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73  g coded */..  as
c650: 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  sert( pX->op==TK
c660: 5f 49 4e 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  _IN );..  /* Che
c670: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 20  ck to see if an 
c680: 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f  existing table o
c690: 72 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75  r index can be u
c6a0: 73 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69  sed to.  ** sati
c6b0: 73 66 79 20 74 68 65 20 71 75 65 72 79 2e 20 20  sfy the query.  
c6c0: 54 68 69 73 20 69 73 20 70 72 65 66 65 72 61 62  This is preferab
c6d0: 6c 65 20 74 6f 20 67 65 6e 65 72 61 74 69 6e 67  le to generating
c6e0: 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68   a new .  ** eph
c6f0: 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 0a 20 20  emeral table..  
c700: 2a 2f 0a 20 20 70 20 3d 20 28 45 78 70 72 48 61  */.  p = (ExprHa
c710: 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50  sProperty(pX, EP
c720: 5f 78 49 73 53 65 6c 65 63 74 29 20 3f 20 70 58  _xIsSelect) ? pX
c730: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3a 20 30 29  ->x.pSelect : 0)
c740: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
c750: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 29 20  Parse->nErr==0) 
c760: 26 26 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  && isCandidateFo
c770: 72 49 6e 4f 70 74 28 70 29 20 29 7b 0a 20 20 20  rInOpt(p) ){.   
c780: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
c790: 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
c7a0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
c7b0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
c7c0: 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  /.    Table *pTa
c7d0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
c7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c7f0: 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a  Table <table>. *
c800: 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  /.    Expr *pExp
c810: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
c820: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c830: 45 78 70 72 65 73 73 69 6f 6e 20 3c 63 6f 6c 75  Expression <colu
c840: 6d 6e 3e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  mn> */.    int i
c850: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
c860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c870: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
c880: 6c 75 6d 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f  lumn <column> */
c890: 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20  .    int iDb;   
c8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
c8c0: 61 74 61 62 61 73 65 20 69 64 78 20 66 6f 72 20  atabase idx for 
c8d0: 70 54 61 62 20 2a 2f 0a 0a 20 20 20 20 61 73 73  pTab */..    ass
c8e0: 65 72 74 28 20 70 20 29 3b 20 20 20 20 20 20 20  ert( p );       
c8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c900: 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69   /* Because of i
c910: 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
c920: 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73  pt(p) */.    ass
c930: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d  ert( p->pEList!=
c940: 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0 );            
c950: 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69   /* Because of i
c960: 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
c970: 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73  pt(p) */.    ass
c980: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ert( p->pEList->
c990: 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b  a[0].pExpr!=0 );
c9a0: 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69   /* Because of i
c9b0: 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
c9c0: 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73  pt(p) */.    ass
c9d0: 65 72 74 28 20 70 2d 3e 70 53 72 63 21 3d 30 20  ert( p->pSrc!=0 
c9e0: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
c9f0: 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69   /* Because of i
ca00: 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
ca10: 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 70 54 61  pt(p) */.    pTa
ca20: 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  b = p->pSrc->a[0
ca30: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 70 45 78 70  ].pTab;.    pExp
ca40: 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  r = p->pEList->a
ca50: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [0].pExpr;.    i
ca60: 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  Col = pExpr->iCo
ca70: 6c 75 6d 6e 3b 0a 20 20 20 0a 20 20 20 20 2f 2a  lumn;.   .    /*
ca80: 20 43 6f 64 65 20 61 6e 20 4f 50 5f 56 65 72 69   Code an OP_Veri
ca90: 66 79 43 6f 6f 6b 69 65 20 61 6e 64 20 4f 50 5f  fyCookie and OP_
caa0: 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c 74  TableLock for <t
cab0: 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 44  able>. */.    iD
cac0: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
cad0: 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
cae0: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
caf0: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
cb00: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
cb10: 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
cb20: 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
cb30: 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
cb40: 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  num, 0, pTab->zN
cb50: 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  ame);..    /* Th
cb60: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
cb70: 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20  nly called from 
cb80: 74 77 6f 20 70 6c 61 63 65 73 2e 20 49 6e 20 62  two places. In b
cb90: 6f 74 68 20 63 61 73 65 73 20 74 68 65 20 76 64  oth cases the vd
cba0: 62 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 61 6c  be.    ** has al
cbb0: 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
cbc0: 61 74 65 64 2e 20 53 6f 20 61 73 73 75 6d 65 20  ated. So assume 
cbd0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 29  sqlite3GetVdbe()
cbe0: 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20 2a   is always.    *
cbf0: 2a 20 73 75 63 63 65 73 73 66 75 6c 20 68 65 72  * successful her
cc00: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
cc10: 73 65 72 74 28 76 29 3b 0a 20 20 20 20 69 66 28  sert(v);.    if(
cc20: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
cc30: 20 69 6e 74 20 69 41 64 64 72 3b 0a 0a 20 20 20   int iAddr;..   
cc40: 20 20 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74     iAddr = sqlit
cc50: 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73  e3CodeOnce(pPars
cc60: 65 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  e);..      sqlit
cc70: 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
cc80: 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70  se, iTab, iDb, p
cc90: 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  Tab, OP_OpenRead
cca0: 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d  );.      eType =
ccb0: 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b   IN_INDEX_ROWID;
ccc0: 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ..      sqlite3V
ccd0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69  dbeJumpHere(v, i
cce0: 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Addr);.    }else
ccf0: 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
cd00: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
cd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cd20: 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
cd30: 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54  e */..      /* T
cd40: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
cd50: 75 65 6e 63 65 20 75 73 65 64 20 62 79 20 74 68  uence used by th
cd60: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 49 66  e comparison. If
cd70: 20 61 6e 20 69 6e 64 65 78 20 69 73 20 74 6f 0a   an index is to.
cd80: 20 20 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64        ** be used
cd90: 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74   in place of a t
cda0: 65 6d 70 2d 74 61 62 6c 65 2c 20 69 74 20 6d 75  emp-table, it mu
cdb0: 73 74 20 62 65 20 6f 72 64 65 72 65 64 20 61 63  st be ordered ac
cdc0: 63 6f 72 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a  cording.      **
cdd0: 20 74 6f 20 74 68 69 73 20 63 6f 6c 6c 61 74 69   to this collati
cde0: 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20 20 2a 2f  on sequence.  */
cdf0: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
ce00: 70 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42 69  pReq = sqlite3Bi
ce10: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
ce20: 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  eq(pParse, pX->p
ce30: 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 0a 20  Left, pExpr);.. 
ce40: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68       /* Check th
ce50: 61 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  at the affinity 
ce60: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65  that will be use
ce70: 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65  d to perform the
ce80: 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61   .      ** compa
ce90: 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d  rison is the sam
cea0: 65 20 61 73 20 74 68 65 20 61 66 66 69 6e 69 74  e as the affinit
ceb0: 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e  y of the column.
cec0: 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 69 74 20   If.      ** it 
ced0: 69 73 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f  is not, it is no
cee0: 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73  t possible to us
cef0: 65 20 61 6e 79 20 69 6e 64 65 78 2e 0a 20 20 20  e any index..   
cf00: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
cf10: 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 73 71  affinity_ok = sq
cf20: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
cf30: 74 79 4f 6b 28 70 58 2c 20 70 54 61 62 2d 3e 61  tyOk(pX, pTab->a
cf40: 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69  Col[iCol].affini
cf50: 74 79 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28  ty);..      for(
cf60: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
cf70: 78 3b 20 70 49 64 78 20 26 26 20 65 54 79 70 65  x; pIdx && eType
cf80: 3d 3d 30 20 26 26 20 61 66 66 69 6e 69 74 79 5f  ==0 && affinity_
cf90: 6f 6b 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  ok; pIdx=pIdx->p
cfa0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69  Next){.        i
cfb0: 66 28 20 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75  f( (pIdx->aiColu
cfc0: 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29 0a 20 20 20  mn[0]==iCol).   
cfd0: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
cfe0: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
cff0: 45 4e 43 28 64 62 29 2c 20 70 49 64 78 2d 3e 61  ENC(db), pIdx->a
d000: 7a 43 6f 6c 6c 5b 30 5d 2c 20 30 29 3d 3d 70 52  zColl[0], 0)==pR
d010: 65 71 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  eq.         && (
d020: 21 6d 75 73 74 42 65 55 6e 69 71 75 65 20 7c 7c  !mustBeUnique ||
d030: 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d   (pIdx->nColumn=
d040: 3d 31 20 26 26 20 70 49 64 78 2d 3e 6f 6e 45 72  =1 && pIdx->onEr
d050: 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 29 29 0a 20  ror!=OE_None)). 
d060: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
d070: 20 20 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 20      int iAddr;. 
d080: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70           char *p
d090: 4b 65 79 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  Key;.  .        
d0a0: 20 20 70 4b 65 79 20 3d 20 28 63 68 61 72 20 2a    pKey = (char *
d0b0: 29 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79  )sqlite3IndexKey
d0c0: 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  info(pParse, pId
d0d0: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 41  x);.          iA
d0e0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  ddr = sqlite3Cod
d0f0: 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a 20  eOnce(pParse);. 
d100: 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
d110: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
d120: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54   OP_OpenRead, iT
d130: 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20  ab, pIdx->tnum, 
d140: 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  iDb,.           
d150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d160: 20 20 20 20 70 4b 65 79 2c 50 34 5f 4b 45 59 49      pKey,P4_KEYI
d170: 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
d180: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
d190: 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49  ent((v, "%s", pI
d1a0: 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  dx->zName));.   
d1b0: 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49         eType = I
d1c0: 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 3b 0a 0a  N_INDEX_INDEX;..
d1d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d1e0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
d1f0: 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20   iAddr);.       
d200: 20 20 20 69 66 28 20 70 72 4e 6f 74 46 6f 75 6e     if( prNotFoun
d210: 64 20 26 26 20 21 70 54 61 62 2d 3e 61 43 6f 6c  d && !pTab->aCol
d220: 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29  [iCol].notNull )
d230: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  {.            *p
d240: 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 2b 2b 70 50  rNotFound = ++pP
d250: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
d260: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d270: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d280: 4e 75 6c 6c 2c 20 30 2c 20 2a 70 72 4e 6f 74 46  Null, 0, *prNotF
d290: 6f 75 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20  ound);.         
d2a0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
d2b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
d2c0: 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20 29    if( eType==0 )
d2d0: 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e  {.    /* Could n
d2e0: 6f 74 20 66 6f 75 6e 64 20 61 6e 20 65 78 69 73  ot found an exis
d2f0: 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e  ting table or in
d300: 64 65 78 20 74 6f 20 75 73 65 20 61 73 20 74 68  dex to use as th
d310: 65 20 52 48 53 20 62 2d 74 72 65 65 2e 0a 20 20  e RHS b-tree..  
d320: 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61 76    ** We will hav
d330: 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e  e to generate an
d340: 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
d350: 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a   to do the job..
d360: 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c      */.    doubl
d370: 65 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  e savedNQueryLoo
d380: 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  p = pParse->nQue
d390: 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20  ryLoop;.    int 
d3a0: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30  rMayHaveNull = 0
d3b0: 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e  ;.    eType = IN
d3c0: 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20 20  _INDEX_EPH;.    
d3d0: 69 66 28 20 70 72 4e 6f 74 46 6f 75 6e 64 20 29  if( prNotFound )
d3e0: 7b 0a 20 20 20 20 20 20 2a 70 72 4e 6f 74 46 6f  {.      *prNotFo
d3f0: 75 6e 64 20 3d 20 72 4d 61 79 48 61 76 65 4e 75  und = rMayHaveNu
d400: 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ll = ++pParse->n
d410: 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
d420: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d430: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 2a 70 72 4e  OP_Null, 0, *prN
d440: 6f 74 46 6f 75 6e 64 29 3b 0a 20 20 20 20 7d 65  otFound);.    }e
d450: 6c 73 65 7b 0a 20 20 20 20 20 20 74 65 73 74 63  lse{.      testc
d460: 61 73 65 28 20 70 50 61 72 73 65 2d 3e 6e 51 75  ase( pParse->nQu
d470: 65 72 79 4c 6f 6f 70 3e 28 64 6f 75 62 6c 65 29  eryLoop>(double)
d480: 31 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  1 );.      pPars
d490: 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  e->nQueryLoop = 
d4a0: 28 64 6f 75 62 6c 65 29 31 3b 0a 20 20 20 20 20  (double)1;.     
d4b0: 20 69 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e   if( pX->pLeft->
d4c0: 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78  iColumn<0 && !Ex
d4d0: 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
d4e0: 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  (pX, EP_xIsSelec
d4f0: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65 54  t) ){.        eT
d500: 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52  ype = IN_INDEX_R
d510: 4f 57 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OWID;.      }.  
d520: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43    }.    sqlite3C
d530: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
d540: 72 73 65 2c 20 70 58 2c 20 72 4d 61 79 48 61 76  rse, pX, rMayHav
d550: 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e  eNull, eType==IN
d560: 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20  _INDEX_ROWID);. 
d570: 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
d580: 79 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e 51 75  yLoop = savedNQu
d590: 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65  eryLoop;.  }else
d5a0: 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61 62 6c 65  {.    pX->iTable
d5b0: 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 20 20 72   = iTab;.  }.  r
d5c0: 65 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23  eturn eType;.}.#
d5d0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  endif../*.** Gen
d5e0: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 73  erate code for s
d5f0: 63 61 6c 61 72 20 73 75 62 71 75 65 72 69 65 73  calar subqueries
d600: 20 75 73 65 64 20 61 73 20 61 20 73 75 62 71 75   used as a subqu
d610: 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ery expression, 
d620: 45 58 49 53 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e  EXISTS,.** or IN
d630: 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 45 78 61   operators.  Exa
d640: 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  mples:.**.**    
d650: 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
d660: 62 29 20 20 20 20 20 20 20 20 20 20 2d 2d 20 73  b)          -- s
d670: 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 45  ubquery.**     E
d680: 58 49 53 54 53 20 28 53 45 4c 45 43 54 20 61 20  XISTS (SELECT a 
d690: 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58 49  FROM b)   -- EXI
d6a0: 53 54 53 20 73 75 62 71 75 65 72 79 0a 2a 2a 20  STS subquery.** 
d6b0: 20 20 20 20 78 20 49 4e 20 28 34 2c 35 2c 31 31      x IN (4,5,11
d6c0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  )              -
d6d0: 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  - IN operator wi
d6e0: 74 68 20 6c 69 73 74 20 6f 6e 20 72 69 67 68 74  th list on right
d6f0: 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20  -hand side.**   
d700: 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 61    x IN (SELECT a
d710: 20 46 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20   FROM b)     -- 
d720: 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
d730: 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65   subquery on the
d740: 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65   right.**.** The
d750: 20 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72   pExpr parameter
d760: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 65   describes the e
d770: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
d780: 6f 6e 74 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a  ontains the IN.*
d790: 2a 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 75  * operator or su
d7a0: 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  bquery..**.** If
d7b0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 52 6f 77   parameter isRow
d7c0: 69 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  id is non-zero, 
d7d0: 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  then expression 
d7e0: 70 45 78 70 72 20 69 73 20 67 75 61 72 61 6e 74  pExpr is guarant
d7f0: 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 6f 66 20  eed.** to be of 
d800: 74 68 65 20 66 6f 72 6d 20 22 3c 72 6f 77 69 64  the form "<rowid
d810: 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c  > IN (?, ?, ?)",
d820: 20 77 68 65 72 65 20 3c 72 6f 77 69 64 3e 20 69   where <rowid> i
d830: 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a  s a reference.**
d840: 20 74 6f 20 73 6f 6d 65 20 69 6e 74 65 67 65 72   to some integer
d850: 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 61   key column of a
d860: 20 74 61 62 6c 65 20 42 2d 54 72 65 65 2e 20 49   table B-Tree. I
d870: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 75 73 65  n this case, use
d880: 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 42 2d   an.** intkey B-
d890: 54 72 65 65 20 74 6f 20 73 74 6f 72 65 20 74 68  Tree to store th
d8a0: 65 20 73 65 74 20 6f 66 20 49 4e 28 2e 2e 2e 29  e set of IN(...)
d8b0: 20 76 61 6c 75 65 73 20 69 6e 73 74 65 61 64 20   values instead 
d8c0: 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20  of the usual.** 
d8d0: 28 73 6c 6f 77 65 72 29 20 76 61 72 69 61 62 6c  (slower) variabl
d8e0: 65 20 6c 65 6e 67 74 68 20 6b 65 79 73 20 42 2d  e length keys B-
d8f0: 54 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72  Tree..**.** If r
d900: 4d 61 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 6e  MayHaveNull is n
d910: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65  on-zero, that me
d920: 61 6e 73 20 74 68 61 74 20 74 68 65 20 6f 70 65  ans that the ope
d930: 72 61 74 69 6f 6e 20 69 73 20 61 6e 20 49 4e 0a  ration is an IN.
d940: 2a 2a 20 28 6e 6f 74 20 61 20 53 45 4c 45 43 54  ** (not a SELECT
d950: 20 6f 72 20 45 58 49 53 54 53 29 20 61 6e 64 20   or EXISTS) and 
d960: 74 68 61 74 20 74 68 65 20 52 48 53 20 6d 69 67  that the RHS mig
d970: 68 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c  ht contains NULL
d980: 73 2e 0a 2a 2a 20 46 75 72 74 68 65 72 6d 6f 72  s..** Furthermor
d990: 65 2c 20 74 68 65 20 49 4e 20 69 73 20 69 6e 20  e, the IN is in 
d9a0: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61  a WHERE clause a
d9b0: 6e 64 20 74 68 61 74 20 77 65 20 72 65 61 6c 6c  nd that we reall
d9c0: 79 20 77 61 6e 74 0a 2a 2a 20 74 6f 20 69 74 65  y want.** to ite
d9d0: 72 61 74 65 20 6f 76 65 72 20 74 68 65 20 52 48  rate over the RH
d9e0: 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
d9f0: 61 74 6f 72 20 69 6e 20 6f 72 64 65 72 20 74 6f  ator in order to
da00: 20 71 75 69 63 6b 6c 79 20 6c 6f 63 61 74 65 0a   quickly locate.
da10: 2a 2a 20 61 6c 6c 20 63 6f 72 72 65 73 70 6f 6e  ** all correspon
da20: 64 69 6e 67 20 4c 48 53 20 65 6c 65 6d 65 6e 74  ding LHS element
da30: 73 2e 20 20 41 6c 6c 20 74 68 69 73 20 72 6f 75  s.  All this rou
da40: 74 69 6e 65 20 64 6f 65 73 20 69 73 20 69 6e 69  tine does is ini
da50: 74 69 61 6c 69 7a 65 0a 2a 2a 20 74 68 65 20 72  tialize.** the r
da60: 65 67 69 73 74 65 72 20 67 69 76 65 6e 20 62 79  egister given by
da70: 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 74 6f   rMayHaveNull to
da80: 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67 20   NULL.  Calling 
da90: 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 74 61  routines will ta
daa0: 6b 65 0a 2a 2a 20 63 61 72 65 20 6f 66 20 63 68  ke.** care of ch
dab0: 61 6e 67 69 6e 67 20 74 68 69 73 20 72 65 67 69  anging this regi
dac0: 73 74 65 72 20 76 61 6c 75 65 20 74 6f 20 6e 6f  ster value to no
dad0: 6e 2d 4e 55 4c 4c 20 69 66 20 74 68 65 20 52 48  n-NULL if the RH
dae0: 53 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a  S is NULL-free..
daf0: 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61 76  **.** If rMayHav
db00: 65 4e 75 6c 6c 20 69 73 20 7a 65 72 6f 2c 20 74  eNull is zero, t
db10: 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74  hat means that t
db20: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 62  he subquery is b
db30: 65 69 6e 67 20 75 73 65 64 0a 2a 2a 20 66 6f 72  eing used.** for
db40: 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74   membership test
db50: 69 6e 67 20 6f 6e 6c 79 2e 20 20 54 68 65 72 65  ing only.  There
db60: 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69   is no need to i
db70: 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 0a 2a 2a  nitialize any.**
db80: 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 69 6e   registers to in
db90: 64 69 63 61 74 65 20 74 68 65 20 70 72 65 73 65  dicate the prese
dba0: 6e 73 65 20 6f 72 20 61 62 73 65 6e 63 65 20 6f  nse or absence o
dbb0: 66 20 4e 55 4c 4c 73 20 6f 6e 20 74 68 65 20 52  f NULLs on the R
dbc0: 48 53 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20  HS..**.** For a 
dbd0: 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53  SELECT or EXISTS
dbe0: 20 6f 70 65 72 61 74 6f 72 2c 20 72 65 74 75 72   operator, retur
dbf0: 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20 74  n the register t
dc00: 68 61 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a 2a  hat holds the.**
dc10: 20 72 65 73 75 6c 74 2e 20 20 46 6f 72 20 49 4e   result.  For IN
dc20: 20 6f 70 65 72 61 74 6f 72 73 20 6f 72 20 69 66   operators or if
dc30: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
dc40: 2c 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  , the return val
dc50: 75 65 20 69 73 20 30 2e 0a 2a 2f 0a 23 69 66 6e  ue is 0..*/.#ifn
dc60: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
dc70: 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c  SUBQUERY.int sql
dc80: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
dc90: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
dca0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
dcb0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
dcc0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
dcd0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
dce0: 54 68 65 20 49 4e 2c 20 53 45 4c 45 43 54 2c 20  The IN, SELECT, 
dcf0: 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61 74  or EXISTS operat
dd00: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 4d 61 79  or */.  int rMay
dd10: 48 61 76 65 4e 75 6c 6c 2c 20 20 20 20 20 20 20  HaveNull,       
dd20: 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 61 74  /* Register that
dd30: 20 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72   records whether
dd40: 20 4e 55 4c 4c 73 20 65 78 69 73 74 20 69 6e 20   NULLs exist in 
dd50: 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52  RHS */.  int isR
dd60: 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20 20  owid            
dd70: 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 4c 48 53   /* If true, LHS
dd80: 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   of IN operator 
dd90: 69 73 20 61 20 72 6f 77 69 64 20 2a 2f 0a 29 7b  is a rowid */.){
dda0: 0a 20 20 69 6e 74 20 74 65 73 74 41 64 64 72 20  .  int testAddr 
ddb0: 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20  = -1;           
ddc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
ddd0: 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64 72  e-time test addr
dde0: 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65  ess */.  int rRe
ddf0: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
de00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de10: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74 6f   /* Register sto
de20: 72 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20 2a  ring resulting *
de30: 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  /.  Vdbe *v = sq
de40: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
de50: 72 73 65 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  rse);.  if( NEVE
de60: 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(v==0) ) return
de70: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   0;.  sqlite3Exp
de80: 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
de90: 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63  e);..  /* This c
dea0: 6f 64 65 20 6d 75 73 74 20 62 65 20 72 75 6e 20  ode must be run 
deb0: 69 6e 20 69 74 73 20 65 6e 74 69 72 65 74 79 20  in its entirety 
dec0: 65 76 65 72 79 20 74 69 6d 65 20 69 74 20 69 73  every time it is
ded0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a   encountered.  *
dee0: 2a 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  * if any of the 
def0: 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75  following is tru
df00: 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  e:.  **.  **    
df10: 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  *  The right-han
df20: 64 20 73 69 64 65 20 69 73 20 61 20 63 6f 72 72  d side is a corr
df30: 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 0a  elated subquery.
df40: 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72    **    *  The r
df50: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69  ight-hand side i
df60: 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s an expression 
df70: 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  list containing 
df80: 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20  variables.  **  
df90: 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69    *  We are insi
dfa0: 64 65 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a  de a trigger.  *
dfb0: 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66  *.  ** If all of
dfc0: 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 66   the above are f
dfd0: 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61  alse, then we ca
dfe0: 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20  n run this code 
dff0: 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73  just once.  ** s
e000: 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c  ave the results,
e010: 20 61 6e 64 20 72 65 75 73 65 20 74 68 65 20 73   and reuse the s
e020: 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75  ame result on su
e030: 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74  bsequent invocat
e040: 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
e050: 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70   !ExprHasAnyProp
e060: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56  erty(pExpr, EP_V
e070: 61 72 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  arSelect) ){.   
e080: 20 74 65 73 74 41 64 64 72 20 3d 20 73 71 6c 69   testAddr = sqli
e090: 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72  te3CodeOnce(pPar
e0a0: 73 65 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  se);.  }..#ifnde
e0b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
e0c0: 50 4c 41 49 4e 0a 20 20 69 66 28 20 70 50 61 72  PLAIN.  if( pPar
e0d0: 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
e0e0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67  {.    char *zMsg
e0f0: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
e100: 66 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  f(.        pPars
e110: 65 2d 3e 64 62 2c 20 22 45 58 45 43 55 54 45 20  e->db, "EXECUTE 
e120: 25 73 25 73 20 53 55 42 51 55 45 52 59 20 25 64  %s%s SUBQUERY %d
e130: 22 2c 20 74 65 73 74 41 64 64 72 3e 3d 30 3f 22  ", testAddr>=0?"
e140: 22 3a 22 43 4f 52 52 45 4c 41 54 45 44 20 22 2c  ":"CORRELATED ",
e150: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
e160: 6f 70 3d 3d 54 4b 5f 49 4e 3f 22 4c 49 53 54 22  op==TK_IN?"LIST"
e170: 3a 22 53 43 41 4c 41 52 22 2c 20 70 50 61 72 73  :"SCALAR", pPars
e180: 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
e190: 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
e1a0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
e1b0: 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61   OP_Explain, pPa
e1c0: 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
e1d0: 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44  0, 0, zMsg, P4_D
e1e0: 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 23 65 6e  YNAMIC);.  }.#en
e1f0: 64 69 66 0a 0a 20 20 73 77 69 74 63 68 28 20 70  dif..  switch( p
e200: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
e210: 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
e220: 20 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74      char affinit
e230: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
e240: 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f 66 20 74  /* Affinity of t
e250: 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e  he LHS of the IN
e260: 20 2a 2f 0a 20 20 20 20 20 20 4b 65 79 49 6e 66   */.      KeyInf
e270: 6f 20 6b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20  o keyInfo;      
e280: 20 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f        /* Keyinfo
e290: 20 66 6f 72 20 74 68 65 20 67 65 6e 65 72 61 74   for the generat
e2a0: 65 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ed table */.    
e2b0: 20 20 73 74 61 74 69 63 20 75 38 20 73 6f 72 74    static u8 sort
e2c0: 4f 72 64 65 72 20 3d 20 30 3b 20 20 20 20 2f 2a  Order = 0;    /*
e2d0: 20 46 61 6b 65 20 61 53 6f 72 74 4f 72 64 65 72   Fake aSortOrder
e2e0: 20 66 6f 72 20 6b 65 79 49 6e 66 6f 20 2a 2f 0a   for keyInfo */.
e2f0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 20        int addr; 
e300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e310: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
e320: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
e330: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a   instruction */.
e340: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
e350: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
e360: 3b 20 2f 2a 20 74 68 65 20 4c 48 53 20 6f 66 20  ; /* the LHS of 
e370: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
e380: 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 72 4d  */..      if( rM
e390: 61 79 48 61 76 65 4e 75 6c 6c 20 29 7b 0a 20 20  ayHaveNull ){.  
e3a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e3b0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
e3c0: 6c 6c 2c 20 30 2c 20 72 4d 61 79 48 61 76 65 4e  ll, 0, rMayHaveN
e3d0: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  ull);.      }.. 
e3e0: 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
e3f0: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
e400: 69 74 79 28 70 4c 65 66 74 29 3b 0a 0a 20 20 20  ity(pLeft);..   
e410: 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68     /* Whether th
e420: 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53  is is an 'x IN(S
e430: 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e  ELECT...)' or an
e440: 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74   'x IN(<exprlist
e450: 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70  >)'.      ** exp
e460: 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61  ression it is ha
e470: 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77  ndled the same w
e480: 61 79 2e 20 20 41 6e 20 65 70 68 65 6d 65 72 61  ay.  An ephemera
e490: 6c 20 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20  l table is .    
e4a0: 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68    ** filled with
e4b0: 20 73 69 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e   single-field in
e4c0: 64 65 78 20 6b 65 79 73 20 72 65 70 72 65 73 65  dex keys represe
e4d0: 6e 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  nting the result
e4e0: 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20  s.      ** from 
e4f0: 74 68 65 20 53 45 4c 45 43 54 20 6f 72 20 74 68  the SELECT or th
e500: 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20  e <exprlist>..  
e510: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
e520: 49 66 20 74 68 65 20 27 78 27 20 65 78 70 72 65  If the 'x' expre
e530: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
e540: 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20  n value, or the 
e550: 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20  SELECT....      
e560: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74  ** statement ret
e570: 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  urns a column va
e580: 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66  lue, then the af
e590: 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20  finity of that. 
e5a0: 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69       ** column i
e5b0: 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  s used to build 
e5c0: 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20  the index keys. 
e5d0: 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20  If both 'x' and 
e5e0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c  the.      ** SEL
e5f0: 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74  ECT... statement
e600: 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68   are columns, th
e610: 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  en numeric affin
e620: 69 74 79 20 69 73 20 75 73 65 64 0a 20 20 20 20  ity is used.    
e630: 20 20 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63    ** if either c
e640: 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49  olumn has NUMERI
e650: 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66  C or INTEGER aff
e660: 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65  inity. If neithe
e670: 72 0a 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e  r.      ** 'x' n
e680: 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e  or the SELECT...
e690: 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63   statement are c
e6a0: 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d  olumns, then num
e6b0: 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20  eric affinity.  
e6c0: 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a      ** is used..
e6d0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
e6e0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
e6f0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
e700: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
e710: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
e720: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
e730: 6c 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  l, pExpr->iTable
e740: 2c 20 21 69 73 52 6f 77 69 64 29 3b 0a 20 20 20  , !isRowid);.   
e750: 20 20 20 69 66 28 20 72 4d 61 79 48 61 76 65 4e     if( rMayHaveN
e760: 75 6c 6c 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  ull==0 ) sqlite3
e770: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
e780: 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29  BTREE_UNORDERED)
e790: 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
e7a0: 6b 65 79 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  keyInfo, 0, size
e7b0: 6f 66 28 6b 65 79 49 6e 66 6f 29 29 3b 0a 20 20  of(keyInfo));.  
e7c0: 20 20 20 20 6b 65 79 49 6e 66 6f 2e 6e 46 69 65      keyInfo.nFie
e7d0: 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 6b 65  ld = 1;.      ke
e7e0: 79 49 6e 66 6f 2e 61 53 6f 72 74 4f 72 64 65 72  yInfo.aSortOrder
e7f0: 20 3d 20 26 73 6f 72 74 4f 72 64 65 72 3b 0a 0a   = &sortOrder;..
e800: 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
e810: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
e820: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
e830: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73  {.        /* Cas
e840: 65 20 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e  e 1:     expr IN
e850: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20   (SELECT ...).  
e860: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
e870: 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   ** Generate cod
e880: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 72  e to write the r
e890: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
e8a0: 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65  lect into the te
e8b0: 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20  mporary.        
e8c0: 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74  ** table allocat
e8d0: 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62  ed and opened ab
e8e0: 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ove..        */.
e8f0: 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 44 65          SelectDe
e900: 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 20  st dest;.       
e910: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
e920: 74 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65  t;..        asse
e930: 72 74 28 20 21 69 73 52 6f 77 69 64 20 29 3b 0a  rt( !isRowid );.
e940: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
e950: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
e960: 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45  est, SRT_Set, pE
e970: 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  xpr->iTable);.  
e980: 20 20 20 20 20 20 64 65 73 74 2e 61 66 66 53 64        dest.affSd
e990: 73 74 20 3d 20 28 75 38 29 61 66 66 69 6e 69 74  st = (u8)affinit
e9a0: 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  y;.        asser
e9b0: 74 28 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c  t( (pExpr->iTabl
e9c0: 65 26 30 78 30 30 30 30 46 46 46 46 29 3d 3d 70  e&0x0000FFFF)==p
e9d0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a  Expr->iTable );.
e9e0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78          pExpr->x
e9f0: 2e 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74  .pSelect->iLimit
ea00: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
ea10: 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  ( sqlite3Select(
ea20: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 78  pParse, pExpr->x
ea30: 2e 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29  .pSelect, &dest)
ea40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
ea50: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
ea60: 7d 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73 74  }.        pEList
ea70: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   = pExpr->x.pSel
ea80: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  ect->pEList;.   
ea90: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
eaa0: 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 4c  pEList!=0 && pEL
eab0: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 29 20 29 7b  ist->nExpr>0) ){
eac0: 20 0a 20 20 20 20 20 20 20 20 20 20 6b 65 79 49   .          keyI
ead0: 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73  nfo.aColl[0] = s
eae0: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
eaf0: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
eb00: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
eb10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
eb20: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
eb30: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
eb40: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c      }else if( AL
eb50: 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c  WAYS(pExpr->x.pL
eb60: 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  ist!=0) ){.     
eb70: 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20     /* Case 2:   
eb80: 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c    expr IN (exprl
eb90: 69 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ist).        **.
eba0: 20 20 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 65          ** For e
ebb0: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ach expression, 
ebc0: 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b  build an index k
ebd0: 65 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c  ey from the eval
ebe0: 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20  uation and.     
ebf0: 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69     ** store it i
ec00: 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
ec10: 74 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e  table. If <expr>
ec20: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68   is a column, th
ec30: 65 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a  en use.        *
ec40: 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61  * that columns a
ec50: 66 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69  ffinity when bui
ec60: 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73  lding index keys
ec70: 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e  . If <expr> is n
ec80: 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  ot.        ** a 
ec90: 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65  column, use nume
eca0: 72 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20  ric affinity..  
ecb0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
ecc0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
ecd0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
ece0: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
ecf0: 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  ;.        struct
ed00: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
ed10: 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 69  pItem;.        i
ed20: 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 0a  nt r1, r2, r3;..
ed30: 20 20 20 20 20 20 20 20 69 66 28 20 21 61 66 66          if( !aff
ed40: 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20  inity ){.       
ed50: 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53 51     affinity = SQ
ed60: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
ed70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ed80: 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30   keyInfo.aColl[0
ed90: 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  ] = sqlite3ExprC
eda0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
edb0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
edc0: 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 53        keyInfo.aS
edd0: 6f 72 74 4f 72 64 65 72 20 3d 20 26 73 6f 72 74  ortOrder = &sort
ede0: 4f 72 64 65 72 3b 0a 0a 20 20 20 20 20 20 20 20  Order;..        
edf0: 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
ee00: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20  each expression 
ee10: 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a  in <exprlist>. *
ee20: 2f 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73  /.        r1 = s
ee30: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
ee40: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
ee50: 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65    r2 = sqlite3Ge
ee60: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
ee70: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
ee80: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
ee90: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a  P_Null, 0, r2);.
eea0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4c          for(i=pL
eeb0: 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  ist->nExpr, pIte
eec0: 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b  m=pList->a; i>0;
eed0: 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
eee0: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
eef0: 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78  pE2 = pItem->pEx
ef00: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  pr;.          in
ef10: 74 20 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20  t iValToIns;..  
ef20: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
ef30: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
ef40: 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65  not constant the
ef50: 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  n we will need t
ef60: 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64  o.          ** d
ef70: 69 73 61 62 6c 65 20 74 68 65 20 74 65 73 74 20  isable the test 
ef80: 74 68 61 74 20 77 61 73 20 67 65 6e 65 72 61 74  that was generat
ef90: 65 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61  ed above that ma
efa0: 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20 20 20  kes sure.       
efb0: 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20     ** this code 
efc0: 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e  only executes on
efd0: 63 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72  ce.  Because for
efe0: 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a   a non-constant.
eff0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70            ** exp
f000: 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20  ression we need 
f010: 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f  to rerun this co
f020: 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20  de each time..  
f030: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
f040: 20 20 20 20 20 69 66 28 20 74 65 73 74 41 64 64       if( testAdd
f050: 72 3e 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33  r>=0 && !sqlite3
f060: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
f070: 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  E2) ){.         
f080: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
f090: 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 74 65  angeToNoop(v, te
f0a0: 73 74 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20  stAddr);.       
f0b0: 20 20 20 20 20 74 65 73 74 41 64 64 72 20 3d 20       testAddr = 
f0c0: 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  -1;.          }.
f0d0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76  .          /* Ev
f0e0: 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65  aluate the expre
f0f0: 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74  ssion and insert
f100: 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d   it into the tem
f110: 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  p table */.     
f120: 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64       if( isRowid
f130: 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
f140: 73 49 6e 74 65 67 65 72 28 70 45 32 2c 20 26 69  sInteger(pE2, &i
f150: 56 61 6c 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20  ValToIns) ){.   
f160: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
f170: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
f180: 5f 49 6e 73 65 72 74 49 6e 74 2c 20 70 45 78 70  _InsertInt, pExp
f190: 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 69  r->iTable, r2, i
f1a0: 56 61 6c 54 6f 49 6e 73 29 3b 0a 20 20 20 20 20  ValToIns);.     
f1b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f1c0: 20 20 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c          r3 = sql
f1d0: 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
f1e0: 65 74 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20  et(pParse, pE2, 
f1f0: 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r1);.           
f200: 20 69 66 28 20 69 73 52 6f 77 69 64 20 29 7b 0a   if( isRowid ){.
f210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
f220: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f230: 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
f240: 20 72 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20   r3,.           
f250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f260: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f270: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32  CurrentAddr(v)+2
f280: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
f290: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f2a0: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
f2b0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
f2c0: 72 32 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20  r2, r3);.       
f2d0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f2e0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f2f0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
f300: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 33  P_MakeRecord, r3
f310: 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69  , 1, r2, &affini
f320: 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ty, 1);.        
f330: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f340: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
f350: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 33 2c  ange(pParse, r3,
f360: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   1);.           
f370: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f380: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
f390: 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  sert, pExpr->iTa
f3a0: 62 6c 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  ble, r2);.      
f3b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f3c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
f3d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
f3e0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
f3f0: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  se, r1);.       
f400: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
f410: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
f420: 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
f430: 20 20 69 66 28 20 21 69 73 52 6f 77 69 64 20 29    if( !isRowid )
f440: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
f450: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
f460: 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 26   addr, (void *)&
f470: 6b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  keyInfo, P4_KEYI
f480: 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NFO);.      }.  
f490: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f4a0: 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  ..    case TK_EX
f4b0: 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54  ISTS:.    case T
f4c0: 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 64 65  K_SELECT:.    de
f4d0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f  fault: {.      /
f4e0: 2a 20 49 66 20 74 68 69 73 20 68 61 73 20 74 6f  * If this has to
f4f0: 20 62 65 20 61 20 73 63 61 6c 61 72 20 53 45 4c   be a scalar SEL
f500: 45 43 54 2e 20 20 47 65 6e 65 72 61 74 65 20 63  ECT.  Generate c
f510: 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65 0a 20  ode to put the. 
f520: 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66       ** value of
f530: 20 74 68 69 73 20 73 65 6c 65 63 74 20 69 6e 20   this select in 
f540: 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  a memory cell an
f550: 64 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d  d record the num
f560: 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ber.      ** of 
f570: 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
f580: 69 6e 20 69 43 6f 6c 75 6d 6e 2e 20 20 49 66 20  in iColumn.  If 
f590: 74 68 69 73 20 69 73 20 61 6e 20 45 58 49 53 54  this is an EXIST
f5a0: 53 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a  S, write.      *
f5b0: 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 30 20 28  * an integer 0 (
f5c0: 6e 6f 74 20 65 78 69 73 74 73 29 20 6f 72 20 31  not exists) or 1
f5d0: 20 28 65 78 69 73 74 73 29 20 69 6e 74 6f 20 61   (exists) into a
f5e0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 0a 20 20 20   memory cell.   
f5f0: 20 20 20 2a 2a 20 61 6e 64 20 72 65 63 6f 72 64     ** and record
f600: 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c   that memory cel
f610: 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20  l in iColumn..  
f620: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c      */.      Sel
f630: 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 20  ect *pSel;      
f640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f650: 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61     /* SELECT sta
f660: 74 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65  tement to encode
f670: 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74   */.      Select
f680: 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20  Dest dest;      
f690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6a0: 2f 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c 20 77  /* How to deal w
f6b0: 69 74 68 20 53 45 4c 45 43 74 20 72 65 73 75 6c  ith SELECt resul
f6c0: 74 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73 74  t */..      test
f6d0: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
f6e0: 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20  =TK_EXISTS );.  
f6f0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
f700: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
f710: 43 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CT );.      asse
f720: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
f730: 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70 45 78 70  K_EXISTS || pExp
f740: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
f750: 20 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72   );..      asser
f760: 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
f770: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
f780: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
f790: 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78   pSel = pExpr->x
f7a0: 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
f7b0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
f7c0: 74 49 6e 69 74 28 26 64 65 73 74 2c 20 30 2c 20  tInit(&dest, 0, 
f7d0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b  ++pParse->nMem);
f7e0: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
f7f0: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
f800: 29 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e  ){.        dest.
f810: 65 44 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b  eDest = SRT_Mem;
f820: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f830: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f840: 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69  _Null, 0, dest.i
f850: 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20  SDParm);.       
f860: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
f870: 20 22 49 6e 69 74 20 73 75 62 71 75 65 72 79 20   "Init subquery 
f880: 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20  result"));.     
f890: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f8a0: 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
f8b0: 5f 45 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20  _Exists;.       
f8c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f8d0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
f8e0: 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72  , 0, dest.iSDPar
f8f0: 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  m);.        Vdbe
f900: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69  Comment((v, "Ini
f910: 74 20 45 58 49 53 54 53 20 72 65 73 75 6c 74 22  t EXISTS result"
f920: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
f930: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
f940: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
f950: 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  pSel->pLimit);. 
f960: 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69       pSel->pLimi
f970: 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  t = sqlite3PExpr
f980: 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45  (pParse, TK_INTE
f990: 47 45 52 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  GER, 0, 0,.     
f9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 71               &sq
f9c0: 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31  lite3IntTokens[1
f9d0: 5d 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e  ]);.      pSel->
f9e0: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
f9f0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
fa00: 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
fa10: 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20  , &dest) ){.    
fa20: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
fa30: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 52 65 67      }.      rReg
fa40: 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b   = dest.iSDParm;
fa50: 0a 20 20 20 20 20 20 45 78 70 72 53 65 74 49 72  .      ExprSetIr
fa60: 72 65 64 75 63 69 62 6c 65 28 70 45 78 70 72 29  reducible(pExpr)
fa70: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
fa80: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
fa90: 74 65 73 74 41 64 64 72 3e 3d 30 20 29 7b 0a 20  testAddr>=0 ){. 
faa0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
fab0: 6d 70 48 65 72 65 28 76 2c 20 74 65 73 74 41 64  mpHere(v, testAd
fac0: 64 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  dr);.  }.  sqlit
fad0: 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
fae0: 50 61 72 73 65 2c 20 31 29 3b 0a 0a 20 20 72 65  Parse, 1);..  re
faf0: 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e  turn rReg;.}.#en
fb00: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
fb10: 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
fb20: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
fb30: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
fb40: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
fb50: 20 66 6f 72 20 61 6e 20 49 4e 20 65 78 70 72 65   for an IN expre
fb60: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ssion..**.**    
fb70: 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e    x IN (SELECT .
fb80: 2e 2e 29 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e  ..).**      x IN
fb90: 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20   (value, value, 
fba0: 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ...).**.** The l
fbb0: 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 28 4c  eft-hand side (L
fbc0: 48 53 29 20 69 73 20 61 20 73 63 61 6c 61 72 20  HS) is a scalar 
fbd0: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 65  expression.  The
fbe0: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
fbf0: 20 28 52 48 53 29 0a 2a 2a 20 69 73 20 61 6e 20   (RHS).** is an 
fc00: 61 72 72 61 79 20 6f 66 20 7a 65 72 6f 20 6f 72  array of zero or
fc10: 20 6d 6f 72 65 20 76 61 6c 75 65 73 2e 20 20 54   more values.  T
fc20: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
fc30: 20 74 72 75 65 20 69 66 20 74 68 65 20 4c 48 53   true if the LHS
fc40: 20 69 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64   is.** contained
fc50: 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e   within the RHS.
fc60: 20 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74    The value of t
fc70: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
fc80: 20 75 6e 6b 6e 6f 77 6e 20 28 4e 55 4c 4c 29 0a   unknown (NULL).
fc90: 2a 2a 20 69 66 20 74 68 65 20 4c 48 53 20 69 73  ** if the LHS is
fca0: 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20   NULL or if the 
fcb0: 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61  LHS is not conta
fcc0: 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ined within the 
fcd0: 52 48 53 20 61 6e 64 20 74 68 65 0a 2a 2a 20 52  RHS and the.** R
fce0: 48 53 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  HS contains one 
fcf0: 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c  or more NULL val
fd00: 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ues..**.** This 
fd10: 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
fd20: 73 20 63 6f 64 65 20 77 69 6c 6c 20 6a 75 6d 70  s code will jump
fd30: 20 74 6f 20 64 65 73 74 49 66 46 61 6c 73 65 20   to destIfFalse 
fd40: 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f  if the LHS is no
fd50: 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20  t .** contained 
fd60: 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20  within the RHS. 
fd70: 20 49 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73   If due to NULLs
fd80: 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72   we cannot deter
fd90: 6d 69 6e 65 20 69 66 20 74 68 65 20 4c 48 53 0a  mine if the LHS.
fda0: 2a 2a 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ** is contained 
fdb0: 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20  in the RHS then 
fdc0: 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66 4e 75  jump to destIfNu
fdd0: 6c 6c 2e 20 20 49 66 20 74 68 65 20 4c 48 53 20  ll.  If the LHS 
fde0: 69 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20  is contained.** 
fdf0: 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 20 74  within the RHS t
fe00: 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  hen fall through
fe10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
fe20: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
fe30: 49 4e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  IN(.  Parse *pPa
fe40: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
fe50: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
fe60: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
fe70: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
fe80: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  xpr,          /*
fe90: 20 54 68 65 20 49 4e 20 65 78 70 72 65 73 73 69   The IN expressi
fea0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  on */.  int dest
feb0: 49 66 46 61 6c 73 65 2c 20 20 20 20 20 20 2f 2a  IfFalse,      /*
fec0: 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 4c 48   Jump here if LH
fed0: 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  S is not contain
fee0: 65 64 20 69 6e 20 74 68 65 20 52 48 53 20 2a 2f  ed in the RHS */
fef0: 0a 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c  .  int destIfNul
ff00: 6c 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70  l        /* Jump
ff10: 20 68 65 72 65 20 69 66 20 74 68 65 20 72 65 73   here if the res
ff20: 75 6c 74 73 20 61 72 65 20 75 6e 6b 6e 6f 77 6e  ults are unknown
ff30: 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f   due to NULLs */
ff40: 0a 29 7b 0a 20 20 69 6e 74 20 72 52 68 73 48 61  .){.  int rRhsHa
ff50: 73 4e 75 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20 52  sNull = 0;  /* R
ff60: 65 67 69 73 74 65 72 20 74 68 61 74 20 69 73 20  egister that is 
ff70: 74 72 75 65 20 69 66 20 52 48 53 20 63 6f 6e 74  true if RHS cont
ff80: 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73  ains NULL values
ff90: 20 2a 2f 0a 20 20 63 68 61 72 20 61 66 66 69 6e   */.  char affin
ffa0: 69 74 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  ity;        /* C
ffb0: 6f 6d 70 61 72 69 73 6f 6e 20 61 66 66 69 6e 69  omparison affini
ffc0: 74 79 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 69  ty to use */.  i
ffd0: 6e 74 20 65 54 79 70 65 3b 20 20 20 20 20 20 20  nt eType;       
ffe0: 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
fff0: 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74  the RHS */.  int
10000 20 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   r1;            
10010 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20     /* Temporary 
10020 75 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  use register */.
10030 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
10040 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65          /* State
10050 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74  ment under const
10060 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a  ruction */..  /*
10070 20 43 6f 6d 70 75 74 65 20 74 68 65 20 52 48 53   Compute the RHS
10080 2e 20 20 20 41 66 74 65 72 20 74 68 69 73 20 73  .   After this s
10090 74 65 70 2c 20 74 68 65 20 74 61 62 6c 65 20 77  tep, the table w
100a0 69 74 68 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20  ith cursor.  ** 
100b0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 77 69  pExpr->iTable wi
100c0 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ll contains the 
100d0 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65  values that make
100e0 20 75 70 20 74 68 65 20 52 48 53 2e 0a 20 20 2a   up the RHS..  *
100f0 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  /.  v = pParse->
10100 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
10110 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f   v!=0 );       /
10120 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65 64 20 70  * OOM detected p
10130 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75  rior to this rou
10140 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  tine */.  VdbeNo
10150 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62  opComment((v, "b
10160 65 67 69 6e 20 49 4e 20 65 78 70 72 22 29 29 3b  egin IN expr"));
10170 0a 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74  .  eType = sqlit
10180 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50  e3FindInIndex(pP
10190 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 52  arse, pExpr, &rR
101a0 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 0a 20 20 2f  hsHasNull);..  /
101b0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
101c0 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65   affinity to use
101d0 20 74 6f 20 63 72 65 61 74 65 20 61 20 6b 65 79   to create a key
101e0 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c 74   from the result
101f0 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 65 78  s.  ** of the ex
10200 70 72 65 73 73 69 6f 6e 2e 20 61 66 66 69 6e 69  pression. affini
10210 74 79 53 74 72 20 73 74 6f 72 65 73 20 61 20 73  tyStr stores a s
10220 74 61 74 69 63 20 73 74 72 69 6e 67 20 73 75 69  tatic string sui
10230 74 61 62 6c 65 20 66 6f 72 0a 20 20 2a 2a 20 50  table for.  ** P
10240 34 20 6f 66 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4 of OP_MakeReco
10250 72 64 2e 0a 20 20 2a 2f 0a 20 20 61 66 66 69 6e  rd..  */.  affin
10260 69 74 79 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e  ity = comparison
10270 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b  Affinity(pExpr);
10280 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20  ..  /* Code the 
10290 4c 48 53 2c 20 74 68 65 20 3c 65 78 70 72 3e 20  LHS, the <expr> 
102a0 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20  from "<expr> IN 
102b0 28 2e 2e 2e 29 22 2e 0a 20 20 2a 2f 0a 20 20 73  (...)"..  */.  s
102c0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
102d0 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 72  ush(pParse);.  r
102e0 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
102f0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
10300 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
10310 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
10320 70 4c 65 66 74 2c 20 72 31 29 3b 0a 0a 20 20 2f  pLeft, r1);..  /
10330 2a 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20  * If the LHS is 
10340 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 72  NULL, then the r
10350 65 73 75 6c 74 20 69 73 20 65 69 74 68 65 72 20  esult is either 
10360 66 61 6c 73 65 20 6f 72 20 4e 55 4c 4c 20 64 65  false or NULL de
10370 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 6f 6e 20  pending.  ** on 
10380 77 68 65 74 68 65 72 20 74 68 65 20 52 48 53 20  whether the RHS 
10390 69 73 20 65 6d 70 74 79 20 6f 72 20 6e 6f 74 2c  is empty or not,
103a0 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20   respectively.. 
103b0 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 49 66   */.  if( destIf
103c0 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73  Null==destIfFals
103d0 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53 68 6f 72  e ){.    /* Shor
103e0 74 63 75 74 20 66 6f 72 20 74 68 65 20 63 6f 6d  tcut for the com
103f0 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
10400 68 65 20 66 61 6c 73 65 20 61 6e 64 20 4e 55 4c  he false and NUL
10410 4c 20 6f 75 74 63 6f 6d 65 73 20 61 72 65 0a 20  L outcomes are. 
10420 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 2e 20     ** the same. 
10430 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
10440 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
10450 73 4e 75 6c 6c 2c 20 72 31 2c 20 64 65 73 74 49  sNull, r1, destI
10460 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b  fNull);.  }else{
10470 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31 20 3d  .    int addr1 =
10480 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10490 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  p1(v, OP_NotNull
104a0 2c 20 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  , r1);.    sqlit
104b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
104c0 4f 50 5f 52 65 77 69 6e 64 2c 20 70 45 78 70 72  OP_Rewind, pExpr
104d0 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66  ->iTable, destIf
104e0 46 61 6c 73 65 29 3b 0a 20 20 20 20 73 71 6c 69  False);.    sqli
104f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10500 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73   OP_Goto, 0, des
10510 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71  tIfNull);.    sq
10520 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
10530 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 7d  e(v, addr1);.  }
10540 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49  ..  if( eType==I
10550 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b  N_INDEX_ROWID ){
10560 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20  .    /* In this 
10570 63 61 73 65 2c 20 74 68 65 20 52 48 53 20 69 73  case, the RHS is
10580 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74 61   the ROWID of ta
10590 62 6c 65 20 62 2d 74 72 65 65 0a 20 20 20 20 2a  ble b-tree.    *
105a0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
105b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75  eAddOp2(v, OP_Mu
105c0 73 74 42 65 49 6e 74 2c 20 72 31 2c 20 64 65 73  stBeInt, r1, des
105d0 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 73  tIfFalse);.    s
105e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
105f0 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  (v, OP_NotExists
10600 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
10610 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31   destIfFalse, r1
10620 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
10630 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  /* In this case,
10640 20 74 68 65 20 52 48 53 20 69 73 20 61 6e 20 69   the RHS is an i
10650 6e 64 65 78 20 62 2d 74 72 65 65 2e 0a 20 20 20  ndex b-tree..   
10660 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
10670 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
10680 41 66 66 69 6e 69 74 79 2c 20 72 31 2c 20 31 2c  Affinity, r1, 1,
10690 20 30 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31   0, &affinity, 1
106a0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
106b0 65 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70  e set membership
106c0 20 74 65 73 74 20 66 61 69 6c 73 2c 20 74 68 65   test fails, the
106d0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  n the result of 
106e0 74 68 65 20 0a 20 20 20 20 2a 2a 20 22 78 20 49  the .    ** "x I
106f0 4e 20 28 2e 2e 2e 29 22 20 65 78 70 72 65 73 73  N (...)" express
10700 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 69 74 68  ion must be eith
10710 65 72 20 30 20 6f 72 20 4e 55 4c 4c 2e 20 49 66  er 0 or NULL. If
10720 20 74 68 65 20 73 65 74 0a 20 20 20 20 2a 2a 20   the set.    ** 
10730 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c  contains no NULL
10740 20 76 61 6c 75 65 73 2c 20 74 68 65 6e 20 74 68   values, then th
10750 65 20 72 65 73 75 6c 74 20 69 73 20 30 2e 20 49  e result is 0. I
10760 66 20 74 68 65 20 73 65 74 20 0a 20 20 20 20 2a  f the set .    *
10770 2a 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f  * contains one o
10780 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75  r more NULL valu
10790 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  es, then the res
107a0 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ult of the.    *
107b0 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  * expression is 
107c0 61 6c 73 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a  also NULL..    *
107d0 2f 0a 20 20 20 20 69 66 28 20 72 52 68 73 48 61  /.    if( rRhsHa
107e0 73 4e 75 6c 6c 3d 3d 30 20 7c 7c 20 64 65 73 74  sNull==0 || dest
107f0 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e  IfFalse==destIfN
10800 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ull ){.      /* 
10810 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73  This branch runs
10820 20 69 66 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20   if it is known 
10830 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20  at compile time 
10840 74 68 61 74 20 74 68 65 20 52 48 53 0a 20 20 20  that the RHS.   
10850 20 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 63 6f 6e     ** cannot con
10860 74 61 69 6e 20 4e 55 4c 4c 20 76 61 6c 75 65 73  tain NULL values
10870 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 61  . This happens a
10880 73 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20  s the result.   
10890 20 20 20 2a 2a 20 6f 66 20 61 20 22 4e 4f 54 20     ** of a "NOT 
108a0 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74  NULL" constraint
108b0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
108c0 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 20 20 2a   schema..      *
108d0 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c 73 6f 20  *.      ** Also 
108e0 72 75 6e 20 74 68 69 73 20 62 72 61 6e 63 68 20  run this branch 
108f0 69 66 20 4e 55 4c 4c 20 69 73 20 65 71 75 69 76  if NULL is equiv
10900 61 6c 65 6e 74 20 74 6f 20 46 41 4c 53 45 0a 20  alent to FALSE. 
10910 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 69 73       ** for this
10920 20 70 61 72 74 69 63 75 6c 61 72 20 49 4e 20 6f   particular IN o
10930 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 20 20 2a  perator..      *
10940 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
10950 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
10960 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78  OP_NotFound, pEx
10970 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74  pr->iTable, dest
10980 49 66 46 61 6c 73 65 2c 20 72 31 2c 20 31 29 3b  IfFalse, r1, 1);
10990 0a 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ..    }else{.   
109a0 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 62 72     /* In this br
109b0 61 6e 63 68 2c 20 74 68 65 20 52 48 53 20 6f 66  anch, the RHS of
109c0 20 74 68 65 20 49 4e 20 6d 69 67 68 74 20 63 6f   the IN might co
109d0 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 61 6e 64  ntain a NULL and
109e0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72  .      ** the pr
109f0 65 73 65 6e 63 65 20 6f 66 20 61 20 4e 55 4c 4c  esence of a NULL
10a00 20 6f 6e 20 74 68 65 20 52 48 53 20 6d 61 6b 65   on the RHS make
10a10 73 20 61 20 64 69 66 66 65 72 65 6e 63 65 20 69  s a difference i
10a20 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f  n the.      ** o
10a30 75 74 63 6f 6d 65 2e 0a 20 20 20 20 20 20 2a 2f  utcome..      */
10a40 0a 20 20 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a  .      int j1, j
10a50 32 2c 20 6a 33 3b 0a 0a 20 20 20 20 20 20 2f 2a  2, j3;..      /*
10a60 20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20   First check to 
10a70 73 65 65 20 69 66 20 74 68 65 20 4c 48 53 20 69  see if the LHS i
10a80 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  s contained in t
10a90 68 65 20 52 48 53 2e 20 20 49 66 20 73 6f 2c 0a  he RHS.  If so,.
10aa0 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
10ab0 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 4e 55  e presence of NU
10ac0 4c 4c 73 20 69 6e 20 74 68 65 20 52 48 53 20 64  LLs in the RHS d
10ad0 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2c 20  oes not matter, 
10ae0 73 6f 20 6a 75 6d 70 0a 20 20 20 20 20 20 2a 2a  so jump.      **
10af0 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65   over all of the
10b00 20 63 6f 64 65 20 74 68 61 74 20 66 6f 6c 6c 6f   code that follo
10b10 77 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ws..      */.   
10b20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56     j1 = sqlite3V
10b30 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
10b40 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d  OP_Found, pExpr-
10b50 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72 31 2c 20  >iTable, 0, r1, 
10b60 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 48 65  1);..      /* He
10b70 72 65 20 77 65 20 62 65 67 69 6e 20 67 65 6e 65  re we begin gene
10b80 72 61 74 69 6e 67 20 63 6f 64 65 20 74 68 61 74  rating code that
10b90 20 72 75 6e 73 20 69 66 20 74 68 65 20 4c 48 53   runs if the LHS
10ba0 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a   is not.      **
10bb0 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
10bc0 6e 20 74 68 65 20 52 48 53 2e 20 20 47 65 6e 65  n the RHS.  Gene
10bd0 72 61 74 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  rate additional 
10be0 63 6f 64 65 20 74 68 61 74 0a 20 20 20 20 20 20  code that.      
10bf0 2a 2a 20 74 65 73 74 73 20 74 68 65 20 52 48 53  ** tests the RHS
10c00 20 66 6f 72 20 4e 55 4c 4c 73 2e 20 20 49 66 20   for NULLs.  If 
10c10 74 68 65 20 52 48 53 20 63 6f 6e 74 61 69 6e 73  the RHS contains
10c20 20 61 20 4e 55 4c 4c 20 74 68 65 6e 0a 20 20 20   a NULL then.   
10c30 20 20 20 2a 2a 20 6a 75 6d 70 20 74 6f 20 64 65     ** jump to de
10c40 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68  stIfNull.  If th
10c50 65 72 65 20 61 72 65 20 6e 6f 20 4e 55 4c 4c 73  ere are no NULLs
10c60 20 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e   in the RHS then
10c70 0a 20 20 20 20 20 20 2a 2a 20 6a 75 6d 70 20 74  .      ** jump t
10c80 6f 20 64 65 73 74 49 66 46 61 6c 73 65 2e 0a 20  o destIfFalse.. 
10c90 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6a 32       */.      j2
10ca0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
10cb0 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  dOp1(v, OP_NotNu
10cc0 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 29  ll, rRhsHasNull)
10cd0 3b 0a 20 20 20 20 20 20 6a 33 20 3d 20 73 71 6c  ;.      j3 = sql
10ce0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
10cf0 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70  t(v, OP_Found, p
10d00 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c  Expr->iTable, 0,
10d10 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 31 29   rRhsHasNull, 1)
10d20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10d30 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10d40 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 72 52 68  Integer, -1, rRh
10d50 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  sHasNull);.     
10d60 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
10d70 48 65 72 65 28 76 2c 20 6a 33 29 3b 0a 20 20 20  Here(v, j3);.   
10d80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10d90 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
10da0 6d 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20  m, rRhsHasNull, 
10db0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
10dc0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
10dd0 20 6a 32 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20   j2);..      /* 
10de0 4a 75 6d 70 20 74 6f 20 74 68 65 20 61 70 70 72  Jump to the appr
10df0 6f 70 72 69 61 74 65 20 74 61 72 67 65 74 20 64  opriate target d
10e00 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
10e10 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20 20  her or not.     
10e20 20 2a 2a 20 74 68 65 20 52 48 53 20 63 6f 6e 74   ** the RHS cont
10e30 61 69 6e 73 20 61 20 4e 55 4c 4c 0a 20 20 20 20  ains a NULL.    
10e40 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
10e50 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10e60 4f 50 5f 49 66 2c 20 72 52 68 73 48 61 73 4e 75  OP_If, rRhsHasNu
10e70 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  ll, destIfNull);
10e80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10e90 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
10ea0 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 46 61  oto, 0, destIfFa
10eb0 6c 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  lse);..      /* 
10ec0 54 68 65 20 4f 50 5f 46 6f 75 6e 64 20 61 74 20  The OP_Found at 
10ed0 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20  the top of this 
10ee0 62 72 61 6e 63 68 20 6a 75 6d 70 73 20 68 65 72  branch jumps her
10ef0 65 20 77 68 65 6e 20 74 72 75 65 2c 20 0a 20 20  e when true, .  
10f00 20 20 20 20 2a 2a 20 63 61 75 73 69 6e 67 20 74      ** causing t
10f10 68 65 20 6f 76 65 72 61 6c 6c 20 49 4e 20 65 78  he overall IN ex
10f20 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74  pression evaluat
10f30 69 6f 6e 20 74 6f 20 66 61 6c 6c 20 74 68 72 6f  ion to fall thro
10f40 75 67 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ugh..      */.  
10f50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
10f60 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a  umpHere(v, j1);.
10f70 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
10f80 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
10f90 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
10fa0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
10fb0 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b  ePop(pParse, 1);
10fc0 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
10fd0 76 2c 20 22 65 6e 64 20 49 4e 20 65 78 70 72 22  v, "end IN expr"
10fe0 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ));.}.#endif /* 
10ff0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
11000 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44  UERY */../*.** D
11010 75 70 6c 69 63 61 74 65 20 61 6e 20 38 2d 62 79  uplicate an 8-by
11020 74 65 20 76 61 6c 75 65 0a 2a 2f 0a 73 74 61 74  te value.*/.stat
11030 69 63 20 63 68 61 72 20 2a 64 75 70 38 62 79 74  ic char *dup8byt
11040 65 73 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73  es(Vdbe *v, cons
11050 74 20 63 68 61 72 20 2a 69 6e 29 7b 0a 20 20 63  t char *in){.  c
11060 68 61 72 20 2a 6f 75 74 20 3d 20 73 71 6c 69 74  har *out = sqlit
11070 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 73 71  e3DbMallocRaw(sq
11080 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 2c 20  lite3VdbeDb(v), 
11090 38 29 3b 0a 20 20 69 66 28 20 6f 75 74 20 29 7b  8);.  if( out ){
110a0 0a 20 20 20 20 6d 65 6d 63 70 79 28 6f 75 74 2c  .    memcpy(out,
110b0 20 69 6e 2c 20 38 29 3b 0a 20 20 7d 0a 20 20 72   in, 8);.  }.  r
110c0 65 74 75 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 23 69  eturn out;.}..#i
110d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
110e0 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
110f0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
11100 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
11110 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65  hat will put the
11120 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a   floating point.
11130 2a 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69 62  ** value describ
11140 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20  ed by z[0..n-1] 
11150 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d  into register iM
11160 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b  em..**.** The z[
11170 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72  ] string will pr
11180 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65  obably not be ze
11190 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20  ro-terminated.  
111a0 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d  But the .** z[n]
111b0 20 63 68 61 72 61 63 74 65 72 20 69 73 20 67 75   character is gu
111c0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73  aranteed to be s
111d0 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f  omething that do
111e0 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c  es not look.** l
111f0 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61  ike the continua
11200 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62  tion of the numb
11210 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
11220 69 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65  id codeReal(Vdbe
11230 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *v, const char 
11240 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c  *z, int negateFl
11250 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20  ag, int iMem){. 
11260 20 69 66 28 20 41 4c 57 41 59 53 28 7a 21 3d 30   if( ALWAYS(z!=0
11270 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20  ) ){.    double 
11280 76 61 6c 75 65 3b 0a 20 20 20 20 63 68 61 72 20  value;.    char 
11290 2a 7a 56 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  *zV;.    sqlite3
112a0 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20  AtoF(z, &value, 
112b0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
112c0 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  z), SQLITE_UTF8)
112d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 73  ;.    assert( !s
112e0 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75  qlite3IsNaN(valu
112f0 65 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77  e) ); /* The new
11300 20 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74 75   AtoF never retu
11310 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69  rns NaN */.    i
11320 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20  f( negateFlag ) 
11330 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a  value = -value;.
11340 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79 74      zV = dup8byt
11350 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76 61  es(v, (char*)&va
11360 6c 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  lue);.    sqlite
11370 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
11380 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c  P_Real, 0, iMem,
11390 20 30 2c 20 7a 56 2c 20 50 34 5f 52 45 41 4c 29   0, zV, P4_REAL)
113a0 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
113b0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
113c0 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
113d0 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65  hat will put the
113e0 20 69 6e 74 65 67 65 72 20 64 65 73 63 72 69 62   integer describ
113f0 65 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30  e by.** text z[0
11400 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69  ..n-1] into regi
11410 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a  ster iMem..**.**
11420 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 69   Expr.u.zToken i
11430 73 20 61 6c 77 61 79 73 20 55 54 46 38 20 61 6e  s always UTF8 an
11440 64 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  d zero-terminate
11450 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
11460 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28 50 61  d codeInteger(Pa
11470 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
11480 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6e 65  r *pExpr, int ne
11490 67 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29  gFlag, int iMem)
114a0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
114b0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
114c0 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
114d0 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
114e0 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70 45 78  .    int i = pEx
114f0 70 72 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20  pr->u.iValue;.  
11500 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 29    assert( i>=0 )
11510 3b 0a 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61  ;.    if( negFla
11520 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20  g ) i = -i;.    
11530 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11540 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
11550 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c   i, iMem);.  }el
11560 73 65 7b 0a 20 20 20 20 69 6e 74 20 63 3b 0a 20  se{.    int c;. 
11570 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20     i64 value;.  
11580 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
11590 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  = pExpr->u.zToke
115a0 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  n;.    assert( z
115b0 21 3d 30 20 29 3b 0a 20 20 20 20 63 20 3d 20 73  !=0 );.    c = s
115c0 71 6c 69 74 65 33 41 74 6f 69 36 34 28 7a 2c 20  qlite3Atoi64(z, 
115d0 26 76 61 6c 75 65 2c 20 73 71 6c 69 74 65 33 53  &value, sqlite3S
115e0 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49  trlen30(z), SQLI
115f0 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 69 66  TE_UTF8);.    if
11600 28 20 63 3d 3d 30 20 7c 7c 20 28 63 3d 3d 32 20  ( c==0 || (c==2 
11610 26 26 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20  && negFlag) ){. 
11620 20 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20       char *zV;. 
11630 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67       if( negFlag
11640 20 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d 32   ){ value = c==2
11650 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36   ? SMALLEST_INT6
11660 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20  4 : -value; }.  
11670 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79 74      zV = dup8byt
11680 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76 61  es(v, (char*)&va
11690 6c 75 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lue);.      sqli
116a0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
116b0 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d   OP_Int64, 0, iM
116c0 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 49 4e  em, 0, zV, P4_IN
116d0 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  T64);.    }else{
116e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
116f0 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
11700 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  NT.      sqlite3
11710 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
11720 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e 74 65   "oversized inte
11730 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65 67 46  ger: %s%s", negF
11740 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20  lag ? "-" : "", 
11750 7a 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  z);.#else.      
11760 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e  codeReal(v, z, n
11770 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 23  egFlag, iMem);.#
11780 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
11790 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61  }../*.** Clear a
117a0 20 63 61 63 68 65 20 65 6e 74 72 79 2e 0a 2a 2f   cache entry..*/
117b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63  .static void cac
117c0 68 65 45 6e 74 72 79 43 6c 65 61 72 28 50 61 72  heEntryClear(Par
117d0 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75  se *pParse, stru
117e0 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 29  ct yColCache *p)
117f0 7b 0a 20 20 69 66 28 20 70 2d 3e 74 65 6d 70 52  {.  if( p->tempR
11800 65 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  eg ){.    if( pP
11810 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41  arse->nTempReg<A
11820 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d  rraySize(pParse-
11830 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20  >aTempReg) ){.  
11840 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d      pParse->aTem
11850 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65  pReg[pParse->nTe
11860 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 2d 3e 69 52  mpReg++] = p->iR
11870 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  eg;.    }.    p-
11880 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  >tempReg = 0;.  
11890 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  }.}.../*.** Reco
118a0 72 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  rd in the column
118b0 20 63 61 63 68 65 20 74 68 61 74 20 61 20 70 61   cache that a pa
118c0 72 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20  rticular column 
118d0 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69 63  from a.** partic
118e0 75 6c 61 72 20 74 61 62 6c 65 20 69 73 20 73 74  ular table is st
118f0 6f 72 65 64 20 69 6e 20 61 20 70 61 72 74 69 63  ored in a partic
11900 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e 0a 2a  ular register..*
11910 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
11920 70 72 43 61 63 68 65 53 74 6f 72 65 28 50 61 72  prCacheStore(Par
11930 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
11940 69 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c 20  iTab, int iCol, 
11950 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74  int iReg){.  int
11960 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72 75   i;.  int minLru
11970 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72 75 3b 0a  ;.  int idxLru;.
11980 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
11990 68 65 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74  he *p;..  assert
119a0 28 20 69 52 65 67 3e 30 20 29 3b 20 20 2f 2a 20  ( iReg>0 );  /* 
119b0 52 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73  Register numbers
119c0 20 61 72 65 20 61 6c 77 61 79 73 20 70 6f 73 69   are always posi
119d0 74 69 76 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  tive */.  assert
119e0 28 20 69 43 6f 6c 3e 3d 2d 31 20 26 26 20 69 43  ( iCol>=-1 && iC
119f0 6f 6c 3c 33 32 37 36 38 20 29 3b 20 20 2f 2a 20  ol<32768 );  /* 
11a00 46 69 6e 69 74 65 20 63 6f 6c 75 6d 6e 20 6e 75  Finite column nu
11a10 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54  mbers */..  /* T
11a20 68 65 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e  he SQLITE_Column
11a30 43 61 63 68 65 20 66 6c 61 67 20 64 69 73 61 62  Cache flag disab
11a40 6c 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  les the column c
11a50 61 63 68 65 2e 20 20 54 68 69 73 20 69 73 20 75  ache.  This is u
11a60 73 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 65 73  sed.  ** for tes
11a70 74 69 6e 67 20 6f 6e 6c 79 20 2d 20 74 6f 20 76  ting only - to v
11a80 65 72 69 66 79 20 74 68 61 74 20 53 51 4c 69 74  erify that SQLit
11a90 65 20 61 6c 77 61 79 73 20 67 65 74 73 20 74 68  e always gets th
11aa0 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20  e same answer.  
11ab0 2a 2a 20 77 69 74 68 20 61 6e 64 20 77 69 74 68  ** with and with
11ac0 6f 75 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  out the column c
11ad0 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ache..  */.  if(
11ae0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73   OptimizationDis
11af0 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62  abled(pParse->db
11b00 2c 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43  , SQLITE_ColumnC
11b10 61 63 68 65 29 20 29 20 72 65 74 75 72 6e 3b 0a  ache) ) return;.
11b20 0a 20 20 2f 2a 20 46 69 72 73 74 20 72 65 70 6c  .  /* First repl
11b30 61 63 65 20 61 6e 79 20 65 78 69 73 74 69 6e 67  ace any existing
11b40 20 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a   entry..  **.  *
11b50 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20  * Actually, the 
11b60 77 61 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  way the column c
11b70 61 63 68 65 20 69 73 20 63 75 72 72 65 6e 74 6c  ache is currentl
11b80 79 20 75 73 65 64 2c 20 77 65 20 61 72 65 20 67  y used, we are g
11b90 75 61 72 61 6e 74 65 65 64 0a 20 20 2a 2a 20 74  uaranteed.  ** t
11ba0 68 61 74 20 74 68 65 20 6f 62 6a 65 63 74 20 77  hat the object w
11bb0 69 6c 6c 20 6e 65 76 65 72 20 61 6c 72 65 61 64  ill never alread
11bc0 79 20 62 65 20 69 6e 20 63 61 63 68 65 2e 20 20  y be in cache.  
11bd0 56 65 72 69 66 79 20 74 68 69 73 20 67 75 61 72  Verify this guar
11be0 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a 23 69 66 6e  antee..  */.#ifn
11bf0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 66 6f 72  def NDEBUG.  for
11c00 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
11c10 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
11c20 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
11c30 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 61  i++, p++){.    a
11c40 73 73 65 72 74 28 20 70 2d 3e 69 52 65 67 3d 3d  ssert( p->iReg==
11c50 30 20 7c 7c 20 70 2d 3e 69 54 61 62 6c 65 21 3d  0 || p->iTable!=
11c60 69 54 61 62 20 7c 7c 20 70 2d 3e 69 43 6f 6c 75  iTab || p->iColu
11c70 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20 20 7d 0a  mn!=iCol );.  }.
11c80 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 69 6e  #endif..  /* Fin
11c90 64 20 61 6e 20 65 6d 70 74 79 20 73 6c 6f 74 20  d an empty slot 
11ca0 61 6e 64 20 72 65 70 6c 61 63 65 20 69 74 20 2a  and replace it *
11cb0 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  /.  for(i=0, p=p
11cc0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
11cd0 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
11ce0 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
11cf0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65  {.    if( p->iRe
11d00 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  g==0 ){.      p-
11d10 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65  >iLevel = pParse
11d20 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20  ->iCacheLevel;. 
11d30 20 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d       p->iTable =
11d40 20 69 54 61 62 3b 0a 20 20 20 20 20 20 70 2d 3e   iTab;.      p->
11d50 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a  iColumn = iCol;.
11d60 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20        p->iReg = 
11d70 69 52 65 67 3b 0a 20 20 20 20 20 20 70 2d 3e 74  iReg;.      p->t
11d80 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20  empReg = 0;.    
11d90 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73    p->lru = pPars
11da0 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a  e->iCacheCnt++;.
11db0 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
11dc0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
11dd0 70 6c 61 63 65 20 74 68 65 20 6c 61 73 74 20 72  place the last r
11de0 65 63 65 6e 74 6c 79 20 75 73 65 64 20 2a 2f 0a  ecently used */.
11df0 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66 66    minLru = 0x7ff
11e00 66 66 66 66 66 3b 0a 20 20 69 64 78 4c 72 75 20  fffff;.  idxLru 
11e10 3d 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  = -1;.  for(i=0,
11e20 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
11e30 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
11e40 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
11e50 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
11e60 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20 29 7b 0a 20  >lru<minLru ){. 
11e70 20 20 20 20 20 69 64 78 4c 72 75 20 3d 20 69 3b       idxLru = i;
11e80 0a 20 20 20 20 20 20 6d 69 6e 4c 72 75 20 3d 20  .      minLru = 
11e90 70 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d 0a 20 20  p->lru;.    }.  
11ea0 7d 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 69  }.  if( ALWAYS(i
11eb0 64 78 4c 72 75 3e 3d 30 29 20 29 7b 0a 20 20 20  dxLru>=0) ){.   
11ec0 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43   p = &pParse->aC
11ed0 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72 75 5d 3b  olCache[idxLru];
11ee0 0a 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d  .    p->iLevel =
11ef0 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
11f00 65 76 65 6c 3b 0a 20 20 20 20 70 2d 3e 69 54 61  evel;.    p->iTa
11f10 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  ble = iTab;.    
11f20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f  p->iColumn = iCo
11f30 6c 3b 0a 20 20 20 20 70 2d 3e 69 52 65 67 20 3d  l;.    p->iReg =
11f40 20 69 52 65 67 3b 0a 20 20 20 20 70 2d 3e 74 65   iReg;.    p->te
11f50 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 70  mpReg = 0;.    p
11f60 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e  ->lru = pParse->
11f70 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20  iCacheCnt++;.   
11f80 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a   return;.  }.}..
11f90 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74  /*.** Indicate t
11fa0 68 61 74 20 72 65 67 69 73 74 65 72 73 20 62 65  hat registers be
11fb0 74 77 65 65 6e 20 69 52 65 67 2e 2e 69 52 65 67  tween iReg..iReg
11fc0 2b 6e 52 65 67 2d 31 20 61 72 65 20 62 65 69 6e  +nReg-1 are bein
11fd0 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 2a  g overwritten..*
11fe0 2a 20 50 75 72 67 65 20 74 68 65 20 72 61 6e 67  * Purge the rang
11ff0 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 66  e of registers f
12000 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  rom the column c
12010 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ache..*/.void sq
12020 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
12030 6d 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61 72  move(Parse *pPar
12040 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e  se, int iReg, in
12050 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t nReg){.  int i
12060 3b 0a 20 20 69 6e 74 20 69 4c 61 73 74 20 3d 20  ;.  int iLast = 
12070 69 52 65 67 20 2b 20 6e 52 65 67 20 2d 20 31 3b  iReg + nReg - 1;
12080 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
12090 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d  che *p;.  for(i=
120a0 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
120b0 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
120c0 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
120d0 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  , p++){.    int 
120e0 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20  r = p->iReg;.   
120f0 20 69 66 28 20 72 3e 3d 69 52 65 67 20 26 26 20   if( r>=iReg && 
12100 72 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20 20  r<=iLast ){.    
12110 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61    cacheEntryClea
12120 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  r(pParse, p);.  
12130 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b      p->iReg = 0;
12140 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
12150 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65  .** Remember the
12160 20 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20   current column 
12170 63 61 63 68 65 20 63 6f 6e 74 65 78 74 2e 20 20  cache context.  
12180 41 6e 79 20 6e 65 77 20 65 6e 74 72 69 65 73 20  Any new entries 
12190 61 64 64 65 64 0a 2a 2a 20 61 64 64 65 64 20 74  added.** added t
121a0 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  o the column cac
121b0 68 65 20 61 66 74 65 72 20 74 68 69 73 20 63 61  he after this ca
121c0 6c 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20 77  ll are removed w
121d0 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65  hen the.** corre
121e0 73 70 6f 6e 64 69 6e 67 20 70 6f 70 20 6f 63 63  sponding pop occ
121f0 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  urs..*/.void sql
12200 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
12210 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  h(Parse *pParse)
12220 7b 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63  {.  pParse->iCac
12230 68 65 4c 65 76 65 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a  heLevel++;.}../*
12240 0a 2a 2a 20 52 65 6d 6f 76 65 20 66 72 6f 6d 20  .** Remove from 
12250 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
12260 20 61 6e 79 20 65 6e 74 72 69 65 73 20 74 68 61   any entries tha
12270 74 20 77 65 72 65 20 61 64 64 65 64 20 73 69 6e  t were added sin
12280 63 65 20 74 68 65 0a 2a 2a 20 74 68 65 20 70 72  ce the.** the pr
12290 65 76 69 6f 75 73 20 4e 20 50 75 73 68 20 6f 70  evious N Push op
122a0 65 72 61 74 69 6f 6e 73 2e 20 20 49 6e 20 6f 74  erations.  In ot
122b0 68 65 72 20 77 6f 72 64 73 2c 20 72 65 73 74 6f  her words, resto
122c0 72 65 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20  re the cache.** 
122d0 74 6f 20 74 68 65 20 73 74 61 74 65 20 69 74 20  to the state it 
122e0 77 61 73 20 69 6e 20 4e 20 50 75 73 68 65 73 20  was in N Pushes 
122f0 61 67 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ago..*/.void sql
12300 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
12310 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
12320 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20 69 3b  int N){.  int i;
12330 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
12340 63 68 65 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  che *p;.  assert
12350 28 20 4e 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ( N>0 );.  asser
12360 74 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  t( pParse->iCach
12370 65 4c 65 76 65 6c 3e 3d 4e 20 29 3b 0a 20 20 70  eLevel>=N );.  p
12380 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
12390 65 6c 20 2d 3d 20 4e 3b 0a 20 20 66 6f 72 28 69  el -= N;.  for(i
123a0 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
123b0 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
123c0 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
123d0 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
123e0 20 70 2d 3e 69 52 65 67 20 26 26 20 70 2d 3e 69   p->iReg && p->i
123f0 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43  Level>pParse->iC
12400 61 63 68 65 4c 65 76 65 6c 20 29 7b 0a 20 20 20  acheLevel ){.   
12410 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65     cacheEntryCle
12420 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  ar(pParse, p);. 
12430 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30       p->iReg = 0
12440 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
12450 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 63 61 63 68  *.** When a cach
12460 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20 72 65 75  ed column is reu
12470 73 65 64 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  sed, make sure t
12480 68 61 74 20 69 74 73 20 72 65 67 69 73 74 65 72  hat its register
12490 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72   is.** no longer
124a0 20 61 76 61 69 6c 61 62 6c 65 20 61 73 20 61 20   available as a 
124b0 74 65 6d 70 20 72 65 67 69 73 74 65 72 2e 20 20  temp register.  
124c0 74 69 63 6b 65 74 20 23 33 38 37 39 3a 20 20 74  ticket #3879:  t
124d0 68 61 74 20 73 61 6d 65 0a 2a 2a 20 72 65 67 69  hat same.** regi
124e0 73 74 65 72 20 6d 69 67 68 74 20 62 65 20 69 6e  ster might be in
124f0 20 74 68 65 20 63 61 63 68 65 20 69 6e 20 6d 75   the cache in mu
12500 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2c 20 73  ltiple places, s
12510 6f 20 62 65 20 73 75 72 65 20 74 6f 0a 2a 2a 20  o be sure to.** 
12520 67 65 74 20 74 68 65 6d 20 61 6c 6c 2e 0a 2a 2f  get them all..*/
12530 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
12540 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69 6e  ite3ExprCachePin
12550 52 65 67 69 73 74 65 72 28 50 61 72 73 65 20 2a  Register(Parse *
12560 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
12570 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
12580 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
12590 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  p;.  for(i=0, p=
125a0 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
125b0 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
125c0 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
125d0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52  ){.    if( p->iR
125e0 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20  eg==iReg ){.    
125f0 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30    p->tempReg = 0
12600 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
12610 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
12620 64 65 20 74 6f 20 65 78 74 72 61 63 74 20 74 68  de to extract th
12630 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69  e value of the i
12640 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
12650 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69   a table..*/.voi
12660 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
12670 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
12680 65 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  e(.  Vdbe *v,   
12690 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
126a0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
126b0 69 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ion */.  Table *
126c0 70 54 61 62 2c 20 20 20 20 2f 2a 20 54 68 65 20  pTab,    /* The 
126d0 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
126e0 20 74 68 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20   the value */.  
126f0 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20 20  int iTabCur,    
12700 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 66 6f  /* The cursor fo
12710 72 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  r this table */.
12720 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20    int iCol,     
12730 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
12740 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72  e column to extr
12750 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  act */.  int reg
12760 4f 75 74 20 20 20 20 20 20 2f 2a 20 45 78 74 72  Out      /* Extr
12770 61 63 74 20 74 68 65 20 76 61 6c 75 64 20 69 6e  act the valud in
12780 74 6f 20 74 68 69 73 20 72 65 67 69 73 74 65 72  to this register
12790 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 43 6f   */.){.  if( iCo
127a0 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61  l<0 || iCol==pTa
127b0 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20  b->iPKey ){.    
127c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
127d0 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69  2(v, OP_Rowid, i
127e0 54 61 62 43 75 72 2c 20 72 65 67 4f 75 74 29 3b  TabCur, regOut);
127f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
12800 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75 61 6c  t op = IsVirtual
12810 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c  (pTab) ? OP_VCol
12820 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b  umn : OP_Column;
12830 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12840 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54  AddOp3(v, op, iT
12850 61 62 43 75 72 2c 20 69 43 6f 6c 2c 20 72 65 67  abCur, iCol, reg
12860 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Out);.  }.  if( 
12870 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 73  iCol>=0 ){.    s
12880 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61  qlite3ColumnDefa
12890 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43 6f  ult(v, pTab, iCo
128a0 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a  l, regOut);.  }.
128b0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
128c0 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
128d0 20 65 78 74 72 61 63 74 20 74 68 65 20 69 43 6f   extract the iCo
128e0 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66  lumn-th column f
128f0 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61  rom.** table pTa
12900 62 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  b and store the 
12910 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20  column value in 
12920 61 20 72 65 67 69 73 74 65 72 2e 20 20 41 6e 20  a register.  An 
12930 65 66 66 6f 72 74 0a 2a 2a 20 69 73 20 6d 61 64  effort.** is mad
12940 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63  e to store the c
12950 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72  olumn value in r
12960 65 67 69 73 74 65 72 20 69 52 65 67 2c 20 62 75  egister iReg, bu
12970 74 20 74 68 69 73 20 69 73 0a 2a 2a 20 6e 6f 74  t this is.** not
12980 20 67 75 61 72 61 6e 74 65 65 64 2e 20 20 54 68   guaranteed.  Th
12990 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
129a0 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  e column value i
129b0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
129c0 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20  * There must be 
129d0 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74  an open cursor t
129e0 6f 20 70 54 61 62 20 69 6e 20 69 54 61 62 6c 65  o pTab in iTable
129f0 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
12a00 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e  ne.** is called.
12a10 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74    If iColumn<0 t
12a20 68 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e 65  hen code is gene
12a30 72 61 74 65 64 20 74 68 61 74 20 65 78 74 72 61  rated that extra
12a40 63 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a  cts the rowid..*
12a50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
12a60 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a  rCodeGetColumn(.
12a70 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
12a80 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
12a90 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
12aa0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
12ab0 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
12ac0 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f  /* Description o
12ad0 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61  f the table we a
12ae0 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  re reading from 
12af0 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
12b00 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f  ,     /* Index o
12b10 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75  f the table colu
12b20 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  mn */.  int iTab
12b30 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  le,      /* The 
12b40 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  cursor pointing 
12b50 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  to the table */.
12b60 20 20 69 6e 74 20 69 52 65 67 2c 20 20 20 20 20    int iReg,     
12b70 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75     /* Store resu
12b80 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 75 38  lts here */.  u8
12b90 20 70 35 20 20 20 20 20 20 20 20 20 20 20 20 2f   p5            /
12ba0 2a 20 50 35 20 76 61 6c 75 65 20 66 6f 72 20 4f  * P5 value for O
12bb0 50 5f 43 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20  P_Column */.){. 
12bc0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
12bd0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
12be0 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
12bf0 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72  Cache *p;..  for
12c00 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
12c10 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
12c20 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
12c30 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
12c40 66 28 20 70 2d 3e 69 52 65 67 3e 30 20 26 26 20  f( p->iReg>0 && 
12c50 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c  p->iTable==iTabl
12c60 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d  e && p->iColumn=
12c70 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  =iColumn ){.    
12c80 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73    p->lru = pPars
12c90 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a  e->iCacheCnt++;.
12ca0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
12cb0 72 43 61 63 68 65 50 69 6e 52 65 67 69 73 74 65  rCachePinRegiste
12cc0 72 28 70 50 61 72 73 65 2c 20 70 2d 3e 69 52 65  r(pParse, p->iRe
12cd0 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  g);.      return
12ce0 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a   p->iReg;.    }.
12cf0 20 20 7d 20 20 0a 20 20 61 73 73 65 72 74 28 20    }  .  assert( 
12d00 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  v!=0 );.  sqlite
12d10 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
12d20 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61  mnOfTable(v, pTa
12d30 62 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75  b, iTable, iColu
12d40 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 69 66 28  mn, iReg);.  if(
12d50 20 70 35 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   p5 ){.    sqlit
12d60 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
12d70 2c 20 70 35 29 3b 0a 20 20 7d 65 6c 73 65 7b 20  , p5);.  }else{ 
12d80 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78    .    sqlite3Ex
12d90 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61  prCacheStore(pPa
12da0 72 73 65 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f  rse, iTable, iCo
12db0 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 7d  lumn, iReg);.  }
12dc0 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a  .  return iReg;.
12dd0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61  }../*.** Clear a
12de0 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  ll column cache 
12df0 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69 64  entries..*/.void
12e00 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
12e10 65 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50  eClear(Parse *pP
12e20 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  arse){.  int i;.
12e30 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
12e40 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28 69 3d  he *p;..  for(i=
12e50 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
12e60 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
12e70 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
12e80 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , p++){.    if( 
12e90 70 2d 3e 69 52 65 67 20 29 7b 0a 20 20 20 20 20  p->iReg ){.     
12ea0 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72   cacheEntryClear
12eb0 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
12ec0 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a     p->iReg = 0;.
12ed0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
12ee0 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66 61  ** Record the fa
12ef0 63 74 20 74 68 61 74 20 61 6e 20 61 66 66 69 6e  ct that an affin
12f00 69 74 79 20 63 68 61 6e 67 65 20 68 61 73 20 6f  ity change has o
12f10 63 63 75 72 72 65 64 20 6f 6e 20 69 43 6f 75 6e  ccurred on iCoun
12f20 74 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73  t.** registers s
12f30 74 61 72 74 69 6e 67 20 77 69 74 68 20 69 53 74  tarting with iSt
12f40 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  art..*/.void sql
12f50 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
12f60 69 6e 69 74 79 43 68 61 6e 67 65 28 50 61 72 73  inityChange(Pars
12f70 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
12f80 53 74 61 72 74 2c 20 69 6e 74 20 69 43 6f 75 6e  Start, int iCoun
12f90 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t){.  sqlite3Exp
12fa0 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61  rCacheRemove(pPa
12fb0 72 73 65 2c 20 69 53 74 61 72 74 2c 20 69 43 6f  rse, iStart, iCo
12fc0 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  unt);.}../*.** G
12fd0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
12fe0 6d 6f 76 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f  move content fro
12ff0 6d 20 72 65 67 69 73 74 65 72 73 20 69 46 72 6f  m registers iFro
13000 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31  m...iFrom+nReg-1
13010 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e  .** over to iTo.
13020 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65  .iTo+nReg-1. Kee
13030 70 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  p the column cac
13040 68 65 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a  he up-to-date..*
13050 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
13060 70 72 43 6f 64 65 4d 6f 76 65 28 50 61 72 73 65  prCodeMove(Parse
13070 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46   *pParse, int iF
13080 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e  rom, int iTo, in
13090 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t nReg){.  int i
130a0 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
130b0 61 63 68 65 20 2a 70 3b 0a 20 20 61 73 73 65 72  ache *p;.  asser
130c0 74 28 20 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52  t( iFrom>=iTo+nR
130d0 65 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65 67  eg || iFrom+nReg
130e0 3c 3d 69 54 6f 20 29 3b 0a 20 20 73 71 6c 69 74  <=iTo );.  sqlit
130f0 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 50 61  e3VdbeAddOp3(pPa
13100 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d  rse->pVdbe, OP_M
13110 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c  ove, iFrom, iTo,
13120 20 6e 52 65 67 2d 31 29 3b 0a 20 20 66 6f 72 28   nReg-1);.  for(
13130 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
13140 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
13150 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
13160 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e  ++, p++){.    in
13170 74 20 78 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20  t x = p->iReg;. 
13180 20 20 20 69 66 28 20 78 3e 3d 69 46 72 6f 6d 20     if( x>=iFrom 
13190 26 26 20 78 3c 69 46 72 6f 6d 2b 6e 52 65 67 20  && x<iFrom+nReg 
131a0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67  ){.      p->iReg
131b0 20 2b 3d 20 69 54 6f 2d 69 46 72 6f 6d 3b 0a 20   += iTo-iFrom;. 
131c0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20     }.  }.}..#if 
131d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
131e0 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
131f0 28 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45  (SQLITE_COVERAGE
13200 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74  _TEST)./*.** Ret
13210 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79 20  urn true if any 
13220 72 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20  register in the 
13230 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e 69 54 6f  range iFrom..iTo
13240 20 28 69 6e 63 6c 75 73 69 76 65 29 0a 2a 2a 20   (inclusive).** 
13250 69 73 20 75 73 65 64 20 61 73 20 70 61 72 74 20  is used as part 
13260 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  of the column ca
13270 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  che..**.** This 
13280 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
13290 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
132a0 61 6e 64 20 74 65 73 74 63 61 73 65 28 29 20 6d  and testcase() m
132b0 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a 20 61 6e  acros only.** an
132c0 64 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61  d does not appea
132d0 72 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 62 75  r in a normal bu
132e0 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ild..*/.static i
132f0 6e 74 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43  nt usedAsColumnC
13300 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72  ache(Parse *pPar
13310 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  se, int iFrom, i
13320 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74 20 69  nt iTo){.  int i
13330 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
13340 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69  ache *p;.  for(i
13350 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
13360 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
13370 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
13380 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  +, p++){.    int
13390 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20   r = p->iReg;.  
133a0 20 20 69 66 28 20 72 3e 3d 69 46 72 6f 6d 20 26    if( r>=iFrom &
133b0 26 20 72 3c 3d 69 54 6f 20 29 20 72 65 74 75 72  & r<=iTo ) retur
133c0 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f 54 45 53  n 1;    /*NO_TES
133d0 54 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  T*/.  }.  return
133e0 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   0;.}.#endif /* 
133f0 53 51 4c 49 54 45 5f 44 45 42 55 47 20 7c 7c 20  SQLITE_DEBUG || 
13400 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f  SQLITE_COVERAGE_
13410 54 45 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  TEST */../*.** G
13420 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
13430 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56 64  o the current Vd
13440 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  be to evaluate t
13450 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
13460 65 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74  ession.  Attempt
13470 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65   to store the re
13480 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
13490 72 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52  r "target"..** R
134a0 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74  eturn the regist
134b0 65 72 20 77 68 65 72 65 20 72 65 73 75 6c 74 73  er where results
134c0 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a   are stored..**.
134d0 2a 2a 20 57 69 74 68 20 74 68 69 73 20 72 6f 75  ** With this rou
134e0 74 69 6e 65 2c 20 74 68 65 72 65 20 69 73 20 6e  tine, there is n
134f0 6f 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  o guarantee that
13500 20 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a   results will.**
13510 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 61   be stored in ta
13520 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c  rget.  The resul
13530 74 20 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65  t might be store
13540 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a  d in some other.
13550 2a 2a 20 72 65 67 69 73 74 65 72 20 69 66 20 69  ** register if i
13560 74 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20  t is convenient 
13570 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65 20 63  to do so.  The c
13580 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
13590 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68  ** must check th
135a0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e  e return code an
135b0 64 20 6d 6f 76 65 20 74 68 65 20 72 65 73 75 6c  d move the resul
135c0 74 73 20 74 6f 20 74 68 65 20 64 65 73 69 72 65  ts to the desire
135d0 64 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a  d.** register..*
135e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
135f0 72 43 6f 64 65 54 61 72 67 65 74 28 50 61 72 73  rCodeTarget(Pars
13600 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
13610 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
13620 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  et){.  Vdbe *v =
13630 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
13640 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64 65 72   /* The VM under
13650 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
13660 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
13670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13680 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67  The opcode being
13690 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
136a0 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 20  inReg = target; 
136b0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73        /* Results
136c0 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73   stored in regis
136d0 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69  ter inReg */.  i
136e0 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
136f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e           /* If n
13700 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69  on-zero free thi
13710 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  s temporary regi
13720 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ster */.  int re
13730 67 46 72 65 65 32 20 3d 20 30 3b 20 20 20 20 20  gFree2 = 0;     
13740 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
13750 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d  ro free this tem
13760 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
13770 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 2c  */.  int r1, r2,
13780 20 72 33 2c 20 72 34 3b 20 20 20 20 20 20 20 2f   r3, r4;       /
13790 2a 20 56 61 72 69 6f 75 73 20 72 65 67 69 73 74  * Various regist
137a0 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20  er numbers */.  
137b0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
137c0 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65  arse->db; /* The
137d0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
137e0 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tion */..  asser
137f0 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20 74  t( target>0 && t
13800 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e  arget<=pParse->n
13810 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d  Mem );.  if( v==
13820 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
13830 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
13840 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
13850 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
13860 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
13870 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55  {.    op = TK_NU
13880 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
13890 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
138a0 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f  .  }.  switch( o
138b0 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
138c0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  _AGG_COLUMN: {. 
138d0 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41       AggInfo *pA
138e0 67 67 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e  ggInfo = pExpr->
138f0 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
13900 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
13910 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67  ol *pCol = &pAgg
13920 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72  Info->aCol[pExpr
13930 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69  ->iAgg];.      i
13940 66 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69  f( !pAggInfo->di
13950 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20  rectMode ){.    
13960 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
13970 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20  ->iMem>0 );.    
13980 20 20 20 20 69 6e 52 65 67 20 3d 20 70 43 6f 6c      inReg = pCol
13990 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->iMem;.        
139a0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
139b0 73 65 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d  se if( pAggInfo-
139c0 3e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29  >useSortingIdx )
139d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
139e0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
139f0 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e  P_Column, pAggIn
13a00 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78 50 54  fo->sortingIdxPT
13a10 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab,.            
13a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a30 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
13a40 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a  olumn, target);.
13a50 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
13a60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
13a70 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20  Otherwise, fall 
13a80 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b  thru into the TK
13a90 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a  _COLUMN case */.
13aa0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
13ab0 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
13ac0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
13ad0 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ble<0 ){.       
13ae0 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61   /* This only ha
13af0 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 64 69 6e  ppens when codin
13b00 67 20 63 68 65 63 6b 20 63 6f 6e 73 74 72 61 69  g check constrai
13b10 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  nts */.        a
13b20 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 63  ssert( pParse->c
13b30 6b 42 61 73 65 3e 30 20 29 3b 0a 20 20 20 20 20  kBase>0 );.     
13b40 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72     inReg = pExpr
13b50 2d 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70 50 61 72  ->iColumn + pPar
13b60 73 65 2d 3e 63 6b 42 61 73 65 3b 0a 20 20 20 20  se->ckBase;.    
13b70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13b80 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
13b90 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
13ba0 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  n(pParse, pExpr-
13bb0 3e 70 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20  >pTab,.         
13bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13bd0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
13be0 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69  Column, pExpr->i
13bf0 54 61 62 6c 65 2c 20 74 61 72 67 65 74 2c 0a 20  Table, target,. 
13c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c20 70 45 78 70 72 2d 3e 6f 70 32 29 3b 0a 20 20 20  pExpr->op2);.   
13c30 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
13c40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
13c50 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20   TK_INTEGER: {. 
13c60 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72       codeInteger
13c70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
13c80 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
13c90 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
13ca0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13cb0 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
13cc0 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  T.    case TK_FL
13cd0 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  OAT: {.      ass
13ce0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
13cf0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
13d00 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
13d10 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70     codeReal(v, p
13d20 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
13d30 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
13d40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
13d50 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54  endif.    case T
13d60 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  K_STRING: {.    
13d70 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
13d80 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
13d90 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
13da0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
13db0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
13dc0 53 74 72 69 6e 67 38 2c 20 30 2c 20 74 61 72 67  String8, 0, targ
13dd0 65 74 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e  et, 0, pExpr->u.
13de0 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20  zToken, 0);.    
13df0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
13e00 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a     case TK_NULL:
13e10 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
13e20 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13e30 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74  _Null, 0, target
13e40 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
13e50 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
13e60 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c  LITE_OMIT_BLOB_L
13e70 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20  ITERAL.    case 
13e80 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TK_BLOB: {.     
13e90 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f   int n;.      co
13ea0 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20  nst char *z;.   
13eb0 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a     char *zBlob;.
13ec0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
13ed0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
13ee0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
13ef0 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  e) );.      asse
13f00 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
13f10 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70  ken[0]=='x' || p
13f20 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
13f30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20 20 20  ]=='X' );.      
13f40 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
13f50 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27  .zToken[1]=='\''
13f60 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 26 70   );.      z = &p
13f70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32  Expr->u.zToken[2
13f80 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c  ];.      n = sql
13f90 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20  ite3Strlen30(z) 
13fa0 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  - 1;.      asser
13fb0 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b  t( z[n]=='\'' );
13fc0 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d 20 73  .      zBlob = s
13fd0 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f 62 28  qlite3HexToBlob(
13fe0 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76 29  sqlite3VdbeDb(v)
13ff0 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73  , z, n);.      s
14000 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
14010 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32  (v, OP_Blob, n/2
14020 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a 42 6c  , target, 0, zBl
14030 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  ob, P4_DYNAMIC);
14040 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14050 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
14060 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a  ase TK_VARIABLE:
14070 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
14080 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
14090 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
140a0 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61  alue) );.      a
140b0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
140c0 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20  zToken!=0 );.   
140d0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
140e0 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30  ->u.zToken[0]!=0
140f0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
14100 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14110 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70  P_Variable, pExp
14120 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67  r->iColumn, targ
14130 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  et);.      if( p
14140 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31  Expr->u.zToken[1
14150 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]!=0 ){.        
14160 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
14170 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20  .zToken[0]=='?' 
14180 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
14190 20 73 74 72 63 6d 70 28 70 45 78 70 72 2d 3e 75   strcmp(pExpr->u
141a0 2e 7a 54 6f 6b 65 6e 2c 20 70 50 61 72 73 65 2d  .zToken, pParse-
141b0 3e 61 7a 56 61 72 5b 70 45 78 70 72 2d 3e 69 43  >azVar[pExpr->iC
141c0 6f 6c 75 6d 6e 2d 31 5d 29 3d 3d 30 20 29 3b 0a  olumn-1])==0 );.
141d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
141e0 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
141f0 31 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  1, pParse->azVar
14200 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d  [pExpr->iColumn-
14210 31 5d 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  1], P4_STATIC);.
14220 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
14230 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
14240 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a  ase TK_REGISTER:
14250 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   {.      inReg =
14260 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
14270 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14280 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
14290 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67  S: {.      inReg
142a0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
142b0 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
142c0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74   pExpr->pLeft, t
142d0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
142e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
142f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
14300 41 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AST.    case TK_
14310 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  CAST: {.      /*
14320 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   Expressions of 
14330 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54  the form:   CAST
14340 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29  (pLeft AS token)
14350 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66   */.      int af
14360 66 2c 20 74 6f 5f 6f 70 3b 0a 20 20 20 20 20 20  f, to_op;.      
14370 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
14380 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
14390 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
143a0 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ft, target);.   
143b0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
143c0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
143d0 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
143e0 29 3b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 73  );.      aff = s
143f0 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
14400 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  pe(pExpr->u.zTok
14410 65 6e 29 3b 0a 20 20 20 20 20 20 74 6f 5f 6f 70  en);.      to_op
14420 20 3d 20 61 66 66 20 2d 20 53 51 4c 49 54 45 5f   = aff - SQLITE_
14430 41 46 46 5f 54 45 58 54 20 2b 20 4f 50 5f 54 6f  AFF_TEXT + OP_To
14440 54 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Text;.      asse
14450 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  rt( to_op==OP_To
14460 54 65 78 74 20 20 20 20 7c 7c 20 61 66 66 21 3d  Text    || aff!=
14470 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
14480 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
14490 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  rt( to_op==OP_To
144a0 42 6c 6f 62 20 20 20 20 7c 7c 20 61 66 66 21 3d  Blob    || aff!=
144b0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
144c0 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
144d0 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  rt( to_op==OP_To
144e0 4e 75 6d 65 72 69 63 20 7c 7c 20 61 66 66 21 3d  Numeric || aff!=
144f0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
14500 49 43 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  IC );.      asse
14510 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  rt( to_op==OP_To
14520 49 6e 74 20 20 20 20 20 7c 7c 20 61 66 66 21 3d  Int     || aff!=
14530 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
14540 45 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ER );.      asse
14550 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  rt( to_op==OP_To
14560 52 65 61 6c 20 20 20 20 7c 7c 20 61 66 66 21 3d  Real    || aff!=
14570 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
14580 20 20 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74     );.      test
14590 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  case( to_op==OP_
145a0 54 6f 54 65 78 74 20 29 3b 0a 20 20 20 20 20 20  ToText );.      
145b0 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d  testcase( to_op=
145c0 3d 4f 50 5f 54 6f 42 6c 6f 62 20 29 3b 0a 20 20  =OP_ToBlob );.  
145d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f      testcase( to
145e0 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69  _op==OP_ToNumeri
145f0 63 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  c );.      testc
14600 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ase( to_op==OP_T
14610 6f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 74 65  oInt );.      te
14620 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f  stcase( to_op==O
14630 50 5f 54 6f 52 65 61 6c 20 29 3b 0a 20 20 20 20  P_ToReal );.    
14640 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72    if( inReg!=tar
14650 67 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  get ){.        s
14660 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14670 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e  (v, OP_SCopy, in
14680 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  Reg, target);.  
14690 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61        inReg = ta
146a0 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rget;.      }.  
146b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
146c0 64 64 4f 70 31 28 76 2c 20 74 6f 5f 6f 70 2c 20  ddOp1(v, to_op, 
146d0 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 74 65  inReg);.      te
146e0 73 74 63 61 73 65 28 20 75 73 65 64 41 73 43 6f  stcase( usedAsCo
146f0 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65  lumnCache(pParse
14700 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65 67 29 20  , inReg, inReg) 
14710 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14720 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
14730 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
14740 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 20  inReg, 1);.     
14750 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
14760 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
14770 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20  MIT_CAST */.    
14780 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
14790 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
147a0 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
147b0 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
147c0 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
147d0 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
147e0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
147f0 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20  T==OP_Lt );.    
14800 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d    assert( TK_LE=
14810 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20  =OP_Le );.      
14820 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f  assert( TK_GT==O
14830 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Gt );.      as
14840 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f  sert( TK_GE==OP_
14850 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Ge );.      asse
14860 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71  rt( TK_EQ==OP_Eq
14870 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14880 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29  ( TK_NE==OP_Ne )
14890 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
148a0 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20  ( op==TK_LT );. 
148b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
148c0 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20  p==TK_LE );.    
148d0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
148e0 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74  TK_GT );.      t
148f0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
14900 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GE );.      test
14910 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20  case( op==TK_EQ 
14920 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14930 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a  e( op==TK_NE );.
14940 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
14950 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
14960 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
14970 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
14980 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
14990 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
149a0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
149b0 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
149c0 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
149d0 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
149e0 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
149f0 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
14a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a10 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53  r1, r2, inReg, S
14a20 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a  QLITE_STOREP2);.
14a30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14a40 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
14a50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
14a60 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
14a70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
14a80 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a  .    case TK_IS:
14a90 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
14aa0 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OT: {.      test
14ab0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20  case( op==TK_IS 
14ac0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14ad0 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20  e( op==TK_ISNOT 
14ae0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
14af0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
14b00 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
14b10 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
14b20 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
14b30 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
14b40 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
14b50 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
14b60 65 65 32 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d  ee2);.      op =
14b70 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54   (op==TK_IS) ? T
14b80 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20  K_EQ : TK_NE;.  
14b90 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
14ba0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
14bb0 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
14bc0 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20  ght, op,.       
14bd0 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
14be0 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45  2, inReg, SQLITE
14bf0 5f 53 54 4f 52 45 50 32 20 7c 20 53 51 4c 49 54  _STOREP2 | SQLIT
14c00 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
14c10 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
14c20 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
14c30 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
14c40 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
14c50 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
14c60 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20  case TK_AND:.   
14c70 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20   case TK_OR:.   
14c80 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20   case TK_PLUS:. 
14c90 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a     case TK_STAR:
14ca0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e  .    case TK_MIN
14cb0 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
14cc0 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  REM:.    case TK
14cd0 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73  _BITAND:.    cas
14ce0 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20  e TK_BITOR:.    
14cf0 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20  case TK_SLASH:. 
14d00 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46     case TK_LSHIF
14d10 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  T:.    case TK_R
14d20 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65  SHIFT: .    case
14d30 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20   TK_CONCAT: {.  
14d40 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41      assert( TK_A
14d50 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 0a 20 20  ND==OP_And );.  
14d60 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f      assert( TK_O
14d70 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20 20 20 20  R==OP_Or );.    
14d80 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55    assert( TK_PLU
14d90 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a 20 20 20  S==OP_Add );.   
14da0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49     assert( TK_MI
14db0 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74  NUS==OP_Subtract
14dc0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14dd0 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d  ( TK_REM==OP_Rem
14de0 61 69 6e 64 65 72 20 29 3b 0a 20 20 20 20 20 20  ainder );.      
14df0 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41 4e  assert( TK_BITAN
14e00 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b 0a  D==OP_BitAnd );.
14e10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
14e20 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72  _BITOR==OP_BitOr
14e30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14e40 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44  ( TK_SLASH==OP_D
14e50 69 76 69 64 65 20 29 3b 0a 20 20 20 20 20 20 61  ivide );.      a
14e60 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46 54  ssert( TK_LSHIFT
14e70 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29  ==OP_ShiftLeft )
14e80 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14e90 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68  TK_RSHIFT==OP_Sh
14ea0 69 66 74 52 69 67 68 74 20 29 3b 0a 20 20 20 20  iftRight );.    
14eb0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e    assert( TK_CON
14ec0 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29  CAT==OP_Concat )
14ed0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14ee0 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a  ( op==TK_AND );.
14ef0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14f00 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20  op==TK_OR );.   
14f10 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
14f20 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20  =TK_PLUS );.    
14f30 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
14f40 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20  TK_MINUS );.    
14f50 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
14f60 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20 20 20  TK_REM );.      
14f70 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
14f80 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20 20 20 20  _BITAND );.     
14f90 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
14fa0 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20 20 20  K_BITOR );.     
14fb0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
14fc0 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20 20 20  K_SLASH );.     
14fd0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
14fe0 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20 20 20  K_LSHIFT );.    
14ff0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
15000 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20 20 20  TK_RSHIFT );.   
15010 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
15020 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20 20  =TK_CONCAT );.  
15030 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
15040 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
15050 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
15060 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
15070 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
15080 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
15090 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
150a0 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
150b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
150c0 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20  beAddOp3(v, op, 
150d0 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b  r2, r1, target);
150e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
150f0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
15100 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15110 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
15120 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15130 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d  }.    case TK_UM
15140 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78  INUS: {.      Ex
15150 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
15160 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
15170 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b  assert( pLeft );
15180 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74  .      if( pLeft
15190 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52  ->op==TK_INTEGER
151a0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
151b0 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c 20  Integer(pParse, 
151c0 70 4c 65 66 74 2c 20 31 2c 20 74 61 72 67 65 74  pLeft, 1, target
151d0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
151e0 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
151f0 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65 6c 73  POINT.      }els
15200 65 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d  e if( pLeft->op=
15210 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20  =TK_FLOAT ){.   
15220 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
15230 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
15240 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
15250 29 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64  ) );.        cod
15260 65 52 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d 3e  eReal(v, pLeft->
15270 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61 72  u.zToken, 1, tar
15280 67 65 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  get);.#endif.   
15290 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
152a0 20 20 72 65 67 46 72 65 65 31 20 3d 20 72 31 20    regFree1 = r1 
152b0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
152c0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
152d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
152e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
152f0 65 67 65 72 2c 20 30 2c 20 72 31 29 3b 0a 20 20  eger, 0, r1);.  
15300 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
15310 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
15320 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
15330 65 66 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  eft, &regFree2);
15340 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15350 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
15360 5f 53 75 62 74 72 61 63 74 2c 20 72 32 2c 20 72  _Subtract, r2, r
15370 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
15380 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
15390 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
153a0 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67     }.      inReg
153b0 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20   = target;.     
153c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
153d0 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54    case TK_BITNOT
153e0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
153f0 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T: {.      asser
15400 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50  t( TK_BITNOT==OP
15410 5f 42 69 74 4e 6f 74 20 29 3b 0a 20 20 20 20 20  _BitNot );.     
15420 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d   assert( TK_NOT=
15430 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20 20 20 20 20  =OP_Not );.     
15440 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
15450 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20  K_BITNOT );.    
15460 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
15470 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  TK_NOT );.      
15480 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
15490 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
154a0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
154b0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
154c0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
154d0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
154e0 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a  inReg = target;.
154f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15500 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72  eAddOp2(v, op, r
15510 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20  1, inReg);.     
15520 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
15530 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
15540 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
15550 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69  TNULL: {.      i
15560 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61  nt addr;.      a
15570 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c  ssert( TK_ISNULL
15580 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20  ==OP_IsNull );. 
15590 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
155a0 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e  NOTNULL==OP_NotN
155b0 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ull );.      tes
155c0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
155d0 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65  NULL );.      te
155e0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
155f0 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  OTNULL );.      
15600 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15610 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
15620 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
15630 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
15640 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
15650 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
15660 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
15670 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
15680 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
15690 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
156a0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 6f  3VdbeAddOp1(v, o
156b0 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  p, r1);.      sq
156c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
156d0 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61  v, OP_AddImm, ta
156e0 72 67 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20 20  rget, -1);.     
156f0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
15700 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
15710 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15720 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  }.    case TK_AG
15730 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  G_FUNCTION: {.  
15740 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e      AggInfo *pIn
15750 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67  fo = pExpr->pAgg
15760 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  Info;.      if( 
15770 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  pInfo==0 ){.    
15780 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
15790 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
157a0 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
157b0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
157c0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
157d0 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61  se, "misuse of a
157e0 67 67 72 65 67 61 74 65 3a 20 25 73 28 29 22 2c  ggregate: %s()",
157f0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
15800 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
15810 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20          inReg = 
15820 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78  pInfo->aFunc[pEx
15830 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a  pr->iAgg].iMem;.
15840 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
15850 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
15860 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e  ase TK_CONST_FUN
15870 43 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  C:.    case TK_F
15880 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
15890 20 45 78 70 72 4c 69 73 74 20 2a 70 46 61 72 67   ExprList *pFarg
158a0 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ;       /* List 
158b0 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  of function argu
158c0 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  ments */.      i
158d0 6e 74 20 6e 46 61 72 67 3b 20 20 20 20 20 20 20  nt nFarg;       
158e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
158f0 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  of function argu
15900 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 46  ments */.      F
15910 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20  uncDef *pDef;   
15920 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e        /* The fun
15930 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e  ction definition
15940 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20   object */.     
15950 20 69 6e 74 20 6e 49 64 3b 20 20 20 20 20 20 20   int nId;       
15960 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
15970 68 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  h of the functio
15980 6e 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20  n name in bytes 
15990 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  */.      const c
159a0 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20  har *zId;       
159b0 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  /* The function 
159c0 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  name */.      in
159d0 74 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b  t constMask = 0;
159e0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
159f0 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
15a00 74 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e 73  ts that are cons
15a10 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tant */.      in
15a20 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
15a30 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
15a40 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 38  nter */.      u8
15a50 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 20   enc = ENC(db); 
15a60 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74       /* The text
15a70 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64 20 62   encoding used b
15a80 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  y this database 
15a90 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  */.      CollSeq
15aa0 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20   *pColl = 0;    
15ab0 2f 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73  /* A collating s
15ac0 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20  equence */..    
15ad0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
15ae0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
15af0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
15b00 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
15b10 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 53 54 5f  e( op==TK_CONST_
15b20 46 55 4e 43 20 29 3b 0a 20 20 20 20 20 20 74 65  FUNC );.      te
15b30 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 46  stcase( op==TK_F
15b40 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20  UNCTION );.     
15b50 20 69 66 28 20 45 78 70 72 48 61 73 41 6e 79 50   if( ExprHasAnyP
15b60 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
15b70 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
15b80 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20          pFarg = 
15b90 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
15ba0 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20          pFarg = 
15bb0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
15bc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46        }.      nF
15bd0 61 72 67 20 3d 20 70 46 61 72 67 20 3f 20 70 46  arg = pFarg ? pF
15be0 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a  arg->nExpr : 0;.
15bf0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
15c00 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
15c10 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
15c20 65 29 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20  e) );.      zId 
15c30 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  = pExpr->u.zToke
15c40 6e 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 73  n;.      nId = s
15c50 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
15c60 49 64 29 3b 0a 20 20 20 20 20 20 70 44 65 66 20  Id);.      pDef 
15c70 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
15c80 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e  ction(db, zId, n
15c90 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20  Id, nFarg, enc, 
15ca0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  0);.      if( pD
15cb0 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ef==0 ){.       
15cc0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
15cd0 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77  (pParse, "unknow
15ce0 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73  n function: %.*s
15cf0 28 29 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a  ()", nId, zId);.
15d00 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
15d10 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
15d20 20 41 74 74 65 6d 70 74 20 61 20 64 69 72 65 63   Attempt a direc
15d30 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
15d40 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69 6e   of the built-in
15d50 20 43 4f 41 4c 45 53 43 45 28 29 20 61 6e 64 0a   COALESCE() and.
15d60 20 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c 28        ** IFNULL(
15d70 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68  ) functions.  Th
15d80 69 73 20 61 76 6f 69 64 73 20 75 6e 6e 65 63 65  is avoids unnece
15d90 73 73 61 72 79 20 65 76 61 6c 61 74 69 6f 6e 20  ssary evalation 
15da0 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 75  of.      ** argu
15db0 6d 65 6e 74 73 20 70 61 73 74 20 74 68 65 20 66  ments past the f
15dc0 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72  irst non-NULL ar
15dd0 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  gument..      */
15de0 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
15df0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
15e00 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b  FUNC_COALESCE ){
15e10 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 6e 64  .        int end
15e20 43 6f 61 6c 65 73 63 65 20 3d 20 73 71 6c 69 74  Coalesce = sqlit
15e30 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
15e40 76 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  v);.        asse
15e50 72 74 28 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a  rt( nFarg>=2 );.
15e60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
15e70 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
15e80 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
15e90 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
15ea0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
15eb0 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Farg; i++){.    
15ec0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15ed0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f  eAddOp2(v, OP_No
15ee0 74 4e 75 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65  tNull, target, e
15ef0 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20  ndCoalesce);.   
15f00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
15f10 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
15f20 61 72 73 65 2c 20 74 61 72 67 65 74 2c 20 31 29  arse, target, 1)
15f30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
15f40 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
15f50 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
15f60 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
15f70 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61 72  ode(pParse, pFar
15f80 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 74  g->a[i].pExpr, t
15f90 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
15fa0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
15fb0 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
15fc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15fd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
15fe0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
15ff0 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20  ndCoalesce);.   
16000 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16010 20 20 7d 0a 0a 0a 20 20 20 20 20 20 69 66 28 20    }...      if( 
16020 70 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20  pFarg ){.       
16030 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
16040 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
16050 2c 20 6e 46 61 72 67 29 3b 0a 0a 20 20 20 20 20  , nFarg);..     
16060 20 20 20 2f 2a 20 46 6f 72 20 6c 65 6e 67 74 68     /* For length
16070 28 29 20 61 6e 64 20 74 79 70 65 6f 66 28 29 20  () and typeof() 
16080 66 75 6e 63 74 69 6f 6e 73 20 77 69 74 68 20 61  functions with a
16090 20 63 6f 6c 75 6d 6e 20 61 72 67 75 6d 65 6e 74   column argument
160a0 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74  ,.        ** set
160b0 20 74 68 65 20 50 35 20 70 61 72 61 6d 65 74 65   the P5 paramete
160c0 72 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f 6c 75  r to the OP_Colu
160d0 6d 6e 20 6f 70 63 6f 64 65 20 74 6f 20 4f 50 46  mn opcode to OPF
160e0 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 0a 20 20  LAG_LENGTHARG.  
160f0 20 20 20 20 20 20 2a 2a 20 6f 72 20 4f 50 46 4c        ** or OPFL
16100 41 47 5f 54 59 50 45 4f 46 41 52 47 20 72 65 73  AG_TYPEOFARG res
16110 70 65 63 74 69 76 65 6c 79 2c 20 74 6f 20 61 76  pectively, to av
16120 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20  oid unnecessary 
16130 64 61 74 61 0a 20 20 20 20 20 20 20 20 2a 2a 20  data.        ** 
16140 6c 6f 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 20  loading..       
16150 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
16160 28 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 28  (pDef->flags & (
16170 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47  SQLITE_FUNC_LENG
16180 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54  TH|SQLITE_FUNC_T
16190 59 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a 20 20  YPEOF))!=0 ){.  
161a0 20 20 20 20 20 20 20 20 75 38 20 65 78 70 72 4f          u8 exprO
161b0 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  p;.          ass
161c0 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b  ert( nFarg==1 );
161d0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
161e0 74 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  t( pFarg->a[0].p
161f0 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
16200 20 20 20 20 20 65 78 70 72 4f 70 20 3d 20 70 46       exprOp = pF
16210 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  arg->a[0].pExpr-
16220 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 69  >op;.          i
16230 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f  f( exprOp==TK_CO
16240 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70 3d 3d  LUMN || exprOp==
16250 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b  TK_AGG_COLUMN ){
16260 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
16270 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43  ert( SQLITE_FUNC
16280 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41 47 5f  _LENGTH==OPFLAG_
16290 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20  LENGTHARG );.   
162a0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
162b0 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50   SQLITE_FUNC_TYP
162c0 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59 50 45  EOF==OPFLAG_TYPE
162d0 4f 46 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20  OFARG );.       
162e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
162f0 44 65 66 2d 3e 66 6c 61 67 73 3d 3d 53 51 4c 49  Def->flags==SQLI
16300 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 20 29  TE_FUNC_LENGTH )
16310 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46  ;.            pF
16320 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  arg->a[0].pExpr-
16330 3e 6f 70 32 20 3d 20 70 44 65 66 2d 3e 66 6c 61  >op2 = pDef->fla
16340 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  gs;.          }.
16350 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
16360 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
16370 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
16380 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32       /* Ticket 2
16390 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20  ea2425d34be */. 
163a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
163b0 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
163c0 50 61 72 73 65 2c 20 70 46 61 72 67 2c 20 72 31  Parse, pFarg, r1
163d0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 1);.        sq
163e0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
163f0 70 28 70 50 61 72 73 65 2c 20 31 29 3b 20 20 20  p(pParse, 1);   
16400 2f 2a 20 54 69 63 6b 65 74 20 32 65 61 32 34 32  /* Ticket 2ea242
16410 35 64 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20  5d34be */.      
16420 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
16430 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  1 = 0;.      }.#
16440 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16450 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
16460 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c        /* Possibl
16470 79 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66  y overload the f
16480 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66  unction if the f
16490 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
164a0 0a 20 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74  .      ** a virt
164b0 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  ual table column
164c0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
164d0 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75   ** For infix fu
164e0 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47  nctions (LIKE, G
164f0 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64  LOB, REGEXP, and
16500 20 4d 41 54 43 48 29 20 75 73 65 20 74 68 65 0a   MATCH) use the.
16510 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20        ** second 
16520 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68  argument, not th
16530 65 20 66 69 72 73 74 2c 20 61 73 20 74 68 65 20  e first, as the 
16540 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74  argument to test
16550 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65   to.      ** see
16560 20 69 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75   if it is a colu
16570 6d 6e 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20  mn in a virtual 
16580 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20  table.  This is 
16590 64 6f 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20  done because.   
165a0 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f     ** the left o
165b0 70 65 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20  perand of infix 
165c0 66 75 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f  functions (the o
165d0 70 65 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74  perand we want t
165e0 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72  o.      ** contr
165f0 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20  ol overloading) 
16600 65 6e 64 73 20 75 70 20 61 73 20 74 68 65 20 73  ends up as the s
16610 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
16620 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66  o the.      ** f
16630 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78  unction.  The ex
16640 70 72 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62  pression "A glob
16650 20 42 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e   B" is equivalen
16660 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22  t to .      ** "
16670 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77  glob(B,A).  We w
16680 61 6e 74 20 74 6f 20 75 73 65 20 74 68 65 20 41  ant to use the A
16690 20 69 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74   in "A glob B" t
166a0 6f 20 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20  o test.      ** 
166b0 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65  for function ove
166c0 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77  rloading.  But w
166d0 65 20 75 73 65 20 74 68 65 20 42 20 74 65 72 6d  e use the B term
166e0 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e   in "glob(B,A)".
166f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
16700 69 66 28 20 6e 46 61 72 67 3e 3d 32 20 26 26 20  if( nFarg>=2 && 
16710 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  (pExpr->flags & 
16720 45 50 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b  EP_InfixFunc) ){
16730 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
16740 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c  sqlite3VtabOverl
16750 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  oadFunction(db, 
16760 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61  pDef, nFarg, pFa
16770 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b  rg->a[1].pExpr);
16780 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
16790 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20 20 20 20   nFarg>0 ){.    
167a0 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
167b0 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75  e3VtabOverloadFu
167c0 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c  nction(db, pDef,
167d0 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61   nFarg, pFarg->a
167e0 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
167f0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
16800 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61 72   for(i=0; i<nFar
16810 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
16820 20 69 66 28 20 69 3c 33 32 20 26 26 20 73 71 6c   if( i<32 && sql
16830 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
16840 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70  nt(pFarg->a[i].p
16850 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
16860 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20     constMask |= 
16870 28 31 3c 3c 69 29 3b 0a 20 20 20 20 20 20 20 20  (1<<i);.        
16880 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  }.        if( (p
16890 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  Def->flags & SQL
168a0 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c  ITE_FUNC_NEEDCOL
168b0 4c 29 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20  L)!=0 && !pColl 
168c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  ){.          pCo
168d0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
168e0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
168f0 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70  pFarg->a[i].pExp
16900 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
16910 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
16920 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51  pDef->flags & SQ
16930 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
16940 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  LL ){.        if
16950 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
16960 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
16970 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ; .        sqlit
16980 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
16990 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30  OP_CollSeq, 0, 0
169a0 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f  , 0, (char *)pCo
169b0 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
169c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
169d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
169e0 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c  (v, OP_Function,
169f0 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20   constMask, r1, 
16a00 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20  target,.        
16a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a20 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f  (char*)pDef, P4_
16a30 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20  FUNCDEF);.      
16a40 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
16a50 65 50 35 28 76 2c 20 28 75 38 29 6e 46 61 72 67  eP5(v, (u8)nFarg
16a60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61  );.      if( nFa
16a70 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rg ){.        sq
16a80 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
16a90 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31  Range(pParse, r1
16aa0 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20  , nFarg);.      
16ab0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
16ac0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
16ad0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
16ae0 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  Y.    case TK_EX
16af0 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54  ISTS:.    case T
16b00 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
16b10 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
16b20 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20  TK_EXISTS );.   
16b30 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
16b40 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20  =TK_SELECT );.  
16b50 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
16b60 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
16b70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
16b80 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  0, 0);.      bre
16b90 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
16ba0 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
16bb0 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73    int destIfFals
16bc0 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
16bd0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
16be0 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c     int destIfNul
16bf0 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
16c00 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
16c10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16c20 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
16c30 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
16c40 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
16c50 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78  deIN(pParse, pEx
16c60 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  pr, destIfFalse,
16c70 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
16c80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16c90 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
16ca0 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  ger, 1, target);
16cb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16cc0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
16cd0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
16ce0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16cf0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
16d00 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20 30 29  dImm, target, 0)
16d10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16d20 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
16d30 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  v, destIfNull);.
16d40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16d50 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
16d60 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
16d70 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20  Y */...    /*.  
16d80 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45    **    x BETWEE
16d90 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a  N y AND z.    **
16da0 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20  .    ** This is 
16db0 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20  equivalent to.  
16dc0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78    **.    **    x
16dd0 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20  >=y AND x<=z.   
16de0 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73 20   **.    ** X is 
16df0 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
16e00 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59  >pLeft..    ** Y
16e10 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
16e20 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d  xpr->pList->a[0]
16e30 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a  .pExpr..    ** Z
16e40 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
16e50 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d  xpr->pList->a[1]
16e60 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20  .pExpr..    */. 
16e70 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
16e80 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  EN: {.      Expr
16e90 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
16ea0 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 73 74  >pLeft;.      st
16eb0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
16ec0 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20 70 45 78  em *pLItem = pEx
16ed0 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 3b 0a  pr->x.pList->a;.
16ee0 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
16ef0 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78  ht = pLItem->pEx
16f00 70 72 3b 0a 0a 20 20 20 20 20 20 72 31 20 3d 20  pr;..      r1 = 
16f10 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
16f20 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 65 66  emp(pParse, pLef
16f30 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
16f40 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
16f50 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
16f60 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 26 72  arse, pRight, &r
16f70 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
16f80 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
16f90 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
16fa0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
16fb0 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 33  2==0 );.      r3
16fc0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
16fd0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
16fe0 20 20 20 20 72 34 20 3d 20 73 71 6c 69 74 65 33      r4 = sqlite3
16ff0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
17000 65 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  e);.      codeCo
17010 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
17020 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f  eft, pRight, OP_
17030 47 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Ge,.            
17040 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 72 33        r1, r2, r3
17050 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  , SQLITE_STOREP2
17060 29 3b 0a 20 20 20 20 20 20 70 4c 49 74 65 6d 2b  );.      pLItem+
17070 2b 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20  +;.      pRight 
17080 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b  = pLItem->pExpr;
17090 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
170a0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
170b0 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a  rse, regFree2);.
170c0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
170d0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
170e0 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 26  Parse, pRight, &
170f0 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
17100 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
17110 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
17120 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
17130 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  se, pLeft, pRigh
17140 74 2c 20 4f 50 5f 4c 65 2c 20 72 31 2c 20 72 32  t, OP_Le, r1, r2
17150 2c 20 72 34 2c 20 53 51 4c 49 54 45 5f 53 54 4f  , r4, SQLITE_STO
17160 52 45 50 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  REP2);.      sql
17170 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
17180 2c 20 4f 50 5f 41 6e 64 2c 20 72 33 2c 20 72 34  , OP_And, r3, r4
17190 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
171a0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
171b0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
171c0 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  3);.      sqlite
171d0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
171e0 70 50 61 72 73 65 2c 20 72 34 29 3b 0a 20 20 20  pParse, r4);.   
171f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
17200 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c      case TK_COLL
17210 41 54 45 3a 20 0a 20 20 20 20 63 61 73 65 20 54  ATE: .    case T
17220 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20  K_UPLUS: {.     
17230 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
17240 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
17250 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
17260 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  eft, target);.  
17270 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17280 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52  ..    case TK_TR
17290 49 47 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f  IGGER: {.      /
172a0 2a 20 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20  * If the opcode 
172b0 69 73 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74  is TK_TRIGGER, t
172c0 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69  hen the expressi
172d0 6f 6e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  on is a referenc
172e0 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20  e.      ** to a 
172f0 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65  column in the ne
17300 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65  w.* or old.* pse
17310 75 64 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c  udo-tables avail
17320 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  able to.      **
17330 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
17340 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
17350 45 78 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73  Expr.iTable is s
17360 65 74 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a  et to 1 for the.
17370 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70        ** new.* p
17380 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20  seudo-table, or 
17390 30 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20  0 for the old.* 
173a0 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78  pseudo-table. Ex
173b0 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20  pr.iColumn.     
173c0 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68   ** is set to th
173d0 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  e column of the 
173e0 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20  pseudo-table to 
173f0 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74  read, or to -1 t
17400 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20  o.      ** read 
17410 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e  the rowid field.
17420 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
17430 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  ** The expressio
17440 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  n is implemented
17450 20 75 73 69 6e 67 20 61 6e 20 4f 50 5f 50 61 72   using an OP_Par
17460 61 6d 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 70  am opcode. The p
17470 31 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d  1.      ** param
17480 65 74 65 72 20 69 73 20 73 65 74 20 74 6f 20 30  eter is set to 0
17490 20 66 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f 77 69   for an old.rowi
174a0 64 20 72 65 66 65 72 65 6e 63 65 2c 20 6f 72 20  d reference, or 
174b0 74 6f 20 28 69 2b 31 29 0a 20 20 20 20 20 20 2a  to (i+1).      *
174c0 2a 20 74 6f 20 72 65 66 65 72 65 6e 63 65 20 61  * to reference a
174d0 6e 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 6f 66  nother column of
174e0 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64   the old.* pseud
174f0 6f 2d 74 61 62 6c 65 2c 20 77 68 65 72 65 20 0a  o-table, where .
17500 20 20 20 20 20 20 2a 2a 20 69 20 69 73 20 74 68        ** i is th
17510 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63  e index of the c
17520 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61 20 6e 65 77  olumn. For a new
17530 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65  .rowid reference
17540 2c 20 70 31 20 69 73 0a 20 20 20 20 20 20 2a 2a  , p1 is.      **
17550 20 73 65 74 20 74 6f 20 28 6e 2b 31 29 2c 20 77   set to (n+1), w
17560 68 65 72 65 20 6e 20 69 73 20 74 68 65 20 6e 75  here n is the nu
17570 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
17580 69 6e 20 65 61 63 68 20 70 73 65 75 64 6f 2d 74  in each pseudo-t
17590 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 46  able..      ** F
175a0 6f 72 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  or a reference t
175b0 6f 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6c 75  o any other colu
175c0 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20  mn in the new.* 
175d0 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 70 31  pseudo-table, p1
175e0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74  .      ** is set
175f0 20 74 6f 20 28 6e 2b 32 2b 69 29 2c 20 77 68 65   to (n+2+i), whe
17600 72 65 20 6e 20 61 6e 64 20 69 20 61 72 65 20 61  re n and i are a
17610 73 20 64 65 66 69 6e 65 64 20 70 72 65 76 69 6f  s defined previo
17620 75 73 6c 79 2e 20 46 6f 72 0a 20 20 20 20 20 20  usly. For.      
17630 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  ** example, if t
17640 68 65 20 74 61 62 6c 65 20 6f 6e 20 77 68 69 63  he table on whic
17650 68 20 74 72 69 67 67 65 72 73 20 61 72 65 20 62  h triggers are b
17660 65 69 6e 67 20 66 69 72 65 64 20 69 73 0a 20 20  eing fired is.  
17670 20 20 20 20 2a 2a 20 64 65 63 6c 61 72 65 64 20      ** declared 
17680 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  as:.      **.   
17690 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54     **   CREATE T
176a0 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
176b0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
176c0 20 54 68 65 6e 20 70 31 20 69 73 20 69 6e 74 65   Then p1 is inte
176d0 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f  rpreted as follo
176e0 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ws:.      **.   
176f0 20 20 20 2a 2a 20 20 20 70 31 3d 3d 30 20 20 20     **   p1==0   
17700 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f 77 69 64 20  ->    old.rowid 
17710 20 20 20 20 70 31 3d 3d 33 20 20 20 2d 3e 20 20      p1==3   ->  
17720 20 20 6e 65 77 2e 72 6f 77 69 64 0a 20 20 20 20    new.rowid.    
17730 20 20 2a 2a 20 20 20 70 31 3d 3d 31 20 20 20 2d    **   p1==1   -
17740 3e 20 20 20 20 6f 6c 64 2e 61 20 20 20 20 20 20  >    old.a      
17750 20 20 20 70 31 3d 3d 34 20 20 20 2d 3e 20 20 20     p1==4   ->   
17760 20 6e 65 77 2e 61 0a 20 20 20 20 20 20 2a 2a 20   new.a.      ** 
17770 20 20 70 31 3d 3d 32 20 20 20 2d 3e 20 20 20 20    p1==2   ->    
17780 6f 6c 64 2e 62 20 20 20 20 20 20 20 20 20 70 31  old.b         p1
17790 3d 3d 35 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e  ==5   ->    new.
177a0 62 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2a  b       .      *
177b0 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
177c0 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61  Tab = pExpr->pTa
177d0 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 70 31 20  b;.      int p1 
177e0 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  = pExpr->iTable 
177f0 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29  * (pTab->nCol+1)
17800 20 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e 69 43   + 1 + pExpr->iC
17810 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61 73  olumn;..      as
17820 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54 61  sert( pExpr->iTa
17830 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d  ble==0 || pExpr-
17840 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20  >iTable==1 );.  
17850 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
17860 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26  r->iColumn>=-1 &
17870 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  & pExpr->iColumn
17880 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  <pTab->nCol );. 
17890 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
178a0 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70 45  b->iPKey<0 || pE
178b0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54  xpr->iColumn!=pT
178c0 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20 20  ab->iPKey );.   
178d0 20 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d 30     assert( p1>=0
178e0 20 26 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e 43   && p1<(pTab->nC
178f0 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20 20  ol*2+2) );..    
17900 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17910 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d 2c  Op2(v, OP_Param,
17920 20 70 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   p1, target);.  
17930 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
17940 28 76 2c 20 22 25 73 2e 25 73 20 2d 3e 20 24 25  (v, "%s.%s -> $%
17950 64 22 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78  d",.        (pEx
17960 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22 6e 65  pr->iTable ? "ne
17970 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20 20 20  w" : "old"),.   
17980 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69 43 6f       (pExpr->iCo
17990 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69 64 22  lumn<0 ? "rowid"
179a0 20 3a 20 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e   : pExpr->pTab->
179b0 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  aCol[pExpr->iCol
179c0 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a 20 20 20  umn].zName),.   
179d0 20 20 20 20 20 74 61 72 67 65 74 0a 20 20 20 20       target.    
179e0 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53    ));..#ifndef S
179f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
17a00 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20  ING_POINT.      
17a10 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e  /* If the column
17a20 20 68 61 73 20 52 45 41 4c 20 61 66 66 69 6e 69   has REAL affini
17a30 74 79 2c 20 69 74 20 6d 61 79 20 63 75 72 72 65  ty, it may curre
17a40 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64 20 61  ntly be stored a
17a50 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e  s an.      ** in
17a60 74 65 67 65 72 2e 20 55 73 65 20 4f 50 5f 52 65  teger. Use OP_Re
17a70 61 6c 41 66 66 69 6e 69 74 79 20 74 6f 20 6d 61  alAffinity to ma
17a80 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 72 65  ke sure it is re
17a90 61 6c 6c 79 20 72 65 61 6c 2e 20 20 2a 2f 0a 20  ally real.  */. 
17aa0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
17ab0 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20 20  iColumn>=0 .    
17ac0 20 20 20 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c     && pTab->aCol
17ad0 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
17ae0 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  .affinity==SQLIT
17af0 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20 20 20  E_AFF_REAL.     
17b00 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
17b10 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
17b20 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79   OP_RealAffinity
17b30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
17b40 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
17b50 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20  break;.    }... 
17b60 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     /*.    ** For
17b70 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  m A:.    **   CA
17b80 53 45 20 78 20 57 48 45 4e 20 65 31 20 54 48 45  SE x WHEN e1 THE
17b90 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45  N r1 WHEN e2 THE
17ba0 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e  N r2 ... WHEN eN
17bb0 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20   THEN rN ELSE y 
17bc0 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  END.    **.    *
17bd0 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a  * Form B:.    **
17be0 20 20 20 43 41 53 45 20 57 48 45 4e 20 65 31 20     CASE WHEN e1 
17bf0 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20  THEN r1 WHEN e2 
17c00 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e  THEN r2 ... WHEN
17c10 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45   eN THEN rN ELSE
17c20 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20   y END.    **.  
17c30 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69 73 20 63    ** Form A is c
17c40 61 6e 20 62 65 20 74 72 61 6e 73 66 6f 72 6d 65  an be transforme
17c50 64 20 69 6e 74 6f 20 74 68 65 20 65 71 75 69 76  d into the equiv
17c60 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20 61 73 20  alent form B as 
17c70 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20  follows:.    ** 
17c80 20 20 43 41 53 45 20 57 48 45 4e 20 78 3d 65 31    CASE WHEN x=e1
17c90 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 78 3d   THEN r1 WHEN x=
17ca0 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20  e2 THEN r2 .... 
17cb0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 57 48 45     **        WHE
17cc0 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45  N x=eN THEN rN E
17cd0 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a  LSE y END.    **
17ce0 0a 20 20 20 20 2a 2a 20 58 20 28 69 66 20 69 74  .    ** X (if it
17cf0 20 65 78 69 73 74 73 29 20 69 73 20 69 6e 20 70   exists) is in p
17d00 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20  Expr->pLeft..   
17d10 20 2a 2a 20 59 20 69 73 20 69 6e 20 70 45 78 70   ** Y is in pExp
17d20 72 2d 3e 70 52 69 67 68 74 2e 20 20 54 68 65 20  r->pRight.  The 
17d30 59 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e  Y is also option
17d40 61 6c 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  al.  If there is
17d50 20 6e 6f 0a 20 20 20 20 2a 2a 20 45 4c 53 45 20   no.    ** ELSE 
17d60 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 20 6f 74  clause and no ot
17d70 68 65 72 20 74 65 72 6d 20 6d 61 74 63 68 65 73  her term matches
17d80 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
17d90 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  t of the.    ** 
17da0 65 78 70 72 73 73 69 6f 6e 20 69 73 20 4e 55 4c  exprssion is NUL
17db0 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20 69 73 20  L..    ** Ei is 
17dc0 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  in pExpr->pList-
17dd0 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20 69  >a[i*2] and Ri i
17de0 73 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  s pExpr->pList->
17df0 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a  a[i*2+1]..    **
17e00 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73 75  .    ** The resu
17e10 6c 74 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  lt of the expres
17e20 73 69 6f 6e 20 69 73 20 74 68 65 20 52 69 20 66  sion is the Ri f
17e30 6f 72 20 74 68 65 20 66 69 72 73 74 20 6d 61 74  or the first mat
17e40 63 68 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a  ching Ei,.    **
17e50 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 20   or if there is 
17e60 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 20  no matching Ei, 
17e70 74 68 65 20 45 4c 53 45 20 74 65 72 6d 20 59 2c  the ELSE term Y,
17e80 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 0a   or if there is.
17e90 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74      ** no ELSE t
17ea0 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a  erm, NULL..    *
17eb0 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61  /.    default: a
17ec0 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 43 41  ssert( op==TK_CA
17ed0 53 45 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e  SE ); {.      in
17ee0 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20  t endLabel;     
17ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f00 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f  /* GOTO label fo
17f10 72 20 65 6e 64 20 6f 66 20 43 41 53 45 20 73 74  r end of CASE st
17f20 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  mt */.      int 
17f30 6e 65 78 74 43 61 73 65 3b 20 20 20 20 20 20 20  nextCase;       
17f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17f50 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20   GOTO label for 
17f60 6e 65 78 74 20 57 48 45 4e 20 63 6c 61 75 73 65  next WHEN clause
17f70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45   */.      int nE
17f80 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  xpr;            
17f90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32              /* 2
17fa0 78 20 6e 75 6d 62 65 72 20 6f 66 20 57 48 45 4e  x number of WHEN
17fb0 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
17fc0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
17fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fe0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
17ff0 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c  r */.      ExprL
18000 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
18010 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18020 4c 69 73 74 20 6f 66 20 57 48 45 4e 20 74 65 72  List of WHEN ter
18030 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75  ms */.      stru
18040 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
18050 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a   *aListelem;  /*
18060 20 41 72 72 61 79 20 6f 66 20 57 48 45 4e 20 74   Array of WHEN t
18070 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45 78  erms */.      Ex
18080 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20  pr opCompare;   
18090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180a0 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20 65 78 70  /* The X==Ei exp
180b0 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ression */.     
180c0 20 45 78 70 72 20 63 61 63 68 65 58 3b 20 20 20   Expr cacheX;   
180d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180e0 20 20 20 2f 2a 20 43 61 63 68 65 64 20 65 78 70     /* Cached exp
180f0 72 65 73 73 69 6f 6e 20 58 20 2a 2f 0a 20 20 20  ression X */.   
18100 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20     Expr *pX;    
18110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18120 20 20 20 20 20 2f 2a 20 54 68 65 20 58 20 65 78       /* The X ex
18130 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
18140 20 20 45 78 70 72 20 2a 70 54 65 73 74 20 3d 20    Expr *pTest = 
18150 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
18160 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f      /* X==Ei (fo
18170 72 6d 20 41 29 20 6f 72 20 6a 75 73 74 20 45 69  rm A) or just Ei
18180 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 20 20 20   (form B) */.   
18190 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74     VVA_ONLY( int
181a0 20 69 43 61 63 68 65 4c 65 76 65 6c 20 3d 20 70   iCacheLevel = p
181b0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
181c0 65 6c 3b 20 29 0a 0a 20 20 20 20 20 20 61 73 73  el; )..      ass
181d0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
181e0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
181f0 78 49 73 53 65 6c 65 63 74 29 20 26 26 20 70 45  xIsSelect) && pE
18200 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a  xpr->x.pList );.
18210 20 20 20 20 20 20 61 73 73 65 72 74 28 28 70 45        assert((pE
18220 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
18230 78 70 72 20 25 20 32 29 20 3d 3d 20 30 29 3b 0a  xpr % 2) == 0);.
18240 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78        assert(pEx
18250 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
18260 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70  pr > 0);.      p
18270 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  EList = pExpr->x
18280 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c  .pList;.      aL
18290 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74  istelem = pEList
182a0 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72  ->a;.      nExpr
182b0 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
182c0 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61 62 65 6c  ;.      endLabel
182d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
182e0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
182f0 20 20 69 66 28 20 28 70 58 20 3d 20 70 45 78 70    if( (pX = pExp
18300 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a  r->pLeft)!=0 ){.
18310 20 20 20 20 20 20 20 20 63 61 63 68 65 58 20 3d          cacheX =
18320 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 74 65   *pX;.        te
18330 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d  stcase( pX->op==
18340 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
18350 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
18360 58 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  X->op==TK_REGIST
18370 45 52 20 29 3b 0a 20 20 20 20 20 20 20 20 63 61  ER );.        ca
18380 63 68 65 58 2e 69 54 61 62 6c 65 20 3d 20 73 71  cheX.iTable = sq
18390 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
183a0 70 28 70 50 61 72 73 65 2c 20 70 58 2c 20 26 72  p(pParse, pX, &r
183b0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
183c0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
183d0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
183e0 20 20 20 63 61 63 68 65 58 2e 6f 70 20 3d 20 54     cacheX.op = T
183f0 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20 20  K_REGISTER;.    
18400 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70      opCompare.op
18410 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20   = TK_EQ;.      
18420 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66    opCompare.pLef
18430 74 20 3d 20 26 63 61 63 68 65 58 3b 0a 20 20 20  t = &cacheX;.   
18440 20 20 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70       pTest = &op
18450 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 20  Compare;.       
18460 20 2f 2a 20 54 69 63 6b 65 74 20 62 33 35 31 64   /* Ticket b351d
18470 39 35 66 39 63 64 35 65 66 31 37 65 39 64 39 64  95f9cd5ef17e9d9d
18480 62 61 65 31 38 66 35 63 61 38 36 31 31 31 39 30  bae18f5ca8611190
18490 30 30 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20  001:.        ** 
184a0 54 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  The value in reg
184b0 46 72 65 65 31 20 6d 69 67 68 74 20 67 65 74 20  Free1 might get 
184c0 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74 68  SCopy-ed into th
184d0 65 20 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20  e file result.. 
184e0 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b         ** So mak
184f0 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
18500 72 65 67 46 72 65 65 31 20 72 65 67 69 73 74 65  regFree1 registe
18510 72 20 69 73 20 6e 6f 74 20 72 65 75 73 65 64 20  r is not reused 
18520 66 6f 72 20 6f 74 68 65 72 0a 20 20 20 20 20 20  for other.      
18530 20 20 2a 2a 20 70 75 72 70 6f 73 65 73 20 61 6e    ** purposes an
18540 64 20 70 6f 73 73 69 62 6c 79 20 6f 76 65 72 77  d possibly overw
18550 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20  ritten.  */.    
18560 20 20 20 20 72 65 67 46 72 65 65 31 20 3d 20 30      regFree1 = 0
18570 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18580 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
18590 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20  ; i=i+2){.      
185a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
185b0 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
185c0 20 20 20 20 20 20 20 20 69 66 28 20 70 58 20 29          if( pX )
185d0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
185e0 72 74 28 20 70 54 65 73 74 21 3d 30 20 29 3b 0a  rt( pTest!=0 );.
185f0 20 20 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70            opComp
18600 61 72 65 2e 70 52 69 67 68 74 20 3d 20 61 4c 69  are.pRight = aLi
18610 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b  stelem[i].pExpr;
18620 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
18630 20 20 20 20 20 20 20 20 20 20 70 54 65 73 74 20            pTest 
18640 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70  = aListelem[i].p
18650 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Expr;.        }.
18660 20 20 20 20 20 20 20 20 6e 65 78 74 43 61 73 65          nextCase
18670 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
18680 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
18690 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
186a0 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  est->op==TK_COLU
186b0 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  MN );.        sq
186c0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
186d0 28 70 50 61 72 73 65 2c 20 70 54 65 73 74 2c 20  (pParse, pTest, 
186e0 6e 65 78 74 43 61 73 65 2c 20 53 51 4c 49 54 45  nextCase, SQLITE
186f0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
18700 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
18710 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70  aListelem[i+1].p
18720 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
18730 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 74  UMN );.        t
18740 65 73 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c  estcase( aListel
18750 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f  em[i+1].pExpr->o
18760 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
18770 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18780 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
18790 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d  , aListelem[i+1]
187a0 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
187b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
187c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
187d0 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 4c 61 62  _Goto, 0, endLab
187e0 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  el);.        sql
187f0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
18800 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20  (pParse, 1);.   
18810 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18820 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
18830 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20  nextCase);.     
18840 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   }.      if( pEx
18850 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20  pr->pRight ){.  
18860 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
18870 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
18880 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
18890 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
188a0 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
188b0 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  t, target);.    
188c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
188d0 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20  achePop(pParse, 
188e0 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
188f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18900 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18910 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74  _Null, 0, target
18920 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
18930 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
18940 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61  locFailed || pPa
18950 72 73 65 2d 3e 6e 45 72 72 3e 30 20 0a 20 20 20  rse->nErr>0 .   
18960 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73          || pPars
18970 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d  e->iCacheLevel==
18980 69 43 61 63 68 65 4c 65 76 65 6c 20 29 3b 0a 20  iCacheLevel );. 
18990 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
189a0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
189b0 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20  endLabel);.     
189c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
189d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
189e0 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63 61  T_TRIGGER.    ca
189f0 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20  se TK_RAISE: {. 
18a00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
18a10 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
18a20 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20  _Rollback .     
18a30 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
18a40 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f  affinity==OE_Abo
18a50 72 74 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  rt.           ||
18a60 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
18a70 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20 20  ==OE_Fail.      
18a80 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61       || pExpr->a
18a90 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f  ffinity==OE_Igno
18aa0 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  re.      );.    
18ab0 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 70    if( !pParse->p
18ac0 54 72 69 67 67 65 72 54 61 62 20 29 7b 0a 20 20  TriggerTab ){.  
18ad0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
18ae0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
18af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b00 20 20 20 20 20 22 52 41 49 53 45 28 29 20 6d 61       "RAISE() ma
18b10 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77  y only be used w
18b20 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d  ithin a trigger-
18b30 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20  program");.     
18b40 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
18b50 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
18b60 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
18b70 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20  OE_Abort ){.    
18b80 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62      sqlite3MayAb
18b90 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ort(pParse);.   
18ba0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
18bb0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
18bc0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
18bd0 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
18be0 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69   if( pExpr->affi
18bf0 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20  nity==OE_Ignore 
18c00 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
18c10 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20  e3VdbeAddOp4(.  
18c20 20 20 20 20 20 20 20 20 20 20 76 2c 20 4f 50 5f            v, OP_
18c30 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c  Halt, SQLITE_OK,
18c40 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20 70   OE_Ignore, 0, p
18c50 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30  Expr->u.zToken,0
18c60 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
18c70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
18c80 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  altConstraint(pP
18c90 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 61 66 66  arse, pExpr->aff
18ca0 69 6e 69 74 79 2c 20 70 45 78 70 72 2d 3e 75 2e  inity, pExpr->u.
18cb0 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20  zToken, 0);.    
18cc0 20 20 7d 0a 0a 20 20 20 20 20 20 62 72 65 61 6b    }..      break
18cd0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
18ce0 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
18cf0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
18d00 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20  e, regFree1);.  
18d10 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
18d20 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
18d30 67 46 72 65 65 32 29 3b 0a 20 20 72 65 74 75 72  gFree2);.  retur
18d40 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  n inReg;.}../*.*
18d50 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
18d60 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 65  to evaluate an e
18d70 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 74  xpression and st
18d80 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ore the results.
18d90 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74  ** into a regist
18da0 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  er.  Return the 
18db0 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20  register number 
18dc0 77 68 65 72 65 20 74 68 65 20 72 65 73 75 6c 74  where the result
18dd0 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 2e  s.** are stored.
18de0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
18df0 67 69 73 74 65 72 20 69 73 20 61 20 74 65 6d 70  gister is a temp
18e00 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 74  orary register t
18e10 68 61 74 20 63 61 6e 20 62 65 20 64 65 61 6c 6c  hat can be deall
18e20 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  ocated,.** then 
18e30 77 72 69 74 65 20 69 74 73 20 6e 75 6d 62 65 72  write its number
18e40 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49 66   into *pReg.  If
18e50 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 67 69   the result regi
18e60 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61  ster is not.** a
18e70 20 74 65 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e   temporary, then
18e80 20 73 65 74 20 2a 70 52 65 67 20 74 6f 20 7a 65   set *pReg to ze
18e90 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ro..*/.int sqlit
18ea0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 50  e3ExprCodeTemp(P
18eb0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
18ec0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a  pr *pExpr, int *
18ed0 70 52 65 67 29 7b 0a 20 20 69 6e 74 20 72 31 20  pReg){.  int r1 
18ee0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
18ef0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69  Reg(pParse);.  i
18f00 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45  nt r2 = sqlite3E
18f10 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
18f20 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29  arse, pExpr, r1)
18f30 3b 0a 20 20 69 66 28 20 72 32 3d 3d 72 31 20 29  ;.  if( r2==r1 )
18f40 7b 0a 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31  {.    *pReg = r1
18f50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
18f60 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
18f70 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
18f80 3b 0a 20 20 20 20 2a 70 52 65 67 20 3d 20 30 3b  ;.    *pReg = 0;
18f90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32  .  }.  return r2
18fa0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
18fb0 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
18fc0 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72  ll evaluate expr
18fd0 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64  ession pExpr and
18fe0 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65   store the.** re
18ff0 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
19000 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72  r target.  The r
19010 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61  esults are guara
19020 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a  nteed to appear.
19030 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ** in register t
19040 61 72 67 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  arget..*/.int sq
19050 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 50 61  lite3ExprCode(Pa
19060 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
19070 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
19080 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52  rget){.  int inR
19090 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74  eg;..  assert( t
190a0 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65  arget>0 && targe
190b0 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  t<=pParse->nMem 
190c0 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 26  );.  if( pExpr &
190d0 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  & pExpr->op==TK_
190e0 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20  REGISTER ){.    
190f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19100 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  2(pParse->pVdbe,
19110 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70 72 2d   OP_Copy, pExpr-
19120 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74 29  >iTable, target)
19130 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
19140 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
19150 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
19160 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
19170 65 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  et);.    assert(
19180 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 7c   pParse->pVdbe |
19190 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
191a0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
191b0 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72    if( inReg!=tar
191c0 67 65 74 20 26 26 20 70 50 61 72 73 65 2d 3e 70  get && pParse->p
191d0 56 64 62 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Vdbe ){.      sq
191e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
191f0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
19200 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20  P_SCopy, inReg, 
19210 74 61 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20  target);.    }. 
19220 20 7d 0a 20 20 72 65 74 75 72 6e 20 74 61 72 67   }.  return targ
19230 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  et;.}../*.** Gen
19240 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
19250 65 76 61 6c 75 74 65 73 20 74 68 65 20 67 69 76  evalutes the giv
19260 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  en expression an
19270 64 20 70 75 74 73 20 74 68 65 20 72 65 73 75 6c  d puts the resul
19280 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72  t.** in register
19290 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41   target..**.** A
192a0 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  lso make a copy 
192b0 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
192c0 6e 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61  n results into a
192d0 6e 6f 74 68 65 72 20 22 63 61 63 68 65 22 20 72  nother "cache" r
192e0 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d  egister.** and m
192f0 6f 64 69 66 79 20 74 68 65 20 65 78 70 72 65 73  odify the expres
19300 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68 65  sion so that the
19310 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69 73   next time it is
19320 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74   evaluated,.** t
19330 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 63  he result is a c
19340 6f 70 79 20 6f 66 20 74 68 65 20 63 61 63 68 65  opy of the cache
19350 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a   register..**.**
19360 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
19370 20 75 73 65 64 20 66 6f 72 20 65 78 70 72 65 73   used for expres
19380 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 75  sions that are u
19390 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a  sed multiple .**
193a0 20 74 69 6d 65 73 2e 20 20 54 68 65 79 20 61 72   times.  They ar
193b0 65 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65  e evaluated once
193c0 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 73   and the results
193d0 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
193e0 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73 65 64  on.** are reused
193f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19400 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65  ExprCodeAndCache
19410 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
19420 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
19430 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65   target){.  Vdbe
19440 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
19450 64 62 65 3b 0a 20 20 69 6e 74 20 69 6e 52 65 67  dbe;.  int inReg
19460 3b 0a 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69  ;.  inReg = sqli
19470 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
19480 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
19490 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61  t);.  assert( ta
194a0 72 67 65 74 3e 30 20 29 3b 0a 20 20 2f 2a 20 54  rget>0 );.  /* T
194b0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
194c0 61 6c 6c 65 64 20 66 6f 72 20 74 65 72 6d 73 20  alled for terms 
194d0 74 6f 20 49 4e 53 45 52 54 20 6f 72 20 55 50 44  to INSERT or UPD
194e0 41 54 45 2e 20 20 41 6e 64 20 74 68 65 20 6f 6e  ATE.  And the on
194f0 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72 20 70 6c  ly.  ** other pl
19500 61 63 65 20 77 68 65 72 65 20 65 78 70 72 65 73  ace where expres
19510 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 63 6f 6e  sions can be con
19520 76 65 72 74 65 64 20 69 6e 74 6f 20 54 4b 5f 52  verted into TK_R
19530 45 47 49 53 54 45 52 20 69 73 0a 20 20 2a 2a 20  EGISTER is.  ** 
19540 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  in WHERE clause 
19550 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 53 6f 20  processing.  So 
19560 61 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6d 70  as currently imp
19570 6c 65 6d 65 6e 74 65 64 2c 20 74 68 65 72 65 20  lemented, there 
19580 69 73 0a 20 20 2a 2a 20 6e 6f 20 77 61 79 20 66  is.  ** no way f
19590 6f 72 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52  or a TK_REGISTER
195a0 20 74 6f 20 65 78 69 73 74 20 68 65 72 65 2e 20   to exist here. 
195b0 20 42 75 74 20 69 74 20 73 65 65 6d 73 20 70 72   But it seems pr
195c0 75 64 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 6b 65  udent to.  ** ke
195d0 65 70 20 74 68 65 20 41 4c 57 41 59 53 28 29 20  ep the ALWAYS() 
195e0 69 6e 20 63 61 73 65 20 74 68 65 20 63 6f 6e 64  in case the cond
195f0 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 63 68 61  itions above cha
19600 6e 67 65 20 77 69 74 68 20 66 75 74 75 72 65 0a  nge with future.
19610 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f    ** modificatio
19620 6e 73 20 6f 72 20 65 6e 68 61 6e 63 65 6d 65 6e  ns or enhancemen
19630 74 73 2e 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57  ts. */.  if( ALW
19640 41 59 53 28 70 45 78 70 72 2d 3e 6f 70 21 3d 54  AYS(pExpr->op!=T
19650 4b 5f 52 45 47 49 53 54 45 52 29 20 29 7b 20 20  K_REGISTER) ){  
19660 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20  .    int iMem;. 
19670 20 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72     iMem = ++pPar
19680 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71  se->nMem;.    sq
19690 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
196a0 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 69 6e 52 65  v, OP_Copy, inRe
196b0 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 70 45  g, iMem);.    pE
196c0 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 4d  xpr->iTable = iM
196d0 65 6d 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f  em;.    pExpr->o
196e0 70 32 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  p2 = pExpr->op;.
196f0 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
19700 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 7d  TK_REGISTER;.  }
19710 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b  .  return inReg;
19720 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
19730 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52  SQLITE_ENABLE_TR
19740 45 45 5f 45 58 50 4c 41 49 4e 29 0a 2f 2a 0a 2a  EE_EXPLAIN)./*.*
19750 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68 75 6d  * Generate a hum
19760 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 78 70 6c  an-readable expl
19770 61 6e 61 74 69 6f 6e 20 6f 66 20 61 6e 20 65 78  anation of an ex
19780 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a  pression tree..*
19790 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
197a0 70 6c 61 69 6e 45 78 70 72 28 56 64 62 65 20 2a  plainExpr(Vdbe *
197b0 70 4f 75 74 2c 20 45 78 70 72 20 2a 70 45 78 70  pOut, Expr *pExp
197c0 72 29 7b 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20  r){.  int op;   
197d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197e0 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65  /* The opcode be
197f0 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 63  ing coded */.  c
19800 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 69 6e 4f  onst char *zBinO
19810 70 20 3d 20 30 3b 20 20 20 2f 2a 20 42 69 6e 61  p = 0;   /* Bina
19820 72 79 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  ry operator */. 
19830 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 6e   const char *zUn
19840 69 4f 70 20 3d 20 30 3b 20 20 20 2f 2a 20 55 6e  iOp = 0;   /* Un
19850 61 72 79 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  ary operator */.
19860 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
19870 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55  {.    op = TK_NU
19880 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
19890 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
198a0 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f  .  }.  switch( o
198b0 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
198c0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  _AGG_COLUMN: {. 
198d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
198e0 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
198f0 22 41 47 47 7b 25 64 3a 25 64 7d 22 2c 0a 20 20  "AGG{%d:%d}",.  
19900 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
19910 3e 69 54 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e  >iTable, pExpr->
19920 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
19930 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
19940 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
19950 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
19960 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b 0a  pr->iTable<0 ){.
19970 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
19980 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
19990 6e 20 63 6f 64 69 6e 67 20 63 68 65 63 6b 20 63  n coding check c
199a0 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
199b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
199c0 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
199d0 20 22 43 4f 4c 55 4d 4e 28 25 64 29 22 2c 20 70   "COLUMN(%d)", p
199e0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  Expr->iColumn);.
199f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
19a00 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
19a10 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
19a20 22 7b 25 64 3a 25 64 7d 22 2c 0a 20 20 20 20 20  "{%d:%d}",.     
19a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a40 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
19a50 54 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43  Table, pExpr->iC
19a60 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  olumn);.      }.
19a70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19a80 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
19a90 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
19aa0 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
19ab0 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29   & EP_IntValue )
19ac0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
19ad0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
19ae0 4f 75 74 2c 20 22 25 64 22 2c 20 70 45 78 70 72  Out, "%d", pExpr
19af0 2d 3e 75 2e 69 56 61 6c 75 65 29 3b 0a 20 20 20  ->u.iValue);.   
19b00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19b10 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
19b20 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 73  Printf(pOut, "%s
19b30 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  ", pExpr->u.zTok
19b40 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  en);.      }.   
19b50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
19b60 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
19b70 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
19b80 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  NT.    case TK_F
19b90 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  LOAT: {.      sq
19ba0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
19bb0 74 66 28 70 4f 75 74 2c 22 25 73 22 2c 20 70 45  tf(pOut,"%s", pE
19bc0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
19bd0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19be0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
19bf0 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
19c00 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
19c10 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
19c20 22 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  "%Q", pExpr->u.z
19c30 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72  Token);.      br
19c40 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
19c50 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20  ase TK_NULL: {. 
19c60 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
19c70 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22  ainPrintf(pOut,"
19c80 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 62 72  NULL");.      br
19c90 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
19ca0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
19cb0 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20  LOB_LITERAL.    
19cc0 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a  case TK_BLOB: {.
19cd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
19ce0 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
19cf0 22 25 73 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  "%s", pExpr->u.z
19d00 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72  Token);.      br
19d10 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
19d20 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41  f.    case TK_VA
19d30 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20  RIABLE: {.      
19d40 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
19d50 69 6e 74 66 28 70 4f 75 74 2c 22 56 41 52 49 41  intf(pOut,"VARIA
19d60 42 4c 45 28 25 73 2c 25 64 29 22 2c 0a 20 20 20  BLE(%s,%d)",.   
19d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d80 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75          pExpr->u
19d90 2e 7a 54 6f 6b 65 6e 2c 20 70 45 78 70 72 2d 3e  .zToken, pExpr->
19da0 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
19db0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
19dc0 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
19dd0 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
19de0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
19df0 70 4f 75 74 2c 22 52 45 47 49 53 54 45 52 28 25  pOut,"REGISTER(%
19e00 64 29 22 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  d)", pExpr->iTab
19e10 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  le);.      break
19e20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
19e30 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20   TK_AS: {.      
19e40 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
19e50 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e  pr(pOut, pExpr->
19e60 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 62 72  pLeft);.      br
19e70 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
19e80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
19e90 41 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AST.    case TK_
19ea0 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  CAST: {.      /*
19eb0 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   Expressions of 
19ec0 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54  the form:   CAST
19ed0 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29  (pLeft AS token)
19ee0 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
19ef0 63 68 61 72 20 2a 7a 41 66 66 20 3d 20 22 75 6e  char *zAff = "un
19f00 6b 22 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68  k";.      switch
19f10 28 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  ( sqlite3Affinit
19f20 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a  yType(pExpr->u.z
19f30 54 6f 6b 65 6e 29 20 29 7b 0a 20 20 20 20 20 20  Token) ){.      
19f40 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46    case SQLITE_AF
19f50 46 5f 54 45 58 54 3a 20 20 20 20 7a 41 66 66 20  F_TEXT:    zAff 
19f60 3d 20 22 54 45 58 54 22 3b 20 20 20 20 20 62 72  = "TEXT";     br
19f70 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
19f80 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  e SQLITE_AFF_NON
19f90 45 3a 20 20 20 20 7a 41 66 66 20 3d 20 22 4e 4f  E:    zAff = "NO
19fa0 4e 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  NE";     break;.
19fb0 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
19fc0 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3a  ITE_AFF_NUMERIC:
19fd0 20 7a 41 66 66 20 3d 20 22 4e 55 4d 45 52 49 43   zAff = "NUMERIC
19fe0 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ";  break;.     
19ff0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
1a000 46 46 5f 49 4e 54 45 47 45 52 3a 20 7a 41 66 66  FF_INTEGER: zAff
1a010 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 20 20 62   = "INTEGER";  b
1a020 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
1a030 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  se SQLITE_AFF_RE
1a040 41 4c 3a 20 20 20 20 7a 41 66 66 20 3d 20 22 52  AL:    zAff = "R
1a050 45 41 4c 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  EAL";     break;
1a060 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1a070 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1a080 6e 74 66 28 70 4f 75 74 2c 20 22 43 41 53 54 2d  ntf(pOut, "CAST-
1a090 25 73 28 22 2c 20 7a 41 66 66 29 3b 0a 20 20 20  %s(", zAff);.   
1a0a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1a0b0 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70  nExpr(pOut, pExp
1a0c0 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
1a0d0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1a0e0 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 29 22 29  rintf(pOut, ")")
1a0f0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1a100 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
1a110 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20  QLITE_OMIT_CAST 
1a120 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  */.    case TK_L
1a130 54 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d  T:      zBinOp =
1a140 20 22 4c 54 22 3b 20 20 20 20 20 62 72 65 61 6b   "LT";     break
1a150 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  ;.    case TK_LE
1a160 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20  :      zBinOp = 
1a170 22 4c 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  "LE";     break;
1a180 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
1a190 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22        zBinOp = "
1a1a0 47 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  GT";     break;.
1a1b0 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 20      case TK_GE: 
1a1c0 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 47       zBinOp = "G
1a1d0 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  E";     break;. 
1a1e0 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20     case TK_NE:  
1a1f0 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4e 45      zBinOp = "NE
1a200 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
1a210 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 20 20    case TK_EQ:   
1a220 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 45 51 22     zBinOp = "EQ"
1a230 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
1a240 20 63 61 73 65 20 54 4b 5f 49 53 3a 20 20 20 20   case TK_IS:    
1a250 20 20 7a 42 69 6e 4f 70 20 3d 20 22 49 53 22 3b    zBinOp = "IS";
1a260 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a270 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 20  case TK_ISNOT:  
1a280 20 7a 42 69 6e 4f 70 20 3d 20 22 49 53 4e 4f 54   zBinOp = "ISNOT
1a290 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";  break;.    c
1a2a0 61 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20 20 20  ase TK_AND:     
1a2b0 7a 42 69 6e 4f 70 20 3d 20 22 41 4e 44 22 3b 20  zBinOp = "AND"; 
1a2c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1a2d0 73 65 20 54 4b 5f 4f 52 3a 20 20 20 20 20 20 7a  se TK_OR:      z
1a2e0 42 69 6e 4f 70 20 3d 20 22 4f 52 22 3b 20 20 20  BinOp = "OR";   
1a2f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1a300 65 20 54 4b 5f 50 4c 55 53 3a 20 20 20 20 7a 42  e TK_PLUS:    zB
1a310 69 6e 4f 70 20 3d 20 22 41 44 44 22 3b 20 20 20  inOp = "ADD";   
1a320 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1a330 20 54 4b 5f 53 54 41 52 3a 20 20 20 20 7a 42 69   TK_STAR:    zBi
1a340 6e 4f 70 20 3d 20 22 4d 55 4c 22 3b 20 20 20 20  nOp = "MUL";    
1a350 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1a360 54 4b 5f 4d 49 4e 55 53 3a 20 20 20 7a 42 69 6e  TK_MINUS:   zBin
1a370 4f 70 20 3d 20 22 53 55 42 22 3b 20 20 20 20 62  Op = "SUB";    b
1a380 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1a390 4b 5f 52 45 4d 3a 20 20 20 20 20 7a 42 69 6e 4f  K_REM:     zBinO
1a3a0 70 20 3d 20 22 52 45 4d 22 3b 20 20 20 20 62 72  p = "REM";    br
1a3b0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1a3c0 5f 42 49 54 41 4e 44 3a 20 20 7a 42 69 6e 4f 70  _BITAND:  zBinOp
1a3d0 20 3d 20 22 42 49 54 41 4e 44 22 3b 20 62 72 65   = "BITAND"; bre
1a3e0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1a3f0 42 49 54 4f 52 3a 20 20 20 7a 42 69 6e 4f 70 20  BITOR:   zBinOp 
1a400 3d 20 22 42 49 54 4f 52 22 3b 20 20 62 72 65 61  = "BITOR";  brea
1a410 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  k;.    case TK_S
1a420 4c 41 53 48 3a 20 20 20 7a 42 69 6e 4f 70 20 3d  LASH:   zBinOp =
1a430 20 22 44 49 56 22 3b 20 20 20 20 62 72 65 61 6b   "DIV";    break
1a440 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53  ;.    case TK_LS
1a450 48 49 46 54 3a 20 20 7a 42 69 6e 4f 70 20 3d 20  HIFT:  zBinOp = 
1a460 22 4c 53 48 49 46 54 22 3b 20 62 72 65 61 6b 3b  "LSHIFT"; break;
1a470 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48  .    case TK_RSH
1a480 49 46 54 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22  IFT:  zBinOp = "
1a490 52 53 48 49 46 54 22 3b 20 62 72 65 61 6b 3b 0a  RSHIFT"; break;.
1a4a0 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43      case TK_CONC
1a4b0 41 54 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22 43  AT:  zBinOp = "C
1a4c0 4f 4e 43 41 54 22 3b 20 62 72 65 61 6b 3b 0a 0a  ONCAT"; break;..
1a4d0 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e      case TK_UMIN
1a4e0 55 53 3a 20 20 7a 55 6e 69 4f 70 20 3d 20 22 55  US:  zUniOp = "U
1a4f0 4d 49 4e 55 53 22 3b 20 62 72 65 61 6b 3b 0a 20  MINUS"; break;. 
1a500 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53     case TK_UPLUS
1a510 3a 20 20 20 7a 55 6e 69 4f 70 20 3d 20 22 55 50  :   zUniOp = "UP
1a520 4c 55 53 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  LUS";  break;.  
1a530 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54    case TK_BITNOT
1a540 3a 20 20 7a 55 6e 69 4f 70 20 3d 20 22 42 49 54  :  zUniOp = "BIT
1a550 4e 4f 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  NOT"; break;.   
1a560 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20 20   case TK_NOT:   
1a570 20 20 7a 55 6e 69 4f 70 20 3d 20 22 4e 4f 54 22    zUniOp = "NOT"
1a580 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
1a590 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20  case TK_ISNULL: 
1a5a0 20 7a 55 6e 69 4f 70 20 3d 20 22 49 53 4e 55 4c   zUniOp = "ISNUL
1a5b0 4c 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  L"; break;.    c
1a5c0 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
1a5d0 7a 55 6e 69 4f 70 20 3d 20 22 4e 4f 54 4e 55 4c  zUniOp = "NOTNUL
1a5e0 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  L"; break;..    
1a5f0 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a  case TK_COLLATE:
1a600 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1a610 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74  ExplainExpr(pOut
1a620 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
1a630 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1a640 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1a650 2c 22 2e 43 4f 4c 4c 41 54 45 28 25 73 29 22 2c  ,".COLLATE(%s)",
1a660 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
1a670 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1a680 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54     }..    case T
1a690 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a  K_AGG_FUNCTION:.
1a6a0 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53      case TK_CONS
1a6b0 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63 61 73 65  T_FUNC:.    case
1a6c0 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a   TK_FUNCTION: {.
1a6d0 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
1a6e0 70 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20  pFarg;       /* 
1a6f0 4c 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e  List of function
1a700 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
1a710 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 41      if( ExprHasA
1a720 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  nyProperty(pExpr
1a730 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  , EP_TokenOnly) 
1a740 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67  ){.        pFarg
1a750 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
1a760 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67  e{.        pFarg
1a770 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
1a780 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
1a790 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 47 47 5f   if( op==TK_AGG_
1a7a0 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20  FUNCTION ){.    
1a7b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1a7c0 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1a7d0 41 47 47 5f 46 55 4e 43 54 49 4f 4e 25 64 3a 25  AGG_FUNCTION%d:%
1a7e0 73 28 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  s(",.           
1a7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a800 20 20 70 45 78 70 72 2d 3e 6f 70 32 2c 20 70 45    pExpr->op2, pE
1a810 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
1a820 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a830 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1a840 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1a850 22 46 55 4e 43 54 49 4f 4e 3a 25 73 28 22 2c 20  "FUNCTION:%s(", 
1a860 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
1a870 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a880 69 66 28 20 70 46 61 72 67 20 29 7b 0a 20 20 20  if( pFarg ){.   
1a890 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1a8a0 61 69 6e 45 78 70 72 4c 69 73 74 28 70 4f 75 74  ainExprList(pOut
1a8b0 2c 20 70 46 61 72 67 29 3b 0a 20 20 20 20 20 20  , pFarg);.      
1a8c0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
1a8d0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1a8e0 74 2c 20 22 29 22 29 3b 0a 20 20 20 20 20 20 62  t, ")");.      b
1a8f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
1a900 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1a910 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
1a920 65 20 54 4b 5f 45 58 49 53 54 53 3a 20 7b 0a 20  e TK_EXISTS: {. 
1a930 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1a940 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1a950 22 45 58 49 53 54 53 28 22 29 3b 0a 20 20 20 20  "EXISTS(");.    
1a960 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1a970 53 65 6c 65 63 74 28 70 4f 75 74 2c 20 70 45 78  Select(pOut, pEx
1a980 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a  pr->x.pSelect);.
1a990 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a9a0 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1a9b0 22 29 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ")");.      brea
1a9c0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1a9d0 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
1a9e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1a9f0 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1aa00 22 28 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  "(");.      sqli
1aa10 74 65 33 45 78 70 6c 61 69 6e 53 65 6c 65 63 74  te3ExplainSelect
1aa20 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e  (pOut, pExpr->x.
1aa30 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
1aa40 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1aa50 69 6e 74 66 28 70 4f 75 74 2c 20 22 29 22 29 3b  intf(pOut, ")");
1aa60 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1aa70 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1aa80 49 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  IN: {.      sqli
1aa90 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1aaa0 28 70 4f 75 74 2c 20 22 49 4e 28 22 29 3b 0a 20  (pOut, "IN(");. 
1aab0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1aac0 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45  ainExpr(pOut, pE
1aad0 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
1aae0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1aaf0 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 2c  nPrintf(pOut, ",
1ab00 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78  ");.      if( Ex
1ab10 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1ab20 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
1ab30 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  t) ){.        sq
1ab40 6c 69 74 65 33 45 78 70 6c 61 69 6e 53 65 6c 65  lite3ExplainSele
1ab50 63 74 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e  ct(pOut, pExpr->
1ab60 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  x.pSelect);.    
1ab70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1ab80 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
1ab90 78 70 72 4c 69 73 74 28 70 4f 75 74 2c 20 70 45  xprList(pOut, pE
1aba0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  xpr->x.pList);. 
1abb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1abc0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1abd0 66 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20 20  f(pOut, ")");.  
1abe0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1abf0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1ac00 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
1ac10 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  */..    /*.    *
1ac20 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79  *    x BETWEEN y
1ac30 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20   AND z.    **.  
1ac40 20 20 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75    ** This is equ
1ac50 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a  ivalent to.    *
1ac60 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79  *.    **    x>=y
1ac70 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a   AND x<=z.    **
1ac80 0a 20 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f  .    ** X is sto
1ac90 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
1aca0 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73  eft..    ** Y is
1acb0 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
1acc0 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
1acd0 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73  xpr..    ** Z is
1ace0 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
1acf0 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ->pList->a[1].pE
1ad00 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xpr..    */.    
1ad10 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
1ad20 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70   {.      Expr *p
1ad30 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  X = pExpr->pLeft
1ad40 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 59  ;.      Expr *pY
1ad50 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
1ad60 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
1ad70 20 20 20 20 20 45 78 70 72 20 2a 70 5a 20 3d 20       Expr *pZ = 
1ad80 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
1ad90 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[1].pExpr;.    
1ada0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1adb0 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 42 45  Printf(pOut, "BE
1adc0 54 57 45 45 4e 28 22 29 3b 0a 20 20 20 20 20 20  TWEEN(");.      
1add0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
1ade0 70 72 28 70 4f 75 74 2c 20 70 58 29 3b 0a 20 20  pr(pOut, pX);.  
1adf0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1ae00 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1ae10 2c 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ,");.      sqlit
1ae20 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f  e3ExplainExpr(pO
1ae30 75 74 2c 20 70 59 29 3b 0a 20 20 20 20 20 20 73  ut, pY);.      s
1ae40 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1ae50 6e 74 66 28 70 4f 75 74 2c 20 22 2c 22 29 3b 0a  ntf(pOut, ",");.
1ae60 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1ae70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70  lainExpr(pOut, p
1ae80 5a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  Z);.      sqlite
1ae90 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1aea0 4f 75 74 2c 20 22 29 22 29 3b 0a 20 20 20 20 20  Out, ")");.     
1aeb0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1aec0 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45    case TK_TRIGGE
1aed0 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  R: {.      /* If
1aee0 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54   the opcode is T
1aef0 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20  K_TRIGGER, then 
1af00 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
1af10 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20  s a reference.  
1af20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75      ** to a colu
1af30 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20  mn in the new.* 
1af40 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  or old.* pseudo-
1af50 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65  tables available
1af60 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69   to.      ** tri
1af70 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49  gger programs. I
1af80 6e 20 74 68 69 73 20 63 61 73 65 20 45 78 70 72  n this case Expr
1af90 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74  .iTable is set t
1afa0 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20  o 1 for the.    
1afb0 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64    ** new.* pseud
1afc0 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f  o-table, or 0 fo
1afd0 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75  r the old.* pseu
1afe0 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69  do-table. Expr.i
1aff0 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20  Column.      ** 
1b000 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f  is set to the co
1b010 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75  lumn of the pseu
1b020 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64  do-table to read
1b030 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20  , or to -1 to.  
1b040 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20      ** read the 
1b050 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20  rowid field..   
1b060 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
1b070 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1b080 28 70 4f 75 74 2c 20 22 25 73 28 25 64 29 22 2c  (pOut, "%s(%d)",
1b090 20 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70   .          pExp
1b0a0 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22 4e 45 57  r->iTable ? "NEW
1b0b0 22 20 3a 20 22 4f 4c 44 22 2c 20 70 45 78 70 72  " : "OLD", pExpr
1b0c0 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
1b0d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1b0e0 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a     case TK_CASE:
1b0f0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1b100 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1b110 75 74 2c 20 22 43 41 53 45 28 22 29 3b 0a 20 20  ut, "CASE(");.  
1b120 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1b130 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78  inExpr(pOut, pEx
1b140 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
1b150 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1b160 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 2c 22  Printf(pOut, ","
1b170 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1b180 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28  ExplainExprList(
1b190 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70  pOut, pExpr->x.p
1b1a0 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65  List);.      bre
1b1b0 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
1b1c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
1b1d0 49 47 47 45 52 0a 20 20 20 20 63 61 73 65 20 54  IGGER.    case T
1b1e0 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20  K_RAISE: {.     
1b1f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
1b200 70 65 20 3d 20 22 75 6e 6b 22 3b 0a 20 20 20 20  pe = "unk";.    
1b210 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
1b220 3e 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20  >affinity ){.   
1b230 20 20 20 20 20 63 61 73 65 20 4f 45 5f 52 6f 6c       case OE_Rol
1b240 6c 62 61 63 6b 3a 20 20 20 7a 54 79 70 65 20 3d  lback:   zType =
1b250 20 22 72 6f 6c 6c 62 61 63 6b 22 3b 20 20 62 72   "rollback";  br
1b260 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
1b270 65 20 4f 45 5f 41 62 6f 72 74 3a 20 20 20 20 20  e OE_Abort:     
1b280 20 7a 54 79 70 65 20 3d 20 22 61 62 6f 72 74 22   zType = "abort"
1b290 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
1b2a0 20 20 20 20 20 63 61 73 65 20 4f 45 5f 46 61 69       case OE_Fai
1b2b0 6c 3a 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d  l:       zType =
1b2c0 20 22 66 61 69 6c 22 3b 20 20 20 20 20 20 62 72   "fail";      br
1b2d0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
1b2e0 65 20 4f 45 5f 49 67 6e 6f 72 65 3a 20 20 20 20  e OE_Ignore:    
1b2f0 20 7a 54 79 70 65 20 3d 20 22 69 67 6e 6f 72 65   zType = "ignore
1b300 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
1b310 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1b320 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1b330 70 4f 75 74 2c 20 22 52 41 49 53 45 2d 25 73 28  pOut, "RAISE-%s(
1b340 25 73 29 22 2c 20 7a 54 79 70 65 2c 20 70 45 78  %s)", zType, pEx
1b350 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
1b360 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b370 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69  }.#endif.  }.  i
1b380 66 28 20 7a 42 69 6e 4f 70 20 29 7b 0a 20 20 20  f( zBinOp ){.   
1b390 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1b3a0 72 69 6e 74 66 28 70 4f 75 74 2c 22 25 73 28 22  rintf(pOut,"%s("
1b3b0 2c 20 7a 42 69 6e 4f 70 29 3b 0a 20 20 20 20 73  , zBinOp);.    s
1b3c0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
1b3d0 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70  r(pOut, pExpr->p
1b3e0 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Left);.    sqlit
1b3f0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1b400 70 4f 75 74 2c 22 2c 22 29 3b 0a 20 20 20 20 73  pOut,",");.    s
1b410 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
1b420 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70  r(pOut, pExpr->p
1b430 52 69 67 68 74 29 3b 0a 20 20 20 20 73 71 6c 69  Right);.    sqli
1b440 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1b450 28 70 4f 75 74 2c 22 29 22 29 3b 0a 20 20 7d 65  (pOut,")");.  }e
1b460 6c 73 65 20 69 66 28 20 7a 55 6e 69 4f 70 20 29  lse if( zUniOp )
1b470 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
1b480 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1b490 22 25 73 28 22 2c 20 7a 55 6e 69 4f 70 29 3b 0a  "%s(", zUniOp);.
1b4a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1b4b0 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78  inExpr(pOut, pEx
1b4c0 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
1b4d0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1b4e0 69 6e 74 66 28 70 4f 75 74 2c 22 29 22 29 3b 0a  intf(pOut,")");.
1b4f0 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
1b500 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1b510 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41  NABLE_TREE_EXPLA
1b520 49 4e 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69  IN) */..#if defi
1b530 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
1b540 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a  E_TREE_EXPLAIN).
1b550 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
1b560 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
1b570 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 61  explanation of a
1b580 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
1b590 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
1b5a0 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73  e3ExplainExprLis
1b5b0 74 28 56 64 62 65 20 2a 70 4f 75 74 2c 20 45 78  t(Vdbe *pOut, Ex
1b5c0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
1b5d0 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
1b5e0 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 4c 69 73 74  List==0 || pList
1b5f0 2d 3e 6e 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20  ->nExpr==0 ){.  
1b600 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1b610 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 28 65  Printf(pOut, "(e
1b620 6d 70 74 79 2d 6c 69 73 74 29 22 29 3b 0a 20 20  mpty-list)");.  
1b630 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73    return;.  }els
1b640 65 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78  e if( pList->nEx
1b650 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c  pr==1 ){.    sql
1b660 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
1b670 70 4f 75 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 30  pOut, pList->a[0
1b680 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 65 6c 73  ].pExpr);.  }els
1b690 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e{.    sqlite3Ex
1b6a0 70 6c 61 69 6e 50 75 73 68 28 70 4f 75 74 29 3b  plainPush(pOut);
1b6b0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1b6c0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
1b6d0 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
1b6e0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1b6f0 4f 75 74 2c 20 22 69 74 65 6d 5b 25 64 5d 20 3d  Out, "item[%d] =
1b700 20 22 2c 20 69 29 3b 0a 20 20 20 20 20 20 73 71   ", i);.      sq
1b710 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68  lite3ExplainPush
1b720 28 70 4f 75 74 29 3b 0a 20 20 20 20 20 20 73 71  (pOut);.      sq
1b730 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
1b740 28 70 4f 75 74 2c 20 70 4c 69 73 74 2d 3e 61 5b  (pOut, pList->a[
1b750 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
1b760 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1b770 6f 70 28 70 4f 75 74 29 3b 0a 20 20 20 20 20 20  op(pOut);.      
1b780 69 66 28 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  if( i<pList->nEx
1b790 70 72 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  pr-1 ){.        
1b7a0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c  sqlite3ExplainNL
1b7b0 28 70 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a  (pOut);.      }.
1b7c0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1b7d0 33 45 78 70 6c 61 69 6e 50 6f 70 28 70 4f 75 74  3ExplainPop(pOut
1b7e0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
1b7f0 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b800 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
1b810 20 54 52 55 45 20 69 66 20 70 45 78 70 72 20 69   TRUE if pExpr i
1b820 73 20 61 6e 20 63 6f 6e 73 74 61 6e 74 20 65 78  s an constant ex
1b830 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73  pression that is
1b840 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
1b850 66 6f 72 20 66 61 63 74 6f 72 69 6e 67 20 6f 75  for factoring ou
1b860 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 20 20 41 70  t of a loop.  Ap
1b870 70 72 6f 70 72 69 61 74 65 20 65 78 70 72 65 73  propriate expres
1b880 73 69 6f 6e 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a  sions are:.**.**
1b890 20 20 20 20 2a 20 20 41 6e 79 20 65 78 70 72 65      *  Any expre
1b8a0 73 73 69 6f 6e 20 74 68 61 74 20 65 76 61 6c 75  ssion that evalu
1b8b0 61 74 65 73 20 74 6f 20 74 77 6f 20 6f 72 20 6d  ates to two or m
1b8c0 6f 72 65 20 6f 70 63 6f 64 65 73 2e 0a 2a 2a 0a  ore opcodes..**.
1b8d0 2a 2a 20 20 20 20 2a 20 20 41 6e 79 20 4f 50 5f  **    *  Any OP_
1b8e0 49 6e 74 65 67 65 72 2c 20 4f 50 5f 52 65 61 6c  Integer, OP_Real
1b8f0 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 4f 50 5f  , OP_String, OP_
1b900 42 6c 6f 62 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 0a  Blob, OP_Null, .
1b910 2a 2a 20 20 20 20 20 20 20 6f 72 20 4f 50 5f 56  **       or OP_V
1b920 61 72 69 61 62 6c 65 20 74 68 61 74 20 64 6f 65  ariable that doe
1b930 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
1b940 20 70 6c 61 63 65 64 20 69 6e 20 61 20 0a 2a 2a   placed in a .**
1b950 20 20 20 20 20 20 20 73 70 65 63 69 66 69 63 20         specific 
1b960 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  register..**.** 
1b970 54 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e  There is no poin
1b980 74 20 69 6e 20 66 61 63 74 6f 72 69 6e 67 20 6f  t in factoring o
1b990 75 74 20 73 69 6e 67 6c 65 2d 69 6e 73 74 72 75  ut single-instru
1b9a0 63 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 0a 2a  ction constant.*
1b9b0 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  * expressions th
1b9c0 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 70 6c  at need to be pl
1b9d0 61 63 65 64 20 69 6e 20 61 20 70 61 72 74 69 63  aced in a partic
1b9e0 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e 20 20  ular register.  
1b9f0 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 66 61 63  .** We could fac
1ba00 74 6f 72 20 74 68 65 6d 20 6f 75 74 2c 20 62 75  tor them out, bu
1ba10 74 20 74 68 65 6e 20 77 65 20 77 6f 75 6c 64 20  t then we would 
1ba20 65 6e 64 20 75 70 20 61 64 64 69 6e 67 20 61 6e  end up adding an
1ba30 0a 2a 2a 20 4f 50 5f 53 43 6f 70 79 20 69 6e 73  .** OP_SCopy ins
1ba40 74 72 75 63 74 69 6f 6e 20 74 6f 20 6d 6f 76 65  truction to move
1ba50 20 74 68 65 20 76 61 6c 75 65 20 69 6e 74 6f 20   the value into 
1ba60 74 68 65 20 63 6f 72 72 65 63 74 20 72 65 67 69  the correct regi
1ba70 73 74 65 72 0a 2a 2a 20 6c 61 74 65 72 2e 20 20  ster.** later.  
1ba80 57 65 20 6d 69 67 68 74 20 61 73 20 77 65 6c 6c  We might as well
1ba90 20 6a 75 73 74 20 75 73 65 20 74 68 65 20 6f 72   just use the or
1baa0 69 67 69 6e 61 6c 20 69 6e 73 74 72 75 63 74 69  iginal instructi
1bab0 6f 6e 20 61 6e 64 0a 2a 2a 20 61 76 6f 69 64 20  on and.** avoid 
1bac0 74 68 65 20 4f 50 5f 53 43 6f 70 79 2e 0a 2a 2f  the OP_SCopy..*/
1bad0 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 41 70  .static int isAp
1bae0 70 72 6f 70 72 69 61 74 65 46 6f 72 46 61 63 74  propriateForFact
1baf0 6f 72 69 6e 67 28 45 78 70 72 20 2a 70 29 7b 0a  oring(Expr *p){.
1bb00 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
1bb10 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a  prIsConstantNotJ
1bb20 6f 69 6e 28 70 29 20 29 7b 0a 20 20 20 20 72 65  oin(p) ){.    re
1bb30 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4f 6e 6c 79  turn 0;  /* Only
1bb40 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73   constant expres
1bb50 73 69 6f 6e 73 20 61 72 65 20 61 70 70 72 6f 70  sions are approp
1bb60 72 69 61 74 65 20 66 6f 72 20 66 61 63 74 6f 72  riate for factor
1bb70 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ing */.  }.  if(
1bb80 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f   (p->flags & EP_
1bb90 46 69 78 65 64 44 65 73 74 29 3d 3d 30 20 29 7b  FixedDest)==0 ){
1bba0 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20 20  .    return 1;  
1bbb0 2f 2a 20 41 6e 79 20 63 6f 6e 73 74 61 6e 74 20  /* Any constant 
1bbc0 77 69 74 68 6f 75 74 20 61 20 66 69 78 65 64 20  without a fixed 
1bbd0 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61  destination is a
1bbe0 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 20 20  ppropriate */.  
1bbf0 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70  }.  while( p->op
1bc00 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 20 70 20 3d  ==TK_UPLUS ) p =
1bc10 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 73 77 69   p->pLeft;.  swi
1bc20 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 23 69  tch( p->op ){.#i
1bc30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1bc40 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20  T_BLOB_LITERAL. 
1bc50 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a     case TK_BLOB:
1bc60 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
1bc70 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20   TK_VARIABLE:.  
1bc80 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
1bc90 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  R:.    case TK_F
1bca0 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54  LOAT:.    case T
1bcb0 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  K_NULL:.    case
1bcc0 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20   TK_STRING: {.  
1bcd0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
1bce0 3e 6f 70 3d 3d 54 4b 5f 42 4c 4f 42 20 29 3b 0a  >op==TK_BLOB );.
1bcf0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1bd00 70 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42  p->op==TK_VARIAB
1bd10 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LE );.      test
1bd20 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  case( p->op==TK_
1bd30 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 20  INTEGER );.     
1bd40 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70   testcase( p->op
1bd50 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 3b 0a 20 20  ==TK_FLOAT );.  
1bd60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
1bd70 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c 4c 20 29 3b 0a  >op==TK_NULL );.
1bd80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1bd90 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47  p->op==TK_STRING
1bda0 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 53 69 6e   );.      /* Sin
1bdb0 67 6c 65 2d 69 6e 73 74 72 75 63 74 69 6f 6e 20  gle-instruction 
1bdc0 63 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 20 61  constants with a
1bdd0 20 66 69 78 65 64 20 64 65 73 74 69 6e 61 74 69   fixed destinati
1bde0 6f 6e 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20  on are.      ** 
1bdf0 62 65 74 74 65 72 20 64 6f 6e 65 20 69 6e 2d 6c  better done in-l
1be00 69 6e 65 2e 20 20 49 66 20 77 65 20 66 61 63 74  ine.  If we fact
1be10 6f 72 20 74 68 65 6d 2c 20 74 68 65 79 20 77 69  or them, they wi
1be20 6c 6c 20 6a 75 73 74 20 65 6e 64 0a 20 20 20 20  ll just end.    
1be30 20 20 2a 2a 20 75 70 20 67 65 6e 65 72 61 74 69    ** up generati
1be40 6e 67 20 61 6e 20 4f 50 5f 53 43 6f 70 79 20 74  ng an OP_SCopy t
1be50 6f 20 6d 6f 76 65 20 74 68 65 20 76 61 6c 75 65  o move the value
1be60 20 74 6f 20 74 68 65 20 64 65 73 74 69 6e 61 74   to the destinat
1be70 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 65 67  ion.      ** reg
1be80 69 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  ister. */.      
1be90 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
1bea0 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e      case TK_UMIN
1beb0 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  US: {.      if( 
1bec0 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  p->pLeft->op==TK
1bed0 5f 46 4c 4f 41 54 20 7c 7c 20 70 2d 3e 70 4c 65  _FLOAT || p->pLe
1bee0 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47  ft->op==TK_INTEG
1bef0 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ER ){.        re
1bf00 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
1bf10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1bf20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
1bf30 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
1bf40 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1bf50 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  n 1;.}../*.** If
1bf60 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6e 73   pExpr is a cons
1bf70 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  tant expression 
1bf80 74 68 61 74 20 69 73 20 61 70 70 72 6f 70 72 69  that is appropri
1bf90 61 74 65 20 66 6f 72 0a 2a 2a 20 66 61 63 74 6f  ate for.** facto
1bfa0 72 69 6e 67 20 6f 75 74 20 6f 66 20 61 20 6c 6f  ring out of a lo
1bfb0 6f 70 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74  op, then evaluat
1bfc0 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
1bfd0 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73  .** into a regis
1bfe0 74 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20  ter and convert 
1bff0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
1c000 6e 74 6f 20 61 20 54 4b 5f 52 45 47 49 53 54 45  nto a TK_REGISTE
1c010 52 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e  R.** expression.
1c020 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
1c030 76 61 6c 43 6f 6e 73 74 45 78 70 72 28 57 61 6c  valConstExpr(Wal
1c040 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
1c050 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 50 61  pr *pExpr){.  Pa
1c060 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
1c070 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
1c080 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
1c090 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
1c0a0 4b 5f 49 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IN:.    case T
1c0b0 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20  K_REGISTER: {.  
1c0c0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
1c0d0 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rune;.    }.    
1c0e0 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
1c0f0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  :.    case TK_AG
1c100 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  G_FUNCTION:.    
1c110 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55  case TK_CONST_FU
1c120 4e 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  NC: {.      /* T
1c130 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  he arguments to 
1c140 61 20 66 75 6e 63 74 69 6f 6e 20 68 61 76 65 20  a function have 
1c150 61 20 66 69 78 65 64 20 64 65 73 74 69 6e 61 74  a fixed destinat
1c160 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 4d 61  ion..      ** Ma
1c170 72 6b 20 74 68 65 6d 20 74 68 69 73 20 77 61 79  rk them this way
1c180 20 74 6f 20 61 76 6f 69 64 20 67 65 6e 65 72 61   to avoid genera
1c190 74 65 64 20 75 6e 6e 65 65 64 65 64 20 4f 50 5f  ted unneeded OP_
1c1a0 53 43 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 69  SCopy.      ** i
1c1b0 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 0a 20 20  nstructions. .  
1c1c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70      */.      Exp
1c1d0 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
1c1e0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
1c1f0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1c200 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1c210 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
1c220 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  t) );.      if( 
1c230 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  pList ){.       
1c240 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e   int i = pList->
1c250 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 73  nExpr;.        s
1c260 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
1c270 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 4c 69  tem *pItem = pLi
1c280 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 66  st->a;.        f
1c290 6f 72 28 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  or(; i>0; i--, p
1c2a0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
1c2b0 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 49     if( ALWAYS(pI
1c2c0 74 65 6d 2d 3e 70 45 78 70 72 29 20 29 20 70 49  tem->pExpr) ) pI
1c2d0 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 66 6c 61 67  tem->pExpr->flag
1c2e0 73 20 7c 3d 20 45 50 5f 46 69 78 65 64 44 65 73  s |= EP_FixedDes
1c2f0 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
1c300 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
1c310 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1c320 28 20 69 73 41 70 70 72 6f 70 72 69 61 74 65 46  ( isAppropriateF
1c330 6f 72 46 61 63 74 6f 72 69 6e 67 28 70 45 78 70  orFactoring(pExp
1c340 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 31  r) ){.    int r1
1c350 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1c360 6d 3b 0a 20 20 20 20 69 6e 74 20 72 32 3b 0a 20  m;.    int r2;. 
1c370 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
1c380 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
1c390 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29  arse, pExpr, r1)
1c3a0 3b 0a 20 20 20 20 69 66 28 20 72 31 21 3d 72 32  ;.    if( r1!=r2
1c3b0 20 29 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73   ) sqlite3Releas
1c3c0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1c3d0 20 72 31 29 3b 0a 20 20 20 20 70 45 78 70 72 2d   r1);.    pExpr-
1c3e0 3e 6f 70 32 20 3d 20 70 45 78 70 72 2d 3e 6f 70  >op2 = pExpr->op
1c3f0 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20  ;.    pExpr->op 
1c400 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20  = TK_REGISTER;. 
1c410 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
1c420 20 3d 20 72 32 3b 0a 20 20 20 20 72 65 74 75 72   = r2;.    retur
1c430 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
1c440 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
1c450 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
1c460 20 50 72 65 65 76 61 6c 75 61 74 65 20 63 6f 6e   Preevaluate con
1c470 73 74 61 6e 74 20 73 75 62 65 78 70 72 65 73 73  stant subexpress
1c480 69 6f 6e 73 20 77 69 74 68 69 6e 20 70 45 78 70  ions within pExp
1c490 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a  r and store the.
1c4a0 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65  ** results in re
1c4b0 67 69 73 74 65 72 73 2e 20 20 4d 6f 64 69 66 79  gisters.  Modify
1c4c0 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 74   pExpr so that t
1c4d0 68 65 20 63 6f 6e 73 74 61 6e 74 20 73 75 62 65  he constant sube
1c4e0 78 70 72 65 73 69 6f 6e 73 0a 2a 2a 20 61 72 65  xpresions.** are
1c4f0 20 54 4b 5f 52 45 47 49 53 54 45 52 20 6f 70 63   TK_REGISTER opc
1c500 6f 64 65 73 20 74 68 61 74 20 72 65 66 65 72 20  odes that refer 
1c510 74 6f 20 74 68 65 20 70 72 65 63 6f 6d 70 75 74  to the precomput
1c520 65 64 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a  ed values..**.**
1c530 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1c540 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
1c550 6a 75 6d 70 20 74 6f 20 74 68 65 20 63 6f 6f 6b  jump to the cook
1c560 69 65 2d 63 68 65 63 6b 20 63 6f 64 65 20 68 61  ie-check code ha
1c570 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63  s.** already occ
1c580 75 72 2e 20 20 53 69 6e 63 65 20 74 68 65 20 63  ur.  Since the c
1c590 6f 6f 6b 69 65 2d 63 68 65 63 6b 20 6a 75 6d 70  ookie-check jump
1c5a0 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 70 72   is generated pr
1c5b0 69 6f 72 20 74 6f 0a 2a 2a 20 61 6e 79 20 6f 74  ior to.** any ot
1c5c0 68 65 72 20 73 65 72 69 6f 75 73 20 70 72 6f 63  her serious proc
1c5d0 65 73 73 69 6e 67 2c 20 74 68 69 73 20 63 68 65  essing, this che
1c5e0 63 6b 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ck ensures that 
1c5f0 74 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 77  there is no.** w
1c600 61 79 20 74 6f 20 61 63 63 69 64 65 6e 74 6c 79  ay to accidently
1c610 20 62 79 70 61 73 73 20 74 68 65 20 63 6f 6e 73   bypass the cons
1c620 74 61 6e 74 20 69 6e 69 74 69 61 6c 69 7a 61 74  tant initializat
1c630 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ions..**.** This
1c640 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6c 73 6f   routine is also
1c650 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
1c660 53 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75 74  SQLITE_FactorOut
1c670 43 6f 6e 73 74 20 6f 70 74 69 6d 69 7a 61 74 69  Const optimizati
1c680 6f 6e 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65  on.** is disable
1c690 64 20 76 69 61 20 74 68 65 20 73 71 6c 69 74 65  d via the sqlite
1c6a0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1c6b0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
1c6c0 50 54 49 4d 49 5a 41 54 49 4f 4e 53 29 0a 2a 2a  PTIMIZATIONS).**
1c6d0 20 69 6e 74 65 72 66 61 63 65 2e 20 20 54 68 69   interface.  Thi
1c6e0 73 20 61 6c 6c 6f 77 73 20 74 65 73 74 20 6c 6f  s allows test lo
1c6f0 67 69 63 20 74 6f 20 76 65 72 69 66 79 20 74 68  gic to verify th
1c700 61 74 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77  at the same answ
1c710 65 72 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65  er is.** obtaine
1c720 64 20 66 6f 72 20 71 75 65 72 69 65 73 20 72 65  d for queries re
1c730 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
1c740 68 65 72 20 6f 72 20 6e 6f 74 20 63 6f 6e 73 74  her or not const
1c750 61 6e 74 73 20 61 72 65 0a 2a 2a 20 70 72 65 63  ants are.** prec
1c760 6f 6d 70 75 74 65 64 20 69 6e 74 6f 20 72 65 67  omputed into reg
1c770 69 73 74 65 72 73 20 6f 72 20 69 66 20 74 68 65  isters or if the
1c780 79 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  y are inserted i
1c790 6e 2d 6c 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20  n-line..*/.void 
1c7a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43  sqlite3ExprCodeC
1c7b0 6f 6e 73 74 61 6e 74 73 28 50 61 72 73 65 20 2a  onstants(Parse *
1c7c0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
1c7d0 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  xpr){.  Walker w
1c7e0 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1c7f0 63 6f 6f 6b 69 65 47 6f 74 6f 20 29 20 72 65 74  cookieGoto ) ret
1c800 75 72 6e 3b 0a 20 20 69 66 28 20 4f 70 74 69 6d  urn;.  if( Optim
1c810 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28  izationDisabled(
1c820 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49  pParse->db, SQLI
1c830 54 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73  TE_FactorOutCons
1c840 74 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77  t) ) return;.  w
1c850 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
1c860 20 65 76 61 6c 43 6f 6e 73 74 45 78 70 72 3b 0a   evalConstExpr;.
1c870 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
1c880 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 70 50 61  ack = 0;.  w.pPa
1c890 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
1c8a0 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
1c8b0 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 0a  &w, pExpr);.}...
1c8c0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1c8d0 6f 64 65 20 74 68 61 74 20 70 75 73 68 65 73 20  ode that pushes 
1c8e0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 76 65  the value of eve
1c8f0 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  ry element of th
1c900 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65  e given.** expre
1c910 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f 20  ssion list into 
1c920 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65  a sequence of re
1c930 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e  gisters beginnin
1c940 67 20 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a 0a  g at target..**.
1c950 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
1c960 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
1c970 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2f 0a 69   evaluated..*/.i
1c980 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
1c990 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61  deExprList(.  Pa
1c9a0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1c9b0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
1c9c0 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
1c9d0 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54  t *pList,   /* T
1c9e0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
1c9f0 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  st to be coded *
1ca00 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74 2c 20  /.  int target, 
1ca10 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
1ca20 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c 74 73  to write results
1ca30 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 48 61 72 64   */.  int doHard
1ca40 43 6f 70 79 20 20 20 20 20 2f 2a 20 4d 61 6b 65  Copy     /* Make
1ca50 20 61 20 68 61 72 64 20 63 6f 70 79 20 6f 66 20   a hard copy of 
1ca60 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 2a 2f  every element */
1ca70 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70  .){.  struct Exp
1ca80 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
1ca90 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  m;.  int i, n;. 
1caa0 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
1cab0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  0 );.  assert( t
1cac0 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73  arget>0 );.  ass
1cad0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64  ert( pParse->pVd
1cae0 62 65 21 3d 30 20 29 3b 20 20 2f 2a 20 4e 65 76  be!=0 );  /* Nev
1caf0 65 72 20 67 65 74 73 20 74 68 69 73 20 66 61 72  er gets this far
1cb00 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20   otherwise */.  
1cb10 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  n = pList->nExpr
1cb20 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
1cb30 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e  ist->a, i=0; i<n
1cb40 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
1cb50 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
1cb60 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
1cb70 0a 20 20 20 20 69 6e 74 20 69 6e 52 65 67 20 3d  .    int inReg =
1cb80 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1cb90 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
1cba0 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b  Expr, target+i);
1cbb0 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d  .    if( inReg!=
1cbc0 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20 20  target+i ){.    
1cbd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1cbe0 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op2(pParse->pVdb
1cbf0 65 2c 20 64 6f 48 61 72 64 43 6f 70 79 20 3f 20  e, doHardCopy ? 
1cc00 4f 50 5f 43 6f 70 79 20 3a 20 4f 50 5f 53 43 6f  OP_Copy : OP_SCo
1cc10 70 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  py,.            
1cc20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 52 65              inRe
1cc30 67 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  g, target+i);.  
1cc40 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1cc50 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   n;.}../*.** Gen
1cc60 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
1cc70 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f   BETWEEN operato
1cc80 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20 42 45  r..**.**    x BE
1cc90 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a  TWEEN y AND z.**
1cca0 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73  .** The above is
1ccb0 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a   equivalent to .
1ccc0 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e  **.**    x>=y AN
1ccd0 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64  D x<=z.**.** Cod
1cce0 65 20 69 74 20 61 73 20 73 75 63 68 2c 20 74 61  e it as such, ta
1ccf0 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20  king care to do 
1cd00 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78  the common subex
1cd10 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c 65 6d  pression.** elem
1cd20 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a  entation of x..*
1cd30 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
1cd40 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 0a 20  prCodeBetween(. 
1cd50 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1cd60 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
1cd70 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
1cd80 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
1cd90 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
1cda0 20 2f 2a 20 54 68 65 20 42 45 54 57 45 45 4e 20   /* The BETWEEN 
1cdb0 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
1cdc0 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20 20  int dest,       
1cdd0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
1cde0 66 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61  f the jump is ta
1cdf0 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d  ken */.  int jum
1ce00 70 49 66 54 72 75 65 2c 20 20 20 2f 2a 20 54 61  pIfTrue,   /* Ta
1ce10 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74  ke the jump if t
1ce20 68 65 20 42 45 54 57 45 45 4e 20 69 73 20 74 72  he BETWEEN is tr
1ce30 75 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  ue */.  int jump
1ce40 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b  IfNull    /* Tak
1ce50 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68  e the jump if th
1ce60 65 20 42 45 54 57 45 45 4e 20 69 73 20 4e 55 4c  e BETWEEN is NUL
1ce70 4c 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 65  L */.){.  Expr e
1ce80 78 70 72 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54  xprAnd;     /* T
1ce90 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20  he AND operator 
1cea0 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d  in  x>=y AND x<=
1ceb0 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d  z  */.  Expr com
1cec0 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20 54 68 65  pLeft;    /* The
1ced0 20 20 78 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a    x>=y  term */.
1cee0 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68 74    Expr compRight
1cef0 3b 20 20 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a  ;   /* The  x<=z
1cf00 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72    term */.  Expr
1cf10 20 65 78 70 72 58 3b 20 20 20 20 20 20 20 2f 2a   exprX;       /*
1cf20 20 54 68 65 20 20 78 20 20 73 75 62 65 78 70 72   The  x  subexpr
1cf30 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
1cf40 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a  regFree1 = 0; /*
1cf50 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72   Temporary use r
1cf60 65 67 69 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73  egister */..  as
1cf70 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1cf80 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1cf90 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
1cfa0 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d   exprX = *pExpr-
1cfb0 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e  >pLeft;.  exprAn
1cfc0 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20  d.op = TK_AND;. 
1cfd0 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d   exprAnd.pLeft =
1cfe0 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 65 78   &compLeft;.  ex
1cff0 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26  prAnd.pRight = &
1d000 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63 6f 6d  compRight;.  com
1d010 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45  pLeft.op = TK_GE
1d020 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65  ;.  compLeft.pLe
1d030 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63  ft = &exprX;.  c
1d040 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20 3d  ompLeft.pRight =
1d050 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
1d060 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 63  >a[0].pExpr;.  c
1d070 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b  ompRight.op = TK
1d080 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74  _LE;.  compRight
1d090 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b  .pLeft = &exprX;
1d0a0 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69  .  compRight.pRi
1d0b0 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ght = pExpr->x.p
1d0c0 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
1d0d0 3b 0a 20 20 65 78 70 72 58 2e 69 54 61 62 6c 65  ;.  exprX.iTable
1d0e0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1d0f0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26  deTemp(pParse, &
1d100 65 78 70 72 58 2c 20 26 72 65 67 46 72 65 65 31  exprX, &regFree1
1d110 29 3b 0a 20 20 65 78 70 72 58 2e 6f 70 20 3d 20  );.  exprX.op = 
1d120 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 69  TK_REGISTER;.  i
1d130 66 28 20 6a 75 6d 70 49 66 54 72 75 65 20 29 7b  f( jumpIfTrue ){
1d140 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1d150 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 26  IfTrue(pParse, &
1d160 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a  exprAnd, dest, j
1d170 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65  umpIfNull);.  }e
1d180 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
1d190 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
1d1a0 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65  se, &exprAnd, de
1d1b0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1d1c0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
1d1d0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1d1e0 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
1d1f0 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 61 64 65  .  /* Ensure ade
1d200 71 75 61 74 65 20 74 65 73 74 20 63 6f 76 65 72  quate test cover
1d210 61 67 65 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  age */.  testcas
1d220 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30  e( jumpIfTrue==0
1d230 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
1d240 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
1d250 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1d260 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26  jumpIfTrue==0 &&
1d270 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26   jumpIfNull==0 &
1d280 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b  & regFree1!=0 );
1d290 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d  .  testcase( jum
1d2a0 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75  pIfTrue==0 && ju
1d2b0 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72  mpIfNull!=0 && r
1d2c0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1d2d0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1d2e0 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49  True==0 && jumpI
1d2f0 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
1d300 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73  ree1!=0 );.  tes
1d310 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75  tcase( jumpIfTru
1d320 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75  e!=0 && jumpIfNu
1d330 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll==0 && regFree
1d340 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
1d350 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d  se( jumpIfTrue!=
1d360 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  0 && jumpIfNull=
1d370 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
1d380 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
1d390 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26   jumpIfTrue!=0 &
1d3a0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20  & jumpIfNull!=0 
1d3b0 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  && regFree1==0 )
1d3c0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  ;.  testcase( ju
1d3d0 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a  mpIfTrue!=0 && j
1d3e0 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
1d3f0 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 7d  regFree1!=0 );.}
1d400 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1d410 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c   code for a bool
1d420 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73  ean expression s
1d430 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20  uch that a jump 
1d440 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68  is made.** to th
1d450 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69  e label "dest" i
1d460 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1d470 20 69 73 20 74 72 75 65 20 62 75 74 20 65 78 65   is true but exe
1d480 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e  cution.** contin
1d490 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72  ues straight thr
1d4a0 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  u if the express
1d4b0 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a  ion is false..**
1d4c0 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
1d4d0 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20  ssion evaluates 
1d4e0 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72  to NULL (neither
1d4f0 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29   true nor false)
1d500 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74  , then.** take t
1d510 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a  he jump if the j
1d520 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69  umpIfNull flag i
1d530 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  s SQLITE_JUMPIFN
1d540 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ULL..**.** This 
1d550 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20  code depends on 
1d560 74 68 65 20 66 61 63 74 20 74 68 61 74 20 63 65  the fact that ce
1d570 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75  rtain token valu
1d580 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a  es (ex: TK_EQ).*
1d590 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61  * are the same a
1d5a0 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20  s opcode values 
1d5b0 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74  (ex: OP_Eq) that
1d5c0 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63   implement the c
1d5d0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
1d5e0 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63  operation.  Spec
1d5f0 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  ial comments in 
1d600 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d  vdbe.c and the m
1d610 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72  kopcodeh.awk scr
1d620 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61  ipt in.** the ma
1d630 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75 73 65  ke process cause
1d640 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f   these values to
1d650 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28   align.  Assert(
1d660 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a  )s in the code.*
1d670 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74  * below verify t
1d680 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20  hat the numbers 
1d690 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72  are aligned corr
1d6a0 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ectly..*/.void s
1d6b0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
1d6c0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1d6d0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
1d6e0 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49   dest, int jumpI
1d6f0 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a  fNull){.  Vdbe *
1d700 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1d710 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b  e;.  int op = 0;
1d720 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
1d730 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72  = 0;.  int regFr
1d740 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ee2 = 0;.  int r
1d750 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74  1, r2;..  assert
1d760 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  ( jumpIfNull==SQ
1d770 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
1d780 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  || jumpIfNull==0
1d790 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   );.  if( NEVER(
1d7a0 76 3d 3d 30 29 20 29 20 20 20 20 20 72 65 74 75  v==0) )     retu
1d7b0 72 6e 3b 20 20 2f 2a 20 45 78 69 73 74 61 6e 63  rn;  /* Existanc
1d7c0 65 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65  e of VDBE checke
1d7d0 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20  d by caller */. 
1d7e0 20 69 66 28 20 4e 45 56 45 52 28 70 45 78 70 72   if( NEVER(pExpr
1d7f0 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20 20  ==0) ) return;  
1d800 2f 2a 20 4e 6f 20 77 61 79 20 74 68 69 73 20 63  /* No way this c
1d810 61 6e 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 6f  an happen */.  o
1d820 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
1d830 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
1d840 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
1d850 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d  {.      int d2 =
1d860 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1d870 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
1d880 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1d890 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1d8a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1d8b0 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
1d8c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1d8d0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
1d8e0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32  pExpr->pLeft, d2
1d8f0 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49  ,jumpIfNull^SQLI
1d900 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
1d910 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1d920 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
1d930 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
1d940 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1d950 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1d960 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1d970 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71  v, d2);.      sq
1d980 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
1d990 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20  p(pParse, 1);.  
1d9a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1d9b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
1d9c0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1d9d0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1d9e0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1d9f0 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
1da00 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1da10 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1da20 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
1da30 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
1da40 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1da50 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
1da60 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
1da70 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1da80 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
1da90 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1daa0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1dab0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1dac0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
1dad0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
1dae0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1daf0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1db00 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
1db10 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
1db20 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
1db30 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
1db40 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
1db50 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
1db60 51 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  Q: {.      asser
1db70 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20  t( TK_LT==OP_Lt 
1db80 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1db90 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b   TK_LE==OP_Le );
1dba0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1dbb0 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20  K_GT==OP_Gt );. 
1dbc0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1dbd0 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20  GE==OP_Ge );.   
1dbe0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51     assert( TK_EQ
1dbf0 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20  ==OP_Eq );.     
1dc00 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d   assert( TK_NE==
1dc10 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 74  OP_Ne );.      t
1dc20 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1dc30 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LT );.      test
1dc40 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20  case( op==TK_LE 
1dc50 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1dc60 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a  e( op==TK_GT );.
1dc70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1dc80 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20  op==TK_GE );.   
1dc90 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1dca0 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20  =TK_EQ );.      
1dcb0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1dcc0 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _NE );.      tes
1dcd0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
1dce0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31  l==0 );.      r1
1dcf0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1dd00 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1dd10 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1dd20 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
1dd30 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
1dd40 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1dd50 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
1dd60 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
1dd70 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
1dd80 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1dd90 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
1dda0 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
1ddb0 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
1ddc0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1ddd0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1dde0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1ddf0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1de00 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
1de10 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1de20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1de30 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  IS:.    case TK_
1de40 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  ISNOT: {.      t
1de50 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1de60 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  IS );.      test
1de70 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
1de80 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  OT );.      r1 =
1de90 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1dea0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1deb0 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1dec0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
1ded0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1dee0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1def0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
1df00 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 6f  gFree2);.      o
1df10 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20  p = (op==TK_IS) 
1df20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b  ? TK_EQ : TK_NE;
1df30 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
1df40 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
1df50 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
1df60 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
1df70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
1df80 2c 20 72 32 2c 20 64 65 73 74 2c 20 53 51 4c 49  , r2, dest, SQLI
1df90 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
1dfa0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1dfb0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1dfc0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1dfd0 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
1dfe0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1dff0 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
1e000 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
1e010 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73  NULL: {.      as
1e020 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d  sert( TK_ISNULL=
1e030 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20  =OP_IsNull );.  
1e040 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
1e050 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75  OTNULL==OP_NotNu
1e060 6c 6c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ll );.      test
1e070 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
1e080 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ULL );.      tes
1e090 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
1e0a0 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72  TNULL );.      r
1e0b0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1e0c0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1e0d0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
1e0e0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1e0f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e100 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73  2(v, op, r1, des
1e110 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
1e120 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1e130 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1e140 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1e150 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
1e160 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1e170 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1e180 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74 77      exprCodeBetw
1e190 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70  een(pParse, pExp
1e1a0 72 2c 20 64 65 73 74 2c 20 31 2c 20 6a 75 6d 70  r, dest, 1, jump
1e1b0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
1e1c0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
1e1d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e1e0 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
1e1f0 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
1e200 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65   int destIfFalse
1e210 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1e220 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
1e230 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c    int destIfNull
1e240 20 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20   = jumpIfNull ? 
1e250 64 65 73 74 20 3a 20 64 65 73 74 49 66 46 61 6c  dest : destIfFal
1e260 73 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se;.      sqlite
1e270 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72  3ExprCodeIN(pPar
1e280 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49  se, pExpr, destI
1e290 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75  fFalse, destIfNu
1e2a0 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
1e2b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1e2c0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74  OP_Goto, 0, dest
1e2d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e2e0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1e2f0 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  (v, destIfFalse)
1e300 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1e310 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1e320 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
1e330 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1e340 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1e350 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65  , pExpr, &regFre
1e360 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e1);.      sqlit
1e370 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1e380 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c  OP_If, r1, dest,
1e390 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b   jumpIfNull!=0);
1e3a0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e3b0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1e3c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e3d0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1e3e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1e3f0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1e400 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1e410 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
1e420 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
1e430 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1e440 65 2c 20 72 65 67 46 72 65 65 32 29 3b 20 20 0a  e, regFree2);  .
1e450 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1e460 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f  e code for a boo
1e470 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lean expression 
1e480 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70  such that a jump
1e490 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74   is made.** to t
1e4a0 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20  he label "dest" 
1e4b0 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
1e4c0 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74 20 65  n is false but e
1e4d0 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74  xecution.** cont
1e4e0 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74  inues straight t
1e4f0 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65  hru if the expre
1e500 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a  ssion is true..*
1e510 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
1e520 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  ession evaluates
1e530 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65   to NULL (neithe
1e540 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65  r true nor false
1e550 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69  ) then.** jump i
1e560 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20  f jumpIfNull is 
1e570 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
1e580 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67  L or fall throug
1e590 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a  h if jumpIfNull.
1e5a0 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64  ** is 0..*/.void
1e5b0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
1e5c0 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lse(Parse *pPars
1e5d0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
1e5e0 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75  int dest, int ju
1e5f0 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62  mpIfNull){.  Vdb
1e600 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1e610 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d  Vdbe;.  int op =
1e620 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
1e630 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  e1 = 0;.  int re
1e640 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e  gFree2 = 0;.  in
1e650 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73  t r1, r2;..  ass
1e660 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ert( jumpIfNull=
1e670 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55  =SQLITE_JUMPIFNU
1e680 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c  LL || jumpIfNull
1e690 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56  ==0 );.  if( NEV
1e6a0 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
1e6b0 6e 3b 20 2f 2a 20 45 78 69 73 74 61 6e 63 65 20  n; /* Existance 
1e6c0 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20  of VDBE checked 
1e6d0 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69  by caller */.  i
1e6e0 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 20 20  f( pExpr==0 )   
1e6f0 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54   return;..  /* T
1e700 68 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70  he value of pExp
1e710 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65  r->op and op are
1e720 20 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c   related as foll
1e730 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
1e740 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20       pExpr->op  
1e750 20 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a            op.  *
1e760 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  *       --------
1e770 2d 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d  -          -----
1e780 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20  -----.  **      
1e790 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20   TK_ISNULL      
1e7a0 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20      OP_NotNull. 
1e7b0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54   **       TK_NOT
1e7c0 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f  NULL         OP_
1e7d0 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  IsNull.  **     
1e7e0 20 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20    TK_NE         
1e7f0 20 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20       OP_Eq.  ** 
1e800 20 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20        TK_EQ     
1e810 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20           OP_Ne. 
1e820 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20   **       TK_GT 
1e830 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
1e840 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Le.  **       TK
1e850 5f 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  _LE             
1e860 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20   OP_Gt.  **     
1e870 20 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20    TK_GE         
1e880 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20       OP_Lt.  ** 
1e890 20 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20        TK_LT     
1e8a0 20 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20           OP_Ge. 
1e8b0 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68   **.  ** For oth
1e8c0 65 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78  er values of pEx
1e8d0 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e  pr->op, op is un
1e8e0 64 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73  defined and unus
1e8f0 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c  ed..  ** The val
1e900 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50  ue of TK_ and OP
1e910 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20  _ constants are 
1e920 61 72 72 61 6e 67 65 64 20 73 75 63 68 20 74 68  arranged such th
1e930 61 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63  at we.  ** can c
1e940 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70 69  ompute the mappi
1e950 6e 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74  ng above using t
1e960 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70  he following exp
1e970 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73  ression..  ** As
1e980 73 65 72 74 28 29 73 20 76 65 72 69 66 79 20 74  sert()s verify t
1e990 68 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74  hat the computat
1e9a0 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  ion is correct..
1e9b0 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45    */.  op = ((pE
1e9c0 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55  xpr->op+(TK_ISNU
1e9d0 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53  LL&1))^1)-(TK_IS
1e9e0 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56  NULL&1);..  /* V
1e9f0 65 72 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c  erify correct al
1ea00 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61  ignment of TK_ a
1ea10 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73  nd OP_ constants
1ea20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1ea30 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53  pExpr->op!=TK_IS
1ea40 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e  NULL || op==OP_N
1ea50 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65  otNull );.  asse
1ea60 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
1ea70 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d  K_NOTNULL || op=
1ea80 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20  =OP_IsNull );.  
1ea90 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
1eaa0 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_NE || op==
1eab0 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72  OP_Eq );.  asser
1eac0 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
1ead0 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65  _EQ || op==OP_Ne
1eae0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1eaf0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c  xpr->op!=TK_LT |
1eb00 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20  | op==OP_Ge );. 
1eb10 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1eb20 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d  op!=TK_LE || op=
1eb30 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65  =OP_Gt );.  asse
1eb40 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
1eb50 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  K_GT || op==OP_L
1eb60 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
1eb70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20  Expr->op!=TK_GE 
1eb80 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a  || op==OP_Lt );.
1eb90 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
1eba0 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
1ebb0 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20   TK_AND: {.     
1ebc0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1ebd0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1ebe0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
1ebf0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
1ec00 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
1ec10 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1ec20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1ec30 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
1ec40 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
1ec50 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1ec60 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1ec70 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1ec80 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  OR: {.      int 
1ec90 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
1eca0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1ecb0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1ecc0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1ecd0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1ece0 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
1ecf0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ed00 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
1ed10 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1ed20 20 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e   d2, jumpIfNull^
1ed30 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
1ed40 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
1ed50 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
1ed60 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1ed70 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
1ed80 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
1ed90 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1eda0 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20  abel(v, d2);.   
1edb0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1edc0 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31  chePop(pParse, 1
1edd0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1ede0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1edf0 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  K_NOT: {.      t
1ee00 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1ee10 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1ee20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
1ee30 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1ee40 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
1ee50 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1ee60 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1ee70 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
1ee80 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
1ee90 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
1eea0 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
1eeb0 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
1eec0 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
1eed0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1eee0 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20  op==TK_LT );.   
1eef0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1ef00 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20  =TK_LE );.      
1ef10 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1ef20 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GT );.      tes
1ef30 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45  tcase( op==TK_GE
1ef40 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1ef50 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b  se( op==TK_EQ );
1ef60 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1ef70 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20   op==TK_NE );.  
1ef80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1ef90 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1efa0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1efb0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1efc0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1efd0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1efe0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
1eff0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1f000 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1f010 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
1f020 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
1f030 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
1f040 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
1f050 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
1f060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1f070 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d  1, r2, dest, jum
1f080 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1f090 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1f0a0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
1f0b0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1f0c0 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
1f0d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1f0e0 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63  ase TK_IS:.    c
1f0f0 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a  ase TK_ISNOT: {.
1f100 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f110 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
1f120 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1f130 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
1f140 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20  K_ISNOT );.     
1f150 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1f160 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1f170 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1f180 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1f190 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1f1a0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1f1b0 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
1f1c0 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
1f1d0 20 20 20 20 6f 70 20 3d 20 28 70 45 78 70 72 2d      op = (pExpr-
1f1e0 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b  >op==TK_IS) ? TK
1f1f0 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a 20 20 20  _NE : TK_EQ;.   
1f200 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
1f210 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1f220 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
1f230 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
1f240 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
1f250 2c 20 64 65 73 74 2c 20 53 51 4c 49 54 45 5f 4e  , dest, SQLITE_N
1f260 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65  ULLEQ);.      te
1f270 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1f280 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
1f290 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
1f2a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
1f2b0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1f2c0 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
1f2d0 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
1f2e0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1f2f0 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  se( op==TK_ISNUL
1f300 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  L );.      testc
1f310 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  ase( op==TK_NOTN
1f320 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20  ULL );.      r1 
1f330 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1f340 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1f350 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1f360 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71  Free1);.      sq
1f370 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1f380 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29  v, op, r1, dest)
1f390 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1f3a0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1f3b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1f3c0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1f3d0 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
1f3e0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1f3f0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1f400 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65    exprCodeBetwee
1f410 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  n(pParse, pExpr,
1f420 20 64 65 73 74 2c 20 30 2c 20 6a 75 6d 70 49 66   dest, 0, jumpIf
1f430 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
1f440 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
1f450 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
1f460 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
1f470 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
1f480 66 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b  f( jumpIfNull ){
1f490 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f4a0 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73  ExprCodeIN(pPars
1f4b0 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
1f4c0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dest);.      }el
1f4d0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
1f4e0 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c  destIfNull = sql
1f4f0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1f500 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  l(v);.        sq
1f510 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
1f520 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
1f530 65 73 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  est, destIfNull)
1f540 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1f550 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1f560 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  l(v, destIfNull)
1f570 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f580 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
1f590 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  dif.    default:
1f5a0 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71   {.      r1 = sq
1f5b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1f5c0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  p(pParse, pExpr,
1f5d0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1f5e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f5f0 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp3(v, OP_IfNot
1f600 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r1, dest, jump
1f610 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20  IfNull!=0);.    
1f620 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1f630 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1f640 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1f650 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1f660 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1f670 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
1f680 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1f690 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20  e, regFree1);.  
1f6a0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1f6b0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
1f6c0 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  gFree2);.}../*.*
1f6d0 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70  * Do a deep comp
1f6e0 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78  arison of two ex
1f6f0 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20  pression trees. 
1f700 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   Return 0 if the
1f710 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69   two.** expressi
1f720 6f 6e 73 20 61 72 65 20 63 6f 6d 70 6c 65 74 65  ons are complete
1f730 6c 79 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 52  ly identical.  R
1f740 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 79 20  eturn 1 if they 
1f750 64 69 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62  differ only.** b
1f760 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  y a COLLATE oper
1f770 61 74 6f 72 20 61 74 20 74 68 65 20 74 6f 70 20  ator at the top 
1f780 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 32  level.  Return 2
1f790 20 69 66 20 74 68 65 72 65 20 61 72 65 20 64 69   if there are di
1f7a0 66 66 65 72 65 6e 63 65 73 0a 2a 2a 20 6f 74 68  fferences.** oth
1f7b0 65 72 20 74 68 61 6e 20 74 68 65 20 74 6f 70 2d  er than the top-
1f7c0 6c 65 76 65 6c 20 43 4f 4c 4c 41 54 45 20 6f 70  level COLLATE op
1f7d0 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 53 6f  erator..**.** So
1f7e0 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75  metimes this rou
1f7f0 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
1f800 20 32 20 65 76 65 6e 20 69 66 20 74 68 65 20 74   2 even if the t
1f810 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  wo expressions.*
1f820 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75  * really are equ
1f830 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20  ivalent.  If we 
1f840 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61  cannot prove tha
1f850 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
1f860 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63  s are.** identic
1f870 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32 20  al, we return 2 
1f880 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e  just to be safe.
1f890 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75    So if this rou
1f8a0 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
1f8b0 32 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e  2, then you do n
1f8c0 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66  ot really know f
1f8d0 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20 74 68  or certain if th
1f8e0 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73  e two.** express
1f8f0 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d  ions are the sam
1f900 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20 67  e.  But if you g
1f910 65 74 20 61 20 30 20 6f 72 20 31 20 72 65 74 75  et a 0 or 1 retu
1f920 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20  rn, then you.** 
1f930 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 65 20  can be sure the 
1f940 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
1f950 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68  the same.  In th
1f960 65 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a  e places where.*
1f970 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
1f980 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20  s used, it does 
1f990 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74 20  not hurt to get 
1f9a0 61 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68 61  an extra 2 - tha
1f9b0 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20  t.** just might 
1f9c0 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73  result in some s
1f9d0 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63  lightly slower c
1f9e0 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e  ode.  But return
1f9f0 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72  ing.** an incorr
1fa00 65 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c 64  ect 0 or 1 could
1fa10 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75   lead to a malfu
1fa20 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
1fa30 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
1fa40 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72  e(Expr *pA, Expr
1fa50 20 2a 70 42 29 7b 0a 20 20 69 66 28 20 70 41 3d   *pB){.  if( pA=
1fa60 3d 30 7c 7c 70 42 3d 3d 30 20 29 7b 0a 20 20 20  =0||pB==0 ){.   
1fa70 20 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 20 3f   return pB==pA ?
1fa80 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20 61 73   0 : 2;.  }.  as
1fa90 73 65 72 74 28 20 21 45 78 70 72 48 61 73 41 6e  sert( !ExprHasAn
1faa0 79 50 72 6f 70 65 72 74 79 28 70 41 2c 20 45 50  yProperty(pA, EP
1fab0 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
1fac0 64 75 63 65 64 29 20 29 3b 0a 20 20 61 73 73 65  duced) );.  asse
1fad0 72 74 28 20 21 45 78 70 72 48 61 73 41 6e 79 50  rt( !ExprHasAnyP
1fae0 72 6f 70 65 72 74 79 28 70 42 2c 20 45 50 5f 54  roperty(pB, EP_T
1faf0 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
1fb00 63 65 64 29 20 29 3b 0a 20 20 69 66 28 20 45 78  ced) );.  if( Ex
1fb10 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 41  prHasProperty(pA
1fb20 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1fb30 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  || ExprHasProper
1fb40 74 79 28 70 42 2c 20 45 50 5f 78 49 73 53 65 6c  ty(pB, EP_xIsSel
1fb50 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ect) ){.    retu
1fb60 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 2;.  }.  if( 
1fb70 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  (pA->flags & EP_
1fb80 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e  Distinct)!=(pB->
1fb90 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
1fba0 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b  nct) ) return 2;
1fbb0 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70  .  if( pA->op!=p
1fbc0 42 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 69 66 28  B->op ){.    if(
1fbd0 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   pA->op==TK_COLL
1fbe0 41 54 45 20 26 26 20 73 71 6c 69 74 65 33 45 78  ATE && sqlite3Ex
1fbf0 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c  prCompare(pA->pL
1fc00 65 66 74 2c 20 70 42 29 3c 32 20 29 7b 0a 20 20  eft, pB)<2 ){.  
1fc10 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1fc20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 2d 3e    }.    if( pB->
1fc30 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26  op==TK_COLLATE &
1fc40 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  & sqlite3ExprCom
1fc50 70 61 72 65 28 70 41 2c 20 70 42 2d 3e 70 4c 65  pare(pA, pB->pLe
1fc60 66 74 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72  ft)<2 ){.      r
1fc70 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
1fc80 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
1fc90 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
1fca0 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c  prCompare(pA->pL
1fcb0 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 29 20  eft, pB->pLeft) 
1fcc0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66  ) return 2;.  if
1fcd0 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
1fce0 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c  pare(pA->pRight,
1fcf0 20 70 42 2d 3e 70 52 69 67 68 74 29 20 29 20 72   pB->pRight) ) r
1fd00 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 73  eturn 2;.  if( s
1fd10 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
1fd20 6d 70 61 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73  mpare(pA->x.pLis
1fd30 74 2c 20 70 42 2d 3e 78 2e 70 4c 69 73 74 29 20  t, pB->x.pList) 
1fd40 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66  ) return 2;.  if
1fd50 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42  ( pA->iTable!=pB
1fd60 2d 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41 2d 3e  ->iTable || pA->
1fd70 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f  iColumn!=pB->iCo
1fd80 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 32 3b  lumn ) return 2;
1fd90 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
1fda0 6f 70 65 72 74 79 28 70 41 2c 20 45 50 5f 49 6e  operty(pA, EP_In
1fdb0 74 56 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 69  tValue) ){.    i
1fdc0 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
1fdd0 72 74 79 28 70 42 2c 20 45 50 5f 49 6e 74 56 61  rty(pB, EP_IntVa
1fde0 6c 75 65 29 20 7c 7c 20 70 41 2d 3e 75 2e 69 56  lue) || pA->u.iV
1fdf0 61 6c 75 65 21 3d 70 42 2d 3e 75 2e 69 56 61 6c  alue!=pB->u.iVal
1fe00 75 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ue ){.      retu
1fe10 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  rn 2;.    }.  }e
1fe20 6c 73 65 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d  lse if( pA->op!=
1fe30 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41 4c 57  TK_COLUMN && ALW
1fe40 41 59 53 28 70 41 2d 3e 6f 70 21 3d 54 4b 5f 41  AYS(pA->op!=TK_A
1fe50 47 47 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 41  GG_COLUMN) && pA
1fe60 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 7b 0a 20 20 20  ->u.zToken){.   
1fe70 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
1fe80 65 72 74 79 28 70 42 2c 20 45 50 5f 49 6e 74 56  erty(pB, EP_IntV
1fe90 61 6c 75 65 29 20 7c 7c 20 4e 45 56 45 52 28 70  alue) || NEVER(p
1fea0 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 3d 3d 30 29 20  B->u.zToken==0) 
1feb0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
1fec0 69 66 28 20 73 74 72 63 6d 70 28 70 41 2d 3e 75  if( strcmp(pA->u
1fed0 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54  .zToken,pB->u.zT
1fee0 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20  oken)!=0 ){.    
1fef0 20 20 72 65 74 75 72 6e 20 70 41 2d 3e 6f 70 3d    return pA->op=
1ff00 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 3f 20 31 20  =TK_COLLATE ? 1 
1ff10 3a 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  : 2;.    }.  }. 
1ff20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 26   if( (pA->flags&
1ff30 45 50 5f 43 6f 6c 6c 61 74 65 29 21 3d 28 70 42  EP_Collate)!=(pB
1ff40 2d 3e 66 6c 61 67 73 26 45 50 5f 43 6f 6c 6c 61  ->flags&EP_Colla
1ff50 74 65 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  te) ) return 1;.
1ff60 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1ff70 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f  *.** Compare two
1ff80 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74   ExprList object
1ff90 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  s.  Return 0 if 
1ffa0 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63  they are identic
1ffb0 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a  al and .** non-z
1ffc0 65 72 6f 20 69 66 20 74 68 65 79 20 64 69 66 66  ero if they diff
1ffd0 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a  er in any way..*
1ffe0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1fff0 65 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 6e  e might return n
20000 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71 75 69  on-zero for equi
20010 76 61 6c 65 6e 74 20 45 78 70 72 4c 69 73 74 73  valent ExprLists
20020 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63  .  The.** only c
20030 6f 6e 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 20  onsequence will 
20040 62 65 20 64 69 73 61 62 6c 65 64 20 6f 70 74 69  be disabled opti
20050 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75 74 20  mizations.  But 
20060 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
20070 6d 75 73 74 20 6e 65 76 65 72 20 72 65 74 75 72  must never retur
20080 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 20 45  n 0 if the two E
20090 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 20  xprList objects 
200a0 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20 6f  are different, o
200b0 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63 74 69  r.** a malfuncti
200c0 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 2e 0a  on will result..
200d0 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 70  **.** Two NULL p
200e0 6f 69 6e 74 65 72 73 20 61 72 65 20 63 6f 6e 73  ointers are cons
200f0 69 64 65 72 65 64 20 74 6f 20 62 65 20 74 68 65  idered to be the
20100 20 73 61 6d 65 2e 20 20 42 75 74 20 61 20 4e 55   same.  But a NU
20110 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 61 6c  LL pointer.** al
20120 77 61 79 73 20 64 69 66 66 65 72 73 20 66 72 6f  ways differs fro
20130 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69  m a non-NULL poi
20140 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nter..*/.int sql
20150 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
20160 61 72 65 28 45 78 70 72 4c 69 73 74 20 2a 70 41  are(ExprList *pA
20170 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 42 29 7b  , ExprList *pB){
20180 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
20190 70 41 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20 29  pA==0 && pB==0 )
201a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
201b0 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20   pA==0 || pB==0 
201c0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
201d0 28 20 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d  ( pA->nExpr!=pB-
201e0 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20  >nExpr ) return 
201f0 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  1;.  for(i=0; i<
20200 70 41 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  pA->nExpr; i++){
20210 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
20220 41 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78  A = pA->a[i].pEx
20230 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  pr;.    Expr *pE
20240 78 70 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e  xprB = pB->a[i].
20250 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
20260 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  A->a[i].sortOrde
20270 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74  r!=pB->a[i].sort
20280 4f 72 64 65 72 20 29 20 72 65 74 75 72 6e 20 31  Order ) return 1
20290 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
202a0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78  3ExprCompare(pEx
202b0 70 72 41 2c 20 70 45 78 70 72 42 29 20 29 20 72  prA, pExprB) ) r
202c0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
202d0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
202e0 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
202f0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
20300 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64  tructure is used
20310 20 62 79 20 74 68 65 20 74 72 65 65 20 77 61 6c   by the tree wal
20320 6b 65 72 0a 2a 2a 20 74 6f 20 63 6f 75 6e 74 20  ker.** to count 
20330 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61  references to ta
20340 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  ble columns in t
20350 68 65 20 61 72 67 75 6d 65 6e 74 73 20 6f 66 20  he arguments of 
20360 61 6e 20 0a 2a 2a 20 61 67 67 72 65 67 61 74 65  an .** aggregate
20370 20 66 75 6e 63 74 69 6f 6e 2c 20 69 6e 20 6f 72   function, in or
20380 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  der to implement
20390 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46   the.** sqlite3F
203a0 75 6e 63 74 69 6f 6e 54 68 69 73 53 72 63 28 29  unctionThisSrc()
203b0 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72   routine..*/.str
203c0 75 63 74 20 53 72 63 43 6f 75 6e 74 20 7b 0a 20  uct SrcCount {. 
203d0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20   SrcList *pSrc; 
203e0 20 20 2f 2a 20 4f 6e 65 20 70 61 72 74 69 63 75    /* One particu
203f0 6c 61 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  lar FROM clause 
20400 69 6e 20 61 20 6e 65 73 74 65 64 20 71 75 65 72  in a nested quer
20410 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 68 69 73  y */.  int nThis
20420 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
20430 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
20440 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 53  to columns in pS
20450 72 63 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  rcList */.  int 
20460 6e 4f 74 68 65 72 3b 20 20 20 20 20 20 2f 2a 20  nOther;      /* 
20470 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  Number of refere
20480 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20  nces to columns 
20490 69 6e 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c  in other FROM cl
204a0 61 75 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  auses */.};../*.
204b0 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  ** Count the num
204c0 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
204d0 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  s to columns..*/
204e0 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
204f0 53 72 63 43 6f 75 6e 74 28 57 61 6c 6b 65 72 20  SrcCount(Walker 
20500 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
20510 70 45 78 70 72 29 7b 0a 20 20 2f 2a 20 54 68 65  pExpr){.  /* The
20520 20 4e 45 56 45 52 28 29 20 6f 6e 20 74 68 65 20   NEVER() on the 
20530 73 65 63 6f 6e 64 20 74 65 72 6d 20 69 73 20 62  second term is b
20540 65 63 61 75 73 65 20 73 71 6c 69 74 65 33 46 75  ecause sqlite3Fu
20550 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72  nctionUsesThisSr
20560 63 28 29 0a 20 20 2a 2a 20 69 73 20 61 6c 77 61  c().  ** is alwa
20570 79 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  ys called before
20580 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
20590 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20  yzeAggregates() 
205a0 61 6e 64 20 73 6f 20 74 68 65 0a 20 20 2a 2a 20  and so the.  ** 
205b0 54 4b 5f 43 4f 4c 55 4d 4e 73 20 68 61 76 65 20  TK_COLUMNs have 
205c0 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 6e  not yet been con
205d0 76 65 72 74 65 64 20 69 6e 74 6f 20 54 4b 5f 41  verted into TK_A
205e0 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20 49 66 0a 20  GG_COLUMN.  If. 
205f0 20 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74   ** sqlite3Funct
20600 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 29  ionUsesThisSrc()
20610 20 69 73 20 75 73 65 64 20 64 69 66 66 65 72 65   is used differe
20620 6e 74 6c 79 20 69 6e 20 74 68 65 20 66 75 74 75  ntly in the futu
20630 72 65 2c 20 74 68 65 0a 20 20 2a 2a 20 4e 45 56  re, the.  ** NEV
20640 45 52 28 29 20 77 69 6c 6c 20 6e 65 65 64 20 74  ER() will need t
20650 6f 20 62 65 20 72 65 6d 6f 76 65 64 2e 20 2a 2f  o be removed. */
20660 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
20670 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 4e  ==TK_COLUMN || N
20680 45 56 45 52 28 70 45 78 70 72 2d 3e 6f 70 3d 3d  EVER(pExpr->op==
20690 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 29  TK_AGG_COLUMN) )
206a0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
206b0 20 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74   struct SrcCount
206c0 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75   *p = pWalker->u
206d0 2e 70 53 72 63 43 6f 75 6e 74 3b 0a 20 20 20 20  .pSrcCount;.    
206e0 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20  SrcList *pSrc = 
206f0 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 66 6f 72  p->pSrc;.    for
20700 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53  (i=0; i<pSrc->nS
20710 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
20720 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  if( pExpr->iTabl
20730 65 3d 3d 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43  e==pSrc->a[i].iC
20740 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20  ursor ) break;. 
20750 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 70     }.    if( i<p
20760 53 72 63 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20  Src->nSrc ){.   
20770 20 20 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20     p->nThis++;. 
20780 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20790 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20 20  p->nOther++;.   
207a0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
207b0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
207c0 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
207d0 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 61   if any of the a
207e0 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  rguments to the 
207f0 70 45 78 70 72 20 46 75 6e 63 74 69 6f 6e 20 72  pExpr Function r
20800 65 66 65 72 65 6e 63 65 0a 2a 2a 20 70 53 72 63  eference.** pSrc
20810 4c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 72  List.  Return tr
20820 75 65 20 69 66 20 74 68 65 79 20 64 6f 2e 20 20  ue if they do.  
20830 41 6c 73 6f 20 72 65 74 75 72 6e 20 74 72 75 65  Also return true
20840 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   if the function
20850 0a 2a 2a 20 68 61 73 20 6e 6f 20 61 72 67 75 6d  .** has no argum
20860 65 6e 74 73 20 6f 72 20 68 61 73 20 6f 6e 6c 79  ents or has only
20870 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65   constant argume
20880 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 66 61 6c  nts.  Return fal
20890 73 65 20 69 66 20 70 45 78 70 72 0a 2a 2a 20 72  se if pExpr.** r
208a0 65 66 65 72 65 6e 63 65 73 20 63 6f 6c 75 6d 6e  eferences column
208b0 73 20 62 75 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e  s but not column
208c0 73 20 6f 66 20 74 61 62 6c 65 73 20 66 6f 75 6e  s of tables foun
208d0 64 20 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a 2a  d in pSrcList..*
208e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 75 6e  /.int sqlite3Fun
208f0 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63  ctionUsesThisSrc
20900 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53 72  (Expr *pExpr, Sr
20910 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 29  cList *pSrcList)
20920 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
20930 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20  struct SrcCount 
20940 63 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  cnt;.  assert( p
20950 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
20960 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 6d  _FUNCTION );.  m
20970 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
20980 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78  eof(w));.  w.xEx
20990 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
209a0 72 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77 2e 75  rSrcCount;.  w.u
209b0 2e 70 53 72 63 43 6f 75 6e 74 20 3d 20 26 63 6e  .pSrcCount = &cn
209c0 74 3b 0a 20 20 63 6e 74 2e 70 53 72 63 20 3d 20  t;.  cnt.pSrc = 
209d0 70 53 72 63 4c 69 73 74 3b 0a 20 20 63 6e 74 2e  pSrcList;.  cnt.
209e0 6e 54 68 69 73 20 3d 20 30 3b 0a 20 20 63 6e 74  nThis = 0;.  cnt
209f0 2e 6e 4f 74 68 65 72 20 3d 20 30 3b 0a 20 20 73  .nOther = 0;.  s
20a00 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69  qlite3WalkExprLi
20a10 73 74 28 26 77 2c 20 70 45 78 70 72 2d 3e 78 2e  st(&w, pExpr->x.
20a20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  pList);.  return
20a30 20 63 6e 74 2e 6e 54 68 69 73 3e 30 20 7c 7c 20   cnt.nThis>0 || 
20a40 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d  cnt.nOther==0;.}
20a50 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
20a60 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
20a70 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
20a80 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  ] array.  Return
20a90 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a   the index of.**
20aa0 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74   the new element
20ab0 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61  .  Return a nega
20ac0 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d  tive number if m
20ad0 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a  alloc fails..*/.
20ae0 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67  static int addAg
20af0 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69  gInfoColumn(sqli
20b00 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f  te3 *db, AggInfo
20b10 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20   *pInfo){.  int 
20b20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c  i;.  pInfo->aCol
20b30 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41   = sqlite3ArrayA
20b40 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20  llocate(.       
20b50 64 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f  db,.       pInfo
20b60 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73  ->aCol,.       s
20b70 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f  izeof(pInfo->aCo
20b80 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70  l[0]),.       &p
20b90 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20  Info->nColumn,. 
20ba0 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20        &i.  );.  
20bb0 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a  return i;.}    .
20bc0 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
20bd0 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
20be0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
20bf0 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  ] array.  Return
20c00 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a   the index of.**
20c10 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74   the new element
20c20 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61  .  Return a nega
20c30 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d  tive number if m
20c40 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a  alloc fails..*/.
20c50 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67  static int addAg
20c60 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74 65  gInfoFunc(sqlite
20c70 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a  3 *db, AggInfo *
20c80 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b  pInfo){.  int i;
20c90 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20  .  pInfo->aFunc 
20ca0 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
20cb0 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64  locate(.       d
20cc0 62 2c 20 0a 20 20 20 20 20 20 20 70 49 6e 66 6f  b, .       pInfo
20cd0 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20 20 20  ->aFunc,.       
20ce0 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46  sizeof(pInfo->aF
20cf0 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20  unc[0]),.       
20d00 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20  &pInfo->nFunc,. 
20d10 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20        &i.  );.  
20d20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a  return i;.}    .
20d30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
20d40 68 65 20 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  he xExprCallback
20d50 20 66 6f 72 20 61 20 74 72 65 65 20 77 61 6c 6b   for a tree walk
20d60 65 72 2e 20 20 49 74 20 69 73 20 75 73 65 64 20  er.  It is used 
20d70 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20  to.** implement 
20d80 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
20d90 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 2e 20  zeAggregates(). 
20da0 20 53 65 65 20 73 71 6c 69 74 65 33 45 78 70 72   See sqlite3Expr
20db0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
20dc0 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f  s.** for additio
20dd0 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
20de0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
20df0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28  nalyzeAggregate(
20e00 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
20e10 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
20e20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f   int i;.  NameCo
20e30 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61  ntext *pNC = pWa
20e40 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50  lker->u.pNC;.  P
20e50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
20e60 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72  NC->pParse;.  Sr
20e70 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20  cList *pSrcList 
20e80 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
20e90 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  .  AggInfo *pAgg
20ea0 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67  Info = pNC->pAgg
20eb0 49 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63 68 28  Info;..  switch(
20ec0 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
20ed0 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
20ee0 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  LUMN:.    case T
20ef0 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
20f00 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
20f10 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
20f20 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  LUMN );.      te
20f30 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
20f40 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
20f50 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
20f60 6f 20 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c  o see if the col
20f70 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66  umn is in one of
20f80 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74   the tables in t
20f90 68 65 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a  he FROM.      **
20fa0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61   clause of the a
20fb0 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a  ggregate query *
20fc0 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  /.      if( ALWA
20fd0 59 53 28 70 53 72 63 4c 69 73 74 21 3d 30 29 20  YS(pSrcList!=0) 
20fe0 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  ){.        struc
20ff0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
21000 70 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74  pItem = pSrcList
21010 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ->a;.        for
21020 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74  (i=0; i<pSrcList
21030 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
21040 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  em++){.         
21050 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
21060 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20  col *pCol;.     
21070 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
21080 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
21090 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e  (pExpr, EP_Token
210a0 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
210b0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
210c0 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
210d0 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  =pItem->iCursor 
210e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
210f0 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
21100 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61  is point, it mea
21110 6e 73 20 74 68 61 74 20 70 45 78 70 72 20 72 65  ns that pExpr re
21120 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a  fers to a table.
21130 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
21140 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 46 52  hat is in the FR
21150 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
21160 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
21170 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  .  .            
21180 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  **.            *
21190 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20  * Make an entry 
211a0 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  for the column i
211b0 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  n pAggInfo->aCol
211c0 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20 20  [] if there.    
211d0 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f          ** is no
211e0 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65  t an entry there
211f0 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20   already..      
21200 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
21210 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
21220 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70          pCol = p
21230 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20  AggInfo->aCol;. 
21240 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b             for(k
21250 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; k<pAggInfo->
21260 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43  nColumn; k++, pC
21270 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ol++){.         
21280 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
21290 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54  Table==pExpr->iT
212a0 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20  able &&.        
212b0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
212c0 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e  iColumn==pExpr->
212d0 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
212e0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
212f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
21300 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
21310 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
21320 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  (k>=pAggInfo->nC
21330 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20  olumn).         
21340 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41      && (k = addA
21350 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61  ggInfoColumn(pPa
21360 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66  rse->db, pAggInf
21370 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20  o))>=0 .        
21380 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
21390 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67       pCol = &pAg
213a0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a  gInfo->aCol[k];.
213b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
213c0 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72  ol->pTab = pExpr
213d0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
213e0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62        pCol->iTab
213f0 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  le = pExpr->iTab
21400 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  le;.            
21410 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20    pCol->iColumn 
21420 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
21430 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
21440 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70  pCol->iMem = ++p
21450 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
21460 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
21470 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
21480 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -1;.           
21490 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d     pCol->pExpr =
214a0 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
214b0 20 20 20 20 20 20 69 66 28 20 70 41 67 67 49 6e        if( pAggIn
214c0 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a  fo->pGroupBy ){.
214d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214e0 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20  int j, n;.      
214f0 20 20 20 20 20 20 20 20 20 20 45 78 70 72 4c 69            ExprLi
21500 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e  st *pGB = pAggIn
21510 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20  fo->pGroupBy;.  
21520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
21530 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
21540 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d  em *pTerm = pGB-
21550 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  >a;.            
21560 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78      n = pGB->nEx
21570 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
21580 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
21590 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j++, pTerm++){
215a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
215b0 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54     Expr *pE = pT
215c0 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
215d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
215e0 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pE->op==TK_COL
215f0 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c  UMN && pE->iTabl
21600 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e==pExpr->iTable
21610 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
21620 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43            pE->iC
21630 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43  olumn==pExpr->iC
21640 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
21650 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
21660 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
21670 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
21680 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
21690 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
216a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
216b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
216c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
216d0 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
216e0 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29  SorterColumn<0 )
216f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
21700 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
21710 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f  olumn = pAggInfo
21720 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  ->nSortingColumn
21730 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
21740 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
21750 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  }.            /*
21760 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e   There is now an
21770 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72   entry for pExpr
21780 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   in pAggInfo->aC
21790 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20  ol[] (either.   
217a0 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61           ** beca
217b0 75 73 65 20 69 74 20 77 61 73 20 74 68 65 72 65  use it was there
217c0 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75   before or becau
217d0 73 65 20 77 65 20 6a 75 73 74 20 63 72 65 61 74  se we just creat
217e0 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20  ed it)..        
217f0 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74      ** Convert t
21800 68 65 20 70 45 78 70 72 20 74 6f 20 62 65 20 61  he pExpr to be a
21810 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72   TK_AGG_COLUMN r
21820 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74  eferring to that
21830 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
21840 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
21850 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20   entry..        
21860 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
21870 20 20 20 45 78 70 72 53 65 74 49 72 72 65 64 75     ExprSetIrredu
21880 63 69 62 6c 65 28 70 45 78 70 72 29 3b 0a 20 20  cible(pExpr);.  
21890 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
218a0 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67  >pAggInfo = pAgg
218b0 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  Info;.          
218c0 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
218d0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  _AGG_COLUMN;.   
218e0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
218f0 69 41 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20  iAgg = (i16)k;. 
21900 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
21910 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a  ;.          } /*
21920 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54   endif pExpr->iT
21930 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75  able==pItem->iCu
21940 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rsor */.        
21950 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76  } /* end loop ov
21960 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20  er pSrcList */. 
21970 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
21980 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
21990 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
219a0 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  _AGG_FUNCTION: {
219b0 0a 20 20 20 20 20 20 69 66 28 20 28 70 4e 43 2d  .      if( (pNC-
219c0 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e  >ncFlags & NC_In
219d0 41 67 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20  AggFunc)==0.    
219e0 20 20 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77     && pWalker->w
219f0 61 6c 6b 65 72 44 65 70 74 68 3d 3d 70 45 78 70  alkerDepth==pExp
21a00 72 2d 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a  r->op2.      ){.
21a10 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
21a20 20 74 6f 20 73 65 65 20 69 66 20 70 45 78 70 72   to see if pExpr
21a30 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20   is a duplicate 
21a40 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65  of another aggre
21a50 67 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  gate .        **
21a60 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
21a70 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
21a80 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74   pAggInfo struct
21a90 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ure.        */. 
21aa0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
21ab0 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65  gInfo_func *pIte
21ac0 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  m = pAggInfo->aF
21ad0 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  unc;.        for
21ae0 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
21af0 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49  ->nFunc; i++, pI
21b00 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
21b10 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
21b20 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e  rCompare(pItem->
21b30 70 45 78 70 72 2c 20 70 45 78 70 72 29 3d 3d 30  pExpr, pExpr)==0
21b40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21b50 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
21b60 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
21b70 20 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67       if( i>=pAgg
21b80 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20  Info->nFunc ){. 
21b90 20 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70           /* pExp
21ba0 72 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20  r is original.  
21bb0 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79  Make a new entry
21bc0 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46   in pAggInfo->aF
21bd0 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20  unc[].          
21be0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  */.          u8 
21bf0 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65  enc = ENC(pParse
21c00 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  ->db);.         
21c10 20 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46   i = addAggInfoF
21c20 75 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  unc(pParse->db, 
21c30 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  pAggInfo);.     
21c40 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b       if( i>=0 ){
21c50 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
21c60 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
21c70 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
21c80 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
21c90 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 20            pItem 
21ca0 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  = &pAggInfo->aFu
21cb0 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  nc[i];.         
21cc0 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
21cd0 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
21ce0 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d       pItem->iMem
21cf0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
21d00 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  m;.            a
21d10 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
21d20 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
21d30 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
21d40 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
21d50 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65  ->pFunc = sqlite
21d60 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50  3FindFunction(pP
21d70 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20  arse->db,.      
21d80 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
21d90 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 73 71  pr->u.zToken, sq
21da0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 45  lite3Strlen30(pE
21db0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2c 0a  xpr->u.zToken),.
21dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21dd0 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73     pExpr->x.pLis
21de0 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t ? pExpr->x.pLi
21df0 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65  st->nExpr : 0, e
21e00 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nc, 0);.        
21e10 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66      if( pExpr->f
21e20 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
21e30 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ct ){.          
21e40 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74      pItem->iDist
21e50 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  inct = pParse->n
21e60 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Tab++;.         
21e70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21e80 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
21e90 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20  Distinct = -1;. 
21ea0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
21eb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21ec0 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61   }.        /* Ma
21ed0 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74  ke pExpr point t
21ee0 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  o the appropriat
21ef0 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  e pAggInfo->aFun
21f00 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20  c[] entry.      
21f10 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
21f20 65 72 74 28 20 21 45 78 70 72 48 61 73 41 6e 79  ert( !ExprHasAny
21f30 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
21f40 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
21f50 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
21f60 20 20 20 20 45 78 70 72 53 65 74 49 72 72 65 64      ExprSetIrred
21f70 75 63 69 62 6c 65 28 70 45 78 70 72 29 3b 0a 20  ucible(pExpr);. 
21f80 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41         pExpr->iA
21f90 67 67 20 3d 20 28 69 31 36 29 69 3b 0a 20 20 20  gg = (i16)i;.   
21fa0 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67       pExpr->pAgg
21fb0 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b  Info = pAggInfo;
21fc0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
21fd0 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20  WRC_Prune;.     
21fe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21ff0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
22000 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
22010 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
22020 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
22030 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79  static int analy
22040 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65  zeAggregatesInSe
22050 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57 61  lect(Walker *pWa
22060 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53  lker, Select *pS
22070 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53 45 44  elect){.  UNUSED
22080 5f 50 41 52 41 4d 45 54 45 52 28 70 57 61 6c 6b  _PARAMETER(pWalk
22090 65 72 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  er);.  UNUSED_PA
220a0 52 41 4d 45 54 45 52 28 70 53 65 6c 65 63 74 29  RAMETER(pSelect)
220b0 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  ;.  return WRC_C
220c0 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
220d0 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 70 45  * Analyze the pE
220e0 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  xpr expression l
220f0 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65  ooking for aggre
22100 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  gate functions a
22110 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62  nd.** for variab
22120 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  les that need to
22130 20 62 65 20 61 64 64 65 64 20 74 6f 20 41 67 67   be added to Agg
22140 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74  Info object that
22150 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 0a 2a   pNC->pAggInfo.*
22160 2a 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41 64  * points to.  Ad
22170 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73  ditional entries
22180 20 61 72 65 20 6d 61 64 65 20 6f 6e 20 74 68 65   are made on the
22190 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20   AggInfo object 
221a0 61 73 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 2e  as.** necessary.
221b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
221c0 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
221d0 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  be called after 
221e0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68  the expression h
221f0 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79  as been.** analy
22200 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 52 65  zed by sqlite3Re
22210 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29  solveExprNames()
22220 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
22230 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
22240 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65  egates(NameConte
22250 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70  xt *pNC, Expr *p
22260 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20  Expr){.  Walker 
22270 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  w;.  memset(&w, 
22280 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
22290 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
222a0 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67   = analyzeAggreg
222b0 61 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  ate;.  w.xSelect
222c0 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79  Callback = analy
222d0 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65  zeAggregatesInSe
222e0 6c 65 63 74 3b 0a 20 20 77 2e 75 2e 70 4e 43 20  lect;.  w.u.pNC 
222f0 3d 20 70 4e 43 3b 0a 20 20 61 73 73 65 72 74 28  = pNC;.  assert(
22300 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d   pNC->pSrcList!=
22310 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  0 );.  sqlite3Wa
22320 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72  lkExpr(&w, pExpr
22330 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  );.}../*.** Call
22340 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
22350 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20  yzeAggregates() 
22360 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73  for every expres
22370 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78  sion in an.** ex
22380 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
22390 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
223a0 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a  r of errors..**.
223b0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  ** If an error i
223c0 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61  s found, the ana
223d0 6c 79 73 69 73 20 69 73 20 63 75 74 20 73 68 6f  lysis is cut sho
223e0 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rt..*/.void sqli
223f0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
22400 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78  gList(NameContex
22410 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74  t *pNC, ExprList
22420 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75   *pList){.  stru
22430 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
22440 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
22450 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
22460 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  .    for(pItem=p
22470 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
22480 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
22490 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
224a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
224b0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
224c0 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  pNC, pItem->pExp
224d0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  r);.    }.  }.}.
224e0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
224f0 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 72 65 67  a single new reg
22500 69 73 74 65 72 20 66 6f 72 20 75 73 65 20 74 6f  ister for use to
22510 20 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65 72   hold some inter
22520 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 2e 0a  mediate result..
22530 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65  */.int sqlite3Ge
22540 74 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a  tTempReg(Parse *
22550 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70  pParse){.  if( p
22560 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d  Parse->nTempReg=
22570 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
22580 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
22590 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50  .  }.  return pP
225a0 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d  arse->aTempReg[-
225b0 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  -pParse->nTempRe
225c0 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61  g];.}../*.** Dea
225d0 6c 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73 74  llocate a regist
225e0 65 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69 6c  er, making avail
225f0 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 20 66  able for reuse f
22600 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  or some other.**
22610 20 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20   purpose..**.** 
22620 49 66 20 61 20 72 65 67 69 73 74 65 72 20 69 73  If a register is
22630 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
22640 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f 6c   used by the col
22650 75 6d 6e 20 63 61 63 68 65 2c 20 74 68 65 6e 0a  umn cache, then.
22660 2a 2a 20 74 68 65 20 64 61 6c 6c 6f 63 61 74 69  ** the dallocati
22670 6f 6e 20 69 73 20 64 65 66 65 72 72 65 64 20 75  on is deferred u
22680 6e 74 69 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 20  ntil the column 
22690 63 61 63 68 65 20 6c 69 6e 65 20 74 68 61 74 20  cache line that 
226a0 75 73 65 73 0a 2a 2a 20 74 68 65 20 72 65 67 69  uses.** the regi
226b0 73 74 65 72 20 62 65 63 6f 6d 65 73 20 73 74 61  ster becomes sta
226c0 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
226d0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
226e0 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  g(Parse *pParse,
226f0 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 66   int iReg){.  if
22700 28 20 69 52 65 67 20 26 26 20 70 50 61 72 73 65  ( iReg && pParse
22710 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79  ->nTempReg<Array
22720 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65  Size(pParse->aTe
22730 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20 69 6e  mpReg) ){.    in
22740 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20  t i;.    struct 
22750 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20  yColCache *p;.  
22760 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
22770 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
22780 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
22790 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
227a0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65        if( p->iRe
227b0 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20 20  g==iReg ){.     
227c0 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20     p->tempReg = 
227d0 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
227e0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n;.      }.    }
227f0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65  .    pParse->aTe
22800 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54  mpReg[pParse->nT
22810 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67  empReg++] = iReg
22820 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
22830 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c  llocate or deall
22840 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66  ocate a block of
22850 20 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69 76   nReg consecutiv
22860 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2f 0a 69  e registers.*/.i
22870 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d  nt sqlite3GetTem
22880 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  pRange(Parse *pP
22890 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b  arse, int nReg){
228a0 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69  .  int i, n;.  i
228b0 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67   = pParse->iRang
228c0 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72  eReg;.  n = pPar
228d0 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20  se->nRangeReg;. 
228e0 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a   if( nReg<=n ){.
228f0 20 20 20 20 61 73 73 65 72 74 28 20 21 75 73 65      assert( !use
22900 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70  dAsColumnCache(p
22910 50 61 72 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29  Parse, i, i+n-1)
22920 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   );.    pParse->
22930 69 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65  iRangeReg += nRe
22940 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  g;.    pParse->n
22950 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65 67  RangeReg -= nReg
22960 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
22970 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
22980 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
22990 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d  Mem += nReg;.  }
229a0 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76  .  return i;.}.v
229b0 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61  oid sqlite3Relea
229c0 73 65 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73  seTempRange(Pars
229d0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
229e0 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  Reg, int nReg){.
229f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
22a00 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c  heRemove(pParse,
22a10 20 69 52 65 67 2c 20 6e 52 65 67 29 3b 0a 20 20   iReg, nReg);.  
22a20 69 66 28 20 6e 52 65 67 3e 70 50 61 72 73 65 2d  if( nReg>pParse-
22a30 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a 20 20  >nRangeReg ){.  
22a40 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65    pParse->nRange
22a50 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20  Reg = nReg;.    
22a60 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
22a70 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a  g = iReg;.  }.}.
22a80 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20  ./*.** Mark all 
22a90 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
22aa0 65 72 73 20 61 73 20 62 65 69 6e 67 20 75 6e 61  ers as being una
22ab0 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75  vailable for reu
22ac0 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
22ad0 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43  te3ClearTempRegC
22ae0 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72  ache(Parse *pPar
22af0 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  se){.  pParse->n
22b00 54 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 70  TempReg = 0;.  p
22b10 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
22b20 20 3d 20 30 3b 0a 7d 0a                           = 0;.}.