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

Artifact 45f814e52d2279914bd7a9141d92a26cb71b1533:


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 20 46 6f 72 77 61 72 64  t.h"../* Forward
0220: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   declarations */
0230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
0240: 72 43 6f 64 65 42 65 74 77 65 65 6e 28 50 61 72  rCodeBetween(Par
0250: 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 76 6f  se*,Expr*,int,vo
0260: 69 64 28 2a 29 28 50 61 72 73 65 2a 2c 45 78 70  id(*)(Parse*,Exp
0270: 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69 6e 74 29  r*,int,int),int)
0280: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  ;.static int exp
0290: 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
02a0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
02b0: 2a 70 2c 20 69 6e 74 20 2a 70 69 54 6f 46 72 65  *p, int *piToFre
02c0: 65 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e);.../*.** Retu
02d0: 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74 79  rn the 'affinity
02e0: 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  ' of the express
02f0: 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e 79  ion pExpr if any
0300: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
0310: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61 20   is a column, a 
0320: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 63  reference to a c
0330: 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41 53  olumn via an 'AS
0340: 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20 61  ' alias,.** or a
0350: 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74 68   sub-select with
0360: 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65   a column as the
0370: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 74   return value, t
0380: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66 69  hen the .** affi
0390: 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f 6c  nity of that col
03a0: 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  umn is returned.
03b0: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30 30   Otherwise, 0x00
03c0: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
03d0: 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 61   indicating no a
03e0: 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65 20  ffinity for the 
03f0: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
0400: 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52 45  * i.e. the WHERE
0410: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69   clause expressi
0420: 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ons in the follo
0430: 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
0440: 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20 61  all.** have an a
0450: 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20 43  ffinity:.**.** C
0460: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
0470: 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  );.** SELECT * F
0480: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b 0a  ROM t1 WHERE a;.
0490: 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20 62  ** SELECT a AS b
04a0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62   FROM t1 WHERE b
04b0: 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46 52  ;.** SELECT * FR
04c0: 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65 6c  OM t1 WHERE (sel
04d0: 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b 0a  ect a from t1);.
04e0: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 45  */.char sqlite3E
04f0: 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70 72  xprAffinity(Expr
0500: 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
0510: 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71  op;.  pExpr = sq
0520: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
0530: 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20 69  late(pExpr);.  i
0540: 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
0550: 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20 72  & EP_Generic ) r
0560: 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d 20  eturn 0;.  op = 
0570: 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28  pExpr->op;.  if(
0580: 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29   op==TK_SELECT )
0590: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
05a0: 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78 49  xpr->flags&EP_xI
05b0: 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20 72  sSelect );.    r
05c0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
05d0: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  rAffinity(pExpr-
05e0: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
05f0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
0600: 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54  .  }.  if( op==T
0610: 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20  K_REGISTER ) op 
0620: 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 23 69  = pExpr->op2;.#i
0630: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
0640: 54 5f 43 41 53 54 0a 20 20 69 66 28 20 6f 70 3d  T_CAST.  if( op=
0650: 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20 20 20  =TK_CAST ){.    
0660: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
0670: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
0680: 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
0690: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
06a0: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70  e3AffinityType(p
06b0: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
06c0: 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  0);.  }.#endif. 
06d0: 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47 47   if( (op==TK_AGG
06e0: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54  _COLUMN || op==T
06f0: 4b 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 45 78  K_COLUMN) && pEx
0700: 70 72 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20  pr->pTab!=0 ){. 
0710: 20 20 20 69 6e 74 20 6a 20 3d 20 70 45 78 70 72     int j = pExpr
0720: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69  ->iColumn;.    i
0730: 66 28 20 6a 3c 30 20 29 20 72 65 74 75 72 6e 20  f( j<0 ) return 
0740: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
0750: 45 52 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ER;.    assert( 
0760: 70 45 78 70 72 2d 3e 70 54 61 62 20 26 26 20 6a  pExpr->pTab && j
0770: 3c 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e 6e 43  <pExpr->pTab->nC
0780: 6f 6c 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ol );.    return
0790: 20 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43   pExpr->pTab->aC
07a0: 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  ol[j].affinity;.
07b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78    }.  return pEx
07c0: 70 72 2d 3e 61 66 66 69 6e 69 74 79 3b 0a 7d 0a  pr->affinity;.}.
07d0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63  ./*.** Set the c
07e0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
07f0: 65 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  e for expression
0800: 20 70 45 78 70 72 20 74 6f 20 62 65 20 74 68 65   pExpr to be the
0810: 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65   collating.** se
0820: 71 75 65 6e 63 65 20 6e 61 6d 65 64 20 62 79 20  quence named by 
0830: 70 54 6f 6b 65 6e 2e 20 20 20 52 65 74 75 72 6e  pToken.   Return
0840: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
0850: 6e 65 77 20 45 78 70 72 20 6e 6f 64 65 20 74 68  new Expr node th
0860: 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73  at.** implements
0870: 20 74 68 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65   the COLLATE ope
0880: 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rator..**.** If 
0890: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
08a0: 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ion error occurs
08b0: 2c 20 74 68 61 74 20 66 61 63 74 20 69 73 20 72  , that fact is r
08c0: 65 63 6f 72 64 65 64 20 69 6e 20 70 50 61 72 73  ecorded in pPars
08d0: 65 2d 3e 64 62 0a 2a 2a 20 61 6e 64 20 74 68 65  e->db.** and the
08e0: 20 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72   pExpr parameter
08f0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 75 6e 63   is returned unc
0900: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 45 78 70 72 20  hanged..*/.Expr 
0910: 2a 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43  *sqlite3ExprAddC
0920: 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 0a 20 20 50  ollateToken(.  P
0930: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
0940: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
0950: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
0960: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
0970: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
0980: 74 68 65 20 22 43 4f 4c 4c 41 54 45 22 20 63 6c  the "COLLATE" cl
0990: 61 75 73 65 20 74 6f 20 74 68 69 73 20 65 78 70  ause to this exp
09a0: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  ression */.  con
09b0: 73 74 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c 4e  st Token *pCollN
09c0: 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame,  /* Name of
09d0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
09e0: 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71  nce */.  int deq
09f0: 75 6f 74 65 20 20 20 20 20 20 20 20 20 20 20 20  uote            
0a00: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 71    /* True to deq
0a10: 75 6f 74 65 20 70 43 6f 6c 6c 4e 61 6d 65 20 2a  uote pCollName *
0a20: 2f 0a 29 7b 0a 20 20 69 66 28 20 70 43 6f 6c 6c  /.){.  if( pColl
0a30: 4e 61 6d 65 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20  Name->n>0 ){.   
0a40: 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71   Expr *pNew = sq
0a50: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70  lite3ExprAlloc(p
0a60: 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 43 4f  Parse->db, TK_CO
0a70: 4c 4c 41 54 45 2c 20 70 43 6f 6c 6c 4e 61 6d 65  LLATE, pCollName
0a80: 2c 20 64 65 71 75 6f 74 65 29 3b 0a 20 20 20 20  , dequote);.    
0a90: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
0aa0: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
0ab0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65  pExpr;.      pNe
0ac0: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43  w->flags |= EP_C
0ad0: 6f 6c 6c 61 74 65 7c 45 50 5f 53 6b 69 70 3b 0a  ollate|EP_Skip;.
0ae0: 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e        pExpr = pN
0af0: 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ew;.    }.  }.  
0b00: 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
0b10: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
0b20: 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e  rAddCollateStrin
0b30: 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  g(Parse *pParse,
0b40: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 6f   Expr *pExpr, co
0b50: 6e 73 74 20 63 68 61 72 20 2a 7a 43 29 7b 0a 20  nst char *zC){. 
0b60: 20 54 6f 6b 65 6e 20 73 3b 0a 20 20 61 73 73 65   Token s;.  asse
0b70: 72 74 28 20 7a 43 21 3d 30 20 29 3b 0a 20 20 73  rt( zC!=0 );.  s
0b80: 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28  qlite3TokenInit(
0b90: 26 73 2c 20 28 63 68 61 72 2a 29 7a 43 29 3b 0a  &s, (char*)zC);.
0ba0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
0bb0: 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f  ExprAddCollateTo
0bc0: 6b 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70  ken(pParse, pExp
0bd0: 72 2c 20 26 73 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  r, &s, 0);.}../*
0be0: 0a 2a 2a 20 53 6b 69 70 20 6f 76 65 72 20 61 6e  .** Skip over an
0bf0: 79 20 54 4b 5f 43 4f 4c 4c 41 54 45 20 6f 70 65  y TK_COLLATE ope
0c00: 72 61 74 6f 72 73 20 61 6e 64 20 61 6e 79 20 75  rators and any u
0c10: 6e 6c 69 6b 65 6c 79 28 29 0a 2a 2a 20 6f 72 20  nlikely().** or 
0c20: 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 66 75 6e  likelihood() fun
0c30: 63 74 69 6f 6e 20 61 74 20 74 68 65 20 72 6f 6f  ction at the roo
0c40: 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
0c50: 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  on..*/.Expr *sql
0c60: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
0c70: 61 74 65 28 45 78 70 72 20 2a 70 45 78 70 72 29  ate(Expr *pExpr)
0c80: 7b 0a 20 20 77 68 69 6c 65 28 20 70 45 78 70 72  {.  while( pExpr
0c90: 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65   && ExprHasPrope
0ca0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 6b  rty(pExpr, EP_Sk
0cb0: 69 70 29 20 29 7b 0a 20 20 20 20 69 66 28 20 45  ip) ){.    if( E
0cc0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
0cd0: 45 78 70 72 2c 20 45 50 5f 55 6e 6c 69 6b 65 6c  Expr, EP_Unlikel
0ce0: 79 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  y) ){.      asse
0cf0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
0d00: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
0d10: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
0d20: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
0d30: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
0d40: 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >0 );.      asse
0d50: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
0d60: 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  K_FUNCTION );.  
0d70: 20 20 20 20 70 45 78 70 72 20 3d 20 70 45 78 70      pExpr = pExp
0d80: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d  r->x.pList->a[0]
0d90: 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73  .pExpr;.    }els
0da0: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
0db0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
0dc0: 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20 20 20  OLLATE );.      
0dd0: 70 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 70  pExpr = pExpr->p
0de0: 4c 65 66 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  Left;.    }.  } 
0df0: 20 20 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70    .  return pExp
0e00: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  r;.}../*.** Retu
0e10: 72 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  rn the collation
0e20: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
0e30: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
0e40: 70 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20  pr. If.** there 
0e50: 69 73 20 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f  is no defined co
0e60: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
0e70: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  , return NULL..*
0e80: 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69  *.** The collati
0e90: 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 69 67 68  ng sequence migh
0ea0: 74 20 62 65 20 64 65 74 65 72 6d 69 6e 65 64 20  t be determined 
0eb0: 62 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65  by a COLLATE ope
0ec0: 72 61 74 6f 72 0a 2a 2a 20 6f 72 20 62 79 20 74  rator.** or by t
0ed0: 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 61  he presence of a
0ee0: 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 61 20 64   column with a d
0ef0: 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67  efined collating
0f00: 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 20 43 4f   sequence..** CO
0f10: 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73 20  LLATE operators 
0f20: 74 61 6b 65 20 66 69 72 73 74 20 70 72 65 63 65  take first prece
0f30: 64 65 6e 63 65 2e 20 20 4c 65 66 74 20 6f 70 65  dence.  Left ope
0f40: 72 61 6e 64 73 20 74 61 6b 65 0a 2a 2a 20 70 72  rands take.** pr
0f50: 65 63 65 64 65 6e 63 65 20 6f 76 65 72 20 72 69  ecedence over ri
0f60: 67 68 74 20 6f 70 65 72 61 6e 64 73 2e 0a 2a 2f  ght operands..*/
0f70: 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65  .CollSeq *sqlite
0f80: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 50 61 72  3ExprCollSeq(Par
0f90: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
0fa0: 20 2a 70 45 78 70 72 29 7b 0a 20 20 73 71 6c 69   *pExpr){.  sqli
0fb0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
0fc0: 2d 3e 64 62 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  ->db;.  CollSeq 
0fd0: 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 45 78  *pColl = 0;.  Ex
0fe0: 70 72 20 2a 70 20 3d 20 70 45 78 70 72 3b 0a 20  pr *p = pExpr;. 
0ff0: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
1000: 20 69 6e 74 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b   int op = p->op;
1010: 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  .    if( p->flag
1020: 73 20 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29  s & EP_Generic )
1030: 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
1040: 6f 70 3d 3d 54 4b 5f 43 41 53 54 20 7c 7c 20 6f  op==TK_CAST || o
1050: 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 7b 0a 20  p==TK_UPLUS ){. 
1060: 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66       p = p->pLef
1070: 74 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  t;.      continu
1080: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
1090: 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20   op==TK_COLLATE 
10a0: 7c 7c 20 28 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  || (op==TK_REGIS
10b0: 54 45 52 20 26 26 20 70 2d 3e 6f 70 32 3d 3d 54  TER && p->op2==T
10c0: 4b 5f 43 4f 4c 4c 41 54 45 29 20 29 7b 0a 20 20  K_COLLATE) ){.  
10d0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
10e0: 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50  te3GetCollSeq(pP
10f0: 61 72 73 65 2c 20 45 4e 43 28 64 62 29 2c 20 30  arse, ENC(db), 0
1100: 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  , p->u.zToken);.
1110: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1120: 20 7d 0a 20 20 20 20 69 66 28 20 28 6f 70 3d 3d   }.    if( (op==
1130: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c 7c  TK_AGG_COLUMN ||
1140: 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20   op==TK_COLUMN. 
1150: 20 20 20 20 20 20 20 20 20 7c 7c 20 6f 70 3d 3d           || op==
1160: 54 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f  TK_REGISTER || o
1170: 70 3d 3d 54 4b 5f 54 52 49 47 47 45 52 29 0a 20  p==TK_TRIGGER). 
1180: 20 20 20 20 26 26 20 70 2d 3e 70 54 61 62 21 3d      && p->pTab!=
1190: 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  0.    ){.      /
11a0: 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  * op==TK_REGISTE
11b0: 52 20 26 26 20 70 2d 3e 70 54 61 62 21 3d 30 20  R && p->pTab!=0 
11c0: 68 61 70 70 65 6e 73 20 77 68 65 6e 20 70 45 78  happens when pEx
11d0: 70 72 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c  pr was originall
11e0: 79 0a 20 20 20 20 20 20 2a 2a 20 61 20 54 4b 5f  y.      ** a TK_
11f0: 43 4f 4c 55 4d 4e 20 62 75 74 20 77 61 73 20 70  COLUMN but was p
1200: 72 65 76 69 6f 75 73 6c 79 20 65 76 61 6c 75 61  reviously evalua
1210: 74 65 64 20 61 6e 64 20 63 61 63 68 65 64 20 69  ted and cached i
1220: 6e 20 61 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  n a register */.
1230: 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 2d        int j = p-
1240: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
1250: 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20 20  if( j>=0 ){.    
1260: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1270: 7a 43 6f 6c 6c 20 3d 20 70 2d 3e 70 54 61 62 2d  zColl = p->pTab-
1280: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a  >aCol[j].zColl;.
1290: 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
12a0: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
12b0: 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20  eq(db, ENC(db), 
12c0: 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20  zColl, 0);.     
12d0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
12e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
12f0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
1300: 61 74 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ate ){.      if(
1310: 20 70 2d 3e 70 4c 65 66 74 20 26 26 20 28 70 2d   p->pLeft && (p-
1320: 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20  >pLeft->flags & 
1330: 45 50 5f 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29  EP_Collate)!=0 )
1340: 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 2d  {.        p = p-
1350: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 65  >pLeft;.      }e
1360: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 78 70  lse{.        Exp
1370: 72 20 2a 70 4e 65 78 74 20 20 3d 20 70 2d 3e 70  r *pNext  = p->p
1380: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 2f  Right;.        /
1390: 2a 20 54 68 65 20 45 78 70 72 2e 78 20 75 6e 69  * The Expr.x uni
13a0: 6f 6e 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  on is never used
13b0: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
13c0: 65 20 61 73 20 45 78 70 72 2e 70 52 69 67 68 74  e as Expr.pRight
13d0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
13e0: 72 74 28 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d  rt( p->x.pList==
13f0: 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d  0 || p->pRight==
1400: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 );.        /* 
1410: 70 2d 3e 66 6c 61 67 73 20 68 6f 6c 64 73 20 45  p->flags holds E
1420: 50 5f 43 6f 6c 6c 61 74 65 20 61 6e 64 20 70 2d  P_Collate and p-
1430: 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 64 6f  >pLeft->flags do
1440: 65 73 20 6e 6f 74 2e 20 20 41 6e 64 0a 20 20 20  es not.  And.   
1450: 20 20 20 20 20 2a 2a 20 70 2d 3e 78 2e 70 53 65       ** p->x.pSe
1460: 6c 65 63 74 20 63 61 6e 6e 6f 74 2e 20 20 53 6f  lect cannot.  So
1470: 20 69 66 20 70 2d 3e 78 2e 70 4c 65 66 74 20 65   if p->x.pLeft e
1480: 78 69 73 74 73 2c 20 69 74 20 6d 75 73 74 20 68  xists, it must h
1490: 6f 6c 64 20 61 74 0a 20 20 20 20 20 20 20 20 2a  old at.        *
14a0: 2a 20 6c 65 61 73 74 20 6f 6e 65 20 45 50 5f 43  * least one EP_C
14b0: 6f 6c 6c 61 74 65 2e 20 54 68 75 73 20 74 68 65  ollate. Thus the
14c0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 41   following two A
14d0: 4c 57 41 59 53 2e 20 2a 2f 0a 20 20 20 20 20 20  LWAYS. */.      
14e0: 20 20 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74    if( p->x.pList
14f0: 21 3d 30 20 26 26 20 41 4c 57 41 59 53 28 21 45  !=0 && ALWAYS(!E
1500: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1510: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 29  , EP_xIsSelect))
1520: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
1530: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 66  t i;.          f
1540: 6f 72 28 69 3d 30 3b 20 41 4c 57 41 59 53 28 69  or(i=0; ALWAYS(i
1550: 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  <p->x.pList->nEx
1560: 70 72 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  pr); i++){.     
1570: 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48         if( ExprH
1580: 61 73 50 72 6f 70 65 72 74 79 28 70 2d 3e 78 2e  asProperty(p->x.
1590: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
15a0: 72 2c 20 45 50 5f 43 6f 6c 6c 61 74 65 29 20 29  r, EP_Collate) )
15b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
15c0: 70 4e 65 78 74 20 3d 20 70 2d 3e 78 2e 70 4c 69  pNext = p->x.pLi
15d0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
15e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
15f0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
1600: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
1610: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1620: 20 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20   p = pNext;.    
1630: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
1640: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1650: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  }.  }.  if( sqli
1660: 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28  te3CheckCollSeq(
1670: 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29  pParse, pColl) )
1680: 7b 20 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30  { .    pColl = 0
1690: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
16a0: 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  Coll;.}../*.** p
16b0: 45 78 70 72 20 69 73 20 61 6e 20 6f 70 65 72 61  Expr is an opera
16c0: 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73  nd of a comparis
16d0: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 61 66  on operator.  af
16e0: 66 32 20 69 73 20 74 68 65 0a 2a 2a 20 74 79 70  f2 is the.** typ
16f0: 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68  e affinity of th
1700: 65 20 6f 74 68 65 72 20 6f 70 65 72 61 6e 64 2e  e other operand.
1710: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72    This routine r
1720: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 74 79  eturns the.** ty
1730: 70 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74  pe affinity that
1740: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
1750: 66 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73  for the comparis
1760: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a  on operator..*/.
1770: 63 68 61 72 20 73 71 6c 69 74 65 33 43 6f 6d 70  char sqlite3Comp
1780: 61 72 65 41 66 66 69 6e 69 74 79 28 45 78 70 72  areAffinity(Expr
1790: 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20 61 66   *pExpr, char af
17a0: 66 32 29 7b 0a 20 20 63 68 61 72 20 61 66 66 31  f2){.  char aff1
17b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
17c0: 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20  finity(pExpr);. 
17d0: 20 69 66 28 20 61 66 66 31 20 26 26 20 61 66 66   if( aff1 && aff
17e0: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42 6f 74 68  2 ){.    /* Both
17f0: 20 73 69 64 65 73 20 6f 66 20 74 68 65 20 63 6f   sides of the co
1800: 6d 70 61 72 69 73 6f 6e 20 61 72 65 20 63 6f 6c  mparison are col
1810: 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20 68 61 73  umns. If one has
1820: 20 6e 75 6d 65 72 69 63 0a 20 20 20 20 2a 2a 20   numeric.    ** 
1830: 61 66 66 69 6e 69 74 79 2c 20 75 73 65 20 74 68  affinity, use th
1840: 61 74 2e 20 4f 74 68 65 72 77 69 73 65 20 75 73  at. Otherwise us
1850: 65 20 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20  e no affinity.. 
1860: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71     */.    if( sq
1870: 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66  lite3IsNumericAf
1880: 66 69 6e 69 74 79 28 61 66 66 31 29 20 7c 7c 20  finity(aff1) || 
1890: 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63  sqlite3IsNumeric
18a0: 41 66 66 69 6e 69 74 79 28 61 66 66 32 29 20 29  Affinity(aff2) )
18b0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
18c0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
18d0: 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  C;.    }else{.  
18e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18f0: 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20  E_AFF_BLOB;.    
1900: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61  }.  }else if( !a
1910: 66 66 31 20 26 26 20 21 61 66 66 32 20 29 7b 0a  ff1 && !aff2 ){.
1920: 20 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 73      /* Neither s
1930: 69 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 61  ide of the compa
1940: 72 69 73 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  rison is a colum
1950: 6e 2e 20 20 43 6f 6d 70 61 72 65 20 74 68 65 0a  n.  Compare the.
1960: 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 20 64      ** results d
1970: 69 72 65 63 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a  irectly..    */.
1980: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1990: 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d 65  E_AFF_BLOB;.  }e
19a0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20  lse{.    /* One 
19b0: 73 69 64 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e  side is a column
19c0: 2c 20 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e  , the other is n
19d0: 6f 74 2e 20 55 73 65 20 74 68 65 20 63 6f 6c 75  ot. Use the colu
19e0: 6d 6e 73 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f  mns affinity. */
19f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 66 66  .    assert( aff
1a00: 31 3d 3d 30 20 7c 7c 20 61 66 66 32 3d 3d 30 20  1==0 || aff2==0 
1a10: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 61  );.    return (a
1a20: 66 66 31 20 2b 20 61 66 66 32 29 3b 0a 20 20 7d  ff1 + aff2);.  }
1a30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
1a40: 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  is a comparison 
1a50: 6f 70 65 72 61 74 6f 72 2e 20 20 52 65 74 75 72  operator.  Retur
1a60: 6e 20 74 68 65 20 74 79 70 65 20 61 66 66 69 6e  n the type affin
1a70: 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64 0a  ity that should.
1a80: 2a 2a 20 62 65 20 61 70 70 6c 69 65 64 20 74 6f  ** be applied to
1a90: 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 70   both operands p
1aa0: 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 74 68  rior to doing th
1ab0: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f  e comparison..*/
1ac0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 63 6f 6d  .static char com
1ad0: 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28  parisonAffinity(
1ae0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
1af0: 63 68 61 72 20 61 66 66 3b 0a 20 20 61 73 73 65  char aff;.  asse
1b00: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
1b10: 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_EQ || pExpr->o
1b20: 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70 45 78 70  p==TK_IN || pExp
1b30: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a  r->op==TK_LT ||.
1b40: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1b50: 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70 45  >op==TK_GT || pE
1b60: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c  xpr->op==TK_GE |
1b70: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
1b80: 4c 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  LE ||.          
1b90: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45  pExpr->op==TK_NE
1ba0: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
1bb0: 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_IS || pExpr->o
1bc0: 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20  p==TK_ISNOT );. 
1bd0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1be0: 70 4c 65 66 74 20 29 3b 0a 20 20 61 66 66 20 3d  pLeft );.  aff =
1bf0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
1c00: 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66  nity(pExpr->pLef
1c10: 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  t);.  if( pExpr-
1c20: 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 61  >pRight ){.    a
1c30: 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ff = sqlite3Comp
1c40: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70  areAffinity(pExp
1c50: 72 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 29 3b  r->pRight, aff);
1c60: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70  .  }else if( Exp
1c70: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1c80: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
1c90: 29 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73  ) ){.    aff = s
1ca0: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
1cb0: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 78 2e 70  inity(pExpr->x.p
1cc0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
1cd0: 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61 66 66 29  a[0].pExpr, aff)
1ce0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4e 45  ;.  }else if( NE
1cf0: 56 45 52 28 61 66 66 3d 3d 30 29 20 29 7b 0a 20  VER(aff==0) ){. 
1d00: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
1d10: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20  AFF_BLOB;.  }.  
1d20: 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f  return aff;.}../
1d30: 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20  *.** pExpr is a 
1d40: 63 6f 6d 70 61 72 69 73 6f 6e 20 65 78 70 72 65  comparison expre
1d50: 73 73 69 6f 6e 2c 20 65 67 2e 20 27 3d 27 2c 20  ssion, eg. '=', 
1d60: 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20 65 74 63  '<', IN(...) etc
1d70: 2e 0a 2a 2a 20 69 64 78 5f 61 66 66 69 6e 69 74  ..** idx_affinit
1d80: 79 20 69 73 20 74 68 65 20 61 66 66 69 6e 69 74  y is the affinit
1d90: 79 20 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20  y of an indexed 
1da0: 63 6f 6c 75 6d 6e 2e 20 52 65 74 75 72 6e 20 74  column. Return t
1db0: 72 75 65 0a 2a 2a 20 69 66 20 74 68 65 20 69 6e  rue.** if the in
1dc0: 64 65 78 20 77 69 74 68 20 61 66 66 69 6e 69 74  dex with affinit
1dd0: 79 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20 6d  y idx_affinity m
1de0: 61 79 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d  ay be used to im
1df0: 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 63  plement.** the c
1e00: 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20 70 45 78  omparison in pEx
1e10: 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  pr..*/.int sqlit
1e20: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f  e3IndexAffinityO
1e30: 6b 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63  k(Expr *pExpr, c
1e40: 68 61 72 20 69 64 78 5f 61 66 66 69 6e 69 74 79  har idx_affinity
1e50: 29 7b 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20  ){.  char aff = 
1e60: 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
1e70: 74 79 28 70 45 78 70 72 29 3b 0a 20 20 73 77 69  ty(pExpr);.  swi
1e80: 74 63 68 28 20 61 66 66 20 29 7b 0a 20 20 20 20  tch( aff ){.    
1e90: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f  case SQLITE_AFF_
1ea0: 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75  BLOB:.      retu
1eb0: 72 6e 20 31 3b 0a 20 20 20 20 63 61 73 65 20 53  rn 1;.    case S
1ec0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a  QLITE_AFF_TEXT:.
1ed0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 64 78        return idx
1ee0: 5f 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  _affinity==SQLIT
1ef0: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
1f00: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72  default:.      r
1f10: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 73 4e  eturn sqlite3IsN
1f20: 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 69  umericAffinity(i
1f30: 64 78 5f 61 66 66 69 6e 69 74 79 29 3b 0a 20 20  dx_affinity);.  
1f40: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
1f50: 6e 20 74 68 65 20 50 35 20 76 61 6c 75 65 20 74  n the P5 value t
1f60: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
1f70: 65 64 20 66 6f 72 20 61 20 62 69 6e 61 72 79 20  ed for a binary 
1f80: 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70  comparison.** op
1f90: 63 6f 64 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f  code (OP_Eq, OP_
1fa0: 47 65 20 65 74 63 2e 29 20 75 73 65 64 20 74 6f  Ge etc.) used to
1fb0: 20 63 6f 6d 70 61 72 65 20 70 45 78 70 72 31 20   compare pExpr1 
1fc0: 61 6e 64 20 70 45 78 70 72 32 2e 0a 2a 2f 0a 73  and pExpr2..*/.s
1fd0: 74 61 74 69 63 20 75 38 20 62 69 6e 61 72 79 43  tatic u8 binaryC
1fe0: 6f 6d 70 61 72 65 50 35 28 45 78 70 72 20 2a 70  ompareP5(Expr *p
1ff0: 45 78 70 72 31 2c 20 45 78 70 72 20 2a 70 45 78  Expr1, Expr *pEx
2000: 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  pr2, int jumpIfN
2010: 75 6c 6c 29 7b 0a 20 20 75 38 20 61 66 66 20 3d  ull){.  u8 aff =
2020: 20 28 63 68 61 72 29 73 71 6c 69 74 65 33 45 78   (char)sqlite3Ex
2030: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
2040: 32 29 3b 0a 20 20 61 66 66 20 3d 20 28 75 38 29  2);.  aff = (u8)
2050: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
2060: 66 69 6e 69 74 79 28 70 45 78 70 72 31 2c 20 61  finity(pExpr1, a
2070: 66 66 29 20 7c 20 28 75 38 29 6a 75 6d 70 49 66  ff) | (u8)jumpIf
2080: 4e 75 6c 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61  Null;.  return a
2090: 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ff;.}../*.** Ret
20a0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
20b0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
20c0: 65 71 75 65 6e 63 65 20 74 68 61 74 20 73 68 6f  equence that sho
20d0: 75 6c 64 20 62 65 20 75 73 65 64 20 62 79 0a 2a  uld be used by.*
20e0: 2a 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61  * a binary compa
20f0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 63  rison operator c
2100: 6f 6d 70 61 72 69 6e 67 20 70 4c 65 66 74 20 61  omparing pLeft a
2110: 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a  nd pRight..**.**
2120: 20 49 66 20 74 68 65 20 6c 65 66 74 20 68 61 6e   If the left han
2130: 64 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73  d expression has
2140: 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   a collating seq
2150: 75 65 6e 63 65 20 74 79 70 65 2c 20 74 68 65 6e  uence type, then
2160: 20 69 74 20 69 73 0a 2a 2a 20 75 73 65 64 2e 20   it is.** used. 
2170: 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 63 6f  Otherwise the co
2180: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
2190: 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 20 68   for the right h
21a0: 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  and expression.*
21b0: 2a 20 69 73 20 75 73 65 64 2c 20 6f 72 20 74 68  * is used, or th
21c0: 65 20 64 65 66 61 75 6c 74 20 28 42 49 4e 41 52  e default (BINAR
21d0: 59 29 20 69 66 20 6e 65 69 74 68 65 72 20 65 78  Y) if neither ex
21e0: 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63  pression has a c
21f0: 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74 79 70 65  ollating.** type
2200: 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
2210: 20 70 52 69 67 68 74 20 28 62 75 74 20 6e 6f 74   pRight (but not
2220: 20 70 4c 65 66 74 29 20 6d 61 79 20 62 65 20 61   pLeft) may be a
2230: 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 49   null pointer. I
2240: 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20  n this case,.** 
2250: 69 74 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64  it is not consid
2260: 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71  ered..*/.CollSeq
2270: 20 2a 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43   *sqlite3BinaryC
2280: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20  ompareCollSeq(. 
2290: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
22a0: 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20  .  Expr *pLeft, 
22b0: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 0a  .  Expr *pRight.
22c0: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
22d0: 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70  oll;.  assert( p
22e0: 4c 65 66 74 20 29 3b 0a 20 20 69 66 28 20 70 4c  Left );.  if( pL
22f0: 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  eft->flags & EP_
2300: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 70  Collate ){.    p
2310: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
2320: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
2330: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 7d 65 6c 73  , pLeft);.  }els
2340: 65 20 69 66 28 20 70 52 69 67 68 74 20 26 26 20  e if( pRight && 
2350: 28 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26  (pRight->flags &
2360: 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21 3d 30 20   EP_Collate)!=0 
2370: 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  ){.    pColl = s
2380: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
2390: 71 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  q(pParse, pRight
23a0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
23b0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
23c0: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
23d0: 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69  e, pLeft);.    i
23e0: 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
23f0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
2400: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
2410: 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20  arse, pRight);. 
2420: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2430: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pColl;.}../*.*
2440: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
2450: 66 6f 72 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e  for a comparison
2460: 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74   operator..*/.st
2470: 61 74 69 63 20 69 6e 74 20 63 6f 64 65 43 6f 6d  atic int codeCom
2480: 70 61 72 65 28 0a 20 20 50 61 72 73 65 20 2a 70  pare(.  Parse *p
2490: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 54 68 65  Parse,    /* The
24a0: 20 70 61 72 73 69 6e 67 20 28 61 6e 64 20 63 6f   parsing (and co
24b0: 64 65 20 67 65 6e 65 72 61 74 69 6e 67 29 20 63  de generating) c
24c0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
24d0: 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 2f 2a   *pLeft,      /*
24e0: 20 54 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e   The left operan
24f0: 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69  d */.  Expr *pRi
2500: 67 68 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  ght,     /* The 
2510: 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f  right operand */
2520: 0a 20 20 69 6e 74 20 6f 70 63 6f 64 65 2c 20 20  .  int opcode,  
2530: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
2540: 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f  arison opcode */
2550: 0a 20 20 69 6e 74 20 69 6e 31 2c 20 69 6e 74 20  .  int in1, int 
2560: 69 6e 32 2c 20 2f 2a 20 52 65 67 69 73 74 65 72  in2, /* Register
2570: 20 68 6f 6c 64 69 6e 67 20 6f 70 65 72 61 6e 64   holding operand
2580: 73 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c  s */.  int dest,
2590: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
25a0: 20 68 65 72 65 20 69 66 20 74 72 75 65 2e 20 20   here if true.  
25b0: 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e  */.  int jumpIfN
25c0: 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20 74 72 75  ull    /* If tru
25d0: 65 2c 20 6a 75 6d 70 20 69 66 20 65 69 74 68 65  e, jump if eithe
25e0: 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c  r operand is NUL
25f0: 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 35  L */.){.  int p5
2600: 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20  ;.  int addr;.  
2610: 43 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a 0a 20 20  CollSeq *p4;..  
2620: 70 34 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  p4 = sqlite3Bina
2630: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
2640: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
2650: 70 52 69 67 68 74 29 3b 0a 20 20 70 35 20 3d 20  pRight);.  p5 = 
2660: 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28  binaryCompareP5(
2670: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 6a  pLeft, pRight, j
2680: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 61 64  umpIfNull);.  ad
2690: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
26a0: 41 64 64 4f 70 34 28 70 50 61 72 73 65 2d 3e 70  AddOp4(pParse->p
26b0: 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c 20 69 6e  Vdbe, opcode, in
26c0: 32 2c 20 64 65 73 74 2c 20 69 6e 31 2c 0a 20 20  2, dest, in1,.  
26d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e0: 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
26f0: 70 34 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  p4, P4_COLLSEQ);
2700: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
2710: 61 6e 67 65 50 35 28 70 50 61 72 73 65 2d 3e 70  angeP5(pParse->p
2720: 56 64 62 65 2c 20 28 75 38 29 70 35 29 3b 0a 20  Vdbe, (u8)p5);. 
2730: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
2740: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
2750: 75 65 20 69 66 20 65 78 70 72 65 73 73 69 6f 6e  ue if expression
2760: 20 70 45 78 70 72 20 69 73 20 61 20 76 65 63 74   pExpr is a vect
2770: 6f 72 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68  or, or false oth
2780: 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  erwise..**.** A 
2790: 76 65 63 74 6f 72 20 69 73 20 64 65 66 69 6e 65  vector is define
27a0: 64 20 61 73 20 61 6e 79 20 65 78 70 72 65 73 73  d as any express
27b0: 69 6f 6e 20 74 68 61 74 20 72 65 73 75 6c 74 73  ion that results
27c0: 20 69 6e 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a   in two or more.
27d0: 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 72 65  ** columns of re
27e0: 73 75 6c 74 2e 20 20 45 76 65 72 79 20 54 4b 5f  sult.  Every TK_
27f0: 56 45 43 54 4f 52 20 6e 6f 64 65 20 69 73 20 61  VECTOR node is a
2800: 6e 20 76 65 63 74 6f 72 20 62 65 63 61 75 73 65  n vector because
2810: 20 74 68 65 0a 2a 2a 20 70 61 72 73 65 72 20 77   the.** parser w
2820: 69 6c 6c 20 6e 6f 74 20 67 65 6e 65 72 61 74 65  ill not generate
2830: 20 61 20 54 4b 5f 56 45 43 54 4f 52 20 77 69 74   a TK_VECTOR wit
2840: 68 20 66 65 77 65 72 20 74 68 61 6e 20 74 77 6f  h fewer than two
2850: 20 65 6e 74 72 69 65 73 2e 0a 2a 2a 20 42 75 74   entries..** But
2860: 20 61 20 54 4b 5f 53 45 4c 45 43 54 20 6d 69 67   a TK_SELECT mig
2870: 68 74 20 62 65 20 65 69 74 68 65 72 20 61 20 76  ht be either a v
2880: 65 63 74 6f 72 20 6f 72 20 61 20 73 63 61 6c 61  ector or a scala
2890: 72 2e 20 49 74 20 69 73 20 6f 6e 6c 79 0a 2a 2a  r. It is only.**
28a0: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 65   considered a ve
28b0: 63 74 6f 72 20 69 66 20 69 74 20 68 61 73 20 74  ctor if it has t
28c0: 77 6f 20 6f 72 20 6d 6f 72 65 20 72 65 73 75 6c  wo or more resul
28d0: 74 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 69 6e  t columns..*/.in
28e0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56  t sqlite3ExprIsV
28f0: 65 63 74 6f 72 28 45 78 70 72 20 2a 70 45 78 70  ector(Expr *pExp
2900: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  r){.  return sql
2910: 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
2920: 7a 65 28 70 45 78 70 72 29 3e 31 3b 0a 7d 0a 0a  ze(pExpr)>1;.}..
2930: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
2940: 72 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61  ression passed a
2950: 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
2960: 65 6e 74 20 69 73 20 6f 66 20 74 79 70 65 20 54  ent is of type T
2970: 4b 5f 56 45 43 54 4f 52 20 0a 2a 2a 20 72 65 74  K_VECTOR .** ret
2980: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
2990: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  f expressions in
29a0: 20 74 68 65 20 76 65 63 74 6f 72 2e 20 4f 72 2c   the vector. Or,
29b0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
29c0: 6f 6e 0a 2a 2a 20 69 73 20 61 20 73 75 62 2d 73  on.** is a sub-s
29d0: 65 6c 65 63 74 2c 20 72 65 74 75 72 6e 20 74 68  elect, return th
29e0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
29f0: 6d 6e 73 20 69 6e 20 74 68 65 20 73 75 62 2d 73  mns in the sub-s
2a00: 65 6c 65 63 74 2e 20 46 6f 72 0a 2a 2a 20 61 6e  elect. For.** an
2a10: 79 20 6f 74 68 65 72 20 74 79 70 65 20 6f 66 20  y other type of 
2a20: 65 78 70 72 65 73 73 69 6f 6e 2c 20 72 65 74 75  expression, retu
2a30: 72 6e 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rn 1..*/.int sql
2a40: 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
2a50: 7a 65 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  ze(Expr *pExpr){
2a60: 0a 20 20 75 38 20 6f 70 20 3d 20 70 45 78 70 72  .  u8 op = pExpr
2a70: 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
2a80: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
2a90: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 20   = pExpr->op2;. 
2aa0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 45 43 54   if( op==TK_VECT
2ab0: 4f 52 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OR ){.    return
2ac0: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
2ad0: 3e 6e 45 78 70 72 3b 0a 20 20 7d 65 6c 73 65 20  >nExpr;.  }else 
2ae0: 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  if( op==TK_SELEC
2af0: 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  T ){.    return 
2b00: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
2b10: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
2b20: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
2b30: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 23  turn 1;.  }.}..#
2b40: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2b50: 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
2b60: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
2b70: 65 72 20 74 6f 20 61 20 73 75 62 65 78 70 72 65  er to a subexpre
2b80: 73 73 69 6f 6e 20 6f 66 20 70 56 65 63 74 6f 72  ssion of pVector
2b90: 20 74 68 61 74 20 69 73 20 74 68 65 20 69 2d 74   that is the i-t
2ba0: 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  h.** column of t
2bb0: 68 65 20 76 65 63 74 6f 72 20 28 6e 75 6d 62 65  he vector (numbe
2bc0: 72 65 64 20 73 74 61 72 74 69 6e 67 20 77 69 74  red starting wit
2bd0: 68 20 30 29 2e 20 20 54 68 65 20 63 61 6c 6c 65  h 0).  The calle
2be0: 72 20 6d 75 73 74 0a 2a 2a 20 65 6e 73 75 72 65  r must.** ensure
2bf0: 20 74 68 61 74 20 69 20 69 73 20 77 69 74 68 69   that i is withi
2c00: 6e 20 72 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 49  n range..**.** I
2c10: 66 20 70 56 65 63 74 6f 72 20 69 73 20 72 65 61  f pVector is rea
2c20: 6c 6c 79 20 61 20 73 63 61 6c 61 72 20 28 61 6e  lly a scalar (an
2c30: 64 20 22 73 63 61 6c 61 72 22 20 68 65 72 65 20  d "scalar" here 
2c40: 69 6e 63 6c 75 64 65 73 20 73 75 62 71 75 65 72  includes subquer
2c50: 69 65 73 0a 2a 2a 20 74 68 61 74 20 72 65 74 75  ies.** that retu
2c60: 72 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  rn a single colu
2c70: 6d 6e 21 29 20 74 68 65 6e 20 72 65 74 75 72 6e  mn!) then return
2c80: 20 70 56 65 63 74 6f 72 20 75 6e 6d 6f 64 69 66   pVector unmodif
2c90: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 70 56 65 63 74  ied..**.** pVect
2ca0: 6f 72 20 72 65 74 61 69 6e 73 20 6f 77 6e 65 72  or retains owner
2cb0: 73 68 69 70 20 6f 66 20 74 68 65 20 72 65 74 75  ship of the retu
2cc0: 72 6e 65 64 20 73 75 62 65 78 70 72 65 73 73 69  rned subexpressi
2cd0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  on..**.** If the
2ce0: 20 76 65 63 74 6f 72 20 69 73 20 61 20 28 53 45   vector is a (SE
2cf0: 4c 45 43 54 20 2e 2e 2e 29 20 74 68 65 6e 20 74  LECT ...) then t
2d00: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  he expression re
2d10: 74 75 72 6e 65 64 20 69 73 0a 2a 2a 20 6a 75 73  turned is.** jus
2d20: 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
2d30: 20 66 6f 72 20 74 68 65 20 69 2d 74 68 20 74 65   for the i-th te
2d40: 72 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rm of the result
2d50: 20 73 65 74 2c 20 61 6e 64 20 6d 61 79 0a 2a 2a   set, and may.**
2d60: 20 6e 6f 74 20 62 65 20 72 65 61 64 79 20 66 6f   not be ready fo
2d70: 72 20 65 76 61 6c 75 61 74 69 6f 6e 20 62 65 63  r evaluation bec
2d80: 61 75 73 65 20 74 68 65 20 74 61 62 6c 65 20 63  ause the table c
2d90: 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 79 65  ursor has not ye
2da0: 74 0a 2a 2a 20 62 65 65 6e 20 70 6f 73 69 74 69  t.** been positi
2db0: 6f 6e 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  oned..*/.Expr *s
2dc0: 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
2dd0: 64 53 75 62 65 78 70 72 28 45 78 70 72 20 2a 70  dSubexpr(Expr *p
2de0: 56 65 63 74 6f 72 2c 20 69 6e 74 20 69 29 7b 0a  Vector, int i){.
2df0: 20 20 61 73 73 65 72 74 28 20 69 3c 73 71 6c 69    assert( i<sqli
2e00: 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
2e10: 65 28 70 56 65 63 74 6f 72 29 20 29 3b 0a 20 20  e(pVector) );.  
2e20: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
2e30: 73 56 65 63 74 6f 72 28 70 56 65 63 74 6f 72 29  sVector(pVector)
2e40: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 56 65 63   ){.    if( pVec
2e50: 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  tor->op==TK_SELE
2e60: 43 54 0a 20 20 20 20 20 7c 7c 20 28 70 56 65 63  CT.     || (pVec
2e70: 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49  tor->op==TK_REGI
2e80: 53 54 45 52 20 26 26 20 70 56 65 63 74 6f 72 2d  STER && pVector-
2e90: 3e 6f 70 32 3d 3d 54 4b 5f 53 45 4c 45 43 54 29  >op2==TK_SELECT)
2ea0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
2eb0: 74 75 72 6e 20 70 56 65 63 74 6f 72 2d 3e 78 2e  turn pVector->x.
2ec0: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
2ed0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
2ee0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
2ef0: 74 75 72 6e 20 70 56 65 63 74 6f 72 2d 3e 78 2e  turn pVector->x.
2f00: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
2f10: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  r;.    }.  }.  r
2f20: 65 74 75 72 6e 20 70 56 65 63 74 6f 72 3b 0a 7d  eturn pVector;.}
2f30: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
2f40: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2f50: 53 55 42 51 55 45 52 59 29 20 2a 2f 0a 0a 23 69  SUBQUERY) */..#i
2f60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2f70: 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
2f80: 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74   Compute and ret
2f90: 75 72 6e 20 61 20 6e 65 77 20 45 78 70 72 20 6f  urn a new Expr o
2fa0: 62 6a 65 63 74 20 77 68 69 63 68 20 77 68 65 6e  bject which when
2fb0: 20 70 61 73 73 65 64 20 74 6f 0a 2a 2a 20 73 71   passed to.** sq
2fc0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 20  lite3ExprCode() 
2fd0: 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 61 6c  will generate al
2fe0: 6c 20 6e 65 63 65 73 73 61 72 79 20 63 6f 64 65  l necessary code
2ff0: 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74   to compute.** t
3000: 68 65 20 69 46 69 65 6c 64 2d 74 68 20 63 6f 6c  he iField-th col
3010: 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f  umn of the vecto
3020: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 70 56 65  r expression pVe
3030: 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ctor..**.** It i
3040: 73 20 6f 6b 20 66 6f 72 20 70 56 65 63 74 6f 72  s ok for pVector
3050: 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20   to be a scalar 
3060: 28 61 73 20 6c 6f 6e 67 20 61 73 20 69 46 69 65  (as long as iFie
3070: 6c 64 3d 3d 30 29 2e 20 20 0a 2a 2a 20 49 6e 20  ld==0).  .** In 
3080: 74 68 61 74 20 63 61 73 65 2c 20 74 68 69 73 20  that case, this 
3090: 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69  routine works li
30a0: 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 44 75  ke sqlite3ExprDu
30b0: 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  p()..**.** The c
30c0: 61 6c 6c 65 72 20 6f 77 6e 73 20 74 68 65 20 72  aller owns the r
30d0: 65 74 75 72 6e 65 64 20 45 78 70 72 20 6f 62 6a  eturned Expr obj
30e0: 65 63 74 20 61 6e 64 20 69 73 20 72 65 73 70 6f  ect and is respo
30f0: 6e 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 65 6e  nsible for.** en
3100: 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 65 20  suring that the 
3110: 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 65  returned value e
3120: 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66  ventually gets f
3130: 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  reed..**.** The 
3140: 63 61 6c 6c 65 72 20 72 65 74 61 69 6e 73 20 6f  caller retains o
3150: 77 6e 65 72 73 68 69 70 20 6f 66 20 70 56 65 63  wnership of pVec
3160: 74 6f 72 2e 20 20 49 66 20 70 56 65 63 74 6f 72  tor.  If pVector
3170: 20 69 73 20 61 20 54 4b 5f 53 45 4c 45 43 54 2c   is a TK_SELECT,
3180: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 74  .** then the ret
3190: 75 72 6e 65 20 6f 62 6a 65 63 74 20 77 69 6c 6c  urne object will
31a0: 20 72 65 66 65 72 65 6e 63 65 20 70 56 65 63 74   reference pVect
31b0: 6f 72 20 61 6e 64 20 73 6f 20 70 56 65 63 74 6f  or and so pVecto
31c0: 72 20 6d 75 73 74 20 72 65 6d 61 69 6e 0a 2a 2a  r must remain.**
31d0: 20 76 61 6c 69 64 20 66 6f 72 20 74 68 65 20 6c   valid for the l
31e0: 69 66 65 20 6f 66 20 74 68 65 20 72 65 74 75 72  ife of the retur
31f0: 6e 65 64 20 6f 62 6a 65 63 74 2e 20 20 49 66 20  ned object.  If 
3200: 70 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b 5f  pVector is a TK_
3210: 56 45 43 54 4f 52 0a 2a 2a 20 6f 72 20 61 20 73  VECTOR.** or a s
3220: 63 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  calar expression
3230: 2c 20 74 68 65 6e 20 69 74 20 63 61 6e 20 62 65  , then it can be
3240: 20 64 65 6c 65 74 65 64 20 61 73 20 73 6f 6f 6e   deleted as soon
3250: 20 61 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65   as this routine
3260: 0a 2a 2a 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a  .** returns..**.
3270: 2a 2a 20 41 20 74 72 69 63 6b 20 74 6f 20 63 61  ** A trick to ca
3280: 75 73 65 20 61 20 54 4b 5f 53 45 4c 45 43 54 20  use a TK_SELECT 
3290: 70 56 65 63 74 6f 72 20 74 6f 20 62 65 20 64 65  pVector to be de
32a0: 6c 65 74 65 64 20 74 6f 67 65 74 68 65 72 20 77  leted together w
32b0: 69 74 68 0a 2a 2a 20 74 68 65 20 72 65 74 75 72  ith.** the retur
32c0: 6e 65 64 20 45 78 70 72 20 6f 62 6a 65 63 74 20  ned Expr object 
32d0: 69 73 20 74 6f 20 61 74 74 61 63 68 20 74 68 65  is to attach the
32e0: 20 70 56 65 63 74 6f 72 20 74 6f 20 74 68 65 20   pVector to the 
32f0: 70 52 69 67 68 74 20 66 69 65 6c 64 0a 2a 2a 20  pRight field.** 
3300: 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  of the returned 
3310: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
3320: 20 45 78 70 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f   Expr object..*/
3330: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
3340: 70 72 46 6f 72 56 65 63 74 6f 72 46 69 65 6c 64  prForVectorField
3350: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
3360: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
3370: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
3380: 20 45 78 70 72 20 2a 70 56 65 63 74 6f 72 2c 20   Expr *pVector, 
3390: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 65 63        /* The vec
33a0: 74 6f 72 2e 20 20 4c 69 73 74 20 6f 66 20 65 78  tor.  List of ex
33b0: 70 72 65 73 73 69 6f 6e 73 20 6f 72 20 61 20 73  pressions or a s
33c0: 75 62 2d 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69  ub-SELECT */.  i
33d0: 6e 74 20 69 46 69 65 6c 64 20 20 20 20 20 20 20  nt iField       
33e0: 20 20 20 20 2f 2a 20 57 68 69 63 68 20 63 6f 6c      /* Which col
33f0: 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f  umn of the vecto
3400: 72 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 29  r to return */.)
3410: 7b 0a 20 20 45 78 70 72 20 2a 70 52 65 74 3b 0a  {.  Expr *pRet;.
3420: 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f    if( pVector->o
3430: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
3440: 20 20 20 20 61 73 73 65 72 74 28 20 70 56 65 63      assert( pVec
3450: 74 6f 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  tor->flags & EP_
3460: 78 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20  xIsSelect );.   
3470: 20 2f 2a 20 54 68 65 20 54 4b 5f 53 45 4c 45 43   /* The TK_SELEC
3480: 54 5f 43 4f 4c 55 4d 4e 20 45 78 70 72 20 6e 6f  T_COLUMN Expr no
3490: 64 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  de:.    **.    *
34a0: 2a 20 70 4c 65 66 74 3a 20 20 20 20 20 20 20 20  * pLeft:        
34b0: 20 20 20 70 56 65 63 74 6f 72 20 63 6f 6e 74 61     pVector conta
34c0: 69 6e 69 6e 67 20 54 4b 5f 53 45 4c 45 43 54 0a  ining TK_SELECT.
34d0: 20 20 20 20 2a 2a 20 70 52 69 67 68 74 3a 20 20      ** pRight:  
34e0: 20 20 20 20 20 20 20 20 6e 6f 74 20 75 73 65 64          not used
34f0: 2e 20 20 42 75 74 20 72 65 63 75 72 73 69 76 65  .  But recursive
3500: 6c 79 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  ly deleted..    
3510: 2a 2a 20 69 43 6f 6c 75 6d 6e 3a 20 20 20 20 20  ** iColumn:     
3520: 20 20 20 20 49 6e 64 65 78 20 6f 66 20 61 20 63      Index of a c
3530: 6f 6c 75 6d 6e 20 69 6e 20 70 56 65 63 74 6f 72  olumn in pVector
3540: 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 2d 3e 69  .    ** pLeft->i
3550: 54 61 62 6c 65 3a 20 20 20 46 69 72 73 74 20 69  Table:   First i
3560: 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  n an array of re
3570: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72  gister holding r
3580: 65 73 75 6c 74 2c 20 6f 72 20 30 0a 20 20 20 20  esult, or 0.    
3590: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
35a0: 20 20 20 20 69 66 20 74 68 65 20 72 65 73 75 6c      if the resul
35b0: 74 20 69 73 20 6e 6f 74 20 79 65 74 20 63 6f 6d  t is not yet com
35c0: 70 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  puted..    **.  
35d0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72    ** sqlite3Expr
35e0: 44 65 6c 65 74 65 28 29 20 73 70 65 63 69 66 69  Delete() specifi
35f0: 63 61 6c 6c 79 20 73 6b 69 70 73 20 74 68 65 20  cally skips the 
3600: 72 65 63 75 72 73 69 76 65 20 64 65 6c 65 74 65  recursive delete
3610: 20 6f 66 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74   of.    ** pLeft
3620: 20 6f 6e 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f   on TK_SELECT_CO
3630: 4c 55 4d 4e 20 6e 6f 64 65 73 2e 20 20 42 75 74  LUMN nodes.  But
3640: 20 70 52 69 67 68 74 20 69 73 20 66 6f 6c 6c 6f   pRight is follo
3650: 77 65 64 2c 20 73 6f 20 70 56 65 63 74 6f 72 0a  wed, so pVector.
3660: 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 61 74      ** can be at
3670: 74 61 63 68 65 64 20 74 6f 20 70 52 69 67 68 74  tached to pRight
3680: 20 74 6f 20 63 61 75 73 65 20 74 68 69 73 20 6e   to cause this n
3690: 6f 64 65 20 74 6f 20 74 61 6b 65 20 6f 77 6e 65  ode to take owne
36a0: 72 73 68 69 70 20 6f 66 0a 20 20 20 20 2a 2a 20  rship of.    ** 
36b0: 70 56 65 63 74 6f 72 2e 20 20 54 79 70 69 63 61  pVector.  Typica
36c0: 6c 6c 79 20 74 68 65 72 65 20 77 69 6c 6c 20 62  lly there will b
36d0: 65 20 6d 75 6c 74 69 70 6c 65 20 54 4b 5f 53 45  e multiple TK_SE
36e0: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  LECT_COLUMN node
36f0: 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68  s.    ** with th
3700: 65 20 73 61 6d 65 20 70 4c 65 66 74 20 70 6f 69  e same pLeft poi
3710: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 56 65 63  nter to the pVec
3720: 74 6f 72 2c 20 62 75 74 20 6f 6e 6c 79 20 6f 6e  tor, but only on
3730: 65 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a  e of them.    **
3740: 20 77 69 6c 6c 20 6f 77 6e 20 74 68 65 20 70 56   will own the pV
3750: 65 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  ector..    */.  
3760: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
3770: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
3780: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 2c 20  _SELECT_COLUMN, 
3790: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 0, 0);.    if
37a0: 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20  ( pRet ){.      
37b0: 70 52 65 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  pRet->iColumn = 
37c0: 69 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 70 52  iField;.      pR
37d0: 65 74 2d 3e 70 4c 65 66 74 20 3d 20 70 56 65 63  et->pLeft = pVec
37e0: 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  tor;.    }.    a
37f0: 73 73 65 72 74 28 20 70 52 65 74 3d 3d 30 20 7c  ssert( pRet==0 |
3800: 7c 20 70 52 65 74 2d 3e 69 54 61 62 6c 65 3d 3d  | pRet->iTable==
3810: 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0 );.  }else{.  
3820: 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f    if( pVector->o
3830: 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 29 20 70  p==TK_VECTOR ) p
3840: 56 65 63 74 6f 72 20 3d 20 70 56 65 63 74 6f 72  Vector = pVector
3850: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69  ->x.pList->a[iFi
3860: 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  eld].pExpr;.    
3870: 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  pRet = sqlite3Ex
3880: 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  prDup(pParse->db
3890: 2c 20 70 56 65 63 74 6f 72 2c 20 30 29 3b 0a 20  , pVector, 0);. 
38a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
38b0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
38c0: 65 66 69 6e 65 28 53 51 4c 49 54 45 5f 4f 4d 49  efine(SQLITE_OMI
38d0: 54 5f 53 55 42 51 55 45 52 59 29 20 2a 2f 0a 0a  T_SUBQUERY) */..
38e0: 2f 2a 0a 2a 2a 20 49 66 20 65 78 70 72 65 73 73  /*.** If express
38f0: 69 6f 6e 20 70 45 78 70 72 20 69 73 20 6f 66 20  ion pExpr is of 
3900: 74 79 70 65 20 54 4b 5f 53 45 4c 45 43 54 2c 20  type TK_SELECT, 
3910: 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  generate code to
3920: 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 69 74 2e   evaluate.** it.
3930: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69   Return the regi
3940: 73 74 65 72 20 69 6e 20 77 68 69 63 68 20 74 68  ster in which th
3950: 65 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72  e result is stor
3960: 65 64 20 28 6f 72 2c 20 69 66 20 74 68 65 20 0a  ed (or, if the .
3970: 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 20 72 65  ** sub-select re
3980: 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20  turns more than 
3990: 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20  one column, the 
39a0: 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61  first in an arra
39b0: 79 0a 2a 2a 20 6f 66 20 72 65 67 69 73 74 65 72  y.** of register
39c0: 73 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 72  s in which the r
39d0: 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64 29  esult is stored)
39e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
39f0: 20 69 73 20 6e 6f 74 20 61 20 54 4b 5f 53 45 4c   is not a TK_SEL
3a00: 45 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ECT expression, 
3a10: 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61  return 0..*/.sta
3a20: 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f 64 65  tic int exprCode
3a30: 53 75 62 73 65 6c 65 63 74 28 50 61 72 73 65 20  Subselect(Parse 
3a40: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
3a50: 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 72 65 67  Expr){.  int reg
3a60: 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
3a70: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
3a80: 52 59 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  RY.  if( pExpr->
3a90: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
3aa0: 0a 20 20 20 20 72 65 67 20 3d 20 73 71 6c 69 74  .    reg = sqlit
3ab0: 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
3ac0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30  pParse, pExpr, 0
3ad0: 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
3ae0: 0a 20 20 72 65 74 75 72 6e 20 72 65 67 3b 0a 7d  .  return reg;.}
3af0: 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ../*.** Argument
3b00: 20 70 56 65 63 74 6f 72 20 70 6f 69 6e 74 73 20   pVector points 
3b10: 74 6f 20 61 20 76 65 63 74 6f 72 20 65 78 70 72  to a vector expr
3b20: 65 73 73 69 6f 6e 20 2d 20 65 69 74 68 65 72 20  ession - either 
3b30: 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f  a TK_VECTOR.** o
3b40: 72 20 54 4b 5f 53 45 4c 45 43 54 20 74 68 61 74  r TK_SELECT that
3b50: 20 72 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68   returns more th
3b60: 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2e 20 54  an one column. T
3b70: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
3b80: 75 72 6e 73 0a 2a 2a 20 74 68 65 20 72 65 67 69  urns.** the regi
3b90: 73 74 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 61  ster number of a
3ba0: 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20 63   register that c
3bb0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75  ontains the valu
3bc0: 65 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20  e of.** element 
3bd0: 69 46 69 65 6c 64 20 6f 66 20 74 68 65 20 76 65  iField of the ve
3be0: 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ctor..**.** If p
3bf0: 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b 5f 53  Vector is a TK_S
3c00: 45 4c 45 43 54 20 65 78 70 72 65 73 73 69 6f 6e  ELECT expression
3c10: 2c 20 74 68 65 6e 20 63 6f 64 65 20 66 6f 72 20  , then code for 
3c20: 69 74 20 6d 75 73 74 20 68 61 76 65 20 0a 2a 2a  it must have .**
3c30: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 67 65   already been ge
3c40: 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 74 68  nerated using th
3c50: 65 20 65 78 70 72 43 6f 64 65 53 75 62 73 65 6c  e exprCodeSubsel
3c60: 65 63 74 28 29 20 72 6f 75 74 69 6e 65 2e 20 49  ect() routine. I
3c70: 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 70  n this.** case p
3c80: 61 72 61 6d 65 74 65 72 20 72 65 67 53 65 6c 65  arameter regSele
3c90: 63 74 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  ct should be the
3ca0: 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72   first in an arr
3cb0: 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a  ay of registers.
3cc0: 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ** containing th
3cd0: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
3ce0: 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 0a 2a 2a   sub-select. .**
3cf0: 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72 20 69  .** If pVector i
3d00: 73 20 6f 66 20 74 79 70 65 20 54 4b 5f 56 45 43  s of type TK_VEC
3d10: 54 4f 52 2c 20 74 68 65 6e 20 63 6f 64 65 20 66  TOR, then code f
3d20: 6f 72 20 74 68 65 20 72 65 71 75 65 73 74 65 64  or the requested
3d30: 20 66 69 65 6c 64 0a 2a 2a 20 69 73 20 67 65 6e   field.** is gen
3d40: 65 72 61 74 65 64 2e 20 49 6e 20 74 68 69 73 20  erated. In this 
3d50: 63 61 73 65 20 28 2a 70 52 65 67 46 72 65 65 29  case (*pRegFree)
3d60: 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 74   may be set to t
3d70: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
3d80: 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  a temporary regi
3d90: 73 74 65 72 20 74 6f 20 62 65 20 66 72 65 65 64  ster to be freed
3da0: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62   by the caller b
3db0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
3dc0: 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
3dd0: 74 75 72 6e 69 6e 67 2c 20 6f 75 74 70 75 74 20  turning, output 
3de0: 70 61 72 61 6d 65 74 65 72 20 28 2a 70 70 45 78  parameter (*ppEx
3df0: 70 72 29 20 69 73 20 73 65 74 20 74 6f 20 70 6f  pr) is set to po
3e00: 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20 45 78  int to the.** Ex
3e10: 70 72 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73  pr object corres
3e20: 70 6f 6e 64 69 6e 67 20 74 6f 20 65 6c 65 6d 65  ponding to eleme
3e30: 6e 74 20 69 45 6c 65 6d 20 6f 66 20 74 68 65 20  nt iElem of the 
3e40: 76 65 63 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  vector..*/.stati
3e50: 63 20 69 6e 74 20 65 78 70 72 56 65 63 74 6f 72  c int exprVector
3e60: 52 65 67 69 73 74 65 72 28 0a 20 20 50 61 72 73  Register(.  Pars
3e70: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
3e80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3e90: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
3ea0: 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f 72 2c    Expr *pVector,
3eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ec0: 20 20 2f 2a 20 56 65 63 74 6f 72 20 74 6f 20 65    /* Vector to e
3ed0: 78 74 72 61 63 74 20 65 6c 65 6d 65 6e 74 20 66  xtract element f
3ee0: 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69  rom */.  int iFi
3ef0: 65 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  eld,            
3f00: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 65 6c           /* Fiel
3f10: 64 20 74 6f 20 65 78 74 72 61 63 74 20 66 72 6f  d to extract fro
3f20: 6d 20 70 56 65 63 74 6f 72 20 2a 2f 0a 20 20 69  m pVector */.  i
3f30: 6e 74 20 72 65 67 53 65 6c 65 63 74 2c 20 20 20  nt regSelect,   
3f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3f50: 2a 20 46 69 72 73 74 20 69 6e 20 61 72 72 61 79  * First in array
3f60: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 2a 2f   of registers */
3f70: 0a 20 20 45 78 70 72 20 2a 2a 70 70 45 78 70 72  .  Expr **ppExpr
3f80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3f90: 20 20 20 2f 2a 20 4f 55 54 3a 20 45 78 70 72 65     /* OUT: Expre
3fa0: 73 73 69 6f 6e 20 65 6c 65 6d 65 6e 74 20 2a 2f  ssion element */
3fb0: 0a 20 20 69 6e 74 20 2a 70 52 65 67 46 72 65 65  .  int *pRegFree
3fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fd0: 20 20 20 2f 2a 20 4f 55 54 3a 20 54 65 6d 70 20     /* OUT: Temp 
3fe0: 72 65 67 69 73 74 65 72 20 74 6f 20 66 72 65 65  register to free
3ff0: 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 6f 70 20 3d   */.){.  u8 op =
4000: 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3b 0a 20 20   pVector->op;.  
4010: 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 56  assert( op==TK_V
4020: 45 43 54 4f 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  ECTOR || op==TK_
4030: 53 45 4c 45 43 54 20 7c 7c 20 6f 70 3d 3d 54 4b  SELECT || op==TK
4040: 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 69  _REGISTER );.  i
4050: 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  f( op==TK_REGIST
4060: 45 52 20 29 7b 0a 20 20 20 20 2a 70 70 45 78 70  ER ){.    *ppExp
4070: 72 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f  r = sqlite3Vecto
4080: 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 56  rFieldSubexpr(pV
4090: 65 63 74 6f 72 2c 20 69 46 69 65 6c 64 29 3b 0a  ector, iField);.
40a0: 20 20 20 20 72 65 74 75 72 6e 20 70 56 65 63 74      return pVect
40b0: 6f 72 2d 3e 69 54 61 62 6c 65 2b 69 46 69 65 6c  or->iTable+iFiel
40c0: 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d  d;.  }.  if( op=
40d0: 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20  =TK_SELECT ){.  
40e0: 20 20 2a 70 70 45 78 70 72 20 3d 20 70 56 65 63    *ppExpr = pVec
40f0: 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  tor->x.pSelect->
4100: 70 45 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64  pEList->a[iField
4110: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 72 65  ].pExpr;.     re
4120: 74 75 72 6e 20 72 65 67 53 65 6c 65 63 74 2b 69  turn regSelect+i
4130: 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 2a 70 70  Field;.  }.  *pp
4140: 45 78 70 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e  Expr = pVector->
4150: 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c  x.pList->a[iFiel
4160: 64 5d 2e 70 45 78 70 72 3b 0a 20 20 72 65 74 75  d].pExpr;.  retu
4170: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  rn sqlite3ExprCo
4180: 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 2a  deTemp(pParse, *
4190: 70 70 45 78 70 72 2c 20 70 52 65 67 46 72 65 65  ppExpr, pRegFree
41a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72  );.}../*.** Expr
41b0: 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20  ession pExpr is 
41c0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65 74  a comparison bet
41d0: 77 65 65 6e 20 74 77 6f 20 76 65 63 74 6f 72 20  ween two vector 
41e0: 76 61 6c 75 65 73 2e 20 43 6f 6d 70 75 74 65 0a  values. Compute.
41f0: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ** the result of
4200: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
4210: 28 31 2c 20 30 2c 20 6f 72 20 4e 55 4c 4c 29 20  (1, 0, or NULL) 
4220: 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 0a 2a  and write that.*
4230: 2a 20 72 65 73 75 6c 74 20 69 6e 74 6f 20 72 65  * result into re
4240: 67 69 73 74 65 72 20 64 65 73 74 2e 0a 2a 2a 0a  gister dest..**.
4250: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
4260: 73 74 20 73 61 74 69 73 66 79 20 74 68 65 20 66  st satisfy the f
4270: 6f 6c 6c 6f 77 69 6e 67 20 70 72 65 63 6f 6e 64  ollowing precond
4280: 69 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  itions:.**.**   
4290: 20 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   if pExpr->op==T
42a0: 4b 5f 49 53 3a 20 20 20 20 20 20 6f 70 3d 3d 54  K_IS:      op==T
42b0: 4b 5f 45 51 20 61 6e 64 20 70 35 3d 3d 53 51 4c  K_EQ and p5==SQL
42c0: 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20 20 20  ITE_NULLEQ.**   
42d0: 20 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   if pExpr->op==T
42e0: 4b 5f 49 53 4e 4f 54 3a 20 20 20 6f 70 3d 3d 54  K_ISNOT:   op==T
42f0: 4b 5f 4e 45 20 61 6e 64 20 70 35 3d 3d 53 51 4c  K_NE and p5==SQL
4300: 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20 20 20  ITE_NULLEQ.**   
4310: 20 6f 74 68 65 72 77 69 73 65 3a 20 20 20 20 20   otherwise:     
4320: 20 20 20 20 20 20 20 20 20 20 20 6f 70 3d 3d 70             op==p
4330: 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 70 35 3d  Expr->op and p5=
4340: 3d 30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  =0.*/.static voi
4350: 64 20 63 6f 64 65 56 65 63 74 6f 72 43 6f 6d 70  d codeVectorComp
4360: 61 72 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  are(.  Parse *pP
4370: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
4380: 43 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 63  Code generator c
4390: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
43a0: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
43b0: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69    /* The compari
43c0: 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  son operation */
43d0: 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20  .  int dest,    
43e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
43f0: 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 74  e results into t
4400: 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
4410: 20 20 75 38 20 6f 70 2c 20 20 20 20 20 20 20 20    u8 op,        
4420: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61          /* Compa
4430: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 2a  rison operator *
4440: 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20 20 20  /.  u8 p5       
4450: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
4460: 49 54 45 5f 4e 55 4c 4c 45 51 20 6f 72 20 7a 65  ITE_NULLEQ or ze
4470: 72 6f 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  ro */.){.  Vdbe 
4480: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
4490: 62 65 3b 0a 20 20 45 78 70 72 20 2a 70 4c 65 66  be;.  Expr *pLef
44a0: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
44b0: 3b 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  ;.  Expr *pRight
44c0: 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74   = pExpr->pRight
44d0: 3b 0a 20 20 69 6e 74 20 6e 4c 65 66 74 20 3d 20  ;.  int nLeft = 
44e0: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
44f0: 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20  rSize(pLeft);.  
4500: 69 6e 74 20 6e 52 69 67 68 74 20 3d 20 73 71 6c  int nRight = sql
4510: 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
4520: 7a 65 28 70 52 69 67 68 74 29 3b 0a 0a 20 20 2f  ze(pRight);..  /
4530: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 62 6f 74  * Check that bot
4540: 68 20 73 69 64 65 73 20 6f 66 20 74 68 65 20 63  h sides of the c
4550: 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20 76 65  omparison are ve
4560: 63 74 6f 72 73 2c 20 61 6e 64 20 74 68 61 74 0a  ctors, and that.
4570: 20 20 2a 2a 20 62 6f 74 68 20 61 72 65 20 74 68    ** both are th
4580: 65 20 73 61 6d 65 20 6c 65 6e 67 74 68 2e 20 20  e same length.  
4590: 2a 2f 0a 20 20 69 66 28 20 6e 4c 65 66 74 21 3d  */.  if( nLeft!=
45a0: 6e 52 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71  nRight ){.    sq
45b0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
45c0: 61 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65  arse, "row value
45d0: 20 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 7d 65   misused");.  }e
45e0: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  lse{.    int i;.
45f0: 20 20 20 20 69 6e 74 20 72 65 67 4c 65 66 74 20      int regLeft 
4600: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 67  = 0;.    int reg
4610: 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 75  Right = 0;.    u
4620: 38 20 6f 70 78 20 3d 20 6f 70 3b 0a 20 20 20 20  8 opx = op;.    
4630: 69 6e 74 20 61 64 64 72 44 6f 6e 65 20 3d 20 73  int addrDone = s
4640: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
4650: 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 61 73 73  bel(v);..    ass
4660: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
4670: 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_EQ || pExpr->
4680: 6f 70 3d 3d 54 4b 5f 4e 45 20 0a 20 20 20 20 20  op==TK_NE .     
4690: 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70      || pExpr->op
46a0: 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72  ==TK_IS || pExpr
46b0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 0a  ->op==TK_ISNOT .
46c0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70           || pExp
46d0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20  r->op==TK_LT || 
46e0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54  pExpr->op==TK_GT
46f0: 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45   .         || pE
4700: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c  xpr->op==TK_LE |
4710: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
4720: 47 45 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61  GE .    );.    a
4730: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
4740: 3d 3d 6f 70 20 7c 7c 20 28 70 45 78 70 72 2d 3e  ==op || (pExpr->
4750: 6f 70 3d 3d 54 4b 5f 49 53 20 26 26 20 6f 70 3d  op==TK_IS && op=
4760: 3d 54 4b 5f 45 51 29 0a 20 20 20 20 20 20 20 20  =TK_EQ).        
4770: 20 20 20 20 20 20 7c 7c 20 28 70 45 78 70 72 2d        || (pExpr-
4780: 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 26 26  >op==TK_ISNOT &&
4790: 20 6f 70 3d 3d 54 4b 5f 4e 45 29 20 29 3b 0a 20   op==TK_NE) );. 
47a0: 20 20 20 61 73 73 65 72 74 28 20 70 35 3d 3d 30     assert( p5==0
47b0: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f   || pExpr->op!=o
47c0: 70 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  p );.    assert(
47d0: 20 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c   p5==SQLITE_NULL
47e0: 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  EQ || pExpr->op=
47f0: 3d 6f 70 20 29 3b 0a 0a 20 20 20 20 70 35 20 7c  =op );..    p5 |
4800: 3d 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  = SQLITE_STOREP2
4810: 3b 0a 20 20 20 20 69 66 28 20 6f 70 78 3d 3d 54  ;.    if( opx==T
4820: 4b 5f 4c 45 20 29 20 6f 70 78 20 3d 20 54 4b 5f  K_LE ) opx = TK_
4830: 4c 54 3b 0a 20 20 20 20 69 66 28 20 6f 70 78 3d  LT;.    if( opx=
4840: 3d 54 4b 5f 47 45 20 29 20 6f 70 78 20 3d 20 54  =TK_GE ) opx = T
4850: 4b 5f 47 54 3b 0a 0a 20 20 20 20 72 65 67 4c 65  K_GT;..    regLe
4860: 66 74 20 3d 20 65 78 70 72 43 6f 64 65 53 75 62  ft = exprCodeSub
4870: 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
4880: 4c 65 66 74 29 3b 0a 20 20 20 20 72 65 67 52 69  Left);.    regRi
4890: 67 68 74 20 3d 20 65 78 70 72 43 6f 64 65 53 75  ght = exprCodeSu
48a0: 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
48b0: 70 52 69 67 68 74 29 3b 0a 0a 20 20 20 20 66 6f  pRight);..    fo
48c0: 72 28 69 3d 30 3b 20 31 20 2f 2a 4c 6f 6f 70 20  r(i=0; 1 /*Loop 
48d0: 65 78 69 74 73 20 62 79 20 22 62 72 65 61 6b 22  exits by "break"
48e0: 2a 2f 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  */; i++){.      
48f0: 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
4900: 2c 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a  , regFree2 = 0;.
4910: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 2c 20        Expr *pL, 
4920: 2a 70 52 3b 20 0a 20 20 20 20 20 20 69 6e 74 20  *pR; .      int 
4930: 72 31 2c 20 72 32 3b 0a 20 20 20 20 20 20 61 73  r1, r2;.      as
4940: 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
4950: 6e 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69  nLeft );.      i
4960: 66 28 20 69 3e 30 20 29 20 73 71 6c 69 74 65 33  f( i>0 ) sqlite3
4970: 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
4980: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72 31 20  arse);.      r1 
4990: 3d 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69  = exprVectorRegi
49a0: 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 4c 65  ster(pParse, pLe
49b0: 66 74 2c 20 69 2c 20 72 65 67 4c 65 66 74 2c 20  ft, i, regLeft, 
49c0: 26 70 4c 2c 20 26 72 65 67 46 72 65 65 31 29 3b  &pL, &regFree1);
49d0: 0a 20 20 20 20 20 20 72 32 20 3d 20 65 78 70 72  .      r2 = expr
49e0: 56 65 63 74 6f 72 52 65 67 69 73 74 65 72 28 70  VectorRegister(p
49f0: 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 69  Parse, pRight, i
4a00: 2c 20 72 65 67 52 69 67 68 74 2c 20 26 70 52 2c  , regRight, &pR,
4a10: 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
4a20: 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
4a30: 50 61 72 73 65 2c 20 70 4c 2c 20 70 52 2c 20 6f  Parse, pL, pR, o
4a40: 70 78 2c 20 72 31 2c 20 72 32 2c 20 64 65 73 74  px, r1, r2, dest
4a50: 2c 20 70 35 29 3b 0a 20 20 20 20 20 20 74 65 73  , p5);.      tes
4a60: 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29  tcase(op==OP_Lt)
4a70: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
4a80: 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20  (v,op==OP_Lt);. 
4a90: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70       testcase(op
4aa0: 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f  ==OP_Le); VdbeCo
4ab0: 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
4ac0: 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 74 65 73  P_Le);.      tes
4ad0: 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29  tcase(op==OP_Gt)
4ae0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
4af0: 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20  (v,op==OP_Gt);. 
4b00: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70       testcase(op
4b10: 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ge); VdbeCo
4b20: 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
4b30: 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 74 65 73  P_Ge);.      tes
4b40: 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29  tcase(op==OP_Eq)
4b50: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
4b60: 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20  (v,op==OP_Eq);. 
4b70: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70       testcase(op
4b80: 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ne); VdbeCo
4b90: 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
4ba0: 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  P_Ne);.      sql
4bb0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
4bc0: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
4bd0: 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee1);.      sqli
4be0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
4bf0: 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
4c00: 65 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  e2);.      if( i
4c10: 3e 30 20 29 20 73 71 6c 69 74 65 33 45 78 70 72  >0 ) sqlite3Expr
4c20: 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
4c30: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 6e  ;.      if( i==n
4c40: 4c 65 66 74 2d 31 20 29 7b 0a 20 20 20 20 20 20  Left-1 ){.      
4c50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
4c60: 0a 20 20 20 20 20 20 69 66 28 20 6f 70 78 3d 3d  .      if( opx==
4c70: 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 20  TK_EQ ){.       
4c80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4c90: 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p2(v, OP_IfNot, 
4ca0: 64 65 73 74 2c 20 61 64 64 72 44 6f 6e 65 29 3b  dest, addrDone);
4cb0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
4cc0: 3b 0a 20 20 20 20 20 20 20 20 70 35 20 7c 3d 20  ;.        p5 |= 
4cd0: 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c 3b  SQLITE_KEEPNULL;
4ce0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
4cf0: 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20 29 7b 0a 20   opx==TK_NE ){. 
4d00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4d10: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
4d20: 66 2c 20 64 65 73 74 2c 20 61 64 64 72 44 6f 6e  f, dest, addrDon
4d30: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
4d40: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 70 35 20  (v);.        p5 
4d50: 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55  |= SQLITE_KEEPNU
4d60: 4c 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LL;.      }else{
4d70: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
4d80: 20 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70   op==TK_LT || op
4d90: 3d 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 54  ==TK_GT || op==T
4da0: 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47  K_LE || op==TK_G
4db0: 45 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  E );.        sql
4dc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
4dd0: 2c 20 4f 50 5f 45 6c 73 65 4e 6f 74 45 71 2c 20  , OP_ElseNotEq, 
4de0: 30 2c 20 61 64 64 72 44 6f 6e 65 29 3b 0a 20 20  0, addrDone);.  
4df0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
4e00: 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c  geIf(v, op==TK_L
4e10: 54 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  T);.        Vdbe
4e20: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
4e30: 3d 3d 54 4b 5f 47 54 29 3b 0a 20 20 20 20 20 20  ==TK_GT);.      
4e40: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
4e50: 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 45 29 3b 0a  (v, op==TK_LE);.
4e60: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
4e70: 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
4e80: 5f 47 45 29 3b 0a 20 20 20 20 20 20 20 20 69 66  _GE);.        if
4e90: 28 20 69 3d 3d 6e 4c 65 66 74 2d 32 20 29 20 6f  ( i==nLeft-2 ) o
4ea0: 70 78 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 7d  px = op;.      }
4eb0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
4ec0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
4ed0: 65 6c 28 76 2c 20 61 64 64 72 44 6f 6e 65 29 3b  el(v, addrDone);
4ee0: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  .  }.}..#if SQLI
4ef0: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
4f00: 48 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  H>0./*.** Check 
4f10: 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20 6e 48  that argument nH
4f20: 65 69 67 68 74 20 69 73 20 6c 65 73 73 20 74 68  eight is less th
4f30: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
4f40: 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 65 78  he maximum.** ex
4f50: 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68 20 61  pression depth a
4f60: 6c 6c 6f 77 65 64 2e 20 49 66 20 69 74 20 69 73  llowed. If it is
4f70: 20 6e 6f 74 2c 20 6c 65 61 76 65 20 61 6e 20 65   not, leave an e
4f80: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 0a  rror message in.
4f90: 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e  ** pParse..*/.in
4fa0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65  t sqlite3ExprChe
4fb0: 63 6b 48 65 69 67 68 74 28 50 61 72 73 65 20 2a  ckHeight(Parse *
4fc0: 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 48 65 69  pParse, int nHei
4fd0: 67 68 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ght){.  int rc =
4fe0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
4ff0: 74 20 6d 78 48 65 69 67 68 74 20 3d 20 70 50 61  t mxHeight = pPa
5000: 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  rse->db->aLimit[
5010: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50  SQLITE_LIMIT_EXP
5020: 52 5f 44 45 50 54 48 5d 3b 0a 20 20 69 66 28 20  R_DEPTH];.  if( 
5030: 6e 48 65 69 67 68 74 3e 6d 78 48 65 69 67 68 74  nHeight>mxHeight
5040: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
5050: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
5060: 0a 20 20 20 20 20 20 20 22 45 78 70 72 65 73 73  .       "Express
5070: 69 6f 6e 20 74 72 65 65 20 69 73 20 74 6f 6f 20  ion tree is too 
5080: 6c 61 72 67 65 20 28 6d 61 78 69 6d 75 6d 20 64  large (maximum d
5090: 65 70 74 68 20 25 64 29 22 2c 20 6d 78 48 65 69  epth %d)", mxHei
50a0: 67 68 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 72  ght.    );.    r
50b0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
50c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
50d0: 63 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c  c;.}../* The fol
50e0: 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e  lowing three fun
50f0: 63 74 69 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66  ctions, heightOf
5100: 45 78 70 72 28 29 2c 20 68 65 69 67 68 74 4f 66  Expr(), heightOf
5110: 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e  ExprList().** an
5120: 64 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74  d heightOfSelect
5130: 28 29 2c 20 61 72 65 20 75 73 65 64 20 74 6f 20  (), are used to 
5140: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 61  determine the ma
5150: 78 69 6d 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20  ximum height.** 
5160: 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  of any expressio
5170: 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65  n tree reference
5180: 64 20 62 79 20 74 68 65 20 73 74 72 75 63 74 75  d by the structu
5190: 72 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  re passed as the
51a0: 0a 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65  .** first argume
51b0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  nt..**.** If thi
51c0: 73 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  s maximum height
51d0: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
51e0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
51f0: 75 65 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f  ue pointed.** to
5200: 20 62 79 20 70 6e 48 65 69 67 68 74 2c 20 74 68   by pnHeight, th
5210: 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
5220: 65 72 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 6e  er, then set *pn
5230: 48 65 69 67 68 74 20 74 6f 20 74 68 61 74 0a 2a  Height to that.*
5240: 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  * value..*/.stat
5250: 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66  ic void heightOf
5260: 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e  Expr(Expr *p, in
5270: 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20  t *pnHeight){.  
5280: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  if( p ){.    if(
5290: 20 70 2d 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48   p->nHeight>*pnH
52a0: 65 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2a  eight ){.      *
52b0: 70 6e 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48  pnHeight = p->nH
52c0: 65 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  eight;.    }.  }
52d0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  .}.static void h
52e0: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
52f0: 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74  ExprList *p, int
5300: 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69   *pnHeight){.  i
5310: 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  f( p ){.    int 
5320: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
5330: 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  i<p->nExpr; i++)
5340: 7b 0a 20 20 20 20 20 20 68 65 69 67 68 74 4f 66  {.      heightOf
5350: 45 78 70 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78  Expr(p->a[i].pEx
5360: 70 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  pr, pnHeight);. 
5370: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
5380: 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 53  c void heightOfS
5390: 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c  elect(Select *p,
53a0: 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b   int *pnHeight){
53b0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
53c0: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
53d0: 70 57 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74  pWhere, pnHeight
53e0: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  );.    heightOfE
53f0: 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20  xpr(p->pHaving, 
5400: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
5410: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
5420: 4c 69 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29  Limit, pnHeight)
5430: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
5440: 70 72 28 70 2d 3e 70 4f 66 66 73 65 74 2c 20 70  pr(p->pOffset, p
5450: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
5460: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
5470: 2d 3e 70 45 4c 69 73 74 2c 20 70 6e 48 65 69 67  ->pEList, pnHeig
5480: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
5490: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72  fExprList(p->pGr
54a0: 6f 75 70 42 79 2c 20 70 6e 48 65 69 67 68 74 29  oupBy, pnHeight)
54b0: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
54c0: 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72  prList(p->pOrder
54d0: 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  By, pnHeight);. 
54e0: 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63     heightOfSelec
54f0: 74 28 70 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48  t(p->pPrior, pnH
5500: 65 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  eight);.  }.}../
5510: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
5520: 72 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61 62  r.nHeight variab
5530: 6c 65 20 69 6e 20 74 68 65 20 73 74 72 75 63 74  le in the struct
5540: 75 72 65 20 70 61 73 73 65 64 20 61 73 20 61 6e  ure passed as an
5550: 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41   .** argument. A
5560: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74  n expression wit
5570: 68 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45  h no children, E
5580: 78 70 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a  xpr.pList or .**
5590: 20 45 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65   Expr.pSelect me
55a0: 6d 62 65 72 20 68 61 73 20 61 20 68 65 69 67 68  mber has a heigh
55b0: 74 20 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65  t of 1. Any othe
55c0: 72 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  r expression.** 
55d0: 68 61 73 20 61 20 68 65 69 67 68 74 20 65 71 75  has a height equ
55e0: 61 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  al to the maximu
55f0: 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20  m height of any 
5600: 6f 74 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65  other .** refere
5610: 6e 63 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f  nced Expr plus o
5620: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70  ne..**.** Also p
5630: 72 6f 70 61 67 61 74 65 20 45 50 5f 50 72 6f 70  ropagate EP_Prop
5640: 61 67 61 74 65 20 66 6c 61 67 73 20 75 70 20 66  agate flags up f
5650: 72 6f 6d 20 45 78 70 72 2e 78 2e 70 4c 69 73 74  rom Expr.x.pList
5660: 20 74 6f 20 45 78 70 72 2e 66 6c 61 67 73 2c 0a   to Expr.flags,.
5670: 2a 2a 20 69 66 20 61 70 70 72 6f 70 72 69 61 74  ** if appropriat
5680: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
5690: 64 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28  d exprSetHeight(
56a0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Expr *p){.  int 
56b0: 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68  nHeight = 0;.  h
56c0: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
56d0: 4c 65 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  Left, &nHeight);
56e0: 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  .  heightOfExpr(
56f0: 70 2d 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69  p->pRight, &nHei
5700: 67 68 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72  ght);.  if( Expr
5710: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
5720: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
5730: 20 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65      heightOfSele
5740: 63 74 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  ct(p->x.pSelect,
5750: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65   &nHeight);.  }e
5760: 6c 73 65 20 69 66 28 20 70 2d 3e 78 2e 70 4c 69  lse if( p->x.pLi
5770: 73 74 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74  st ){.    height
5780: 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e  OfExprList(p->x.
5790: 70 4c 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29  pList, &nHeight)
57a0: 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c  ;.    p->flags |
57b0: 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26  = EP_Propagate &
57c0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
57d0: 46 6c 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74  Flags(p->x.pList
57e0: 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69  );.  }.  p->nHei
57f0: 67 68 74 20 3d 20 6e 48 65 69 67 68 74 20 2b 20  ght = nHeight + 
5800: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  1;.}../*.** Set 
5810: 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74  the Expr.nHeight
5820: 20 76 61 72 69 61 62 6c 65 20 75 73 69 6e 67 20   variable using 
5830: 74 68 65 20 65 78 70 72 53 65 74 48 65 69 67 68  the exprSetHeigh
5840: 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66  t() function. If
5850: 0a 2a 2a 20 74 68 65 20 68 65 69 67 68 74 20 69  .** the height i
5860: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
5870: 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77  he maximum allow
5880: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65  ed expression de
5890: 70 74 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e  pth,.** leave an
58a0: 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65   error in pParse
58b0: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f  ..**.** Also pro
58c0: 70 61 67 61 74 65 20 61 6c 6c 20 45 50 5f 50 72  pagate all EP_Pr
58d0: 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20 66 72  opagate flags fr
58e0: 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c  om the Expr.x.pL
58f0: 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72  ist into.** Expr
5900: 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64  .flags. .*/.void
5910: 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48   sqlite3ExprSetH
5920: 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28 50 61  eightAndFlags(Pa
5930: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
5940: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 50 61  r *p){.  if( pPa
5950: 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
5960: 72 6e 3b 0a 20 20 65 78 70 72 53 65 74 48 65 69  rn;.  exprSetHei
5970: 67 68 74 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ght(p);.  sqlite
5980: 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74  3ExprCheckHeight
5990: 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69  (pParse, p->nHei
59a0: 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ght);.}../*.** R
59b0: 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75  eturn the maximu
59c0: 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20  m height of any 
59d0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
59e0: 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79  referenced.** by
59f0: 20 74 68 65 20 73 65 6c 65 63 74 20 73 74 61 74   the select stat
5a00: 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20  ement passed as 
5a10: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  an argument..*/.
5a20: 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
5a30: 74 45 78 70 72 48 65 69 67 68 74 28 53 65 6c 65  tExprHeight(Sele
5a40: 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48  ct *p){.  int nH
5a50: 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69  eight = 0;.  hei
5a60: 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2c 20 26  ghtOfSelect(p, &
5a70: 6e 48 65 69 67 68 74 29 3b 0a 20 20 72 65 74 75  nHeight);.  retu
5a80: 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65  rn nHeight;.}.#e
5a90: 6c 73 65 20 2f 2a 20 41 42 4f 56 45 3a 20 20 48  lse /* ABOVE:  H
5aa0: 65 69 67 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e  eight enforcemen
5ab0: 74 20 65 6e 61 62 6c 65 64 2e 20 20 42 45 4c 4f  t enabled.  BELO
5ac0: 57 3a 20 48 65 69 67 68 74 20 65 6e 66 6f 72 63  W: Height enforc
5ad0: 65 6d 65 6e 74 20 6f 66 66 20 2a 2f 0a 2f 2a 0a  ement off */./*.
5ae0: 2a 2a 20 50 72 6f 70 61 67 61 74 65 20 61 6c 6c  ** Propagate all
5af0: 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c   EP_Propagate fl
5b00: 61 67 73 20 66 72 6f 6d 20 74 68 65 20 45 78 70  ags from the Exp
5b10: 72 2e 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a  r.x.pList into.*
5b20: 2a 20 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a  * Expr.flags. .*
5b30: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
5b40: 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c  prSetHeightAndFl
5b50: 61 67 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ags(Parse *pPars
5b60: 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  e, Expr *p){.  i
5b70: 66 28 20 70 20 26 26 20 70 2d 3e 78 2e 70 4c 69  f( p && p->x.pLi
5b80: 73 74 20 26 26 20 21 45 78 70 72 48 61 73 50 72  st && !ExprHasPr
5b90: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73  operty(p, EP_xIs
5ba0: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 70  Select) ){.    p
5bb0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72  ->flags |= EP_Pr
5bc0: 6f 70 61 67 61 74 65 20 26 20 73 71 6c 69 74 65  opagate & sqlite
5bd0: 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70  3ExprListFlags(p
5be0: 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a  ->x.pList);.  }.
5bf0: 7d 0a 23 64 65 66 69 6e 65 20 65 78 70 72 53 65  }.#define exprSe
5c00: 74 48 65 69 67 68 74 28 79 29 0a 23 65 6e 64 69  tHeight(y).#endi
5c10: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f  f /* SQLITE_MAX_
5c20: 45 58 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a  EXPR_DEPTH>0 */.
5c30: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
5c40: 69 6e 65 20 69 73 20 74 68 65 20 63 6f 72 65 20  ine is the core 
5c50: 61 6c 6c 6f 63 61 74 6f 72 20 66 6f 72 20 45 78  allocator for Ex
5c60: 70 72 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20  pr nodes..**.** 
5c70: 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  Construct a new 
5c80: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
5c90: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
5ca0: 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d  nter to it.  Mem
5cb0: 6f 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20  ory.** for this 
5cc0: 6e 6f 64 65 20 61 6e 64 20 66 6f 72 20 74 68 65  node and for the
5cd0: 20 70 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74   pToken argument
5ce0: 20 69 73 20 61 20 73 69 6e 67 6c 65 20 61 6c 6c   is a single all
5cf0: 6f 63 61 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69  ocation.** obtai
5d00: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
5d10: 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65  DbMalloc().  The
5d20: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
5d30: 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69  n.** is responsi
5d40: 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73  ble for making s
5d50: 75 72 65 20 74 68 65 20 6e 6f 64 65 20 65 76 65  ure the node eve
5d60: 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65  ntually gets fre
5d70: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 71  ed..**.** If deq
5d80: 75 6f 74 65 20 69 73 20 74 72 75 65 2c 20 74 68  uote is true, th
5d90: 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20 28 69 66  en the token (if
5da0: 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20 64   it exists) is d
5db0: 65 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 64  equoted..** If d
5dc0: 65 71 75 6f 74 65 20 69 73 20 66 61 6c 73 65 2c  equote is false,
5dd0: 20 6e 6f 20 64 65 71 75 6f 74 69 6e 67 20 69 73   no dequoting is
5de0: 20 70 65 72 66 6f 72 6d 65 64 2e 20 20 54 68 65   performed.  The
5df0: 20 64 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61   deQuote.** para
5e00: 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64  meter is ignored
5e10: 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55   if pToken is NU
5e20: 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 74 6f 6b  LL or if the tok
5e30: 65 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61  en does not.** a
5e40: 70 70 65 61 72 20 74 6f 20 62 65 20 71 75 6f 74  ppear to be quot
5e50: 65 64 2e 20 20 49 66 20 74 68 65 20 71 75 6f 74  ed.  If the quot
5e60: 65 73 20 77 65 72 65 20 6f 66 20 74 68 65 20 66  es were of the f
5e70: 6f 72 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c  orm "..." (doubl
5e80: 65 2d 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65  e-quotes).** the
5e90: 6e 20 74 68 65 20 45 50 5f 44 62 6c 51 75 6f 74  n the EP_DblQuot
5ea0: 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f  ed flag is set o
5eb0: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
5ec0: 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65   node..**.** Spe
5ed0: 63 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20 6f  cial case:  If o
5ee0: 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e  p==TK_INTEGER an
5ef0: 64 20 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20  d pToken points 
5f00: 74 6f 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  to a string that
5f10: 0a 2a 2a 20 63 61 6e 20 62 65 20 74 72 61 6e 73  .** can be trans
5f20: 6c 61 74 65 64 20 69 6e 74 6f 20 61 20 33 32 2d  lated into a 32-
5f30: 62 69 74 20 69 6e 74 65 67 65 72 2c 20 74 68 65  bit integer, the
5f40: 6e 20 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e  n the token is n
5f50: 6f 74 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  ot.** stored in 
5f60: 75 2e 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65  u.zToken.  Inste
5f70: 61 64 2c 20 74 68 65 20 69 6e 74 65 67 65 72 20  ad, the integer 
5f80: 76 61 6c 75 65 73 20 69 73 20 77 72 69 74 74 65  values is writte
5f90: 6e 0a 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c  n.** into u.iVal
5fa0: 75 65 20 61 6e 64 20 74 68 65 20 45 50 5f 49 6e  ue and the EP_In
5fb0: 74 56 61 6c 75 65 20 66 6c 61 67 20 69 73 20 73  tValue flag is s
5fc0: 65 74 2e 20 20 4e 6f 20 65 78 74 72 61 20 73 74  et.  No extra st
5fd0: 6f 72 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f  orage.** is allo
5fe0: 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  cated to hold th
5ff0: 65 20 69 6e 74 65 67 65 72 20 74 65 78 74 20 61  e integer text a
6000: 6e 64 20 74 68 65 20 64 65 71 75 6f 74 65 20 66  nd the dequote f
6010: 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a  lag is ignored..
6020: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
6030: 45 78 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c  ExprAlloc(.  sql
6040: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
6050: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
6060: 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  or sqlite3DbMall
6070: 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65  ocZero() (may be
6080: 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20   null) */.  int 
6090: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
60a0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
60b0: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  n opcode */.  co
60c0: 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  nst Token *pToke
60d0: 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61  n,    /* Token a
60e0: 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20  rgument.  Might 
60f0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
6100: 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20   dequote        
6110: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
6120: 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20  dequote */.){.  
6130: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  Expr *pNew;.  in
6140: 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20  t nExtra = 0;.  
6150: 69 6e 74 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a  int iValue = 0;.
6160: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
6170: 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e   );.  if( pToken
6180: 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d   ){.    if( op!=
6190: 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 70 54  TK_INTEGER || pT
61a0: 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20 20 20  oken->z==0.     
61b0: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47       || sqlite3G
61c0: 65 74 49 6e 74 33 32 28 70 54 6f 6b 65 6e 2d 3e  etInt32(pToken->
61d0: 7a 2c 20 26 69 56 61 6c 75 65 29 3d 3d 30 20 29  z, &iValue)==0 )
61e0: 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 3d  {.      nExtra =
61f0: 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a 20 20   pToken->n+1;.  
6200: 20 20 20 20 61 73 73 65 72 74 28 20 69 56 61 6c      assert( iVal
6210: 75 65 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  ue>=0 );.    }. 
6220: 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69   }.  pNew = sqli
6230: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
6240: 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  (db, sizeof(Expr
6250: 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28  )+nExtra);.  if(
6260: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 6d 65 6d   pNew ){.    mem
6270: 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a  set(pNew, 0, siz
6280: 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 20 20  eof(Expr));.    
6290: 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29 6f  pNew->op = (u8)o
62a0: 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41 67  p;.    pNew->iAg
62b0: 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  g = -1;.    if( 
62c0: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20  pToken ){.      
62d0: 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29 7b  if( nExtra==0 ){
62e0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  .        pNew->f
62f0: 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61  lags |= EP_IntVa
6300: 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  lue;.        pNe
6310: 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 56  w->u.iValue = iV
6320: 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  alue;.      }els
6330: 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  e{.        pNew-
6340: 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61  >u.zToken = (cha
6350: 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20  r*)&pNew[1];.   
6360: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f       assert( pTo
6370: 6b 65 6e 2d 3e 7a 21 3d 30 20 7c 7c 20 70 54 6f  ken->z!=0 || pTo
6380: 6b 65 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20  ken->n==0 );.   
6390: 20 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d       if( pToken-
63a0: 3e 6e 20 29 20 6d 65 6d 63 70 79 28 70 4e 65 77  >n ) memcpy(pNew
63b0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54 6f 6b  ->u.zToken, pTok
63c0: 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e  en->z, pToken->n
63d0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
63e0: 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b 65 6e  >u.zToken[pToken
63f0: 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  ->n] = 0;.      
6400: 20 20 69 66 28 20 64 65 71 75 6f 74 65 20 26 26    if( dequote &&
6410: 20 73 71 6c 69 74 65 33 49 73 71 75 6f 74 65 28   sqlite3Isquote(
6420: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  pNew->u.zToken[0
6430: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
6440: 69 66 28 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b  if( pNew->u.zTok
6450: 65 6e 5b 30 5d 3d 3d 27 22 27 20 29 20 70 4e 65  en[0]=='"' ) pNe
6460: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 44  w->flags |= EP_D
6470: 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20 20 20  blQuoted;.      
6480: 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
6490: 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65  te(pNew->u.zToke
64a0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  n);.        }.  
64b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 20      }.    }.#if 
64c0: 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
64d0: 44 45 50 54 48 3e 30 0a 20 20 20 20 70 4e 65 77  DEPTH>0.    pNew
64e0: 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b 0a 23  ->nHeight = 1;.#
64f0: 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20 72 65  endif  .  }.  re
6500: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
6510: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
6520: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ew expression no
6530: 64 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 74  de from a zero-t
6540: 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65 6e 20  erminated token 
6550: 74 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c 72 65  that has.** alre
6560: 61 64 79 20 62 65 65 6e 20 64 65 71 75 6f 74 65  ady been dequote
6570: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
6580: 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c 69 74  te3Expr(.  sqlit
6590: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
65a0: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
65b0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
65c0: 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e  Zero() (may be n
65d0: 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  ull) */.  int op
65e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
65f0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
6600: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  opcode */.  cons
6610: 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 20  t char *zToken  
6620: 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67      /* Token arg
6630: 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65  ument.  Might be
6640: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 6f   NULL */.){.  To
6650: 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d 20 7a  ken x;.  x.z = z
6660: 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d 20 7a  Token;.  x.n = z
6670: 54 6f 6b 65 6e 20 3f 20 73 71 6c 69 74 65 33 53  Token ? sqlite3S
6680: 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e 29 20  trlen30(zToken) 
6690: 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  : 0;.  return sq
66a0: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
66b0: 62 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b 0a 7d  b, op, &x, 0);.}
66c0: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20 73  ../*.** Attach s
66d0: 75 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e  ubtrees pLeft an
66e0: 64 20 70 52 69 67 68 74 20 74 6f 20 74 68 65 20  d pRight to the 
66f0: 45 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f 74 2e  Expr node pRoot.
6700: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f 74 3d  .**.** If pRoot=
6710: 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
6720: 20 74 68 61 74 20 61 20 6d 65 6d 6f 72 79 20 61   that a memory a
6730: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
6740: 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a  has occurred..**
6750: 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64   In that case, d
6760: 65 6c 65 74 65 20 74 68 65 20 73 75 62 74 72 65  elete the subtre
6770: 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69  es pLeft and pRi
6780: 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ght..*/.void sql
6790: 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53 75  ite3ExprAttachSu
67a0: 62 74 72 65 65 73 28 0a 20 20 73 71 6c 69 74 65  btrees(.  sqlite
67b0: 33 20 2a 64 62 2c 0a 20 20 45 78 70 72 20 2a 70  3 *db,.  Expr *p
67c0: 52 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a 70 4c  Root,.  Expr *pL
67d0: 65 66 74 2c 0a 20 20 45 78 70 72 20 2a 70 52 69  eft,.  Expr *pRi
67e0: 67 68 74 0a 29 7b 0a 20 20 69 66 28 20 70 52 6f  ght.){.  if( pRo
67f0: 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ot==0 ){.    ass
6800: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
6810: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c  ailed );.    sql
6820: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
6830: 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  b, pLeft);.    s
6840: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
6850: 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  (db, pRight);.  
6860: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
6870: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70  Right ){.      p
6880: 52 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d 20 70  Root->pRight = p
6890: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70 52 6f  Right;.      pRo
68a0: 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ot->flags |= EP_
68b0: 50 72 6f 70 61 67 61 74 65 20 26 20 70 52 69 67  Propagate & pRig
68c0: 68 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d  ht->flags;.    }
68d0: 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 20 29  .    if( pLeft )
68e0: 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70  {.      pRoot->p
68f0: 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20  Left = pLeft;.  
6900: 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73      pRoot->flags
6910: 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65   |= EP_Propagate
6920: 20 26 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 3b   & pLeft->flags;
6930: 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 70 72 53  .    }.    exprS
6940: 65 74 48 65 69 67 68 74 28 70 52 6f 6f 74 29 3b  etHeight(pRoot);
6950: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
6960: 6c 6f 63 61 74 65 20 61 6e 20 45 78 70 72 20 6e  locate an Expr n
6970: 6f 64 65 20 77 68 69 63 68 20 6a 6f 69 6e 73 20  ode which joins 
6980: 61 73 20 6d 61 6e 79 20 61 73 20 74 77 6f 20 73  as many as two s
6990: 75 62 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f  ubtrees..**.** O
69a0: 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68  ne or both of th
69b0: 65 20 73 75 62 74 72 65 65 73 20 63 61 6e 20 62  e subtrees can b
69c0: 65 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 20  e NULL.  Return 
69d0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
69e0: 20 6e 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f 64   new.** Expr nod
69f0: 65 2e 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f  e.  Or, if an OO
6a00: 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  M error occurs, 
6a10: 73 65 74 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  set pParse->db->
6a20: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a  mallocFailed,.**
6a30: 20 66 72 65 65 20 74 68 65 20 73 75 62 74 72 65   free the subtre
6a40: 65 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  es and return NU
6a50: 4c 4c 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  LL..*/.Expr *sql
6a60: 69 74 65 33 50 45 78 70 72 28 0a 20 20 50 61 72  ite3PExpr(.  Par
6a70: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
6a80: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
6a90: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
6aa0: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
6ab0: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
6ac0: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45  on opcode */.  E
6ad0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  xpr *pLeft,     
6ae0: 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f         /* Left o
6af0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72  perand */.  Expr
6b00: 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 20 20   *pRight,       
6b10: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65      /* Right ope
6b20: 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rand */.  const 
6b30: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20 20  Token *pToken   
6b40: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
6b50: 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ken */.){.  Expr
6b60: 20 2a 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54   *p;.  if( op==T
6b70: 4b 5f 41 4e 44 20 26 26 20 70 50 61 72 73 65 2d  K_AND && pParse-
6b80: 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
6b90: 2f 2a 20 54 61 6b 65 20 61 64 76 61 6e 74 61 67  /* Take advantag
6ba0: 65 20 6f 66 20 73 68 6f 72 74 2d 63 69 72 63 75  e of short-circu
6bb0: 69 74 20 66 61 6c 73 65 20 6f 70 74 69 6d 69 7a  it false optimiz
6bc0: 61 74 69 6f 6e 20 66 6f 72 20 41 4e 44 20 2a 2f  ation for AND */
6bd0: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
6be0: 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e  ExprAnd(pParse->
6bf0: 64 62 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  db, pLeft, pRigh
6c00: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
6c10: 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   p = sqlite3Expr
6c20: 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
6c30: 2c 20 6f 70 20 26 20 54 4b 46 4c 47 5f 4d 41 53  , op & TKFLG_MAS
6c40: 4b 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20  K, pToken, 1);. 
6c50: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74     sqlite3ExprAt
6c60: 74 61 63 68 53 75 62 74 72 65 65 73 28 70 50 61  tachSubtrees(pPa
6c70: 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66  rse->db, p, pLef
6c80: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a  t, pRight);.  }.
6c90: 20 20 69 66 28 20 70 20 29 20 7b 0a 20 20 20 20    if( p ) {.    
6ca0: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
6cb0: 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70  Height(pParse, p
6cc0: 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a  ->nHeight);.  }.
6cd0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
6ce0: 2a 0a 2a 2a 20 41 64 64 20 70 53 65 6c 65 63 74  *.** Add pSelect
6cf0: 20 74 6f 20 74 68 65 20 45 78 70 72 2e 78 2e 70   to the Expr.x.p
6d00: 53 65 6c 65 63 74 20 66 69 65 6c 64 2e 20 20 4f  Select field.  O
6d10: 72 2c 20 69 66 20 70 45 78 70 72 20 69 73 20 4e  r, if pExpr is N
6d20: 55 4c 4c 20 28 64 75 65 0a 2a 2a 20 64 6f 20 61  ULL (due.** do a
6d30: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
6d40: 6f 6e 20 66 61 69 6c 75 72 65 29 20 74 68 65 6e  on failure) then
6d50: 20 64 65 6c 65 74 65 20 74 68 65 20 70 53 65 6c   delete the pSel
6d60: 65 63 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76  ect object..*/.v
6d70: 6f 69 64 20 73 71 6c 69 74 65 33 50 45 78 70 72  oid sqlite3PExpr
6d80: 41 64 64 53 65 6c 65 63 74 28 50 61 72 73 65 20  AddSelect(Parse 
6d90: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
6da0: 45 78 70 72 2c 20 53 65 6c 65 63 74 20 2a 70 53  Expr, Select *pS
6db0: 65 6c 65 63 74 29 7b 0a 20 20 69 66 28 20 70 45  elect){.  if( pE
6dc0: 78 70 72 20 29 7b 0a 20 20 20 20 70 45 78 70 72  xpr ){.    pExpr
6dd0: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 70 53  ->x.pSelect = pS
6de0: 65 6c 65 63 74 3b 0a 20 20 20 20 45 78 70 72 53  elect;.    ExprS
6df0: 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
6e00: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 7c 45  , EP_xIsSelect|E
6e10: 50 5f 53 75 62 71 75 65 72 79 29 3b 0a 20 20 20  P_Subquery);.   
6e20: 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48   sqlite3ExprSetH
6e30: 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28 70 50  eightAndFlags(pP
6e40: 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
6e50: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
6e60: 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  t( pParse->db->m
6e70: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
6e80: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
6e90: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
6ea0: 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d  b, pSelect);.  }
6eb0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .}.../*.** If th
6ec0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
6ed0: 61 6c 77 61 79 73 20 65 69 74 68 65 72 20 54 52  always either TR
6ee0: 55 45 20 6f 72 20 46 41 4c 53 45 20 28 72 65 73  UE or FALSE (res
6ef0: 70 65 63 74 69 76 65 6c 79 29 2c 0a 2a 2a 20 74  pectively),.** t
6f00: 68 65 6e 20 72 65 74 75 72 6e 20 31 2e 20 20 49  hen return 1.  I
6f10: 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 64 65 74  f one cannot det
6f20: 65 72 6d 69 6e 65 20 74 68 65 20 74 72 75 74 68  ermine the truth
6f30: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a   value of the.**
6f40: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74 20 63   expression at c
6f50: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 72 65 74 75  ompile-time retu
6f60: 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rn 0..**.** This
6f70: 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
6f80: 69 6f 6e 2e 20 20 49 66 20 69 73 20 4f 4b 20 74  ion.  If is OK t
6f90: 6f 20 72 65 74 75 72 6e 20 30 20 68 65 72 65 20  o return 0 here 
6fa0: 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20 65  even if.** the e
6fb0: 78 70 72 65 73 73 69 6f 6e 20 72 65 61 6c 6c 79  xpression really
6fc0: 20 69 73 20 61 6c 77 61 79 73 20 66 61 6c 73 65   is always false
6fd0: 20 6f 72 20 66 61 6c 73 65 20 28 61 20 66 61 6c   or false (a fal
6fe0: 73 65 20 6e 65 67 61 74 69 76 65 29 2e 0a 2a 2a  se negative)..**
6ff0: 20 42 75 74 20 69 74 20 69 73 20 61 20 62 75 67   But it is a bug
7000: 20 74 6f 20 72 65 74 75 72 6e 20 31 20 69 66 20   to return 1 if 
7010: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  the expression m
7020: 69 67 68 74 20 68 61 76 65 20 64 69 66 66 65 72  ight have differ
7030: 65 6e 74 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20 76  ent.** boolean v
7040: 61 6c 75 65 73 20 69 6e 20 64 69 66 66 65 72 65  alues in differe
7050: 6e 74 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  nt circumstances
7060: 20 28 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69   (a false positi
7070: 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ve.).**.** Note 
7080: 74 68 61 74 20 69 66 20 74 68 65 20 65 78 70 72  that if the expr
7090: 65 73 73 69 6f 6e 20 69 73 20 70 61 72 74 20 6f  ession is part o
70a0: 66 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 66 6f  f conditional fo
70b0: 72 20 61 0a 2a 2a 20 4c 45 46 54 20 4a 4f 49 4e  r a.** LEFT JOIN
70c0: 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74  , then we cannot
70d0: 20 64 65 74 65 72 6d 69 6e 65 20 61 74 20 63 6f   determine at co
70e0: 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68  mpile-time wheth
70f0: 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 69 73 20  er or not.** is 
7100: 69 74 20 74 72 75 65 20 6f 72 20 66 61 6c 73 65  it true or false
7110: 2c 20 73 6f 20 61 6c 77 61 79 73 20 72 65 74 75  , so always retu
7120: 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rn 0..*/.static 
7130: 69 6e 74 20 65 78 70 72 41 6c 77 61 79 73 54 72  int exprAlwaysTr
7140: 75 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  ue(Expr *p){.  i
7150: 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20  nt v = 0;.  if( 
7160: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
7170: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  p, EP_FromJoin) 
7180: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
7190: 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73  ( !sqlite3ExprIs
71a0: 49 6e 74 65 67 65 72 28 70 2c 20 26 76 29 20 29  Integer(p, &v) )
71b0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
71c0: 75 72 6e 20 76 21 3d 30 3b 0a 7d 0a 73 74 61 74  urn v!=0;.}.stat
71d0: 69 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61 79  ic int exprAlway
71e0: 73 46 61 6c 73 65 28 45 78 70 72 20 2a 70 29 7b  sFalse(Expr *p){
71f0: 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20  .  int v = 0;.  
7200: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
7210: 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rty(p, EP_FromJo
7220: 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  in) ) return 0;.
7230: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
7240: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26  prIsInteger(p, &
7250: 76 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  v) ) return 0;. 
7260: 20 72 65 74 75 72 6e 20 76 3d 3d 30 3b 0a 7d 0a   return v==0;.}.
7270: 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f 20  ./*.** Join two 
7280: 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73 69 6e  expressions usin
7290: 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  g an AND operato
72a0: 72 2e 20 20 49 66 20 65 69 74 68 65 72 20 65 78  r.  If either ex
72b0: 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 4e  pression is.** N
72c0: 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20 72  ULL, then just r
72d0: 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65 72 20  eturn the other 
72e0: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
72f0: 2a 20 49 66 20 6f 6e 65 20 73 69 64 65 20 6f 72  * If one side or
7300: 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
7310: 65 20 41 4e 44 20 69 73 20 6b 6e 6f 77 6e 20 74  e AND is known t
7320: 6f 20 62 65 20 66 61 6c 73 65 2c 20 74 68 65 6e  o be false, then
7330: 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 72   instead.** of r
7340: 65 74 75 72 6e 69 6e 67 20 61 6e 20 41 4e 44 20  eturning an AND 
7350: 65 78 70 72 65 73 73 69 6f 6e 2c 20 6a 75 73 74  expression, just
7360: 20 72 65 74 75 72 6e 20 61 20 63 6f 6e 73 74 61   return a consta
7370: 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  nt expression wi
7380: 74 68 0a 2a 2a 20 61 20 76 61 6c 75 65 20 6f 66  th.** a value of
7390: 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45 78 70 72 20   false..*/.Expr 
73a0: 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28  *sqlite3ExprAnd(
73b0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
73c0: 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20 2a  r *pLeft, Expr *
73d0: 70 52 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70  pRight){.  if( p
73e0: 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Left==0 ){.    r
73f0: 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a 20 20  eturn pRight;.  
7400: 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68 74  }else if( pRight
7410: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
7420: 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73 65  n pLeft;.  }else
7430: 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 46   if( exprAlwaysF
7440: 61 6c 73 65 28 70 4c 65 66 74 29 20 7c 7c 20 65  alse(pLeft) || e
7450: 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
7460: 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71  Right) ){.    sq
7470: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
7480: 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20  db, pLeft);.    
7490: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
74a0: 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20  e(db, pRight);. 
74b0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
74c0: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
74d0: 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c 69  K_INTEGER, &sqli
74e0: 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30 5d 2c  te3IntTokens[0],
74f0: 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
7500: 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73    Expr *pNew = s
7510: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
7520: 64 62 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20 30  db, TK_AND, 0, 0
7530: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
7540: 70 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73  prAttachSubtrees
7550: 28 64 62 2c 20 70 4e 65 77 2c 20 70 4c 65 66 74  (db, pNew, pLeft
7560: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72  , pRight);.    r
7570: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 20 20 7d 0a  eturn pNew;.  }.
7580: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75  }../*.** Constru
7590: 63 74 20 61 20 6e 65 77 20 65 78 70 72 65 73 73  ct a new express
75a0: 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20 66  ion node for a f
75b0: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c  unction with mul
75c0: 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  tiple.** argumen
75d0: 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ts..*/.Expr *sql
75e0: 69 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f 6e  ite3ExprFunction
75f0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
7600: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
7610: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
7620: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
7630: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
7640: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73  Parse->db;.  ass
7650: 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20  ert( pToken );. 
7660: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
7670: 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f  xprAlloc(db, TK_
7680: 46 55 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b 65 6e  FUNCTION, pToken
7690: 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  , 1);.  if( pNew
76a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
76b0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
76c0: 28 64 62 2c 20 70 4c 69 73 74 29 3b 20 2f 2a 20  (db, pList); /* 
76d0: 41 76 6f 69 64 20 6d 65 6d 6f 72 79 20 6c 65 61  Avoid memory lea
76e0: 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61  k when malloc fa
76f0: 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ils */.    retur
7700: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  n 0;.  }.  pNew-
7710: 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74  >x.pList = pList
7720: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  ;.  assert( !Exp
7730: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
7740: 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  w, EP_xIsSelect)
7750: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
7760: 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61  rSetHeightAndFla
7770: 67 73 28 70 50 61 72 73 65 2c 20 70 4e 65 77 29  gs(pParse, pNew)
7780: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
7790: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
77a0: 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62   a variable numb
77b0: 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73  er to an express
77c0: 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64 65 73  ion that encodes
77d0: 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69   a wildcard.** i
77e0: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
77f0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a  QL statement.  .
7800: 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20  **.** Wildcards 
7810: 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20  consisting of a 
7820: 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65 20 61  single "?" are a
7830: 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65 78 74  ssigned the next
7840: 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 76   sequential.** v
7850: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e 0a  ariable number..
7860: 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20  **.** Wildcards 
7870: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e  of the form "?nn
7880: 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  n" are assigned 
7890: 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e 22  the number "nnn"
78a0: 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73 75  .  We make.** su
78b0: 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74 20  re "nnn" is not 
78c0: 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69 64 20  too be to avoid 
78d0: 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65 72 76  a denial of serv
78e0: 69 63 65 20 61 74 74 61 63 6b 20 77 68 65 6e 0a  ice attack when.
78f0: 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  ** the SQL state
7900: 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20  ment comes from 
7910: 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f 75 72  an external sour
7920: 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  ce..**.** Wildca
7930: 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rds of the form 
7940: 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22 2c 20  ":aaa", "@aaa", 
7950: 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61 73  or "$aaa" are as
7960: 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65 20  signed the same 
7970: 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68 65  number.** as the
7980: 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61 6e   previous instan
7990: 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 77  ce of the same w
79a0: 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66 20  ildcard.  Or if 
79b0: 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
79c0: 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66  t.** instance of
79d0: 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20 74   the wildcard, t
79e0: 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69  he next sequenti
79f0: 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  al variable numb
7a00: 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65  er is.** assigne
7a10: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
7a20: 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e  e3ExprAssignVarN
7a30: 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50 61  umber(Parse *pPa
7a40: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
7a50: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
7a60: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
7a70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
7a80: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
7a90: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
7aa0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
7ab0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
7ac0: 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65 64 75 63  ntValue|EP_Reduc
7ad0: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  ed|EP_TokenOnly)
7ae0: 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78 70 72 2d   );.  z = pExpr-
7af0: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 61 73 73  >u.zToken;.  ass
7b00: 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 61  ert( z!=0 );.  a
7b10: 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d 30 20 29  ssert( z[0]!=0 )
7b20: 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 30 20  ;.  if( z[1]==0 
7b30: 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  ){.    /* Wildca
7b40: 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rd of the form "
7b50: 3f 22 2e 20 20 41 73 73 69 67 6e 20 74 68 65 20  ?".  Assign the 
7b60: 6e 65 78 74 20 76 61 72 69 61 62 6c 65 20 6e 75  next variable nu
7b70: 6d 62 65 72 20 2a 2f 0a 20 20 20 20 61 73 73 65  mber */.    asse
7b80: 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b  rt( z[0]=='?' );
7b90: 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c  .    pExpr->iCol
7ba0: 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b  umn = (ynVar)(++
7bb0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20  pParse->nVar);. 
7bc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 79 6e 56 61   }else{.    ynVa
7bd0: 72 20 78 20 3d 20 30 3b 0a 20 20 20 20 75 33 32  r x = 0;.    u32
7be0: 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
7bf0: 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69 66 28  en30(z);.    if(
7c00: 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20   z[0]=='?' ){.  
7c10: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20      /* Wildcard 
7c20: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e  of the form "?nn
7c30: 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e  n".  Convert "nn
7c40: 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  n" to an integer
7c50: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75 73   and.      ** us
7c60: 65 20 69 74 20 61 73 20 74 68 65 20 76 61 72 69  e it as the vari
7c70: 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  able number */. 
7c80: 20 20 20 20 20 69 36 34 20 69 3b 0a 20 20 20 20       i64 i;.    
7c90: 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3d 3d 73    int bOk = 0==s
7ca0: 71 6c 69 74 65 33 41 74 6f 69 36 34 28 26 7a 5b  qlite3Atoi64(&z[
7cb0: 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53 51 4c  1], &i, n-1, SQL
7cc0: 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20  ITE_UTF8);.     
7cd0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
7ce0: 3d 20 78 20 3d 20 28 79 6e 56 61 72 29 69 3b 0a  = x = (ynVar)i;.
7cf0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
7d00: 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  i==0 );.      te
7d10: 73 74 63 61 73 65 28 20 69 3d 3d 31 20 29 3b 0a  stcase( i==1 );.
7d20: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
7d30: 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  i==db->aLimit[SQ
7d40: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
7d50: 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20 29 3b  BLE_NUMBER]-1 );
7d60: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
7d70: 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53   i==db->aLimit[S
7d80: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
7d90: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 3b 0a  ABLE_NUMBER] );.
7da0: 20 20 20 20 20 20 69 66 28 20 62 4f 6b 3d 3d 30        if( bOk==0
7db0: 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e 64 62 2d   || i<1 || i>db-
7dc0: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
7dd0: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
7de0: 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 20 20 20  MBER] ){.       
7df0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7e00: 28 70 50 61 72 73 65 2c 20 22 76 61 72 69 61 62  (pParse, "variab
7e10: 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 62  le number must b
7e20: 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e 64  e between ?1 and
7e30: 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20   ?%d",.         
7e40: 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51     db->aLimit[SQ
7e50: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
7e60: 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20 20  BLE_NUMBER]);.  
7e70: 20 20 20 20 20 20 78 20 3d 20 30 3b 0a 20 20 20        x = 0;.   
7e80: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
7e90: 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b  >pParse->nVar ){
7ea0: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
7eb0: 3e 6e 56 61 72 20 3d 20 28 69 6e 74 29 69 3b 0a  >nVar = (int)i;.
7ec0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
7ed0: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64  e{.      /* Wild
7ee0: 63 61 72 64 73 20 6c 69 6b 65 20 22 3a 61 61 61  cards like ":aaa
7ef0: 22 2c 20 22 24 61 61 61 22 20 6f 72 20 22 40 61  ", "$aaa" or "@a
7f00: 61 61 22 2e 20 20 52 65 75 73 65 20 74 68 65 20  aa".  Reuse the 
7f10: 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20  same variable.  
7f20: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73      ** number as
7f30: 20 74 68 65 20 70 72 69 6f 72 20 61 70 70 65 61   the prior appea
7f40: 72 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d  rance of the sam
7f50: 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68  e name, or if th
7f60: 65 20 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20  e name.      ** 
7f70: 68 61 73 20 6e 65 76 65 72 20 61 70 70 65 61 72  has never appear
7f80: 65 64 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65  ed before, reuse
7f90: 20 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62   the same variab
7fa0: 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20  le number.      
7fb0: 2a 2f 0a 20 20 20 20 20 20 79 6e 56 61 72 20 69  */.      ynVar i
7fc0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
7fd0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72   i<pParse->nzVar
7fe0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
7ff0: 69 66 28 20 70 50 61 72 73 65 2d 3e 61 7a 56 61  if( pParse->azVa
8000: 72 5b 69 5d 20 26 26 20 73 74 72 63 6d 70 28 70  r[i] && strcmp(p
8010: 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 69 5d 2c  Parse->azVar[i],
8020: 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  z)==0 ){.       
8030: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
8040: 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72 29 69  n = x = (ynVar)i
8050: 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  +1;.          br
8060: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
8070: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
8080: 20 78 3d 3d 30 20 29 20 78 20 3d 20 70 45 78 70   x==0 ) x = pExp
8090: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e  r->iColumn = (yn
80a0: 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e  Var)(++pParse->n
80b0: 56 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Var);.    }.    
80c0: 69 66 28 20 78 3e 30 20 29 7b 0a 20 20 20 20 20  if( x>0 ){.     
80d0: 20 69 66 28 20 78 3e 70 50 61 72 73 65 2d 3e 6e   if( x>pParse->n
80e0: 7a 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20  zVar ){.        
80f0: 63 68 61 72 20 2a 2a 61 3b 0a 20 20 20 20 20 20  char **a;.      
8100: 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62 52    a = sqlite3DbR
8110: 65 61 6c 6c 6f 63 28 64 62 2c 20 70 50 61 72 73  ealloc(db, pPars
8120: 65 2d 3e 61 7a 56 61 72 2c 20 78 2a 73 69 7a 65  e->azVar, x*size
8130: 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20  of(a[0]));.     
8140: 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20     if( a==0 ){. 
8150: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
8160: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
8170: 64 20 29 3b 20 2f 2a 20 45 72 72 6f 72 20 72 65  d ); /* Error re
8180: 70 6f 72 74 65 64 20 74 68 72 6f 75 67 68 20 6d  ported through m
8190: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 2a 2f 0a 20  allocFailed */. 
81a0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b           return;
81b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
81c0: 20 20 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72     pParse->azVar
81d0: 20 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 6d 65   = a;.        me
81e0: 6d 73 65 74 28 26 61 5b 70 50 61 72 73 65 2d 3e  mset(&a[pParse->
81f0: 6e 7a 56 61 72 5d 2c 20 30 2c 20 28 78 2d 70 50  nzVar], 0, (x-pP
8200: 61 72 73 65 2d 3e 6e 7a 56 61 72 29 2a 73 69 7a  arse->nzVar)*siz
8210: 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20 20  eof(a[0]));.    
8220: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61      pParse->nzVa
8230: 72 20 3d 20 78 3b 0a 20 20 20 20 20 20 7d 0a 20  r = x;.      }. 
8240: 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27       if( z[0]!='
8250: 3f 27 20 7c 7c 20 70 50 61 72 73 65 2d 3e 61 7a  ?' || pParse->az
8260: 56 61 72 5b 78 2d 31 5d 3d 3d 30 20 29 7b 0a 20  Var[x-1]==0 ){. 
8270: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
8280: 46 72 65 65 28 64 62 2c 20 70 50 61 72 73 65 2d  Free(db, pParse-
8290: 3e 61 7a 56 61 72 5b 78 2d 31 5d 29 3b 0a 20 20  >azVar[x-1]);.  
82a0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 7a        pParse->az
82b0: 56 61 72 5b 78 2d 31 5d 20 3d 20 73 71 6c 69 74  Var[x-1] = sqlit
82c0: 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
82d0: 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  z, n);.      }. 
82e0: 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66 28 20     }.  } .  if( 
82f0: 21 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 26 26  !pParse->nErr &&
8300: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 64 62   pParse->nVar>db
8310: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
8320: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
8330: 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 73 71  UMBER] ){.    sq
8340: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8350: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
8360: 53 51 4c 20 76 61 72 69 61 62 6c 65 73 22 29 3b  SQL variables");
8370: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
8380: 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65  cursively delete
8390: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
83a0: 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  ree..*/.static S
83b0: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
83c0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 44  oid sqlite3ExprD
83d0: 65 6c 65 74 65 4e 4e 28 73 71 6c 69 74 65 33 20  eleteNN(sqlite3 
83e0: 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20  *db, Expr *p){. 
83f0: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
8400: 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
8410: 63 6b 3a 20 41 73 73 65 72 74 20 74 68 61 74 20  ck: Assert that 
8420: 74 68 65 20 49 6e 74 56 61 6c 75 65 20 69 73 20  the IntValue is 
8430: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 66 20  non-negative if 
8440: 69 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 61  it exists */.  a
8450: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
8460: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e  roperty(p, EP_In
8470: 74 56 61 6c 75 65 29 20 7c 7c 20 70 2d 3e 75 2e  tValue) || p->u.
8480: 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 69  iValue>=0 );.  i
8490: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
84a0: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
84b0: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  nly) ){.    /* T
84c0: 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20  he Expr.x union 
84d0: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61 74  is never used at
84e0: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
84f0: 73 20 45 78 70 72 2e 70 52 69 67 68 74 20 2a 2f  s Expr.pRight */
8500: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
8510: 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d  x.pList==0 || p-
8520: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
8530: 20 20 69 66 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f    if( p->op!=TK_
8540: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 20  SELECT_COLUMN ) 
8550: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
8560: 65 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b  e(db, p->pLeft);
8570: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
8580: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 52  Delete(db, p->pR
8590: 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20 45  ight);.    if( E
85a0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
85b0: 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29  , EP_MemToken) )
85c0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
85d0: 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  b, p->u.zToken);
85e0: 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
85f0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
8600: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
8610: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
8620: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e  Delete(db, p->x.
8630: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65  pSelect);.    }e
8640: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
8650: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
8660: 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29  (db, p->x.pList)
8670: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
8680: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
8690: 74 79 28 70 2c 20 45 50 5f 53 74 61 74 69 63 29  ty(p, EP_Static)
86a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
86b0: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
86c0: 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
86d0: 45 78 70 72 44 65 6c 65 74 65 28 73 71 6c 69 74  ExprDelete(sqlit
86e0: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29  e3 *db, Expr *p)
86f0: 7b 0a 20 20 69 66 28 20 70 20 29 20 73 71 6c 69  {.  if( p ) sqli
8700: 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28  te3ExprDeleteNN(
8710: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
8720: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
8730: 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f  er of bytes allo
8740: 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 65 78  cated for the ex
8750: 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63 74 75  pression structu
8760: 72 65 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73  re .** passed as
8770: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
8780: 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61 6c 77  ent. This is alw
8790: 61 79 73 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f  ays one of EXPR_
87a0: 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50  FULLSIZE,.** EXP
87b0: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72  R_REDUCEDSIZE or
87c0: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
87d0: 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  IZE..*/.static i
87e0: 6e 74 20 65 78 70 72 53 74 72 75 63 74 53 69 7a  nt exprStructSiz
87f0: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  e(Expr *p){.  if
8800: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
8810: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
8820: 79 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52  y) ) return EXPR
8830: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a  _TOKENONLYSIZE;.
8840: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
8850: 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75  perty(p, EP_Redu
8860: 63 65 64 29 20 29 20 72 65 74 75 72 6e 20 45 58  ced) ) return EX
8870: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 3b 0a  PR_REDUCEDSIZE;.
8880: 20 20 72 65 74 75 72 6e 20 45 58 50 52 5f 46 55    return EXPR_FU
8890: 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  LLSIZE;.}../*.**
88a0: 20 54 68 65 20 64 75 70 65 64 45 78 70 72 2a 53   The dupedExpr*S
88b0: 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 73 20 65  ize() routines e
88c0: 61 63 68 20 72 65 74 75 72 6e 20 74 68 65 20 6e  ach return the n
88d0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
88e0: 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 73 74  equired.** to st
88f0: 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20 61 6e  ore a copy of an
8900: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 20 65   expression or e
8910: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
8920: 20 54 68 65 79 20 64 69 66 66 65 72 20 69 6e 0a   They differ in.
8930: 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66 20 74  ** how much of t
8940: 68 65 20 74 72 65 65 20 69 73 20 6d 65 61 73 75  he tree is measu
8950: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64  red..**.**     d
8960: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
8970: 7a 65 28 29 20 20 20 20 20 53 69 7a 65 20 6f 66  ze()     Size of
8980: 20 6f 6e 6c 79 20 74 68 65 20 45 78 70 72 20 73   only the Expr s
8990: 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 20 20 20  tructure .**    
89a0: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
89b0: 7a 65 28 29 20 20 20 20 20 20 20 53 69 7a 65 20  ze()       Size 
89c0: 6f 66 20 45 78 70 72 20 2b 20 73 70 61 63 65 20  of Expr + space 
89d0: 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20  for token.**    
89e0: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 29   dupedExprSize()
89f0: 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
8a00: 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74 72 65  + token + subtre
8a10: 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a  e components.**.
8a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
8a70: 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72 53  * The dupedExprS
8a80: 74 72 75 63 74 53 69 7a 65 28 29 20 66 75 6e 63  tructSize() func
8a90: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 77 6f  tion returns two
8aa0: 20 76 61 6c 75 65 73 20 4f 52 2d 65 64 20 74 6f   values OR-ed to
8ab0: 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28 31 29  gether:  .** (1)
8ac0: 20 74 68 65 20 73 70 61 63 65 20 72 65 71 75 69   the space requi
8ad0: 72 65 64 20 66 6f 72 20 61 20 63 6f 70 79 20 6f  red for a copy o
8ae0: 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63  f the Expr struc
8af0: 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a  ture only and .*
8b00: 2a 20 28 32 29 20 74 68 65 20 45 50 5f 78 78 78  * (2) the EP_xxx
8b10: 20 66 6c 61 67 73 20 74 68 61 74 20 69 6e 64 69   flags that indi
8b20: 63 61 74 65 20 77 68 61 74 20 74 68 65 20 73 74  cate what the st
8b30: 72 75 63 74 75 72 65 20 73 69 7a 65 20 73 68 6f  ructure size sho
8b40: 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65 20 72  uld be..** The r
8b50: 65 74 75 72 6e 20 76 61 6c 75 65 73 20 69 73 20  eturn values is 
8b60: 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a  always one of:.*
8b70: 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 46  *.**      EXPR_F
8b80: 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20 20 20  ULLSIZE.**      
8b90: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
8ba0: 20 20 20 7c 20 45 50 5f 52 65 64 75 63 65 64 0a     | EP_Reduced.
8bb0: 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 54 4f 4b  **      EXPR_TOK
8bc0: 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f  ENONLYSIZE | EP_
8bd0: 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20  TokenOnly.**.** 
8be0: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
8bf0: 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65  structure can be
8c00: 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e   found by maskin
8c10: 67 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  g the return val
8c20: 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f  ue.** of this ro
8c30: 75 74 69 6e 65 20 77 69 74 68 20 30 78 66 66 66  utine with 0xfff
8c40: 2e 20 20 54 68 65 20 66 6c 61 67 73 20 63 61 6e  .  The flags can
8c50: 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73   be found by mas
8c60: 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65 74 75  king the.** retu
8c70: 72 6e 20 76 61 6c 75 65 20 77 69 74 68 20 45 50  rn value with EP
8c80: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
8c90: 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  nOnly..**.** Not
8ca0: 65 20 74 68 61 74 20 77 69 74 68 20 66 6c 61 67  e that with flag
8cb0: 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43  s==EXPRDUP_REDUC
8cc0: 45 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 73  E, this routines
8cd0: 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73   works on full-s
8ce0: 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75 63 65  ize.** (unreduce
8cf0: 64 29 20 45 78 70 72 20 6f 62 6a 65 63 74 73 20  d) Expr objects 
8d00: 61 73 20 74 68 65 79 20 6f 72 20 6f 72 69 67 69  as they or origi
8d10: 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63 74 65  nally constructe
8d20: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e  d by the parser.
8d30: 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78 70 72 65  .** During expre
8d40: 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 2c 20  ssion analysis, 
8d50: 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f  extra informatio
8d60: 6e 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e  n is computed an
8d70: 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a 20  d moved into.** 
8d80: 6c 61 74 65 72 20 70 61 72 74 73 20 6f 66 20 74  later parts of t
8d90: 65 68 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61  eh Expr object a
8da0: 6e 64 20 74 68 61 74 20 65 78 74 72 61 20 69 6e  nd that extra in
8db0: 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68 74 20  formation might 
8dc0: 67 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a 20 6f  get chopped.** o
8dd0: 66 66 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ff if the expres
8de0: 73 69 6f 6e 20 69 73 20 72 65 64 75 63 65 64 2e  sion is reduced.
8df0: 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74    Note also that
8e00: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72   it does not wor
8e10: 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61 6e 20  k to.** make an 
8e20: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 63  EXPRDUP_REDUCE c
8e30: 6f 70 79 20 6f 66 20 61 20 72 65 64 75 63 65 64  opy of a reduced
8e40: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 74   expression.  It
8e50: 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a   is only legal.*
8e60: 2a 20 74 6f 20 72 65 64 75 63 65 20 61 20 70 72  * to reduce a pr
8e70: 69 73 74 69 6e 65 20 65 78 70 72 65 73 73 69 6f  istine expressio
8e80: 6e 20 74 72 65 65 20 66 72 6f 6d 20 74 68 65 20  n tree from the 
8e90: 70 61 72 73 65 72 2e 20 20 54 68 65 20 69 6d 70  parser.  The imp
8ea0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f  lementation.** o
8eb0: 66 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63  f dupedExprStruc
8ec0: 74 53 69 7a 65 28 29 20 63 6f 6e 74 61 69 6e 20  tSize() contain 
8ed0: 6d 75 6c 74 69 70 6c 65 20 61 73 73 65 72 74 28  multiple assert(
8ee0: 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  ) statements tha
8ef0: 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20  t attempt.** to 
8f00: 65 6e 66 6f 72 63 65 20 74 68 69 73 20 63 6f 6e  enforce this con
8f10: 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74  straint..*/.stat
8f20: 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72  ic int dupedExpr
8f30: 53 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20  StructSize(Expr 
8f40: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
8f50: 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20 20 61    int nSize;.  a
8f60: 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 45 58  ssert( flags==EX
8f70: 50 52 44 55 50 5f 52 45 44 55 43 45 20 7c 7c 20  PRDUP_REDUCE || 
8f80: 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f  flags==0 ); /* O
8f90: 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76 61 6c  nly one flag val
8fa0: 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20  ue allowed */.  
8fb0: 61 73 73 65 72 74 28 20 45 58 50 52 5f 46 55 4c  assert( EXPR_FUL
8fc0: 4c 53 49 5a 45 3c 3d 30 78 66 66 66 20 29 3b 0a  LSIZE<=0xfff );.
8fd0: 20 20 61 73 73 65 72 74 28 20 28 30 78 66 66 66    assert( (0xfff
8fe0: 20 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45   & (EP_Reduced|E
8ff0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30  P_TokenOnly))==0
9000: 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d 66 6c 61   );.  if( 0==fla
9010: 67 73 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20  gs ){.    nSize 
9020: 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b  = EXPR_FULLSIZE;
9030: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
9040: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
9050: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
9060: 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
9070: 64 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  d) );.    assert
9080: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
9090: 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  ty(p, EP_FromJoi
90a0: 6e 29 20 29 3b 20 0a 20 20 20 20 61 73 73 65 72  n) ); .    asser
90b0: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
90c0: 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b  rty(p, EP_MemTok
90d0: 65 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  en) );.    asser
90e0: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
90f0: 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75  rty(p, EP_NoRedu
9100: 63 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ce) );.    if( p
9110: 2d 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e 78 2e  ->pLeft || p->x.
9120: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e  pList ){.      n
9130: 53 69 7a 65 20 3d 20 45 58 50 52 5f 52 45 44 55  Size = EXPR_REDU
9140: 43 45 44 53 49 5a 45 20 7c 20 45 50 5f 52 65 64  CEDSIZE | EP_Red
9150: 75 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  uced;.    }else{
9160: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9170: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
9180: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50       nSize = EXP
9190: 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20  R_TOKENONLYSIZE 
91a0: 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a  | EP_TokenOnly;.
91b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
91c0: 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a  rn nSize;.}../*.
91d0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
91e0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 70 61   returns the spa
91f0: 63 65 20 69 6e 20 62 79 74 65 73 20 72 65 71 75  ce in bytes requ
9200: 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  ired to store th
9210: 65 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74 68  e copy .** of th
9220: 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  e Expr structure
9230: 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 74   and a copy of t
9240: 68 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e  he Expr.u.zToken
9250: 20 73 74 72 69 6e 67 20 28 69 66 20 74 68 61 74   string (if that
9260: 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 64 65  .** string is de
9270: 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61 74 69  fined.).*/.stati
9280: 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 4e  c int dupedExprN
9290: 6f 64 65 53 69 7a 65 28 45 78 70 72 20 2a 70 2c  odeSize(Expr *p,
92a0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
92b0: 6e 74 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64  nt nByte = duped
92c0: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  ExprStructSize(p
92d0: 2c 20 66 6c 61 67 73 29 20 26 20 30 78 66 66 66  , flags) & 0xfff
92e0: 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  ;.  if( !ExprHas
92f0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49  Property(p, EP_I
9300: 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75  ntValue) && p->u
9310: 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 6e  .zToken ){.    n
9320: 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53  Byte += sqlite3S
9330: 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f  trlen30(p->u.zTo
9340: 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65  ken)+1;.  }.  re
9350: 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74  turn ROUND8(nByt
9360: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  e);.}../*.** Ret
9370: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
9380: 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64  f bytes required
9390: 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 75 70   to create a dup
93a0: 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20 0a 2a  licate of the .*
93b0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73  * expression pas
93c0: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
93d0: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 73   argument. The s
93e0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
93f0: 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74  s a.** mask cont
9400: 61 69 6e 69 6e 67 20 45 58 50 52 44 55 50 5f 58  aining EXPRDUP_X
9410: 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20  XX flags..**.** 
9420: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
9430: 65 64 20 69 6e 63 6c 75 64 65 73 20 73 70 61 63  ed includes spac
9440: 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f  e to create a co
9450: 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73  py of the Expr s
9460: 74 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20  truct.** itself 
9470: 61 6e 64 20 74 68 65 20 62 75 66 66 65 72 20 72  and the buffer r
9480: 65 66 65 72 72 65 64 20 74 6f 20 62 79 20 45 78  eferred to by Ex
9490: 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20  pr.u.zToken, if 
94a0: 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  any..**.** If th
94b0: 65 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  e EXPRDUP_REDUCE
94c0: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
94d0: 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  en the return va
94e0: 6c 75 65 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a  lue includes .**
94f0: 20 73 70 61 63 65 20 74 6f 20 64 75 70 6c 69 63   space to duplic
9500: 61 74 65 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64  ate all Expr nod
9510: 65 73 20 69 6e 20 74 68 65 20 74 72 65 65 20 66  es in the tree f
9520: 6f 72 6d 65 64 20 62 79 20 45 78 70 72 2e 70 4c  ormed by Expr.pL
9530: 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72  eft .** and Expr
9540: 2e 70 52 69 67 68 74 20 76 61 72 69 61 62 6c 65  .pRight variable
9550: 73 20 28 62 75 74 20 6e 6f 74 20 66 6f 72 20 61  s (but not for a
9560: 6e 79 20 73 74 72 75 63 74 75 72 65 73 20 70 6f  ny structures po
9570: 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20  inted to or .** 
9580: 64 65 73 63 65 6e 64 65 64 20 66 72 6f 6d 20 74  descended from t
9590: 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20  he Expr.x.pList 
95a0: 6f 72 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63  or Expr.x.pSelec
95b0: 74 20 76 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f  t variables)..*/
95c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65  .static int dupe
95d0: 64 45 78 70 72 53 69 7a 65 28 45 78 70 72 20 2a  dExprSize(Expr *
95e0: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
95f0: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a   int nByte = 0;.
9600: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 6e    if( p ){.    n
9610: 42 79 74 65 20 3d 20 64 75 70 65 64 45 78 70 72  Byte = dupedExpr
9620: 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c 61 67  NodeSize(p, flag
9630: 73 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67  s);.    if( flag
9640: 73 26 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  s&EXPRDUP_REDUCE
9650: 20 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20   ){.      nByte 
9660: 2b 3d 20 64 75 70 65 64 45 78 70 72 53 69 7a 65  += dupedExprSize
9670: 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73  (p->pLeft, flags
9680: 29 20 2b 20 64 75 70 65 64 45 78 70 72 53 69 7a  ) + dupedExprSiz
9690: 65 28 70 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61  e(p->pRight, fla
96a0: 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  gs);.    }.  }. 
96b0: 20 72 65 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d   return nByte;.}
96c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
96d0: 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72  ction is similar
96e0: 20 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 44   to sqlite3ExprD
96f0: 75 70 28 29 2c 20 65 78 63 65 70 74 20 74 68 61  up(), except tha
9700: 74 20 69 66 20 70 7a 42 75 66 66 65 72 20 0a 2a  t if pzBuffer .*
9710: 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  * is not NULL th
9720: 65 6e 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20  en *pzBuffer is 
9730: 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74  assumed to point
9740: 20 74 6f 20 61 20 62 75 66 66 65 72 20 6c 61 72   to a buffer lar
9750: 67 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f  ge enough .** to
9760: 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20   store the copy 
9770: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 2c  of expression p,
9780: 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 70   the copies of p
9790: 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69  ->u.zToken.** (i
97a0: 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 61  f applicable), a
97b0: 6e 64 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66  nd the copies of
97c0: 20 74 68 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e   the p->pLeft an
97d0: 64 20 70 2d 3e 70 52 69 67 68 74 20 65 78 70 72  d p->pRight expr
97e0: 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61  essions,.** if a
97f0: 6e 79 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72  ny. Before retur
9800: 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65 72 20  ning, *pzBuffer 
9810: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 66 69  is set to the fi
9820: 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
9830: 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f 66 20  e.** portion of 
9840: 74 68 65 20 62 75 66 66 65 72 20 63 6f 70 69 65  the buffer copie
9850: 64 20 69 6e 74 6f 20 62 79 20 74 68 69 73 20 66  d into by this f
9860: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
9870: 69 63 20 45 78 70 72 20 2a 65 78 70 72 44 75 70  ic Expr *exprDup
9880: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
9890: 70 72 20 2a 70 2c 20 69 6e 74 20 64 75 70 46 6c  pr *p, int dupFl
98a0: 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66  ags, u8 **pzBuff
98b0: 65 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  er){.  Expr *pNe
98c0: 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  w;           /* 
98d0: 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
98e0: 2a 2f 0a 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b  */.  u8 *zAlloc;
98f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
9900: 6d 6f 72 79 20 73 70 61 63 65 20 66 72 6f 6d 20  mory space from 
9910: 77 68 69 63 68 20 74 6f 20 62 75 69 6c 64 20 45  which to build E
9920: 78 70 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  xpr object */.  
9930: 75 33 32 20 73 74 61 74 69 63 46 6c 61 67 3b 20  u32 staticFlag; 
9940: 20 20 20 20 20 20 2f 2a 20 45 50 5f 53 74 61 74        /* EP_Stat
9950: 69 63 20 69 66 20 73 70 61 63 65 20 6e 6f 74 20  ic if space not 
9960: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
9970: 6c 6c 6f 63 20 2a 2f 0a 0a 20 20 61 73 73 65 72  lloc */..  asser
9980: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t( db!=0 );.  as
9990: 73 65 72 74 28 20 70 20 29 3b 0a 20 20 61 73 73  sert( p );.  ass
99a0: 65 72 74 28 20 64 75 70 46 6c 61 67 73 3d 3d 30  ert( dupFlags==0
99b0: 20 7c 7c 20 64 75 70 46 6c 61 67 73 3d 3d 45 58   || dupFlags==EX
99c0: 50 52 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a  PRDUP_REDUCE );.
99d0: 20 20 61 73 73 65 72 74 28 20 70 7a 42 75 66 66    assert( pzBuff
99e0: 65 72 3d 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67  er==0 || dupFlag
99f0: 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43  s==EXPRDUP_REDUC
9a00: 45 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  E );..  /* Figur
9a10: 65 20 6f 75 74 20 77 68 65 72 65 20 74 6f 20 77  e out where to w
9a20: 72 69 74 65 20 74 68 65 20 6e 65 77 20 45 78 70  rite the new Exp
9a30: 72 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a  r structure. */.
9a40: 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29    if( pzBuffer )
9a50: 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a  {.    zAlloc = *
9a60: 70 7a 42 75 66 66 65 72 3b 0a 20 20 20 20 73 74  pzBuffer;.    st
9a70: 61 74 69 63 46 6c 61 67 20 3d 20 45 50 5f 53 74  aticFlag = EP_St
9a80: 61 74 69 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  atic;.  }else{. 
9a90: 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69     zAlloc = sqli
9aa0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
9ab0: 28 64 62 2c 20 64 75 70 65 64 45 78 70 72 53 69  (db, dupedExprSi
9ac0: 7a 65 28 70 2c 20 64 75 70 46 6c 61 67 73 29 29  ze(p, dupFlags))
9ad0: 3b 0a 20 20 20 20 73 74 61 74 69 63 46 6c 61 67  ;.    staticFlag
9ae0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77   = 0;.  }.  pNew
9af0: 20 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c 6c 6f   = (Expr *)zAllo
9b00: 63 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77 20 29  c;..  if( pNew )
9b10: 7b 0a 20 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65  {.    /* Set nNe
9b20: 77 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a  wSize to the siz
9b30: 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
9b40: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70 6f  the structure po
9b50: 69 6e 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  inted to.    ** 
9b60: 62 79 20 70 4e 65 77 2e 20 54 68 69 73 20 69 73  by pNew. This is
9b70: 20 65 69 74 68 65 72 20 45 58 50 52 5f 46 55 4c   either EXPR_FUL
9b80: 4c 53 49 5a 45 2c 20 45 58 50 52 5f 52 45 44 55  LSIZE, EXPR_REDU
9b90: 43 45 44 53 49 5a 45 20 6f 72 0a 20 20 20 20 2a  CEDSIZE or.    *
9ba0: 2a 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59  * EXPR_TOKENONLY
9bb0: 53 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69 73 20  SIZE. nToken is 
9bc0: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
9bd0: 72 20 6f 66 20 62 79 74 65 73 20 63 6f 6e 73 75  r of bytes consu
9be0: 6d 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  med.    ** by th
9bf0: 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 2d  e copy of the p-
9c00: 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67  >u.zToken string
9c10: 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a   (if any)..    *
9c20: 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  /.    const unsi
9c30: 67 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a 65  gned nStructSize
9c40: 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75   = dupedExprStru
9c50: 63 74 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61  ctSize(p, dupFla
9c60: 67 73 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69  gs);.    const i
9c70: 6e 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53  nt nNewSize = nS
9c80: 74 72 75 63 74 53 69 7a 65 20 26 20 30 78 66 66  tructSize & 0xff
9c90: 66 3b 0a 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65  f;.    int nToke
9ca0: 6e 3b 0a 20 20 20 20 69 66 28 20 21 45 78 70 72  n;.    if( !Expr
9cb0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
9cc0: 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70  P_IntValue) && p
9cd0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20  ->u.zToken ){.  
9ce0: 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c      nToken = sql
9cf0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e  ite3Strlen30(p->
9d00: 75 2e 7a 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20  u.zToken) + 1;. 
9d10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9d20: 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 20 20  nToken = 0;.    
9d30: 7d 0a 20 20 20 20 69 66 28 20 64 75 70 46 6c 61  }.    if( dupFla
9d40: 67 73 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  gs ){.      asse
9d50: 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  rt( ExprHasPrope
9d60: 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65  rty(p, EP_Reduce
9d70: 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d  d)==0 );.      m
9d80: 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c  emcpy(zAlloc, p,
9d90: 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20   nNewSize);.    
9da0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32  }else{.      u32
9db0: 20 6e 53 69 7a 65 20 3d 20 28 75 33 32 29 65 78   nSize = (u32)ex
9dc0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 29 3b  prStructSize(p);
9dd0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41  .      memcpy(zA
9de0: 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a 65 29 3b  lloc, p, nSize);
9df0: 0a 20 20 20 20 20 20 69 66 28 20 6e 53 69 7a 65  .      if( nSize
9e00: 3c 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 20 29  <EXPR_FULLSIZE )
9e10: 7b 20 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  { .        memse
9e20: 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d  t(&zAlloc[nSize]
9e30: 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49  , 0, EXPR_FULLSI
9e40: 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20  ZE-nSize);.     
9e50: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
9e60: 20 53 65 74 20 74 68 65 20 45 50 5f 52 65 64 75   Set the EP_Redu
9e70: 63 65 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  ced, EP_TokenOnl
9e80: 79 2c 20 61 6e 64 20 45 50 5f 53 74 61 74 69 63  y, and EP_Static
9e90: 20 66 6c 61 67 73 20 61 70 70 72 6f 70 72 69 61   flags appropria
9ea0: 74 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 70 4e 65  tely. */.    pNe
9eb0: 77 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50  w->flags &= ~(EP
9ec0: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
9ed0: 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c  nOnly|EP_Static|
9ee0: 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20  EP_MemToken);.  
9ef0: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
9f00: 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20 28   nStructSize & (
9f10: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
9f20: 6b 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20 70 4e  kenOnly);.    pN
9f30: 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 73 74 61  ew->flags |= sta
9f40: 74 69 63 46 6c 61 67 3b 0a 0a 20 20 20 20 2f 2a  ticFlag;..    /*
9f50: 20 43 6f 70 79 20 74 68 65 20 70 2d 3e 75 2e 7a   Copy the p->u.z
9f60: 54 6f 6b 65 6e 20 73 74 72 69 6e 67 2c 20 69 66  Token string, if
9f70: 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28   any. */.    if(
9f80: 20 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20   nToken ){.     
9f90: 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20   char *zToken = 
9fa0: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d  pNew->u.zToken =
9fb0: 20 28 63 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b   (char*)&zAlloc[
9fc0: 6e 4e 65 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20  nNewSize];.     
9fd0: 20 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20   memcpy(zToken, 
9fe0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f  p->u.zToken, nTo
9ff0: 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ken);.    }..   
a000: 20 69 66 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61   if( 0==((p->fla
a010: 67 73 7c 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20  gs|pNew->flags) 
a020: 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  & EP_TokenOnly) 
a030: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c  ){.      /* Fill
a040: 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e   in the pNew->x.
a050: 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d  pSelect or pNew-
a060: 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e  >x.pList member.
a070: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78   */.      if( Ex
a080: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
a090: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
a0a0: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
a0b0: 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  x.pSelect = sqli
a0c0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
a0d0: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 64   p->x.pSelect, d
a0e0: 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  upFlags);.      
a0f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
a100: 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73  New->x.pList = s
a110: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
a120: 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74  p(db, p->x.pList
a130: 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20  , dupFlags);.   
a140: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
a150: 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d  /* Fill in pNew-
a160: 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65 77 2d  >pLeft and pNew-
a170: 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  >pRight. */.    
a180: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
a190: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64  rty(pNew, EP_Red
a1a0: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
a1b0: 79 29 20 29 7b 0a 20 20 20 20 20 20 7a 41 6c 6c  y) ){.      zAll
a1c0: 6f 63 20 2b 3d 20 64 75 70 65 64 45 78 70 72 4e  oc += dupedExprN
a1d0: 6f 64 65 53 69 7a 65 28 70 2c 20 64 75 70 46 6c  odeSize(p, dupFl
a1e0: 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ags);.      if( 
a1f0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a200: 70 4e 65 77 2c 20 45 50 5f 52 65 64 75 63 65 64  pNew, EP_Reduced
a210: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) ){.        pNe
a220: 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c  w->pLeft = p->pL
a230: 65 66 74 20 3f 0a 20 20 20 20 20 20 20 20 20 20  eft ?.          
a240: 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70 72              expr
a250: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74  Dup(db, p->pLeft
a260: 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
a270: 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a  , &zAlloc) : 0;.
a280: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52          pNew->pR
a290: 69 67 68 74 20 3d 20 70 2d 3e 70 52 69 67 68 74  ight = p->pRight
a2a0: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
a2b0: 20 20 20 20 20 20 20 20 20 20 65 78 70 72 44 75            exprDu
a2c0: 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c  p(db, p->pRight,
a2d0: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c   EXPRDUP_REDUCE,
a2e0: 20 26 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20   &zAlloc) : 0;. 
a2f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
a300: 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20   pzBuffer ){.   
a310: 20 20 20 20 20 2a 70 7a 42 75 66 66 65 72 20 3d       *pzBuffer =
a320: 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 7d   zAlloc;.      }
a330: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a340: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
a350: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
a360: 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  enOnly) ){.     
a370: 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6f 70 3d     if( pNew->op=
a380: 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d  =TK_SELECT_COLUM
a390: 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  N ){.          p
a3a0: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d 3e  New->pLeft = p->
a3b0: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 7d  pLeft;.        }
a3c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
a3d0: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71  pNew->pLeft = sq
a3e0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
a3f0: 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20   p->pLeft, 0);. 
a400: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a410: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20   pNew->pRight = 
a420: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
a430: 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 30 29  b, p->pRight, 0)
a440: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a450: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
a460: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  w;.}../*.** Crea
a470: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
a480: 64 65 65 70 20 63 6f 70 79 20 6f 66 20 74 68 65  deep copy of the
a490: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
a4a0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  s the second .**
a4b0: 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 61 6e   argument. If an
a4c0: 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 69   OOM condition i
a4d0: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 4e  s encountered, N
a4e0: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ULL is returned.
a4f0: 2a 2a 20 61 6e 64 20 74 68 65 20 64 62 2d 3e 6d  ** and the db->m
a500: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
a510: 20 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66   set..*/.#ifndef
a520: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
a530: 0a 73 74 61 74 69 63 20 57 69 74 68 20 2a 77 69  .static With *wi
a540: 74 68 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  thDup(sqlite3 *d
a550: 62 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20 20 57  b, With *p){.  W
a560: 69 74 68 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20  ith *pRet = 0;. 
a570: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e   if( p ){.    in
a580: 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66  t nByte = sizeof
a590: 28 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28 70 2d  (*p) + sizeof(p-
a5a0: 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 43 74  >a[0]) * (p->nCt
a5b0: 65 2d 31 29 3b 0a 20 20 20 20 70 52 65 74 20 3d  e-1);.    pRet =
a5c0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
a5d0: 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b  Zero(db, nByte);
a5e0: 0a 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b  .    if( pRet ){
a5f0: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
a600: 20 20 20 20 70 52 65 74 2d 3e 6e 43 74 65 20 3d      pRet->nCte =
a610: 20 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20 20 20   p->nCte;.      
a620: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
a630: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  te; i++){.      
a640: 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 53 65    pRet->a[i].pSe
a650: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
a660: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 61  lectDup(db, p->a
a670: 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b  [i].pSelect, 0);
a680: 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61  .        pRet->a
a690: 5b 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71 6c 69  [i].pCols = sqli
a6a0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
a6b0: 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73  b, p->a[i].pCols
a6c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52  , 0);.        pR
a6d0: 65 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  et->a[i].zName =
a6e0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
a6f0: 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61  (db, p->a[i].zNa
a700: 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
a710: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
a720: 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  pRet;.}.#else.# 
a730: 64 65 66 69 6e 65 20 77 69 74 68 44 75 70 28 78  define withDup(x
a740: 2c 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,y) 0.#endif../*
a750: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
a760: 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69  g group of routi
a770: 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f  nes make deep co
a780: 70 69 65 73 20 6f 66 20 65 78 70 72 65 73 73 69  pies of expressi
a790: 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69  ons,.** expressi
a7a0: 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73  on lists, ID lis
a7b0: 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73  ts, and select s
a7c0: 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20  tatements.  The 
a7d0: 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65  copies can.** be
a7e0: 20 64 65 6c 65 74 65 64 20 28 62 79 20 62 65 69   deleted (by bei
a7f0: 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  ng passed to the
a800: 69 72 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e  ir respective ..
a810: 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e  .Delete() routin
a820: 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65  es).** without e
a830: 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69  ffecting the ori
a840: 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ginals..**.** Th
a850: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
a860: 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63  t, ID, and sourc
a870: 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62  e lists return b
a880: 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  y sqlite3ExprLis
a890: 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74  tDup(),.** sqlit
a8a0: 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61  e3IdListDup(), a
a8b0: 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  nd sqlite3SrcLis
a8c0: 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62  tDup() can not b
a8d0: 65 20 66 75 72 74 68 65 72 20 65 78 70 61 6e 64  e further expand
a8e0: 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71  ed .** by subseq
a8f0: 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71  uent calls to sq
a900: 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28  lite*ListAppend(
a910: 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a  ) routines..**.*
a920: 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61  * Any tables tha
a930: 74 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69  t the SrcList mi
a940: 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65  ght point to are
a950: 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e   not duplicated.
a960: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73  .**.** The flags
a970: 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61   parameter conta
a980: 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f  ins a combinatio
a990: 6e 20 6f 66 20 74 68 65 20 45 58 50 52 44 55 50  n of the EXPRDUP
a9a0: 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20 49  _XXX flags..** I
a9b0: 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52 45  f the EXPRDUP_RE
a9c0: 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65 74  DUCE flag is set
a9d0: 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72 75 63  , then the struc
a9e0: 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 69 73  ture returned is
a9f0: 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64 20   a.** truncated 
aa00: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 75  version of the u
aa10: 73 75 61 6c 20 45 78 70 72 20 73 74 72 75 63 74  sual Expr struct
aa20: 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ure that will be
aa30: 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70 61   stored as.** pa
aa40: 72 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d  rt of the in-mem
aa50: 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
aa60: 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  on of the databa
aa70: 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78  se schema..*/.Ex
aa80: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44  pr *sqlite3ExprD
aa90: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
aaa0: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61  Expr *p, int fla
aab0: 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 66  gs){.  assert( f
aac0: 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73  lags==0 || flags
aad0: 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  ==EXPRDUP_REDUCE
aae0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 20 3f   );.  return p ?
aaf0: 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2c 20   exprDup(db, p, 
ab00: 66 6c 61 67 73 2c 20 30 29 20 3a 20 30 3b 0a 7d  flags, 0) : 0;.}
ab10: 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74  .ExprList *sqlit
ab20: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 73 71  e3ExprListDup(sq
ab30: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c  lite3 *db, ExprL
ab40: 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  ist *p, int flag
ab50: 73 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  s){.  ExprList *
ab60: 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45  pNew;.  struct E
ab70: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
ab80: 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a  tem, *pOldItem;.
ab90: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
aba0: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  t( db!=0 );.  if
abb0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
abc0: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
abd0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
abe0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
abf0: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
ac00: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
ac10: 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20    pNew->nExpr = 
ac20: 69 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20  i = p->nExpr;.  
ac30: 69 66 28 20 28 66 6c 61 67 73 20 26 20 45 58 50  if( (flags & EXP
ac40: 52 44 55 50 5f 52 45 44 55 43 45 29 3d 3d 30 20  RDUP_REDUCE)==0 
ac50: 29 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e  ) for(i=1; i<p->
ac60: 6e 45 78 70 72 3b 20 69 2b 3d 69 29 7b 7d 0a 20  nExpr; i+=i){}. 
ac70: 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d   pNew->a = pItem
ac80: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
ac90: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 20 69 2a 73  ocRawNN(db,  i*s
aca0: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29  izeof(p->a[0]) )
acb0: 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 3d 3d 30  ;.  if( pItem==0
acc0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
acd0: 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b  bFree(db, pNew);
ace0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
acf0: 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d   } .  pOldItem =
ad00: 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30   p->a;.  for(i=0
ad10: 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b  ; i<p->nExpr; i+
ad20: 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64  +, pItem++, pOld
ad30: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Item++){.    Exp
ad40: 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f  r *pOldExpr = pO
ad50: 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20  ldItem->pExpr;. 
ad60: 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
ad70: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
ad80: 28 64 62 2c 20 70 4f 6c 64 45 78 70 72 2c 20 66  (db, pOldExpr, f
ad90: 6c 61 67 73 29 3b 0a 20 20 20 20 70 49 74 65 6d  lags);.    pItem
ada0: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
adb0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
adc0: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
add0: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e      pItem->zSpan
ade0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
adf0: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
ae00: 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74  >zSpan);.    pIt
ae10: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20  em->sortOrder = 
ae20: 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72  pOldItem->sortOr
ae30: 64 65 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  der;.    pItem->
ae40: 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 49  done = 0;.    pI
ae50: 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 20  tem->bSpanIsTab 
ae60: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53 70 61  = pOldItem->bSpa
ae70: 6e 49 73 54 61 62 3b 0a 20 20 20 20 70 49 74 65  nIsTab;.    pIte
ae80: 6d 2d 3e 75 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  m->u = pOldItem-
ae90: 3e 75 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  >u;.  }.  return
aea0: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
aeb0: 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69 67  If cursors, trig
aec0: 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64 20  gers, views and 
aed0: 73 75 62 71 75 65 72 69 65 73 20 61 72 65 20 61  subqueries are a
aee0: 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 0a  ll omitted from.
aef0: 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74 68  ** the build, th
af00: 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 66  en none of the f
af10: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
af20: 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a 2a  s, except for .*
af30: 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  * sqlite3SelectD
af40: 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61 6c  up(), can be cal
af50: 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c 65  led. sqlite3Sele
af60: 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65 74  ctDup() is somet
af70: 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77  imes.** called w
af80: 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75 6d  ith a NULL argum
af90: 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ent..*/.#if !def
afa0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
afb0: 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
afc0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
afd0: 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21 64  RIGGER) \. || !d
afe0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
aff0: 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72 63  IT_SUBQUERY).Src
b000: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
b010: 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20  ListDup(sqlite3 
b020: 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c  *db, SrcList *p,
b030: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53   int flags){.  S
b040: 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  rcList *pNew;.  
b050: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79  int i;.  int nBy
b060: 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  te;.  assert( db
b070: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  !=0 );.  if( p==
b080: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
b090: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
b0a0: 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20  p) + (p->nSrc>0 
b0b0: 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  ? sizeof(p->a[0]
b0c0: 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20  ) * (p->nSrc-1) 
b0d0: 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  : 0);.  pNew = s
b0e0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
b0f0: 77 4e 4e 28 64 62 2c 20 6e 42 79 74 65 20 29 3b  wNN(db, nByte );
b100: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
b110: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
b120: 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e  w->nSrc = pNew->
b130: 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63  nAlloc = p->nSrc
b140: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
b150: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
b160: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
b170: 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20  _item *pNewItem 
b180: 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20  = &pNew->a[i];. 
b190: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
b1a0: 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d  t_item *pOldItem
b1b0: 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20   = &p->a[i];.   
b1c0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
b1d0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 63 68    pNewItem->pSch
b1e0: 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  ema = pOldItem->
b1f0: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70 4e 65  pSchema;.    pNe
b200: 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  wItem->zDatabase
b210: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
b220: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
b230: 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  >zDatabase);.   
b240: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pNewItem->zName
b250: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
b260: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
b270: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65  >zName);.    pNe
b280: 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20  wItem->zAlias = 
b290: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
b2a0: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41  db, pOldItem->zA
b2b0: 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49  lias);.    pNewI
b2c0: 74 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64 49 74  tem->fg = pOldIt
b2d0: 65 6d 2d 3e 66 67 3b 0a 20 20 20 20 70 4e 65 77  em->fg;.    pNew
b2e0: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20  Item->iCursor = 
b2f0: 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pOldItem->iCurso
b300: 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  r;.    pNewItem-
b310: 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 70  >addrFillSub = p
b320: 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  OldItem->addrFil
b330: 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65 77 49 74  lSub;.    pNewIt
b340: 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20  em->regReturn = 
b350: 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65 74  pOldItem->regRet
b360: 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  urn;.    if( pNe
b370: 77 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65  wItem->fg.isInde
b380: 78 65 64 42 79 20 29 7b 0a 20 20 20 20 20 20 70  xedBy ){.      p
b390: 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64  NewItem->u1.zInd
b3a0: 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74 65 33  exedBy = sqlite3
b3b0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
b3c0: 64 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78  dItem->u1.zIndex
b3d0: 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20  edBy);.    }.   
b3e0: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 42 49 6e   pNewItem->pIBIn
b3f0: 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  dex = pOldItem->
b400: 70 49 42 49 6e 64 65 78 3b 0a 20 20 20 20 69 66  pIBIndex;.    if
b410: 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69  ( pNewItem->fg.i
b420: 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20  sTabFunc ){.    
b430: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 70    pNewItem->u1.p
b440: 46 75 6e 63 41 72 67 20 3d 20 0a 20 20 20 20 20  FuncArg = .     
b450: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
b460: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64  ListDup(db, pOld
b470: 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72  Item->u1.pFuncAr
b480: 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d  g, flags);.    }
b490: 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65 77  .    pTab = pNew
b4a0: 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c  Item->pTab = pOl
b4b0: 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  dItem->pTab;.   
b4c0: 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
b4d0: 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b     pTab->nRef++;
b4e0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49  .    }.    pNewI
b4f0: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  tem->pSelect = s
b500: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
b510: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53  db, pOldItem->pS
b520: 65 6c 65 63 74 2c 20 66 6c 61 67 73 29 3b 0a 20  elect, flags);. 
b530: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e     pNewItem->pOn
b540: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
b550: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
b560: 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  pOn, flags);.   
b570: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e   pNewItem->pUsin
b580: 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73  g = sqlite3IdLis
b590: 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  tDup(db, pOldIte
b5a0: 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20  m->pUsing);.    
b5b0: 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  pNewItem->colUse
b5c0: 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f  d = pOldItem->co
b5d0: 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74  lUsed;.  }.  ret
b5e0: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69  urn pNew;.}.IdLi
b5f0: 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73  st *sqlite3IdLis
b600: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
b610: 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20  , IdList *p){.  
b620: 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  IdList *pNew;.  
b630: 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
b640: 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
b650: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
b660: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
b670: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
b680: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  b, sizeof(*pNew)
b690: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
b6a0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
b6b0: 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e  pNew->nId = p->n
b6c0: 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  Id;.  pNew->a = 
b6d0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
b6e0: 61 77 4e 4e 28 64 62 2c 20 70 2d 3e 6e 49 64 2a  awNN(db, p->nId*
b6f0: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
b700: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61  );.  if( pNew->a
b710: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
b720: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65  e3DbFree(db, pNe
b730: 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  w);.    return 0
b740: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20  ;.  }.  /* Note 
b750: 74 68 61 74 20 62 65 63 61 75 73 65 20 74 68 65  that because the
b760: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c   size of the all
b770: 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61  ocation for p->a
b780: 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e  [] is not.  ** n
b790: 65 63 65 73 73 61 72 69 6c 79 20 61 20 70 6f 77  ecessarily a pow
b7a0: 65 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74  er of two, sqlit
b7b0: 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 29  e3IdListAppend()
b7c0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c   may not be call
b7d0: 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64  ed.  ** on the d
b7e0: 75 70 6c 69 63 61 74 65 20 63 72 65 61 74 65 64  uplicate created
b7f0: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
b800: 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  n. */.  for(i=0;
b810: 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b   i<p->nId; i++){
b820: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
b830: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
b840: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
b850: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
b860: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
b870: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
b880: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
b890: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
b8a0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
b8b0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
b8c0: 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f  ewItem->idx = pO
b8d0: 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d  ldItem->idx;.  }
b8e0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
b8f0: 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65  }.Select *sqlite
b900: 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74  3SelectDup(sqlit
b910: 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a  e3 *db, Select *
b920: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
b930: 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 2c 20 2a   Select *pNew, *
b940: 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74  pPrior;.  assert
b950: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( db!=0 );.  if(
b960: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
b970: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
b980: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
b990: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  db, sizeof(*p) )
b9a0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
b9b0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
b9c0: 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c  ew->pEList = sql
b9d0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
b9e0: 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 66  db, p->pEList, f
b9f0: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lags);.  pNew->p
ba00: 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Src = sqlite3Src
ba10: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
ba20: 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  Src, flags);.  p
ba30: 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71  New->pWhere = sq
ba40: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
ba50: 20 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61 67   p->pWhere, flag
ba60: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f  s);.  pNew->pGro
ba70: 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  upBy = sqlite3Ex
ba80: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
ba90: 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c 61 67 73  >pGroupBy, flags
baa0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  );.  pNew->pHavi
bab0: 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ng = sqlite3Expr
bac0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 48 61 76 69  Dup(db, p->pHavi
bad0: 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  ng, flags);.  pN
bae0: 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73  ew->pOrderBy = s
baf0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
bb00: 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  p(db, p->pOrderB
bb10: 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  y, flags);.  pNe
bb20: 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20  w->op = p->op;. 
bb30: 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20   pNew->pPrior = 
bb40: 70 50 72 69 6f 72 20 3d 20 73 71 6c 69 74 65 33  pPrior = sqlite3
bb50: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d  SelectDup(db, p-
bb60: 3e 70 50 72 69 6f 72 2c 20 66 6c 61 67 73 29 3b  >pPrior, flags);
bb70: 0a 20 20 69 66 28 20 70 50 72 69 6f 72 20 29 20  .  if( pPrior ) 
bb80: 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20  pPrior->pNext = 
bb90: 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e  pNew;.  pNew->pN
bba0: 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ext = 0;.  pNew-
bbb0: 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65  >pLimit = sqlite
bbc0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
bbd0: 70 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a  pLimit, flags);.
bbe0: 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20    pNew->pOffset 
bbf0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
bc00: 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c  (db, p->pOffset,
bc10: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
bc20: 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70  >iLimit = 0;.  p
bc30: 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30  New->iOffset = 0
bc40: 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61  ;.  pNew->selFla
bc50: 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73  gs = p->selFlags
bc60: 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68 65 6d   & ~SF_UsesEphem
bc70: 65 72 61 6c 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  eral;.  pNew->ad
bc80: 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
bc90: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  -1;.  pNew->addr
bca0: 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31  OpenEphm[1] = -1
bcb0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63  ;.  pNew->nSelec
bcc0: 74 52 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c 65 63  tRow = p->nSelec
bcd0: 74 52 6f 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 57  tRow;.  pNew->pW
bce0: 69 74 68 20 3d 20 77 69 74 68 44 75 70 28 64 62  ith = withDup(db
bcf0: 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a 20 20 73  , p->pWith);.  s
bd00: 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e  qlite3SelectSetN
bd10: 61 6d 65 28 70 4e 65 77 2c 20 70 2d 3e 7a 53 65  ame(pNew, p->zSe
bd20: 6c 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  lName);.  return
bd30: 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53   pNew;.}.#else.S
bd40: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
bd50: 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20  lectDup(sqlite3 
bd60: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  *db, Select *p, 
bd70: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73  int flags){.  as
bd80: 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20  sert( p==0 );.  
bd90: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
bda0: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  if.../*.** Add a
bdb0: 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
bdc0: 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65 78  the end of an ex
bdd0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
bde0: 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69  If pList is.** i
bdf0: 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74  nitially NULL, t
be00: 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77  hen create a new
be10: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
be20: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
be30: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
be40: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
be50: 20 65 6e 74 69 72 65 20 6c 69 73 74 20 69 73 20   entire list is 
be60: 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c  freed and.** NUL
be70: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  L is returned.  
be80: 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72  If non-NULL is r
be90: 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 69 74  eturned, then it
bea0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a   is guaranteed.*
beb0: 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 65  * that the new e
bec0: 6e 74 72 79 20 77 61 73 20 73 75 63 63 65 73 73  ntry was success
bed0: 66 75 6c 6c 79 20 61 70 70 65 6e 64 65 64 2e 0a  fully appended..
bee0: 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c  */.ExprList *sql
bef0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
bf00: 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nd(.  Parse *pPa
bf10: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
bf20: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
bf30: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
bf40: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  pList,        /*
bf50: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
bf60: 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20  o append. Might 
bf70: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
bf80: 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20  r *pExpr        
bf90: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
bfa0: 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65  on to be appende
bfb0: 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  d. Might be NULL
bfc0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
bfd0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
bfe0: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  b;.  assert( db!
bff0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73  =0 );.  if( pLis
c000: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
c010: 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
c020: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
c030: 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b  eof(ExprList) );
c040: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
c050: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
c060: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  no_mem;.    }.  
c070: 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3d    pList->nExpr =
c080: 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61   0;.    pList->a
c090: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
c0a0: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
c0b0: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
c0c0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  ;.    if( pList-
c0d0: 3e 61 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f  >a==0 ) goto no_
c0e0: 6d 65 6d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  mem;.  }else if(
c0f0: 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26   (pList->nExpr &
c100: 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31   (pList->nExpr-1
c110: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72  ))==0 ){.    str
c120: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
c130: 6d 20 2a 61 3b 0a 20 20 20 20 61 73 73 65 72 74  m *a;.    assert
c140: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30  ( pList->nExpr>0
c150: 20 29 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69   );.    a = sqli
c160: 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
c170: 20 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74   pList->a, pList
c180: 2d 3e 6e 45 78 70 72 2a 32 2a 73 69 7a 65 6f 66  ->nExpr*2*sizeof
c190: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
c1a0: 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a      if( a==0 ){.
c1b0: 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65        goto no_me
c1c0: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  m;.    }.    pLi
c1d0: 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20  st->a = a;.  }. 
c1e0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
c1f0: 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 31 20  a!=0 );.  if( 1 
c200: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
c210: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
c220: 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
c230: 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a  List->nExpr++];.
c240: 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d      memset(pItem
c250: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74  , 0, sizeof(*pIt
c260: 65 6d 29 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  em));.    pItem-
c270: 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
c280: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69    }.  return pLi
c290: 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20  st;..no_mem:    
c2a0: 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61   .  /* Avoid lea
c2b0: 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d  king memory if m
c2c0: 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c 65 64  alloc has failed
c2d0: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78  . */.  sqlite3Ex
c2e0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
c2f0: 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  pr);.  sqlite3Ex
c300: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
c310: 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72   pList);.  retur
c320: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43  n 0;.}../*.** pC
c330: 6f 6c 75 6d 6e 73 20 61 6e 64 20 70 45 78 70 72  olumns and pExpr
c340: 20 66 6f 72 6d 20 61 20 76 65 63 74 6f 72 20 61   form a vector a
c350: 73 73 69 67 6e 6d 65 6e 74 20 77 68 69 63 68 20  ssignment which 
c360: 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 53  is part of the S
c370: 45 54 0a 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20  ET.** clause of 
c380: 61 6e 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  an UPDATE statem
c390: 65 6e 74 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a  ent.  Like this:
c3a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 28 61  .**.**        (a
c3b0: 2c 62 2c 63 29 20 3d 20 28 65 78 70 72 31 2c 65  ,b,c) = (expr1,e
c3c0: 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a 20 4f  xpr2,expr3).** O
c3d0: 72 3a 20 20 20 20 28 61 2c 62 2c 63 29 20 3d 20  r:    (a,b,c) = 
c3e0: 28 53 45 4c 45 43 54 20 78 2c 79 2c 7a 20 46 52  (SELECT x,y,z FR
c3f0: 4f 4d 20 2e 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 46  OM ....).**.** F
c400: 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6f 66 20  or each term of 
c410: 74 68 65 20 76 65 63 74 6f 72 20 61 73 73 69 67  the vector assig
c420: 6e 6d 65 6e 74 2c 20 61 70 70 65 6e 64 20 6e 65  nment, append ne
c430: 77 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65  w entries to the
c440: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
c450: 69 73 74 20 70 4c 69 73 74 2e 20 20 49 6e 20 74  ist pList.  In t
c460: 68 65 20 63 61 73 65 20 6f 66 20 61 20 73 75 62  he case of a sub
c470: 71 75 65 72 79 20 6f 6e 20 74 68 65 20 4c 48 53  query on the LHS
c480: 2c 20 61 70 70 65 6e 64 0a 2a 2a 20 54 4b 5f 53  , append.** TK_S
c490: 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 65 78 70  ELECT_COLUMN exp
c4a0: 72 65 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 45 78 70  ressions..*/.Exp
c4b0: 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78  rList *sqlite3Ex
c4c0: 70 72 4c 69 73 74 41 70 70 65 6e 64 56 65 63 74  prListAppendVect
c4d0: 6f 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  or(.  Parse *pPa
c4e0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
c4f0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
c500: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
c510: 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c  List,       /* L
c520: 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20  ist to which to 
c530: 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65  append. Might be
c540: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 49 64 4c 69 73   NULL */.  IdLis
c550: 74 20 2a 70 43 6f 6c 75 6d 6e 73 2c 20 20 20 20  t *pColumns,    
c560: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6e 61 6d    /* List of nam
c570: 65 73 20 6f 66 20 4c 48 53 20 6f 66 20 74 68 65  es of LHS of the
c580: 20 61 73 73 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20   assignment */. 
c590: 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20   Expr *pExpr    
c5a0: 20 20 20 20 20 20 20 20 2f 2a 20 56 65 63 74 6f          /* Vecto
c5b0: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  r expression to 
c5c0: 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69 67  be appended. Mig
c5d0: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  ht be NULL */.){
c5e0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
c5f0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
c600: 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  nt n;.  int i;. 
c610: 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20 70 4c   int iFirst = pL
c620: 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78  ist ? pList->nEx
c630: 70 72 20 3a 20 30 3b 0a 20 20 2f 2a 20 70 43 6f  pr : 0;.  /* pCo
c640: 6c 75 6d 6e 73 20 63 61 6e 20 6f 6e 6c 79 20 62  lumns can only b
c650: 65 20 4e 55 4c 4c 20 64 75 65 20 74 6f 20 61 6e  e NULL due to an
c660: 20 4f 4f 4d 20 62 75 74 20 61 6e 20 4f 4f 4d 20   OOM but an OOM 
c670: 77 69 6c 6c 20 63 61 75 73 65 20 61 6e 0a 20 20  will cause an.  
c680: 2a 2a 20 65 78 69 74 20 70 72 69 6f 72 20 74 6f  ** exit prior to
c690: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65   this routine be
c6a0: 69 6e 67 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20  ing invoked */. 
c6b0: 20 69 66 28 20 4e 45 56 45 52 28 70 43 6f 6c 75   if( NEVER(pColu
c6c0: 6d 6e 73 3d 3d 30 29 20 29 20 67 6f 74 6f 20 76  mns==0) ) goto v
c6d0: 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72  ector_append_err
c6e0: 6f 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d  or;.  if( pExpr=
c6f0: 3d 30 20 29 20 67 6f 74 6f 20 76 65 63 74 6f 72  =0 ) goto vector
c700: 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20  _append_error;. 
c710: 20 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   n = sqlite3Expr
c720: 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72  VectorSize(pExpr
c730: 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e  );.  if( pColumn
c740: 73 2d 3e 6e 49 64 21 3d 6e 20 29 7b 0a 20 20 20  s->nId!=n ){.   
c750: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
c760: 28 70 50 61 72 73 65 2c 20 22 25 64 20 63 6f 6c  (pParse, "%d col
c770: 75 6d 6e 73 20 61 73 73 69 67 6e 65 64 20 25 64  umns assigned %d
c780: 20 76 61 6c 75 65 73 22 2c 0a 20 20 20 20 20 20   values",.      
c790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
c7a0: 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 2c 20 6e 29 3b  olumns->nId, n);
c7b0: 0a 20 20 20 20 67 6f 74 6f 20 76 65 63 74 6f 72  .    goto vector
c7c0: 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20  _append_error;. 
c7d0: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
c7e0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  n; i++){.    Exp
c7f0: 72 20 2a 70 53 75 62 45 78 70 72 20 3d 20 73 71  r *pSubExpr = sq
c800: 6c 69 74 65 33 45 78 70 72 46 6f 72 56 65 63 74  lite3ExprForVect
c810: 6f 72 46 69 65 6c 64 28 70 50 61 72 73 65 2c 20  orField(pParse, 
c820: 70 45 78 70 72 2c 20 69 29 3b 0a 20 20 20 20 70  pExpr, i);.    p
c830: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
c840: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
c850: 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 53 75 62  rse, pList, pSub
c860: 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Expr);.    if( p
c870: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 61 73  List ){.      as
c880: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
c890: 70 72 3d 3d 69 46 69 72 73 74 2b 69 2b 31 20 29  pr==iFirst+i+1 )
c8a0: 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61  ;.      pList->a
c8b0: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d  [pList->nExpr-1]
c8c0: 2e 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c 75 6d 6e  .zName = pColumn
c8d0: 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  s->a[i].zName;. 
c8e0: 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61       pColumns->a
c8f0: 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  [i].zName = 0;. 
c900: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
c910: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
c920: 45 43 54 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ECT ){.    if( p
c930: 4c 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 61  List && pList->a
c940: 5b 69 46 69 72 73 74 5d 2e 70 45 78 70 72 20 29  [iFirst].pExpr )
c950: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
c960: 70 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 5d  pList->a[iFirst]
c970: 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53  .pExpr->op==TK_S
c980: 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  ELECT_COLUMN );.
c990: 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69        pList->a[i
c9a0: 46 69 72 73 74 5d 2e 70 45 78 70 72 2d 3e 70 52  First].pExpr->pR
c9b0: 69 67 68 74 20 3d 20 70 45 78 70 72 3b 0a 20 20  ight = pExpr;.  
c9c0: 20 20 20 20 70 45 78 70 72 20 3d 20 30 3b 0a 20      pExpr = 0;. 
c9d0: 20 20 20 7d 0a 20 20 7d 0a 0a 76 65 63 74 6f 72     }.  }..vector
c9e0: 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3a 0a 20  _append_error:. 
c9f0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
ca00: 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20  te(db, pExpr);. 
ca10: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
ca20: 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 75 6d 6e  lete(db, pColumn
ca30: 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69  s);.  return pLi
ca40: 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  st;.}../*.** Set
ca50: 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20   the sort order 
ca60: 66 6f 72 20 74 68 65 20 6c 61 73 74 20 65 6c 65  for the last ele
ca70: 6d 65 6e 74 20 6f 6e 20 74 68 65 20 67 69 76 65  ment on the give
ca80: 6e 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 76  n ExprList..*/.v
ca90: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
caa0: 69 73 74 53 65 74 53 6f 72 74 4f 72 64 65 72 28  istSetSortOrder(
cab0: 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74  ExprList *p, int
cac0: 20 69 53 6f 72 74 4f 72 64 65 72 29 7b 0a 20 20   iSortOrder){.  
cad0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
cae0: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  n;.  assert( SQL
caf0: 49 54 45 5f 53 4f 5f 55 4e 44 45 46 49 4e 45 44  ITE_SO_UNDEFINED
cb00: 3c 30 20 26 26 20 53 51 4c 49 54 45 5f 53 4f 5f  <0 && SQLITE_SO_
cb10: 41 53 43 3e 3d 30 20 26 26 20 53 51 4c 49 54 45  ASC>=0 && SQLITE
cb20: 5f 53 4f 5f 44 45 53 43 3e 30 20 29 3b 0a 20 20  _SO_DESC>0 );.  
cb30: 61 73 73 65 72 74 28 20 70 2d 3e 6e 45 78 70 72  assert( p->nExpr
cb40: 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 53 6f 72  >0 );.  if( iSor
cb50: 74 4f 72 64 65 72 3c 30 20 29 7b 0a 20 20 20 20  tOrder<0 ){.    
cb60: 61 73 73 65 72 74 28 20 70 2d 3e 61 5b 70 2d 3e  assert( p->a[p->
cb70: 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64  nExpr-1].sortOrd
cb80: 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53  er==SQLITE_SO_AS
cb90: 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  C );.    return;
cba0: 0a 20 20 7d 0a 20 20 70 2d 3e 61 5b 70 2d 3e 6e  .  }.  p->a[p->n
cbb0: 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65  Expr-1].sortOrde
cbc0: 72 20 3d 20 28 75 38 29 69 53 6f 72 74 4f 72 64  r = (u8)iSortOrd
cbd0: 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  er;.}../*.** Set
cbe0: 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b   the ExprList.a[
cbf0: 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20  ].zName element 
cc00: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
cc10: 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a  ntly added item.
cc20: 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ** on the expres
cc30: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
cc40: 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20   pList might be 
cc50: 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  NULL following a
cc60: 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75  n OOM error.  Bu
cc70: 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e  t pName should n
cc80: 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e  ever be.** NULL.
cc90: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
cca0: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20  location fails, 
ccb0: 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  the pParse->db->
ccc0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
ccd0: 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a  g.** is set..*/.
cce0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
ccf0: 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a 20 20 50  ListSetName(.  P
cd00: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
cd10: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
cd20: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
cd30: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
cd40: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
cd50: 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74  o which to add t
cd60: 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f  he span. */.  To
cd70: 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20  ken *pName,     
cd80: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f        /* Name to
cd90: 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69   be added */.  i
cda0: 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20  nt dequote      
cdb0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
cdc0: 6f 20 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65  o cause the name
cdd0: 20 74 6f 20 62 65 20 64 65 71 75 6f 74 65 64 20   to be dequoted 
cde0: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
cdf0: 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50 61 72  pList!=0 || pPar
ce00: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
ce10: 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28  iled!=0 );.  if(
ce20: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74   pList ){.    st
ce30: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
ce40: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61  em *pItem;.    a
ce50: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
ce60: 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 70 49 74  xpr>0 );.    pIt
ce70: 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
ce80: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  List->nExpr-1];.
ce90: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
cea0: 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20  m->zName==0 );. 
ceb0: 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20     pItem->zName 
cec0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
ced0: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
cee0: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
cef0: 6e 29 3b 0a 20 20 20 20 69 66 28 20 64 65 71 75  n);.    if( dequ
cf00: 6f 74 65 20 29 20 73 71 6c 69 74 65 33 44 65 71  ote ) sqlite3Deq
cf10: 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d  uote(pItem->zNam
cf20: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
cf30: 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73   Set the ExprLis
cf40: 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d  t.a[].zSpan elem
cf50: 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ent of the most 
cf60: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69  recently added i
cf70: 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78  tem.** on the ex
cf80: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
cf90: 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74  *.** pList might
cfa0: 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69   be NULL followi
cfb0: 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  ng an OOM error.
cfc0: 20 20 42 75 74 20 70 53 70 61 6e 20 73 68 6f 75    But pSpan shou
cfd0: 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e  ld never be.** N
cfe0: 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72  ULL.  If a memor
cff0: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
d000: 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e  ls, the pParse->
d010: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
d020: 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e   flag.** is set.
d030: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d040: 45 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e 28  ExprListSetSpan(
d050: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
d060: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
d070: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
d080: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
d090: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
d0a0: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
d0b0: 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a  dd the span. */.
d0c0: 20 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61    ExprSpan *pSpa
d0d0: 6e 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  n         /* The
d0e0: 20 73 70 61 6e 20 74 6f 20 62 65 20 61 64 64 65   span to be adde
d0f0: 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  d */.){.  sqlite
d100: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
d110: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  db;.  assert( pL
d120: 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  ist!=0 || db->ma
d130: 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b  llocFailed!=0 );
d140: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
d150: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
d160: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
d170: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
d180: 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20  t->nExpr-1];.   
d190: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
d1a0: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 61  nExpr>0 );.    a
d1b0: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
d1c0: 63 46 61 69 6c 65 64 20 7c 7c 20 70 49 74 65 6d  cFailed || pItem
d1d0: 2d 3e 70 45 78 70 72 3d 3d 70 53 70 61 6e 2d 3e  ->pExpr==pSpan->
d1e0: 70 45 78 70 72 20 29 3b 0a 20 20 20 20 73 71 6c  pExpr );.    sql
d1f0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
d200: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
d210: 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d    pItem->zSpan =
d220: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
d230: 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53 70  p(db, (char*)pSp
d240: 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20  an->zStart,.    
d250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d270: 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e  (int)(pSpan->zEn
d280: 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72  d - pSpan->zStar
d290: 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  t));.  }.}../*.*
d2a0: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
d2b0: 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20  ion list pEList 
d2c0: 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68  contains more th
d2d0: 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e  an iLimit elemen
d2e0: 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  ts,.** leave an 
d2f0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
d300: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64   pParse..*/.void
d310: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
d320: 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50  CheckLength(.  P
d330: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
d340: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
d350: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
d360: 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74  zObject.){.  int
d370: 20 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   mx = pParse->db
d380: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
d390: 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20  LIMIT_COLUMN];. 
d3a0: 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73   testcase( pELis
d3b0: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
d3c0: 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74  pr==mx );.  test
d3d0: 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20  case( pEList && 
d3e0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d  pEList->nExpr==m
d3f0: 78 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c  x+1 );.  if( pEL
d400: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
d410: 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73  Expr>mx ){.    s
d420: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
d430: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
d440: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c   columns in %s",
d450: 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d   zObject);.  }.}
d460: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
d470: 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73  n entire express
d480: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  ion list..*/.sta
d490: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
d4a0: 49 4e 45 20 76 6f 69 64 20 65 78 70 72 4c 69 73  INE void exprLis
d4b0: 74 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69 74 65  tDeleteNN(sqlite
d4c0: 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20  3 *db, ExprList 
d4d0: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
d4e0: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
d4f0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
d500: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
d510: 2d 3e 61 21 3d 30 20 7c 7c 20 70 4c 69 73 74 2d  ->a!=0 || pList-
d520: 3e 6e 45 78 70 72 3d 3d 30 20 29 3b 0a 20 20 66  >nExpr==0 );.  f
d530: 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
d540: 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  a, i=0; i<pList-
d550: 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
d560: 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  em++){.    sqlit
d570: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
d580: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
d590: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
d5a0: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61  e(db, pItem->zNa
d5b0: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
d5c0: 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
d5d0: 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 7d 0a 20 20  ->zSpan);.  }.  
d5e0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
d5f0: 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73  , pList->a);.  s
d600: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
d610: 20 70 4c 69 73 74 29 3b 0a 7d 0a 76 6f 69 64 20   pList);.}.void 
d620: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
d630: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
d640: 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  b, ExprList *pLi
d650: 73 74 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74  st){.  if( pList
d660: 20 29 20 65 78 70 72 4c 69 73 74 44 65 6c 65 74   ) exprListDelet
d670: 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  eNN(db, pList);.
d680: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
d690: 74 68 65 20 62 69 74 77 69 73 65 2d 4f 52 20 6f  the bitwise-OR o
d6a0: 66 20 61 6c 6c 20 45 78 70 72 2e 66 6c 61 67 73  f all Expr.flags
d6b0: 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 67   fields in the g
d6c0: 69 76 65 6e 0a 2a 2a 20 45 78 70 72 4c 69 73 74  iven.** ExprList
d6d0: 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
d6e0: 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 63 6f  ExprListFlags(co
d6f0: 6e 73 74 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  nst ExprList *pL
d700: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
d710: 20 75 33 32 20 6d 20 3d 20 30 3b 0a 20 20 69 66   u32 m = 0;.  if
d720: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
d730: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
d740: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
d750: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
d760: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70   = pList->a[i].p
d770: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 61 73 73  Expr;.       ass
d780: 65 72 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b  ert( pExpr!=0 );
d790: 0a 20 20 20 20 20 20 20 6d 20 7c 3d 20 70 45 78  .       m |= pEx
d7a0: 70 72 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d  pr->flags;.    }
d7b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b  .  }.  return m;
d7c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  .}../*.** These 
d7d0: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57 61 6c  routines are Wal
d7e0: 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 75 73  ker callbacks us
d7f0: 65 64 20 74 6f 20 63 68 65 63 6b 20 65 78 70 72  ed to check expr
d800: 65 73 73 69 6f 6e 73 20 74 6f 0a 2a 2a 20 73 65  essions to.** se
d810: 65 20 69 66 20 74 68 65 79 20 61 72 65 20 22 63  e if they are "c
d820: 6f 6e 73 74 61 6e 74 22 20 66 6f 72 20 73 6f 6d  onstant" for som
d830: 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20  e definition of 
d840: 63 6f 6e 73 74 61 6e 74 2e 20 20 54 68 65 0a 2a  constant.  The.*
d850: 2a 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76  * Walker.eCode v
d860: 61 6c 75 65 20 64 65 74 65 72 6d 69 6e 65 73 20  alue determines 
d870: 74 68 65 20 74 79 70 65 20 6f 66 20 22 63 6f 6e  the type of "con
d880: 73 74 61 6e 74 22 20 77 65 20 61 72 65 20 6c 6f  stant" we are lo
d890: 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72 2e 0a 2a 2a  oking.** for..**
d8a0: 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 62 61  .** These callba
d8b0: 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  ck routines are 
d8c0: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
d8d0: 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  t the following:
d8e0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  .**.**     sqlit
d8f0: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
d900: 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ()              
d910: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
d920: 64 65 3d 3d 31 0a 2a 2a 20 20 20 20 20 73 71 6c  de==1.**     sql
d930: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
d940: 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20 20 20 20 20  ntNotJoin()     
d950: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
d960: 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20 20 20 20 73  Code==2.**     s
d970: 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62 6c  qlite3ExprIsTabl
d980: 65 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20 20  eConstant()     
d990: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
d9a0: 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a 20 20 20 20  >eCode==3.**    
d9b0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
d9c0: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
d9d0: 28 29 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65  ()        pWalke
d9e0: 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35  r->eCode==4 or 5
d9f0: 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20 63 61  .**.** In all ca
da00: 73 65 73 2c 20 74 68 65 20 63 61 6c 6c 62 61 63  ses, the callbac
da10: 6b 73 20 73 65 74 20 57 61 6c 6b 65 72 2e 65 43  ks set Walker.eC
da20: 6f 64 65 3d 30 20 61 6e 64 20 61 62 6f 72 74 20  ode=0 and abort 
da30: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
da40: 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e 64 20 74 6f  n.** is found to
da50: 20 6e 6f 74 20 62 65 20 61 20 63 6f 6e 73 74 61   not be a consta
da60: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71  nt..**.** The sq
da70: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
da80: 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20  antOrFunction() 
da90: 69 73 20 75 73 65 64 20 66 6f 72 20 65 76 61 6c  is used for eval
daa0: 75 61 74 69 6e 67 20 65 78 70 72 65 73 73 69 6f  uating expressio
dab0: 6e 73 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54  ns.** in a CREAT
dac0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
dad0: 74 2e 20 20 54 68 65 20 57 61 6c 6b 65 72 2e 65  t.  The Walker.e
dae0: 43 6f 64 65 20 76 61 6c 75 65 20 69 73 20 35 20  Code value is 5 
daf0: 77 68 65 6e 20 70 61 72 73 69 6e 67 0a 2a 2a 20  when parsing.** 
db00: 61 6e 20 65 78 69 73 74 69 6e 67 20 73 63 68 65  an existing sche
db10: 6d 61 20 61 6e 64 20 34 20 77 68 65 6e 20 70 72  ma and 4 when pr
db20: 6f 63 65 73 73 69 6e 67 20 61 20 6e 65 77 20 73  ocessing a new s
db30: 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 62 6f 75  tatement.  A bou
db40: 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  nd.** parameter 
db50: 72 61 69 73 65 73 20 61 6e 20 65 72 72 6f 72 20  raises an error 
db60: 66 6f 72 20 6e 65 77 20 73 74 61 74 65 6d 65 6e  for new statemen
db70: 74 73 2c 20 62 75 74 20 69 73 20 73 69 6c 65 6e  ts, but is silen
db80: 74 6c 79 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a  tly converted.**
db90: 20 74 6f 20 4e 55 4c 4c 20 66 6f 72 20 65 78 69   to NULL for exi
dba0: 73 74 69 6e 67 20 73 63 68 65 6d 61 73 2e 20 20  sting schemas.  
dbb0: 54 68 69 73 20 61 6c 6c 6f 77 73 20 73 71 6c 69  This allows sqli
dbc0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73  te_master tables
dbd0: 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6e 74 61 69   that .** contai
dbe0: 6e 20 61 20 62 6f 75 6e 64 20 70 61 72 61 6d 65  n a bound parame
dbf0: 74 65 72 20 62 65 63 61 75 73 65 20 74 68 65 79  ter because they
dc00: 20 77 65 72 65 20 67 65 6e 65 72 61 74 65 64 20   were generated 
dc10: 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e  by older version
dc20: 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 74  s.** of SQLite t
dc30: 6f 20 62 65 20 70 61 72 73 65 64 20 62 79 20 6e  o be parsed by n
dc40: 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  ewer versions of
dc50: 20 53 51 4c 69 74 65 20 77 69 74 68 6f 75 74 20   SQLite without 
dc60: 72 61 69 73 69 6e 67 20 61 0a 2a 2a 20 6d 61 6c  raising a.** mal
dc70: 66 6f 72 6d 65 64 20 73 63 68 65 6d 61 20 65 72  formed schema er
dc80: 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ror..*/.static i
dc90: 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e  nt exprNodeIsCon
dca0: 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57  stant(Walker *pW
dcb0: 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
dcc0: 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70 57  pr){..  /* If pW
dcd0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 69 73 20  alker->eCode is 
dce0: 32 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d 20  2 then any term 
dcf0: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
dd00: 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72 6f  n that comes fro
dd10: 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72  m.  ** the ON or
dd20: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
dd30: 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 64 69  f a left join di
dd40: 73 71 75 61 6c 69 66 69 65 73 20 74 68 65 20 65  squalifies the e
dd50: 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66  xpression.  ** f
dd60: 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69 64  rom being consid
dd70: 65 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a  ered constant. *
dd80: 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d  /.  if( pWalker-
dd90: 3e 65 43 6f 64 65 3d 3d 32 20 26 26 20 45 78 70  >eCode==2 && Exp
dda0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
ddb0: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
ddc0: 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d   ){.    pWalker-
ddd0: 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  >eCode = 0;.    
dde0: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
ddf0: 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28  ;.  }..  switch(
de00: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
de10: 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66 75    /* Consider fu
de20: 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f  nctions to be co
de30: 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20 74 68  nstant if all th
de40: 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20 61 72  eir arguments ar
de50: 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a  e constant.    *
de60: 2a 20 61 6e 64 20 65 69 74 68 65 72 20 70 57 61  * and either pWa
de70: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f  lker->eCode==4 o
de80: 72 20 35 20 6f 72 20 74 68 65 20 66 75 6e 63 74  r 5 or the funct
de90: 69 6f 6e 20 68 61 73 20 74 68 65 0a 20 20 20 20  ion has the.    
dea0: 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43  ** SQLITE_FUNC_C
deb0: 4f 4e 53 54 20 66 6c 61 67 2e 20 2a 2f 0a 20 20  ONST flag. */.  
dec0: 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
ded0: 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57  ON:.      if( pW
dee0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3e 3d 34 20  alker->eCode>=4 
def0: 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  || ExprHasProper
df00: 74 79 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e 73  ty(pExpr,EP_Cons
df10: 74 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20  tFunc) ){.      
df20: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
df30: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c  tinue;.      }el
df40: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 57 61 6c  se{.        pWal
df50: 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a  ker->eCode = 0;.
df60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
df70: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
df80: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44  }.    case TK_ID
df90: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
dfa0: 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  LUMN:.    case T
dfb0: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a  K_AGG_FUNCTION:.
dfc0: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
dfd0: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 74 65  COLUMN:.      te
dfe0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
dff0: 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20  p==TK_ID );.    
e000: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
e010: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
e020: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
e030: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
e040: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
e050: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
e060: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
e070: 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  AGG_COLUMN );.  
e080: 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d      if( pWalker-
e090: 3e 65 43 6f 64 65 3d 3d 33 20 26 26 20 70 45 78  >eCode==3 && pEx
e0a0: 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61 6c  pr->iTable==pWal
e0b0: 6b 65 72 2d 3e 75 2e 69 43 75 72 20 29 7b 0a 20  ker->u.iCur ){. 
e0c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
e0d0: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  C_Continue;.    
e0e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e0f0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
e100: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
e110: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
e120: 20 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20       }.    case 
e130: 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20 20  TK_VARIABLE:.   
e140: 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
e150: 65 43 6f 64 65 3d 3d 35 20 29 7b 0a 20 20 20 20  eCode==5 ){.    
e160: 20 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20      /* Silently 
e170: 63 6f 6e 76 65 72 74 20 62 6f 75 6e 64 20 70 61  convert bound pa
e180: 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 61 70  rameters that ap
e190: 70 65 61 72 20 69 6e 73 69 64 65 20 6f 66 20 43  pear inside of C
e1a0: 52 45 41 54 45 0a 20 20 20 20 20 20 20 20 2a 2a  REATE.        **
e1b0: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 6f   statements into
e1c0: 20 61 20 4e 55 4c 4c 20 77 68 65 6e 20 70 61 72   a NULL when par
e1d0: 73 69 6e 67 20 74 68 65 20 43 52 45 41 54 45 20  sing the CREATE 
e1e0: 73 74 61 74 65 6d 65 6e 74 20 74 65 78 74 20 6f  statement text o
e1f0: 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ut.        ** of
e200: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
e210: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  er table */.    
e220: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
e230: 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d  TK_NULL;.      }
e240: 65 6c 73 65 20 69 66 28 20 70 57 61 6c 6b 65 72  else if( pWalker
e250: 2d 3e 65 43 6f 64 65 3d 3d 34 20 29 7b 0a 20 20  ->eCode==4 ){.  
e260: 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 75 6e 64        /* A bound
e270: 20 70 61 72 61 6d 65 74 65 72 20 69 6e 20 61 20   parameter in a 
e280: 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74  CREATE statement
e290: 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73   that originates
e2a0: 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a   from.        **
e2b0: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
e2c0: 28 29 20 63 61 75 73 65 73 20 61 6e 20 65 72 72  () causes an err
e2d0: 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 57  or */.        pW
e2e0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
e2f0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
e300: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
e310: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c    }.      /* Fal
e320: 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20  l through */.   
e330: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
e340: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
e350: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
e360: 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65 49  ; /* selectNodeI
e370: 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20 64  sConstant will d
e380: 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20  isallow */.     
e390: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
e3a0: 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20  ->op==TK_EXISTS 
e3b0: 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65  ); /* selectNode
e3c0: 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20  IsConstant will 
e3d0: 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20  disallow */.    
e3e0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
e3f0: 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61  tinue;.  }.}.sta
e400: 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 4e 6f  tic int selectNo
e410: 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c  deIsConstant(Wal
e420: 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
e430: 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 29 7b 0a  lect *NotUsed){.
e440: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
e450: 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 70  ER(NotUsed);.  p
e460: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
e470: 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  0;.  return WRC_
e480: 41 62 6f 72 74 3b 0a 7d 0a 73 74 61 74 69 63 20  Abort;.}.static 
e490: 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74 28  int exprIsConst(
e4a0: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e 69  Expr *p, int ini
e4b0: 74 46 6c 61 67 2c 20 69 6e 74 20 69 43 75 72 29  tFlag, int iCur)
e4c0: 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
e4d0: 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69  memset(&w, 0, si
e4e0: 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 65 43  zeof(w));.  w.eC
e4f0: 6f 64 65 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a  ode = initFlag;.
e500: 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
e510: 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  k = exprNodeIsCo
e520: 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c  nstant;.  w.xSel
e530: 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65  ectCallback = se
e540: 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61  lectNodeIsConsta
e550: 6e 74 3b 0a 20 20 77 2e 75 2e 69 43 75 72 20 3d  nt;.  w.u.iCur =
e560: 20 69 43 75 72 3b 0a 20 20 73 71 6c 69 74 65 33   iCur;.  sqlite3
e570: 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b  WalkExpr(&w, p);
e580: 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64  .  return w.eCod
e590: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  e;.}../*.** Walk
e5a0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
e5b0: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  ree.  Return non
e5c0: 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70  -zero if the exp
e5d0: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
e5e0: 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20  ant.** and 0 if 
e5f0: 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69  it involves vari
e600: 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f  ables or functio
e610: 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46  n calls..**.** F
e620: 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
e630: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
e640: 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  , a double-quote
e650: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61  d string (ex: "a
e660: 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  bc").** is consi
e670: 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65  dered a variable
e680: 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75   but a single-qu
e690: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
e6a0: 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20   'abc') is.** a 
e6b0: 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74  constant..*/.int
e6c0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
e6d0: 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29 7b  nstant(Expr *p){
e6e0: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
e6f0: 43 6f 6e 73 74 28 70 2c 20 31 2c 20 30 29 3b 0a  Const(p, 1, 0);.
e700: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
e710: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
e720: 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
e730: 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ro if the expres
e740: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
e750: 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  .** that does no
e760: 20 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d 20   originate from 
e770: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
e780: 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69  clauses of a joi
e790: 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69  n..** Return 0 i
e7a0: 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61  f it involves va
e7b0: 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74  riables or funct
e7c0: 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65 72  ion calls or ter
e7d0: 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e  ms from.** an ON
e7e0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
e7f0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
e800: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
e810: 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a  tJoin(Expr *p){.
e820: 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43    return exprIsC
e830: 6f 6e 73 74 28 70 2c 20 32 2c 20 30 29 3b 0a 7d  onst(p, 2, 0);.}
e840: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
e850: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
e860: 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72    Return non-zer
e870: 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  o if the express
e880: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
e890: 2a 2a 20 66 6f 72 20 61 6e 79 20 73 69 6e 67 6c  ** for any singl
e8a0: 65 20 72 6f 77 20 6f 66 20 74 68 65 20 74 61 62  e row of the tab
e8b0: 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 20 69  le with cursor i
e8c0: 43 75 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  Cur.  In other w
e8d0: 6f 72 64 73 2c 20 74 68 65 0a 2a 2a 20 65 78 70  ords, the.** exp
e8e0: 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 6e 6f 74  ression must not
e8f0: 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20 6e 6f   refer to any no
e900: 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20  n-deterministic 
e910: 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 20 61 6e 79  function nor any
e920: 0a 2a 2a 20 74 61 62 6c 65 20 6f 74 68 65 72 20  .** table other 
e930: 74 68 61 6e 20 69 43 75 72 2e 0a 2a 2f 0a 69 6e  than iCur..*/.in
e940: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54  t sqlite3ExprIsT
e950: 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 45 78 70  ableConstant(Exp
e960: 72 20 2a 70 2c 20 69 6e 74 20 69 43 75 72 29 7b  r *p, int iCur){
e970: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
e980: 43 6f 6e 73 74 28 70 2c 20 33 2c 20 69 43 75 72  Const(p, 3, iCur
e990: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  );.}../*.** Walk
e9a0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
e9b0: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  ree.  Return non
e9c0: 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70  -zero if the exp
e9d0: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
e9e0: 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63  ant.** or a func
e9f0: 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63  tion call with c
ea00: 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
ea10: 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30  s.  Return and 0
ea20: 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
ea30: 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a   any variables..
ea40: 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
ea50: 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66  rposes of this f
ea60: 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c  unction, a doubl
ea70: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
ea80: 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69  (ex: "abc").** i
ea90: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76  s considered a v
eaa0: 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69  ariable but a si
eab0: 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  ngle-quoted stri
eac0: 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69  ng (ex: 'abc') i
ead0: 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e  s.** a constant.
eae0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
eaf0: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46  xprIsConstantOrF
eb00: 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 2c  unction(Expr *p,
eb10: 20 75 38 20 69 73 49 6e 69 74 29 7b 0a 20 20 61   u8 isInit){.  a
eb20: 73 73 65 72 74 28 20 69 73 49 6e 69 74 3d 3d 30  ssert( isInit==0
eb30: 20 7c 7c 20 69 73 49 6e 69 74 3d 3d 31 20 29 3b   || isInit==1 );
eb40: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
eb50: 43 6f 6e 73 74 28 70 2c 20 34 2b 69 73 49 6e 69  Const(p, 4+isIni
eb60: 74 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 64 65 66  t, 0);.}..#ifdef
eb70: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
eb80: 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a  URSOR_HINTS./*.*
eb90: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
eba0: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
ebb0: 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72  rn 1 if the expr
ebc0: 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  ession contains 
ebd0: 61 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 6f 66  a.** subquery of
ebe0: 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 52 65 74   some kind.  Ret
ebf0: 75 72 6e 20 30 20 69 66 20 74 68 65 72 65 20 61  urn 0 if there a
ec00: 72 65 20 6e 6f 20 73 75 62 71 75 65 72 69 65 73  re no subqueries
ec10: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ec20: 45 78 70 72 43 6f 6e 74 61 69 6e 73 53 75 62 71  ExprContainsSubq
ec30: 75 65 72 79 28 45 78 70 72 20 2a 70 29 7b 0a 20  uery(Expr *p){. 
ec40: 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d   Walker w;.  mem
ec50: 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
ec60: 66 28 77 29 29 3b 0a 20 20 77 2e 65 43 6f 64 65  f(w));.  w.eCode
ec70: 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70 72 43   = 1;.  w.xExprC
ec80: 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65  allback = sqlite
ec90: 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20  3ExprWalkNoop;. 
eca0: 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
ecb0: 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49  ck = selectNodeI
ecc0: 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 73 71 6c  sConstant;.  sql
ecd0: 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
ece0: 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e   p);.  return w.
ecf0: 65 43 6f 64 65 3d 3d 30 3b 0a 7d 0a 23 65 6e 64  eCode==0;.}.#end
ed00: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
ed10: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f   expression p co
ed20: 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69  des a constant i
ed30: 6e 74 65 67 65 72 20 74 68 61 74 20 69 73 20 73  nteger that is s
ed40: 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74  mall enough.** t
ed50: 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69  o fit in a 32-bi
ed60: 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72  t integer, retur
ed70: 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68 65 20  n 1 and put the 
ed80: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74  value of the int
ed90: 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c  eger.** in *pVal
eda0: 75 65 2e 20 20 49 66 20 74 68 65 20 65 78 70 72  ue.  If the expr
edb0: 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e  ession is not an
edc0: 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69   integer or if i
edd0: 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20  t is too big.** 
ede0: 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e  to fit in a sign
edf0: 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65  ed 32-bit intege
ee00: 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20  r, return 0 and 
ee10: 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e  leave *pValue un
ee20: 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20  changed..*/.int 
ee30: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
ee40: 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e  eger(Expr *p, in
ee50: 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e  t *pValue){.  in
ee60: 74 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  t rc = 0;..  /* 
ee70: 49 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  If an expression
ee80: 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6c   is an integer l
ee90: 69 74 65 72 61 6c 20 74 68 61 74 20 66 69 74 73  iteral that fits
eea0: 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d   in a signed 32-
eeb0: 62 69 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72  bit.  ** integer
eec0: 2c 20 74 68 65 6e 20 74 68 65 20 45 50 5f 49 6e  , then the EP_In
eed0: 74 56 61 6c 75 65 20 66 6c 61 67 20 77 69 6c 6c  tValue flag will
eee0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
eef0: 65 6e 20 73 65 74 20 2a 2f 0a 20 20 61 73 73 65  en set */.  asse
ef00: 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e  rt( p->op!=TK_IN
ef10: 54 45 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c 61  TEGER || (p->fla
ef20: 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
ef30: 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
ef40: 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  || sqlite3GetInt
ef50: 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  32(p->u.zToken, 
ef60: 26 72 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  &rc)==0 );..  if
ef70: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ( p->flags & EP_
ef80: 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  IntValue ){.    
ef90: 2a 70 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69  *pValue = p->u.i
efa0: 56 61 6c 75 65 3b 0a 20 20 20 20 72 65 74 75 72  Value;.    retur
efb0: 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  n 1;.  }.  switc
efc0: 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
efd0: 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b  case TK_UPLUS: {
efe0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
eff0: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
f000: 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75  (p->pLeft, pValu
f010: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
f020: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
f030: 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
f040: 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20     int v;.      
f050: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
f060: 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66  sInteger(p->pLef
f070: 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20  t, &v) ){.      
f080: 20 20 61 73 73 65 72 74 28 20 76 21 3d 28 2d 32    assert( v!=(-2
f090: 31 34 37 34 38 33 36 34 37 2d 31 29 20 29 3b 0a  147483647-1) );.
f0a0: 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20          *pValue 
f0b0: 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 63  = -v;.        rc
f0c0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
f0d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f0e0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72  .    default: br
f0f0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
f100: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
f110: 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74  eturn FALSE if t
f120: 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63  here is no chanc
f130: 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65  e that the expre
f140: 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c  ssion can be NUL
f150: 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  L..**.** If the 
f160: 65 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74  expression might
f170: 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74   be NULL or if t
f180: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
f190: 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20   too complex.** 
f1a0: 74 6f 20 74 65 6c 6c 20 72 65 74 75 72 6e 20 54  to tell return T
f1b0: 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  RUE.  .**.** Thi
f1c0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
f1d0: 64 20 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  d as an optimiza
f1e0: 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50  tion, to skip OP
f1f0: 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a  _IsNull opcodes.
f200: 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20  ** when we know 
f210: 74 68 61 74 20 61 20 76 61 6c 75 65 20 63 61 6e  that a value can
f220: 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65  not be NULL.  He
f230: 6e 63 65 2c 20 61 20 66 61 6c 73 65 20 70 6f 73  nce, a false pos
f240: 69 74 69 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e  itive.** (return
f250: 69 6e 67 20 54 52 55 45 20 77 68 65 6e 20 69 6e  ing TRUE when in
f260: 20 66 61 63 74 20 74 68 65 20 65 78 70 72 65 73   fact the expres
f270: 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20 62  sion can never b
f280: 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a  e NULL) might.**
f290: 20 62 65 20 61 20 73 6d 61 6c 6c 20 70 65 72 66   be a small perf
f2a0: 6f 72 6d 61 6e 63 65 20 68 69 74 20 62 75 74 20  ormance hit but 
f2b0: 69 73 20 6f 74 68 65 72 77 69 73 65 20 68 61 72  is otherwise har
f2c0: 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f  mless.  On the o
f2d0: 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20  ther.** hand, a 
f2e0: 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 20 28  false negative (
f2f0: 72 65 74 75 72 6e 69 6e 67 20 46 41 4c 53 45 20  returning FALSE 
f300: 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  when the result 
f310: 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a  could be NULL).*
f320: 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65  * will likely re
f330: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72  sult in an incor
f340: 72 65 63 74 20 61 6e 73 77 65 72 2e 20 20 53 6f  rect answer.  So
f350: 20 77 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20   when in doubt, 
f360: 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a  return.** TRUE..
f370: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
f380: 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73  prCanBeNull(cons
f390: 74 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 75 38  t Expr *p){.  u8
f3a0: 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d   op;.  while( p-
f3b0: 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c  >op==TK_UPLUS ||
f3c0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55   p->op==TK_UMINU
f3d0: 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66  S ){ p = p->pLef
f3e0: 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f  t; }.  op = p->o
f3f0: 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  p;.  if( op==TK_
f400: 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20  REGISTER ) op = 
f410: 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68  p->op2;.  switch
f420: 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
f430: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20   TK_INTEGER:.   
f440: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
f450: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
f460: 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AT:.    case TK_
f470: 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75  BLOB:.      retu
f480: 72 6e 20 30 3b 0a 20 20 20 20 63 61 73 65 20 54  rn 0;.    case T
f490: 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20  K_COLUMN:.      
f4a0: 61 73 73 65 72 74 28 20 70 2d 3e 70 54 61 62 21  assert( p->pTab!
f4b0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  =0 );.      retu
f4c0: 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  rn ExprHasProper
f4d0: 74 79 28 70 2c 20 45 50 5f 43 61 6e 42 65 4e 75  ty(p, EP_CanBeNu
f4e0: 6c 6c 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ll) ||.         
f4f0: 20 20 20 20 28 70 2d 3e 69 43 6f 6c 75 6d 6e 3e      (p->iColumn>
f500: 3d 30 20 26 26 20 70 2d 3e 70 54 61 62 2d 3e 61  =0 && p->pTab->a
f510: 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  Col[p->iColumn].
f520: 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 3b 0a 20 20 20  notNull==0);.   
f530: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
f540: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a  return 1;.  }.}.
f550: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
f560: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
f570: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
f580: 63 6f 6e 73 74 61 6e 74 20 77 68 69 63 68 20 77  constant which w
f590: 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 6e 63 68 61  ould be.** uncha
f5a0: 6e 67 65 64 20 62 79 20 4f 50 5f 41 66 66 69 6e  nged by OP_Affin
f5b0: 69 74 79 20 77 69 74 68 20 74 68 65 20 61 66 66  ity with the aff
f5c0: 69 6e 69 74 79 20 67 69 76 65 6e 20 69 6e 20 74  inity given in t
f5d0: 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67  he second.** arg
f5e0: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ument..**.** Thi
f5f0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
f600: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
f610: 66 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74  f the OP_Affinit
f620: 79 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 63  y operation.** c
f630: 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e 20 20  an be omitted.  
f640: 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 20 72 65  When in doubt re
f650: 74 75 72 6e 20 46 41 4c 53 45 2e 20 20 41 20 66  turn FALSE.  A f
f660: 61 6c 73 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a  alse negative.**
f670: 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 20 20 41   is harmless.  A
f680: 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2c   false positive,
f690: 20 68 6f 77 65 76 65 72 2c 20 63 61 6e 20 72 65   however, can re
f6a0: 73 75 6c 74 20 69 6e 20 74 68 65 20 77 72 6f 6e  sult in the wron
f6b0: 67 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a  g.** answer..*/.
f6c0: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 4e  int sqlite3ExprN
f6d0: 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68  eedsNoAffinityCh
f6e0: 61 6e 67 65 28 63 6f 6e 73 74 20 45 78 70 72 20  ange(const Expr 
f6f0: 2a 70 2c 20 63 68 61 72 20 61 66 66 29 7b 0a 20  *p, char aff){. 
f700: 20 75 38 20 6f 70 3b 0a 20 20 69 66 28 20 61 66   u8 op;.  if( af
f710: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  f==SQLITE_AFF_BL
f720: 4f 42 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  OB ) return 1;. 
f730: 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54   while( p->op==T
f740: 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70  K_UPLUS || p->op
f750: 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70  ==TK_UMINUS ){ p
f760: 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20   = p->pLeft; }. 
f770: 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69   op = p->op;.  i
f780: 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  f( op==TK_REGIST
f790: 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32  ER ) op = p->op2
f7a0: 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
f7b0: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  {.    case TK_IN
f7c0: 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 72  TEGER: {.      r
f7d0: 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54  eturn aff==SQLIT
f7e0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c  E_AFF_INTEGER ||
f7f0: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
f800: 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a  _NUMERIC;.    }.
f810: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41      case TK_FLOA
f820: 54 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  T: {.      retur
f830: 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  n aff==SQLITE_AF
f840: 46 5f 52 45 41 4c 20 7c 7c 20 61 66 66 3d 3d 53  F_REAL || aff==S
f850: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
f860: 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  C;.    }.    cas
f870: 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20  e TK_STRING: {. 
f880: 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d       return aff=
f890: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
f8a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
f8b0: 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20   TK_BLOB: {.    
f8c0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
f8d0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
f8e0: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61 73  LUMN: {.      as
f8f0: 73 65 72 74 28 20 70 2d 3e 69 54 61 62 6c 65 3e  sert( p->iTable>
f900: 3d 30 20 29 3b 20 20 2f 2a 20 70 20 63 61 6e 6e  =0 );  /* p cann
f910: 6f 74 20 62 65 20 70 61 72 74 20 6f 66 20 61 20  ot be part of a 
f920: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
f930: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
f940: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20   p->iColumn<0.  
f950: 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d          && (aff=
f960: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45  =SQLITE_AFF_INTE
f970: 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  GER || aff==SQLI
f980: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 29 3b  TE_AFF_NUMERIC);
f990: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
f9a0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  lt: {.      retu
f9b0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
f9c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
f9d0: 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65  TRUE if the give
f9e0: 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f  n string is a ro
f9f0: 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  w-id column name
fa00: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
fa10: 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68  IsRowid(const ch
fa20: 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71  ar *z){.  if( sq
fa30: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
fa40: 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20  "_ROWID_")==0 ) 
fa50: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
fa60: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
fa70: 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20  , "ROWID")==0 ) 
fa80: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
fa90: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
faa0: 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65  , "OID")==0 ) re
fab0: 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
fac0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 58 20   0;.}../*.** pX 
fad0: 69 73 20 74 68 65 20 52 48 53 20 6f 66 20 61 6e  is the RHS of an
fae0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 49   IN operator.  I
faf0: 66 20 70 58 20 69 73 20 61 20 53 45 4c 45 43 54  f pX is a SELECT
fb00: 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 74   statement .** t
fb10: 68 61 74 20 63 61 6e 20 62 65 20 73 69 6d 70 6c  hat can be simpl
fb20: 69 66 69 65 64 20 74 6f 20 61 20 64 69 72 65 63  ified to a direc
fb30: 74 20 74 61 62 6c 65 20 61 63 63 65 73 73 2c 20  t table access, 
fb40: 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a 2a 20 61  then return.** a
fb50: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
fb60: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
fb70: 2e 20 20 49 66 20 70 58 20 69 73 20 6e 6f 74 20  .  If pX is not 
fb80: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
fb90: 6e 74 2c 0a 2a 2a 20 6f 72 20 69 66 20 74 68 65  nt,.** or if the
fba0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
fbb0: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6d 61  t needs to be ma
fbc0: 6e 69 66 65 73 74 65 64 20 69 6e 74 6f 20 61 20  nifested into a 
fbd0: 74 72 61 6e 73 69 65 6e 74 0a 2a 2a 20 74 61 62  transient.** tab
fbe0: 6c 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  le, then return 
fbf0: 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  NULL..*/.#ifndef
fc00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
fc10: 51 55 45 52 59 0a 73 74 61 74 69 63 20 53 65 6c  QUERY.static Sel
fc20: 65 63 74 20 2a 69 73 43 61 6e 64 69 64 61 74 65  ect *isCandidate
fc30: 46 6f 72 49 6e 4f 70 74 28 45 78 70 72 20 2a 70  ForInOpt(Expr *p
fc40: 58 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b  X){.  Select *p;
fc50: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
fc60: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
fc70: 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70  List;.  Table *p
fc80: 54 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Tab;.  int i;.  
fc90: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
fca0: 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53  erty(pX, EP_xIsS
fcb0: 65 6c 65 63 74 29 20 29 20 72 65 74 75 72 6e 20  elect) ) return 
fcc0: 30 3b 20 20 2f 2a 20 4e 6f 74 20 61 20 73 75 62  0;  /* Not a sub
fcd0: 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 45  query */.  if( E
fce0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
fcf0: 58 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29  X, EP_VarSelect)
fd00: 20 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f    ) return 0;  /
fd10: 2a 20 43 6f 72 72 65 6c 61 74 65 64 20 73 75 62  * Correlated sub
fd20: 71 20 2a 2f 0a 20 20 70 20 3d 20 70 58 2d 3e 78  q */.  p = pX->x
fd30: 2e 70 53 65 6c 65 63 74 3b 0a 20 20 69 66 28 20  .pSelect;.  if( 
fd40: 70 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74 75  p->pPrior ) retu
fd50: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
fd60: 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d 70     /* Not a comp
fd70: 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20  ound SELECT */. 
fd80: 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
fd90: 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
fda0: 53 46 5f 41 67 67 72 65 67 61 74 65 29 20 29 7b  SF_Aggregate) ){
fdb0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28  .    testcase( (
fdc0: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  p->selFlags & (S
fdd0: 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
fde0: 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69  gregate))==SF_Di
fdf0: 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 74 65  stinct );.    te
fe00: 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46  stcase( (p->selF
fe10: 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
fe20: 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
fe30: 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65  ))==SF_Aggregate
fe40: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   );.    return 0
fe50: 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49 4e 43 54  ; /* No DISTINCT
fe60: 20 6b 65 79 77 6f 72 64 20 61 6e 64 20 6e 6f 20   keyword and no 
fe70: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
fe80: 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73  ons */.  }.  ass
fe90: 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79  ert( p->pGroupBy
fea0: 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  ==0 );          
feb0: 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 47 52      /* Has no GR
fec0: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  OUP BY clause */
fed0: 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74  .  if( p->pLimit
fee0: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
fef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
ff00: 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73 65   no LIMIT clause
ff10: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
ff20: 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20  >pOffset==0 );  
ff30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ff40: 4e 6f 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 6e  No LIMIT means n
ff50: 6f 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69 66  o OFFSET */.  if
ff60: 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65  ( p->pWhere ) re
ff70: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
ff80: 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 57       /* Has no W
ff90: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
ffa0: 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
ffb0: 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21  .  assert( pSrc!
ffc0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 53 72 63  =0 );.  if( pSrc
ffd0: 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75  ->nSrc!=1 ) retu
ffe0: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f  rn 0;          /
fff0: 2a 20 53 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e  * Single term in
10000 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
10010 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d    if( pSrc->a[0]
10020 2e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75 72  .pSelect ) retur
10030 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  n 0;     /* FROM
10040 20 69 73 20 6e 6f 74 20 61 20 73 75 62 71 75 65   is not a subque
10050 72 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20  ry or view */.  
10060 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30  pTab = pSrc->a[0
10070 5d 2e 70 54 61 62 3b 0a 20 20 61 73 73 65 72 74  ].pTab;.  assert
10080 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61  ( pTab!=0 );.  a
10090 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70 53 65  ssert( pTab->pSe
100a0 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20 20 20 20  lect==0 );      
100b0 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c        /* FROM cl
100c0 61 75 73 65 20 69 73 20 6e 6f 74 20 61 20 76 69  ause is not a vi
100d0 65 77 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69  ew */.  if( IsVi
100e0 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65  rtual(pTab) ) re
100f0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 2f  turn 0;        /
10100 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e 6f  * FROM clause no
10110 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t a virtual tabl
10120 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20  e */.  pEList = 
10130 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73 73  p->pEList;.  ass
10140 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
10150 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 20 53 45 4c 45  ;..  /* All SELE
10160 43 54 20 72 65 73 75 6c 74 73 20 6d 75 73 74 20  CT results must 
10170 62 65 20 63 6f 6c 75 6d 6e 73 2e 20 2a 2f 0a 20  be columns. */. 
10180 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
10190 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
101a0 0a 20 20 20 20 45 78 70 72 20 2a 70 52 65 73 20  .    Expr *pRes 
101b0 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
101c0 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 52  Expr;.    if( pR
101d0 65 73 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  es->op!=TK_COLUM
101e0 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  N ) return 0;.  
101f0 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e    assert( pRes->
10200 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b  iTable==pSrc->a[
10210 30 5d 2e 69 43 75 72 73 6f 72 20 29 3b 20 20 2f  0].iCursor );  /
10220 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61 74  * Not a correlat
10230 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  ed subquery */. 
10240 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
10250 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
10260 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
10270 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61  */../*.** Code a
10280 6e 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75  n OP_Once instru
10290 63 74 69 6f 6e 20 61 6e 64 20 61 6c 6c 6f 63 61  ction and alloca
102a0 74 65 20 73 70 61 63 65 20 66 6f 72 20 69 74 73  te space for its
102b0 20 66 6c 61 67 2e 20 52 65 74 75 72 6e 20 74 68   flag. Return th
102c0 65 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f 66  e .** address of
102d0 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75 63   the new instruc
102e0 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
102f0 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 50 61 72  ite3CodeOnce(Par
10300 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56  se *pParse){.  V
10310 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
10320 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
10330 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c        /* Virtual
10340 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63   machine being c
10350 6f 64 65 64 20 2a 2f 0a 20 20 72 65 74 75 72 6e  oded */.  return
10360 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10370 70 31 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20 70  p1(v, OP_Once, p
10380 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 2b 2b 29 3b  Parse->nOnce++);
10390 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
103a0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
103b0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
103c0 63 6f 64 65 20 74 68 61 74 20 63 68 65 63 6b 73  code that checks
103d0 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63   the left-most c
103e0 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74  olumn of index t
103f0 61 62 6c 65 20 69 43 75 72 20 74 6f 20 73 65 65  able iCur to see
10400 20 69 66 0a 2a 2a 20 69 74 20 63 6f 6e 74 61 69   if.** it contai
10410 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 65 6e 74 72  ns any NULL entr
10420 69 65 73 2e 20 20 43 61 75 73 65 20 74 68 65 20  ies.  Cause the 
10430 72 65 67 69 73 74 65 72 20 61 74 20 72 65 67 48  register at regH
10440 61 73 4e 75 6c 6c 20 74 6f 20 62 65 20 73 65 74  asNull to be set
10450 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c  .** to a non-NUL
10460 4c 20 76 61 6c 75 65 20 69 66 20 69 43 75 72 20  L value if iCur 
10470 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c  contains no NULL
10480 73 2e 20 20 43 61 75 73 65 20 72 65 67 69 73 74  s.  Cause regist
10490 65 72 20 72 65 67 48 61 73 4e 75 6c 6c 0a 2a 2a  er regHasNull.**
104a0 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20 4e 55   to be set to NU
104b0 4c 4c 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61  LL if iCur conta
104c0 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
104d0 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a  NULL values..*/.
104e0 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
104f0 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61  te3SetHasNullFla
10500 67 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  g(Vdbe *v, int i
10510 43 75 72 2c 20 69 6e 74 20 72 65 67 48 61 73 4e  Cur, int regHasN
10520 75 6c 6c 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  ull){.  int addr
10530 31 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  1;.  sqlite3Vdbe
10540 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
10550 65 67 65 72 2c 20 30 2c 20 72 65 67 48 61 73 4e  eger, 0, regHasN
10560 75 6c 6c 29 3b 0a 20 20 61 64 64 72 31 20 3d 20  ull);.  addr1 = 
10570 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10580 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  1(v, OP_Rewind, 
10590 69 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72  iCur); VdbeCover
105a0 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
105b0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
105c0 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c 20  P_Column, iCur, 
105d0 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a  0, regHasNull);.
105e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
105f0 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
10600 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 56 64  TYPEOFARG);.  Vd
10610 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66  beComment((v, "f
10620 69 72 73 74 5f 65 6e 74 72 79 5f 69 6e 28 25 64  irst_entry_in(%d
10630 29 22 2c 20 69 43 75 72 29 29 3b 0a 20 20 73 71  )", iCur));.  sq
10640 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
10650 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 7d 0a 23  e(v, addr1);.}.#
10660 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20  endif...#ifndef 
10670 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
10680 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  UERY./*.** The a
10690 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 49 4e  rgument is an IN
106a0 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 61   operator with a
106b0 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75 62   list (not a sub
106c0 71 75 65 72 79 29 20 6f 6e 20 74 68 65 20 0a 2a  query) on the .*
106d0 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  * right-hand sid
106e0 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  e.  Return TRUE 
106f0 69 66 20 74 68 61 74 20 6c 69 73 74 20 69 73 20  if that list is 
10700 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 73 74 61  constant..*/.sta
10710 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 49  tic int sqlite3I
10720 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 45  nRhsIsConstant(E
10730 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 45 78 70  xpr *pIn){.  Exp
10740 72 20 2a 70 4c 48 53 3b 0a 20 20 69 6e 74 20 72  r *pLHS;.  int r
10750 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45  es;.  assert( !E
10760 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
10770 49 6e 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  In, EP_xIsSelect
10780 29 20 29 3b 0a 20 20 70 4c 48 53 20 3d 20 70 49  ) );.  pLHS = pI
10790 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20 70 49 6e 2d  n->pLeft;.  pIn-
107a0 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 72 65  >pLeft = 0;.  re
107b0 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49  s = sqlite3ExprI
107c0 73 43 6f 6e 73 74 61 6e 74 28 70 49 6e 29 3b 0a  sConstant(pIn);.
107d0 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 70    pIn->pLeft = p
107e0 4c 48 53 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  LHS;.  return re
107f0 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  s;.}.#endif../*.
10800 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
10810 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
10820 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
10830 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20 6f  f the IN (...) o
10840 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 54 68 65 20  perator..** The 
10850 70 58 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  pX parameter is 
10860 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  the expression o
10870 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  n the RHS of the
10880 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 68   IN operator, wh
10890 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20  ich.** might be 
108a0 65 69 74 68 65 72 20 61 20 6c 69 73 74 20 6f 66  either a list of
108b0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20   expressions or 
108c0 61 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  a subquery..**.*
108d0 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69  * The job of thi
108e0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20  s routine is to 
108f0 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61  find or create a
10900 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74   b-tree object t
10910 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73  hat can.** be us
10920 65 64 20 65 69 74 68 65 72 20 74 6f 20 74 65 73  ed either to tes
10930 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70  t for membership
10940 20 69 6e 20 74 68 65 20 52 48 53 20 73 65 74 20   in the RHS set 
10950 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  or to iterate th
10960 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65 6d  rough.** all mem
10970 62 65 72 73 20 6f 66 20 74 68 65 20 52 48 53 20  bers of the RHS 
10980 73 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 64 75  set, skipping du
10990 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  plicates..**.** 
109a0 41 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e  A cursor is open
109b0 65 64 20 6f 6e 20 74 68 65 20 62 2d 74 72 65 65  ed on the b-tree
109c0 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20   object that is 
109d0 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
109e0 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 61 6e  N operator.** an
109f0 64 20 70 58 2d 3e 69 54 61 62 6c 65 20 69 73 20  d pX->iTable is 
10a00 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78  set to the index
10a10 20 6f 66 20 74 68 61 74 20 63 75 72 73 6f 72 2e   of that cursor.
10a20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
10a30 6e 65 64 20 76 61 6c 75 65 20 6f 66 20 74 68 69  ned value of thi
10a40 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69 63  s function indic
10a50 61 74 65 73 20 74 68 65 20 62 2d 74 72 65 65 20  ates the b-tree 
10a60 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  type, as follows
10a70 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  :.**.**   IN_IND
10a80 45 58 5f 52 4f 57 49 44 20 20 20 20 20 20 2d 20  EX_ROWID      - 
10a90 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
10aa0 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62  pened on a datab
10ab0 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20  ase table..**   
10ac0 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41  IN_INDEX_INDEX_A
10ad0 53 43 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72  SC  - The cursor
10ae0 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
10af0 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65  n ascending inde
10b00 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  x..**   IN_INDEX
10b10 5f 49 4e 44 45 58 5f 44 45 53 43 20 2d 20 54 68  _INDEX_DESC - Th
10b20 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
10b30 6e 65 64 20 6f 6e 20 61 20 64 65 73 63 65 6e 64  ned on a descend
10b40 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20  ing index..**   
10b50 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20 20 20 20  IN_INDEX_EPH    
10b60 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72      - The cursor
10b70 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
10b80 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65 61 74   specially creat
10b90 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  ed and.**       
10ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bb0 20 20 70 6f 70 75 6c 61 74 65 64 20 65 70 68 65    populated ephe
10bc0 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20  remal table..** 
10bd0 20 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20    IN_INDEX_NOOP 
10be0 20 20 20 20 20 20 2d 20 4e 6f 20 63 75 72 73 6f        - No curso
10bf0 72 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 2e  r was allocated.
10c00 20 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74 6f    The IN operato
10c10 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 20 20 20  r must be.**    
10c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c30 20 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74 65 64       implemented
10c40 20 61 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f   as a sequence o
10c50 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 2a  f comparisons..*
10c60 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67  *.** An existing
10c70 20 62 2d 74 72 65 65 20 6d 69 67 68 74 20 62 65   b-tree might be
10c80 20 75 73 65 64 20 69 66 20 74 68 65 20 52 48 53   used if the RHS
10c90 20 65 78 70 72 65 73 73 69 6f 6e 20 70 58 20 69   expression pX i
10ca0 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 73 75  s a simple.** su
10cb0 62 71 75 65 72 79 20 73 75 63 68 20 61 73 3a 0a  bquery such as:.
10cc0 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
10cd0 20 3c 63 6f 6c 75 6d 6e 31 3e 2c 20 3c 63 6f 6c   <column1>, <col
10ce0 75 6d 6e 32 3e 2e 2e 2e 20 46 52 4f 4d 20 3c 74  umn2>... FROM <t
10cf0 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  able>.**.** If t
10d00 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
10d10 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c   operator is a l
10d20 69 73 74 20 6f 72 20 61 20 6d 6f 72 65 20 63 6f  ist or a more co
10d30 6d 70 6c 65 78 20 73 75 62 71 75 65 72 79 2c 20  mplex subquery, 
10d40 74 68 65 6e 0a 2a 2a 20 61 6e 20 65 70 68 65 6d  then.** an ephem
10d50 65 72 61 6c 20 74 61 62 6c 65 20 6d 69 67 68 74  eral table might
10d60 20 6e 65 65 64 20 74 6f 20 62 65 20 67 65 6e 65   need to be gene
10d70 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 52  rated from the R
10d80 48 53 20 61 6e 64 20 74 68 65 6e 0a 2a 2a 20 70  HS and then.** p
10d90 58 2d 3e 69 54 61 62 6c 65 20 6d 61 64 65 20 74  X->iTable made t
10da0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 65  o point to the e
10db0 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69  phemeral table i
10dc0 6e 73 74 65 61 64 20 6f 66 20 61 6e 0a 2a 2a 20  nstead of an.** 
10dd0 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 2e 0a  existing table..
10de0 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 46 6c 61 67  **.** The inFlag
10df0 73 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73 74  s parameter must
10e00 20 63 6f 6e 74 61 69 6e 20 65 78 61 63 74 6c 79   contain exactly
10e10 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 69 74 73   one of the bits
10e20 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d  .** IN_INDEX_MEM
10e30 42 45 52 53 48 49 50 20 6f 72 20 49 4e 5f 49 4e  BERSHIP or IN_IN
10e40 44 45 58 5f 4c 4f 4f 50 2e 20 20 49 66 20 69 6e  DEX_LOOP.  If in
10e50 46 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 0a 2a  Flags contains.*
10e60 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45  * IN_INDEX_MEMBE
10e70 52 53 48 49 50 2c 20 74 68 65 6e 20 74 68 65 20  RSHIP, then the 
10e80 67 65 6e 65 72 61 74 65 64 20 74 61 62 6c 65 20  generated table 
10e90 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72  will be used for
10ea0 20 61 0a 2a 2a 20 66 61 73 74 20 6d 65 6d 62 65   a.** fast membe
10eb0 72 73 68 69 70 20 74 65 73 74 2e 20 20 57 68 65  rship test.  Whe
10ec0 6e 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4c  n the IN_INDEX_L
10ed0 4f 4f 50 20 62 69 74 20 69 73 20 73 65 74 2c 20  OOP bit is set, 
10ee0 74 68 65 0a 2a 2a 20 49 4e 20 69 6e 64 65 78 20  the.** IN index 
10ef0 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
10f00 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 76 61  loop over all va
10f10 6c 75 65 73 20 6f 66 20 74 68 65 20 52 48 53 20  lues of the RHS 
10f20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 20 6f 70 65  of the.** IN ope
10f30 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  rator..**.** Whe
10f40 6e 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20  n IN_INDEX_LOOP 
10f50 69 73 20 75 73 65 64 20 28 61 6e 64 20 74 68 65  is used (and the
10f60 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20   b-tree will be 
10f70 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 0a  used to iterate.
10f80 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65 20 73  ** through the s
10f90 65 74 20 6d 65 6d 62 65 72 73 29 20 74 68 65 6e  et members) then
10fa0 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 73 74   the b-tree must
10fb0 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 64 75 70   not contain dup
10fc0 6c 69 63 61 74 65 73 2e 0a 2a 2a 20 41 6e 20 65  licates..** An e
10fd0 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d  pheremal table m
10fe0 75 73 74 20 62 65 20 75 73 65 64 20 75 6e 6c 65  ust be used unle
10ff0 73 73 20 74 68 65 20 73 65 6c 65 63 74 65 64 20  ss the selected 
11000 63 6f 6c 75 6d 6e 73 20 61 72 65 20 67 75 61 72  columns are guar
11010 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  anteed.** to be 
11020 75 6e 69 71 75 65 20 2d 20 65 69 74 68 65 72 20  unique - either 
11030 62 65 63 61 75 73 65 20 69 74 20 69 73 20 61 6e  because it is an
11040 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
11050 20 4b 45 59 20 6f 72 20 64 75 65 20 74 6f 0a 2a   KEY or due to.*
11060 2a 20 61 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  * a UNIQUE const
11070 72 61 69 6e 74 20 6f 72 20 69 6e 64 65 78 2e 0a  raint or index..
11080 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e  **.** When IN_IN
11090 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 69  DEX_MEMBERSHIP i
110a0 73 20 75 73 65 64 20 28 61 6e 64 20 74 68 65 20  s used (and the 
110b0 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75  b-tree will be u
110c0 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74  sed .** for fast
110d0 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20   set membership 
110e0 74 65 73 74 73 29 20 74 68 65 6e 20 61 6e 20 65  tests) then an e
110f0 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d  pheremal table m
11100 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64 20  ust .** be used 
11110 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 73 3e  unless <columns>
11120 20 69 73 20 61 20 73 69 6e 67 6c 65 20 49 4e 54   is a single INT
11130 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
11140 20 63 6f 6c 75 6d 6e 20 6f 72 20 61 6e 20 0a 2a   column or an .*
11150 2a 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 66  * index can be f
11160 6f 75 6e 64 20 77 69 74 68 20 74 68 65 20 73 70  ound with the sp
11170 65 63 69 66 69 65 64 20 3c 63 6f 6c 75 6d 6e 73  ecified <columns
11180 3e 20 61 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f  > as its left-mo
11190 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  st..**.** If the
111a0 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f   IN_INDEX_NOOP_O
111b0 4b 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4d  K and IN_INDEX_M
111c0 45 4d 42 45 52 53 48 49 50 20 61 72 65 20 62 6f  EMBERSHIP are bo
111d0 74 68 20 73 65 74 20 61 6e 64 0a 2a 2a 20 69 66  th set and.** if
111e0 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
111f0 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61  IN operator is a
11200 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75 62   list (not a sub
11210 71 75 65 72 79 29 20 74 68 65 6e 20 74 68 69 73  query) then this
11220 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  .** routine migh
11230 74 20 64 65 63 69 64 65 20 74 68 61 74 20 63 72  t decide that cr
11240 65 61 74 69 6e 67 20 61 6e 20 65 70 68 65 6d 65  eating an epheme
11250 72 61 6c 20 62 2d 74 72 65 65 20 66 6f 72 20 6d  ral b-tree for m
11260 65 6d 62 65 72 73 68 69 70 0a 2a 2a 20 74 65 73  embership.** tes
11270 74 69 6e 67 20 69 73 20 74 6f 6f 20 65 78 70 65  ting is too expe
11280 6e 73 69 76 65 20 61 6e 64 20 72 65 74 75 72 6e  nsive and return
11290 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 20   IN_INDEX_NOOP. 
112a0 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
112b0 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f  he.** calling ro
112c0 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 69 6d 70  utine should imp
112d0 6c 65 6d 65 6e 74 20 74 68 65 20 49 4e 20 6f 70  lement the IN op
112e0 65 72 61 74 6f 72 20 75 73 69 6e 67 20 61 20 73  erator using a s
112f0 65 71 75 65 6e 63 65 0a 2a 2a 20 6f 66 20 45 71  equence.** of Eq
11300 20 6f 72 20 4e 65 20 63 6f 6d 70 61 72 69 73 6f   or Ne compariso
11310 6e 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a  n operations..**
11320 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 62 2d 74  .** When the b-t
11330 72 65 65 20 69 73 20 62 65 69 6e 67 20 75 73 65  ree is being use
11340 64 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70  d for membership
11350 20 74 65 73 74 73 2c 20 74 68 65 20 63 61 6c 6c   tests, the call
11360 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ing function.** 
11370 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 6b 6e  might need to kn
11380 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ow whether or no
11390 74 20 74 68 65 20 52 48 53 20 73 69 64 65 20 6f  t the RHS side o
113a0 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
113b0 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20  r.** contains a 
113c0 4e 55 4c 4c 2e 20 20 49 66 20 70 72 52 68 73 48  NULL.  If prRhsH
113d0 61 73 4e 75 6c 6c 20 69 73 20 6e 6f 74 20 61 20  asNull is not a 
113e0 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61 6e 64  NULL pointer and
113f0 20 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73   .** if there is
11400 20 61 6e 79 20 63 68 61 6e 63 65 20 74 68 61 74   any chance that
11410 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68 74   the (...) might
11420 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20   contain a NULL 
11430 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74  value at.** runt
11440 69 6d 65 2c 20 74 68 65 6e 20 61 20 72 65 67 69  ime, then a regi
11450 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65  ster is allocate
11460 64 20 61 6e 64 20 74 68 65 20 72 65 67 69 73 74  d and the regist
11470 65 72 20 6e 75 6d 62 65 72 20 77 72 69 74 74 65  er number writte
11480 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52 68 73 48 61  n.** to *prRhsHa
11490 73 4e 75 6c 6c 2e 20 49 66 20 74 68 65 72 65 20  sNull. If there 
114a0 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61  is no chance tha
114b0 74 20 74 68 65 20 28 2e 2e 2e 29 20 63 6f 6e 74  t the (...) cont
114c0 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76  ains a.** NULL v
114d0 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72 52 68  alue, then *prRh
114e0 73 48 61 73 4e 75 6c 6c 20 69 73 20 6c 65 66 74  sHasNull is left
114f0 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a   unchanged..**.*
11500 2a 20 49 66 20 61 20 72 65 67 69 73 74 65 72 20  * If a register 
11510 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
11520 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20 73 74   its location st
11530 6f 72 65 64 20 69 6e 20 2a 70 72 52 68 73 48 61  ored in *prRhsHa
11540 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a 2a 2a 20 74  sNull, then.** t
11550 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 61 74  he value in that
11560 20 72 65 67 69 73 74 65 72 20 77 69 6c 6c 20 62   register will b
11570 65 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 62 2d  e NULL if the b-
11580 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  tree contains on
11590 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 4e 55 4c  e or more.** NUL
115a0 4c 20 76 61 6c 75 65 73 2c 20 61 6e 64 20 69 74  L values, and it
115b0 20 77 69 6c 6c 20 62 65 20 73 6f 6d 65 20 6e 6f   will be some no
115c0 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66 20  n-NULL value if 
115d0 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61  the b-tree conta
115e0 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55 4c 4c 20 76  ins no.** NULL v
115f0 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alues..**.** If 
11600 74 68 65 20 61 69 4d 61 70 20 70 61 72 61 6d 65  the aiMap parame
11610 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ter is not NULL,
11620 20 69 74 20 6d 75 73 74 20 70 6f 69 6e 74 20 74   it must point t
11630 6f 20 61 6e 20 61 72 72 61 79 20 63 6f 6e 74 61  o an array conta
11640 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65 6c 65  ining.** one ele
11650 6d 65 6e 74 20 66 6f 72 20 65 61 63 68 20 63 6f  ment for each co
11660 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64 20 62 79  lumn returned by
11670 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
11680 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 52 48 53  ement on the RHS
11690 0a 2a 2a 20 6f 66 20 74 68 65 20 49 4e 28 2e 2e  .** of the IN(..
116a0 2e 29 20 6f 70 65 72 61 74 6f 72 2e 20 54 68 65  .) operator. The
116b0 20 69 27 74 68 20 65 6e 74 72 79 20 6f 66 20 74   i'th entry of t
116c0 68 65 20 61 72 72 61 79 20 69 73 20 70 6f 70 75  he array is popu
116d0 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 2a  lated with the.*
116e0 2a 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20  * offset of the 
116f0 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68 61  index column tha
11700 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 69 27  t matches the i'
11710 74 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e  th column return
11720 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 53 45 4c  ed by the.** SEL
11730 45 43 54 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ECT. For example
11740 2c 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  , if the express
11750 69 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 65 64  ion and selected
11760 20 69 6e 64 65 78 20 61 72 65 3a 0a 2a 2a 0a 2a   index are:.**.*
11770 2a 20 20 20 28 3f 2c 3f 2c 3f 29 20 49 4e 20 28  *   (?,?,?) IN (
11780 53 45 4c 45 43 54 20 61 2c 20 62 2c 20 63 20 46  SELECT a, b, c F
11790 52 4f 4d 20 74 31 29 0a 2a 2a 20 20 20 43 52 45  ROM t1).**   CRE
117a0 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
117b0 74 31 28 62 2c 20 63 2c 20 61 29 3b 0a 2a 2a 0a  t1(b, c, a);.**.
117c0 2a 2a 20 74 68 65 6e 20 61 69 4d 61 70 5b 5d 20  ** then aiMap[] 
117d0 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
117e0 68 20 7b 32 2c 20 30 2c 20 31 7d 2e 0a 2a 2f 0a  h {2, 0, 1}..*/.
117f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11800 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74  MIT_SUBQUERY.int
11810 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
11820 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
11830 61 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70  arse, .  Expr *p
11840 58 2c 20 0a 20 20 75 33 32 20 69 6e 46 6c 61 67  X, .  u32 inFlag
11850 73 2c 20 0a 20 20 69 6e 74 20 2a 70 72 52 68 73  s, .  int *prRhs
11860 48 61 73 4e 75 6c 6c 2c 0a 20 20 69 6e 74 20 2a  HasNull,.  int *
11870 61 69 4d 61 70 0a 29 7b 0a 20 20 53 65 6c 65 63  aiMap.){.  Selec
11880 74 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  t *p;           
11890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118a0 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f 20 74 68   /* SELECT to th
118b0 65 20 72 69 67 68 74 20 6f 66 20 49 4e 20 6f 70  e right of IN op
118c0 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
118d0 65 54 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20  eType = 0;      
118e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118f0 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 52 48 53    /* Type of RHS
11900 20 74 61 62 6c 65 2e 20 49 4e 5f 49 4e 44 45 58   table. IN_INDEX
11910 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  _* */.  int iTab
11920 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
11930 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  +;            /*
11940 20 43 75 72 73 6f 72 20 6f 66 20 74 68 65 20 52   Cursor of the R
11950 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  HS table */.  in
11960 74 20 6d 75 73 74 42 65 55 6e 69 71 75 65 3b 20  t mustBeUnique; 
11970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11980 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 52      /* True if R
11990 48 53 20 6d 75 73 74 20 62 65 20 75 6e 69 71 75  HS must be uniqu
119a0 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  e */.  Vdbe *v =
119b0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
119c0 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20  pParse);     /* 
119d0 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  Virtual machine 
119e0 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 0a  being coded */..
119f0 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70    assert( pX->op
11a00 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 6d 75 73  ==TK_IN );.  mus
11a10 74 42 65 55 6e 69 71 75 65 20 3d 20 28 69 6e 46  tBeUnique = (inF
11a20 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f  lags & IN_INDEX_
11a30 4c 4f 4f 50 29 21 3d 30 3b 0a 0a 20 20 2f 2a 20  LOOP)!=0;..  /* 
11a40 49 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  If the RHS of th
11a50 69 73 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61  is IN(...) opera
11a60 74 6f 72 20 69 73 20 61 20 53 45 4c 45 43 54 2c  tor is a SELECT,
11a70 20 61 6e 64 20 69 66 20 69 74 20 6d 61 74 74 65   and if it matte
11a80 72 73 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72  rs .  ** whether
11a90 20 6f 72 20 6e 6f 74 20 74 68 65 20 53 45 4c 45   or not the SELE
11aa0 43 54 20 72 65 73 75 6c 74 20 63 6f 6e 74 61 69  CT result contai
11ab0 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20  ns NULL values, 
11ac0 63 68 65 63 6b 20 77 68 65 74 68 65 72 0a 20 20  check whether.  
11ad0 2a 2a 20 6f 72 20 6e 6f 74 20 4e 55 4c 4c 20 69  ** or not NULL i
11ae0 73 20 61 63 74 75 61 6c 6c 79 20 70 6f 73 73 69  s actually possi
11af0 62 6c 65 20 28 69 74 20 6d 61 79 20 6e 6f 74 20  ble (it may not 
11b00 62 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  be, for example,
11b10 20 64 75 65 20 0a 20 20 2a 2a 20 74 6f 20 4e 4f   due .  ** to NO
11b20 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e  T NULL constrain
11b30 74 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61  ts in the schema
11b40 29 2e 20 49 66 20 6e 6f 20 4e 55 4c 4c 20 76 61  ). If no NULL va
11b50 6c 75 65 73 20 61 72 65 20 70 6f 73 73 69 62 6c  lues are possibl
11b60 65 2c 0a 20 20 2a 2a 20 73 65 74 20 70 72 52 68  e,.  ** set prRh
11b70 73 48 61 73 4e 75 6c 6c 20 74 6f 20 30 20 62 65  sHasNull to 0 be
11b80 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e  fore continuing.
11b90 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 52 68 73    */.  if( prRhs
11ba0 48 61 73 4e 75 6c 6c 20 26 26 20 28 70 58 2d 3e  HasNull && (pX->
11bb0 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65  flags & EP_xIsSe
11bc0 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69 6e 74  lect) ){.    int
11bd0 20 69 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   i;.    ExprList
11be0 20 2a 70 45 4c 69 73 74 20 3d 20 70 58 2d 3e 78   *pEList = pX->x
11bf0 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
11c00 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
11c10 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
11c20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
11c30 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65  sqlite3ExprCanBe
11c40 4e 75 6c 6c 28 70 45 4c 69 73 74 2d 3e 61 5b 69  Null(pEList->a[i
11c50 5d 2e 70 45 78 70 72 29 20 29 20 62 72 65 61 6b  ].pExpr) ) break
11c60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11c70 69 3d 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  i==pEList->nExpr
11c80 20 29 7b 0a 20 20 20 20 20 20 70 72 52 68 73 48   ){.      prRhsH
11c90 61 73 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  asNull = 0;.    
11ca0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  }.  }..  /* Chec
11cb0 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 20 65  k to see if an e
11cc0 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72  xisting table or
11cd0 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73   index can be us
11ce0 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69 73  ed to.  ** satis
11cf0 66 79 20 74 68 65 20 71 75 65 72 79 2e 20 20 54  fy the query.  T
11d00 68 69 73 20 69 73 20 70 72 65 66 65 72 61 62 6c  his is preferabl
11d10 65 20 74 6f 20 67 65 6e 65 72 61 74 69 6e 67 20  e to generating 
11d20 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68 65  a new .  ** ephe
11d30 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 20 2a 2f  meral table.  */
11d40 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
11d50 45 72 72 3d 3d 30 20 26 26 20 28 70 20 3d 20 69  Err==0 && (p = i
11d60 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
11d70 70 74 28 70 58 29 29 21 3d 30 20 29 7b 0a 20 20  pt(pX))!=0 ){.  
11d80 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
11d90 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
11da0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
11db0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
11dc0 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  */.    Table *pT
11dd0 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
11de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11df0 20 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e 20   Table <table>. 
11e00 2a 2f 0a 20 20 20 20 69 31 36 20 69 44 62 3b 20  */.    i16 iDb; 
11e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11e30 20 44 61 74 61 62 61 73 65 20 69 64 78 20 66 6f   Database idx fo
11e40 72 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 45 78  r pTab */.    Ex
11e50 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
11e60 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20   p->pEList;.    
11e70 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 45 4c 69  int nExpr = pELi
11e80 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 20 20  st->nExpr;..    
11e90 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
11ea0 74 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  t!=0 );         
11eb0 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f      /* Because o
11ec0 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72  f isCandidateFor
11ed0 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20  InOpt(p) */.    
11ee0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
11ef0 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30  t->a[0].pExpr!=0
11f00 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 6f   ); /* Because o
11f10 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72  f isCandidateFor
11f20 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20  InOpt(p) */.    
11f30 61 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63 21  assert( p->pSrc!
11f40 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
11f50 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f      /* Because o
11f60 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72  f isCandidateFor
11f70 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20  InOpt(p) */.    
11f80 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  pTab = p->pSrc->
11f90 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 20 20  a[0].pTab;..    
11fa0 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54 72  /* Code an OP_Tr
11fb0 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 4f 50  ansaction and OP
11fc0 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c  _TableLock for <
11fd0 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69  table>. */.    i
11fe0 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
11ff0 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
12000 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
12010 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
12020 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
12030 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
12040 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
12050 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
12060 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
12070 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  Name);..    /* T
12080 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
12090 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d  only called from
120a0 20 74 77 6f 20 70 6c 61 63 65 73 2e 20 49 6e 20   two places. In 
120b0 62 6f 74 68 20 63 61 73 65 73 20 74 68 65 20 76  both cases the v
120c0 64 62 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 61  dbe.    ** has a
120d0 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
120e0 63 61 74 65 64 2e 20 53 6f 20 61 73 73 75 6d 65  cated. So assume
120f0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
12100 29 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20  ) is always.    
12110 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 68 65  ** successful he
12120 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  re..    */.    a
12130 73 73 65 72 74 28 76 29 3b 0a 20 20 20 20 69 66  ssert(v);.    if
12140 28 20 6e 45 78 70 72 3d 3d 31 20 26 26 20 70 45  ( nExpr==1 && pE
12150 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
12160 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
12170 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78 20 49       /* The "x I
12180 4e 20 28 53 45 4c 45 43 54 20 72 6f 77 69 64 20  N (SELECT rowid 
12190 46 52 4f 4d 20 74 61 62 6c 65 29 22 20 63 61 73  FROM table)" cas
121a0 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  e */.      int i
121b0 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f  Addr = sqlite3Co
121c0 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a  deOnce(pParse);.
121d0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
121e0 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 73 71  ge(v);..      sq
121f0 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
12200 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62  Parse, iTab, iDb
12210 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52  , pTab, OP_OpenR
12220 65 61 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70  ead);.      eTyp
12230 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  e = IN_INDEX_ROW
12240 49 44 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  ID;..      sqlit
12250 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
12260 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65  , iAddr);.    }e
12270 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  lse{.      Index
12280 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
12290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122a0 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
122b0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  able */.      in
122c0 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20  t affinity_ok = 
122d0 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  1;.      int i;.
122e0 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
122f0 74 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74  that the affinit
12300 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75  y that will be u
12310 73 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 65  sed to perform e
12320 61 63 68 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  ach .      ** co
12330 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20  mparison is the 
12340 73 61 6d 65 20 61 73 20 74 68 65 20 61 66 66 69  same as the affi
12350 6e 69 74 79 20 6f 66 20 65 61 63 68 20 63 6f 6c  nity of each col
12360 75 6d 6e 20 69 6e 20 74 61 62 6c 65 0a 20 20 20  umn in table.   
12370 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 52 48 53     ** on the RHS
12380 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
12390 74 6f 72 2e 20 20 49 66 20 69 74 20 6e 6f 74 2c  tor.  If it not,
123a0 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
123b0 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ble to.      ** 
123c0 75 73 65 20 61 6e 79 20 69 6e 64 65 78 20 6f 66  use any index of
123d0 20 74 68 65 20 52 48 53 20 74 61 62 6c 65 2e 20   the RHS table. 
123e0 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   */.      for(i=
123f0 30 3b 20 69 3c 6e 45 78 70 72 20 26 26 20 61 66  0; i<nExpr && af
12400 66 69 6e 69 74 79 5f 6f 6b 3b 20 69 2b 2b 29 7b  finity_ok; i++){
12410 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
12420 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 56 65 63  Lhs = sqlite3Vec
12430 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
12440 70 58 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20  pX->pLeft, i);. 
12450 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20         int iCol 
12460 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
12470 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
12480 20 20 20 20 20 20 20 63 68 61 72 20 69 64 78 61         char idxa
12490 66 66 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ff = pTab->aCol[
124a0 69 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 3b 20  iCol].affinity; 
124b0 20 2f 2a 20 52 48 53 20 74 61 62 6c 65 20 61 66   /* RHS table af
124c0 66 69 6e 69 74 79 20 2a 2f 0a 20 20 20 20 20 20  finity */.      
124d0 20 20 63 68 61 72 20 63 6d 70 61 66 66 20 3d 20    char cmpaff = 
124e0 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
124f0 66 69 6e 69 74 79 28 70 4c 68 73 2c 20 69 64 78  finity(pLhs, idx
12500 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 74 65  aff);.        te
12510 73 74 63 61 73 65 28 20 63 6d 70 61 66 66 3d 3d  stcase( cmpaff==
12520 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
12530 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
12540 61 73 65 28 20 63 6d 70 61 66 66 3d 3d 53 51 4c  ase( cmpaff==SQL
12550 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a  ITE_AFF_TEXT );.
12560 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20          switch( 
12570 63 6d 70 61 66 66 20 29 7b 0a 20 20 20 20 20 20  cmpaff ){.      
12580 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
12590 41 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20  AFF_BLOB:.      
125a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
125b0 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
125c0 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20  TE_AFF_TEXT:.   
125d0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
125e0 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
125f0 74 79 28 29 20 6f 6e 6c 79 20 72 65 74 75 72 6e  ty() only return
12600 73 20 54 45 58 54 20 69 66 20 6f 6e 65 20 73 69  s TEXT if one si
12610 64 65 20 6f 72 20 74 68 65 0a 20 20 20 20 20 20  de or the.      
12620 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 68        ** other h
12630 61 73 20 6e 6f 20 61 66 66 69 6e 69 74 79 20 61  as no affinity a
12640 6e 64 20 74 68 65 20 6f 74 68 65 72 20 73 69 64  nd the other sid
12650 65 20 69 73 20 54 45 58 54 2e 20 20 48 65 6e 63  e is TEXT.  Henc
12660 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  e,.            *
12670 2a 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 66  * the only way f
12680 6f 72 20 63 6d 70 61 66 66 20 74 6f 20 62 65 20  or cmpaff to be 
12690 54 45 58 54 20 69 73 20 66 6f 72 20 69 64 78 61  TEXT is for idxa
126a0 66 66 20 74 6f 20 62 65 20 54 45 58 54 0a 20 20  ff to be TEXT.  
126b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64            ** and
126c0 20 66 6f 72 20 74 68 65 20 74 65 72 6d 20 6f 6e   for the term on
126d0 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   the LHS of the 
126e0 49 4e 20 74 6f 20 68 61 76 65 20 6e 6f 20 61 66  IN to have no af
126f0 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 20  finity. */.     
12700 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
12710 64 78 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  dxaff==SQLITE_AF
12720 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 20 20  F_TEXT );.      
12730 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12740 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a         default:.
12750 20 20 20 20 20 20 20 20 20 20 20 20 61 66 66 69              affi
12760 6e 69 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65  nity_ok = sqlite
12770 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
12780 74 79 28 69 64 78 61 66 66 29 3b 0a 20 20 20 20  ty(idxaff);.    
12790 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
127a0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c       /* The coll
127b0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75  ation sequence u
127c0 73 65 64 20 62 79 20 74 68 65 20 63 6f 6d 70 61  sed by the compa
127d0 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20 69 6e 64  rison. If an ind
127e0 65 78 20 69 73 20 74 6f 0a 20 20 20 20 20 20 2a  ex is to.      *
127f0 2a 20 62 65 20 75 73 65 64 20 69 6e 20 70 6c 61  * be used in pla
12800 63 65 20 6f 66 20 61 20 74 65 6d 70 2d 74 61 62  ce of a temp-tab
12810 6c 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20 6f  le, it must be o
12820 72 64 65 72 65 64 20 61 63 63 6f 72 64 69 6e 67  rdered according
12830 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 69  .      ** to thi
12840 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  s collation sequ
12850 65 6e 63 65 2e 20 20 2a 2f 0a 0a 20 20 20 20 20  ence.  */..     
12860 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
12870 70 49 6e 64 65 78 3b 20 70 49 64 78 20 26 26 20  pIndex; pIdx && 
12880 65 54 79 70 65 3d 3d 30 20 26 26 20 61 66 66 69  eType==0 && affi
12890 6e 69 74 79 5f 6f 6b 3b 20 70 49 64 78 3d 70 49  nity_ok; pIdx=pI
128a0 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
128b0 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b      if( pIdx->nK
128c0 65 79 43 6f 6c 3c 6e 45 78 70 72 20 29 20 63 6f  eyCol<nExpr ) co
128d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
128e0 69 66 28 20 6d 75 73 74 42 65 55 6e 69 71 75 65  if( mustBeUnique
128f0 20 26 26 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43   && (pIdx->nKeyC
12900 6f 6c 21 3d 6e 45 78 70 72 20 7c 7c 20 21 49 73  ol!=nExpr || !Is
12910 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78  UniqueIndex(pIdx
12920 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  )) ){.          
12930 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
12940 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 66 6f 72    }..        for
12950 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
12960 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  ++){.          E
12970 78 70 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69  xpr *pLhs = sqli
12980 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
12990 62 65 78 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c  bexpr(pX->pLeft,
129a0 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 45   i);.          E
129b0 78 70 72 20 2a 70 52 68 73 20 3d 20 70 45 4c 69  xpr *pRhs = pELi
129c0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
129d0 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65            CollSe
129e0 71 20 2a 70 52 65 71 20 3d 20 73 71 6c 69 74 65  q *pReq = sqlite
129f0 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
12a00 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
12a10 68 73 2c 20 70 52 68 73 29 3b 0a 20 20 20 20 20  hs, pRhs);.     
12a20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 20       int j;..   
12a30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
12a40 52 65 71 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  Req || pParse->n
12a50 45 72 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Err );.         
12a60 20 69 66 28 20 70 52 65 71 3d 3d 30 20 29 20 62   if( pReq==0 ) b
12a70 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 20  reak;..         
12a80 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 78 70   for(j=0; j<nExp
12a90 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; j++){.       
12aa0 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
12ab0 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70 52 68 73  iColumn[j]!=pRhs
12ac0 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74  ->iColumn ) cont
12ad0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
12ae0 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
12af0 61 7a 43 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20 20 20  azColl[j] );.   
12b00 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
12b10 69 74 65 33 53 74 72 49 43 6d 70 28 70 52 65 71  ite3StrICmp(pReq
12b20 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61  ->zName, pIdx->a
12b30 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63  zColl[j])!=0 ) c
12b40 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
12b50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
12b60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12b70 20 20 69 66 28 20 6a 3d 3d 6e 45 78 70 72 20 29    if( j==nExpr )
12b80 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
12b90 20 20 69 66 28 20 61 69 4d 61 70 20 29 20 61 69    if( aiMap ) ai
12ba0 4d 61 70 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20  Map[i] = j;.    
12bb0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
12bc0 66 28 20 69 3d 3d 6e 45 78 70 72 20 29 7b 0a 20  f( i==nExpr ){. 
12bd0 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64           int iAd
12be0 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  dr = sqlite3Code
12bf0 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56 64  Once(pParse); Vd
12c00 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
12c10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
12c20 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
12c30 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54 61 62 2c  _OpenRead, iTab,
12c40 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62   pIdx->tnum, iDb
12c50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
12c60 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
12c70 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  Info(pParse, pId
12c80 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64  x);.          Vd
12c90 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
12ca0 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  s", pIdx->zName)
12cb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
12cc0 65 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  ert( IN_INDEX_IN
12cd0 44 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e 5f 49  DEX_DESC == IN_I
12ce0 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 2b 31  NDEX_INDEX_ASC+1
12cf0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 54   );.          eT
12d00 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49  ype = IN_INDEX_I
12d10 4e 44 45 58 5f 41 53 43 20 2b 20 70 49 64 78 2d  NDEX_ASC + pIdx-
12d20 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 3b 0a  >aSortOrder[0];.
12d30 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
12d40 72 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 20  rRhsHasNull ){. 
12d50 20 20 20 20 20 20 20 20 20 20 20 2a 70 72 52 68             *prRh
12d60 73 48 61 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61  sHasNull = ++pPa
12d70 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 23 69 66 64 65  rse->nMem;.#ifde
12d80 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
12d90 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b  COLUMN_USED_MASK
12da0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 36 34  .            i64
12db0 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 6e 45 78 70   mask = (1<<nExp
12dc0 72 29 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  r)-1;.          
12dd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12de0 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f  Op4Dup8(v, OP_Co
12df0 6c 75 6d 6e 73 55 73 65 64 2c 20 0a 20 20 20 20  lumnsUsed, .    
12e00 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62              iTab
12e10 2c 20 30 2c 20 30 2c 20 28 75 38 2a 29 26 6d 61  , 0, 0, (u8*)&ma
12e20 73 6b 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23  sk, P4_INT64);.#
12e30 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
12e40 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 29    if( nExpr==1 )
12e50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
12e60 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c  sqlite3SetHasNul
12e70 6c 46 6c 61 67 28 76 2c 20 69 54 61 62 2c 20 2a  lFlag(v, iTab, *
12e80 70 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20  prRhsHasNull);. 
12e90 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
12ea0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12eb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
12ec0 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29  mpHere(v, iAddr)
12ed0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12ee0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
12ef0 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65 65 78 69   /* If no preexi
12f00 73 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 61  sting index is a
12f10 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65  vailable for the
12f20 20 49 4e 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20   IN clause.  ** 
12f30 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  and IN_INDEX_NOO
12f40 50 20 69 73 20 61 6e 20 61 6c 6c 6f 77 65 64 20  P is an allowed 
12f50 72 65 70 6c 79 0a 20 20 2a 2a 20 61 6e 64 20 74  reply.  ** and t
12f60 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
12f70 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c   operator is a l
12f80 69 73 74 2c 20 6e 6f 74 20 61 20 73 75 62 71 75  ist, not a subqu
12f90 65 72 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ery.  ** and the
12fa0 20 52 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 73   RHS is not cons
12fb0 74 61 6e 74 20 6f 72 20 68 61 73 20 74 77 6f 20  tant or has two 
12fc0 6f 72 20 66 65 77 65 72 20 74 65 72 6d 73 2c 0a  or fewer terms,.
12fd0 20 20 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20    ** then it is 
12fe0 6e 6f 74 20 77 6f 72 74 68 20 63 72 65 61 74 69  not worth creati
12ff0 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  ng an ephemeral 
13000 74 61 62 6c 65 20 74 6f 20 65 76 61 6c 75 61 74  table to evaluat
13010 65 0a 20 20 2a 2a 20 74 68 65 20 49 4e 20 6f 70  e.  ** the IN op
13020 65 72 61 74 6f 72 20 73 6f 20 72 65 74 75 72 6e  erator so return
13030 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a   IN_INDEX_NOOP..
13040 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
13050 3d 3d 30 0a 20 20 20 26 26 20 28 69 6e 46 6c 61  ==0.   && (inFla
13060 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  gs & IN_INDEX_NO
13070 4f 50 5f 4f 4b 29 0a 20 20 20 26 26 20 21 45 78  OP_OK).   && !Ex
13080 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
13090 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 0a  , EP_xIsSelect).
130a0 20 20 20 26 26 20 28 21 73 71 6c 69 74 65 33 49     && (!sqlite3I
130b0 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 70  nRhsIsConstant(p
130c0 58 29 20 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69 73  X) || pX->x.pLis
130d0 74 2d 3e 6e 45 78 70 72 3c 3d 32 29 0a 20 20 29  t->nExpr<=2).  )
130e0 7b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e  {.    eType = IN
130f0 5f 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d  _INDEX_NOOP;.  }
13100 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30  ..  if( eType==0
13110 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64   ){.    /* Could
13120 20 6e 6f 74 20 66 69 6e 64 20 61 6e 20 65 78 69   not find an exi
13130 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69  sting table or i
13140 6e 64 65 78 20 74 6f 20 75 73 65 20 61 73 20 74  ndex to use as t
13150 68 65 20 52 48 53 20 62 2d 74 72 65 65 2e 0a 20  he RHS b-tree.. 
13160 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61     ** We will ha
13170 76 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ve to generate a
13180 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
13190 65 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e  e to do the job.
131a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 33 32 20  .    */.    u32 
131b0 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20  savedNQueryLoop 
131c0 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79  = pParse->nQuery
131d0 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 72 4d  Loop;.    int rM
131e0 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a  ayHaveNull = 0;.
131f0 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
13200 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20 20 69 66  NDEX_EPH;.    if
13210 28 20 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49  ( inFlags & IN_I
13220 4e 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20  NDEX_LOOP ){.   
13230 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
13240 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20  yLoop = 0;.     
13250 20 69 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e   if( pX->pLeft->
13260 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78  iColumn<0 && !Ex
13270 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
13280 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
13290 29 7b 0a 20 20 20 20 20 20 20 20 65 54 79 70 65  ){.        eType
132a0 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49   = IN_INDEX_ROWI
132b0 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  D;.      }.    }
132c0 65 6c 73 65 20 69 66 28 20 70 72 52 68 73 48 61  else if( prRhsHa
132d0 73 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2a  sNull ){.      *
132e0 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 72  prRhsHasNull = r
132f0 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b  MayHaveNull = ++
13300 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
13310 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43    }.    sqlite3C
13320 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
13330 72 73 65 2c 20 70 58 2c 20 72 4d 61 79 48 61 76  rse, pX, rMayHav
13340 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e  eNull, eType==IN
13350 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20  _INDEX_ROWID);. 
13360 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
13370 79 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e 51 75  yLoop = savedNQu
13380 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65  eryLoop;.  }else
13390 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61 62 6c 65  {.    pX->iTable
133a0 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 0a 20 20   = iTab;.  }..  
133b0 69 66 28 20 61 69 4d 61 70 20 26 26 20 65 54 79  if( aiMap && eTy
133c0 70 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  pe!=IN_INDEX_IND
133d0 45 58 5f 41 53 43 20 26 26 20 65 54 79 70 65 21  EX_ASC && eType!
133e0 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f  =IN_INDEX_INDEX_
133f0 44 45 53 43 20 29 7b 0a 20 20 20 20 69 6e 74 20  DESC ){.    int 
13400 69 2c 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 73 71  i, n;.    n = sq
13410 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
13420 69 7a 65 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a  ize(pX->pLeft);.
13430 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
13440 3b 20 69 2b 2b 29 20 61 69 4d 61 70 5b 69 5d 20  ; i++) aiMap[i] 
13450 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = i;.  }.  retur
13460 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69  n eType;.}.#endi
13470 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
13480 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
13490 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  /*.** Argument p
134a0 45 78 70 72 20 69 73 20 61 6e 20 28 3f 2c 20 3f  Expr is an (?, ?
134b0 2e 2e 2e 29 20 49 4e 28 2e 2e 2e 29 20 65 78 70  ...) IN(...) exp
134c0 72 65 73 73 69 6f 6e 2e 20 54 68 69 73 20 0a 2a  ression. This .*
134d0 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  * function alloc
134e0 61 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73  ates and returns
134f0 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
13500 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  d string contain
13510 69 6e 67 20 0a 2a 2a 20 74 68 65 20 61 66 66 69  ing .** the affi
13520 6e 69 74 69 65 73 20 74 6f 20 62 65 20 75 73 65  nities to be use
13530 64 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  d for each colum
13540 6e 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  n of the compari
13550 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  son..**.** It is
13560 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
13570 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
13580 72 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  r to ensure that
13590 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a   the returned.**
135a0 20 73 74 72 69 6e 67 20 69 73 20 65 76 65 6e 74   string is event
135b0 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e  ually freed usin
135c0 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  g sqlite3DbFree(
135d0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  )..*/.static cha
135e0 72 20 2a 65 78 70 72 49 4e 41 66 66 69 6e 69 74  r *exprINAffinit
135f0 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
13600 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
13610 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
13620 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69  Expr->pLeft;.  i
13630 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65  nt nVal = sqlite
13640 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
13650 70 4c 65 66 74 29 3b 0a 20 20 53 65 6c 65 63 74  pLeft);.  Select
13660 20 2a 70 53 65 6c 65 63 74 20 3d 20 28 70 45 78   *pSelect = (pEx
13670 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78  pr->flags & EP_x
13680 49 73 53 65 6c 65 63 74 29 20 3f 20 70 45 78 70  IsSelect) ? pExp
13690 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3a 20 30  r->x.pSelect : 0
136a0 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a  ;.  char *zRet;.
136b0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
136c0 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op==TK_IN );. 
136d0 20 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44   zRet = sqlite3D
136e0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
136f0 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2b 31 29 3b  se->db, nVal+1);
13700 0a 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0a 20  .  if( zRet ){. 
13710 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
13720 72 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69  r(i=0; i<nVal; i
13730 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
13740 2a 70 41 20 3d 20 73 71 6c 69 74 65 33 56 65 63  *pA = sqlite3Vec
13750 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
13760 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20  pLeft, i);.     
13770 20 63 68 61 72 20 61 20 3d 20 73 71 6c 69 74 65   char a = sqlite
13780 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 41  3ExprAffinity(pA
13790 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  );.      if( pSe
137a0 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
137b0 7a 52 65 74 5b 69 5d 20 3d 20 73 71 6c 69 74 65  zRet[i] = sqlite
137c0 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
137d0 28 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  (pSelect->pEList
137e0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 61 29  ->a[i].pExpr, a)
137f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13800 20 20 20 20 20 20 20 7a 52 65 74 5b 69 5d 20 3d         zRet[i] =
13810 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   a;.      }.    
13820 7d 0a 20 20 20 20 7a 52 65 74 5b 6e 56 61 6c 5d  }.    zRet[nVal]
13830 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 72   = '\0';.  }.  r
13840 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65  eturn zRet;.}.#e
13850 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
13860 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
13870 52 59 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68  RY./*.** Load th
13880 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 70  e Parse object p
13890 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
138a0 73 74 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68  st argument with
138b0 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65   an error .** me
138c0 73 73 61 67 65 20 6f 66 20 74 68 65 20 66 6f 72  ssage of the for
138d0 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d  m:.**.**   "sub-
138e0 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20 4e  select returns N
138f0 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63   columns - expec
13900 74 65 64 20 4d 22 0a 2a 2f 20 20 20 0a 76 6f 69  ted M".*/   .voi
13910 64 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65  d sqlite3Subsele
13920 63 74 45 72 72 6f 72 28 50 61 72 73 65 20 2a 70  ctError(Parse *p
13930 50 61 72 73 65 2c 20 69 6e 74 20 6e 41 63 74 75  Parse, int nActu
13940 61 6c 2c 20 69 6e 74 20 6e 45 78 70 65 63 74 29  al, int nExpect)
13950 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
13960 7a 46 6d 74 20 3d 20 22 73 75 62 2d 73 65 6c 65  zFmt = "sub-sele
13970 63 74 20 72 65 74 75 72 6e 73 20 25 64 20 63 6f  ct returns %d co
13980 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64  lumns - expected
13990 20 25 64 22 3b 0a 20 20 73 71 6c 69 74 65 33 45   %d";.  sqlite3E
139a0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
139b0 7a 46 6d 74 2c 20 6e 41 63 74 75 61 6c 2c 20 6e  zFmt, nActual, n
139c0 45 78 70 65 63 74 29 3b 0a 7d 0a 23 65 6e 64 69  Expect);.}.#endi
139d0 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  f../*.** Generat
139e0 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61  e code for scala
139f0 72 20 73 75 62 71 75 65 72 69 65 73 20 75 73 65  r subqueries use
13a00 64 20 61 73 20 61 20 73 75 62 71 75 65 72 79 20  d as a subquery 
13a10 65 78 70 72 65 73 73 69 6f 6e 2c 20 45 58 49 53  expression, EXIS
13a20 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70 65  TS,.** or IN ope
13a30 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65  rators.  Example
13a40 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45  s:.**.**     (SE
13a50 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
13a60 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75          -- subqu
13a70 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54  ery.**     EXIST
13a80 53 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  S (SELECT a FROM
13a90 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20   b)   -- EXISTS 
13aa0 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20  subquery.**     
13ab0 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20  x IN (4,5,11)   
13ac0 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e             -- IN
13ad0 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c   operator with l
13ae0 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e  ist on right-han
13af0 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20  d side.**     x 
13b00 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f  IN (SELECT a FRO
13b10 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f  M b)     -- IN o
13b20 70 65 72 61 74 6f 72 20 77 69 74 68 20 73 75 62  perator with sub
13b30 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67  query on the rig
13b40 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78  ht.**.** The pEx
13b50 70 72 20 70 61 72 61 6d 65 74 65 72 20 64 65 73  pr parameter des
13b60 63 72 69 62 65 73 20 74 68 65 20 65 78 70 72 65  cribes the expre
13b70 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61  ssion that conta
13b80 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70  ins the IN.** op
13b90 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71 75 65  erator or subque
13ba0 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ry..**.** If par
13bb0 61 6d 65 74 65 72 20 69 73 52 6f 77 69 64 20 69  ameter isRowid i
13bc0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
13bd0 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
13be0 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a  r is guaranteed.
13bf0 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74 68 65 20  ** to be of the 
13c00 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e  form "<rowid> IN
13c10 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65   (?, ?, ?)", whe
13c20 72 65 20 3c 72 6f 77 69 64 3e 20 69 73 20 61 20  re <rowid> is a 
13c30 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20  reference.** to 
13c40 73 6f 6d 65 20 69 6e 74 65 67 65 72 20 6b 65 79  some integer key
13c50 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62   column of a tab
13c60 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e 20 74 68  le B-Tree. In th
13c70 69 73 20 63 61 73 65 2c 20 75 73 65 20 61 6e 0a  is case, use an.
13c80 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65  ** intkey B-Tree
13c90 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65   to store the se
13ca0 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c  t of IN(...) val
13cb0 75 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20 74  ues instead of t
13cc0 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f  he usual.** (slo
13cd0 77 65 72 29 20 76 61 72 69 61 62 6c 65 20 6c 65  wer) variable le
13ce0 6e 67 74 68 20 6b 65 79 73 20 42 2d 54 72 65 65  ngth keys B-Tree
13cf0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48  ..**.** If rMayH
13d00 61 76 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a  aveNull is non-z
13d10 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ero, that means 
13d20 74 68 61 74 20 74 68 65 20 6f 70 65 72 61 74 69  that the operati
13d30 6f 6e 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28  on is an IN.** (
13d40 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 6f 72 20  not a SELECT or 
13d50 45 58 49 53 54 53 29 20 61 6e 64 20 74 68 61 74  EXISTS) and that
13d60 20 74 68 65 20 52 48 53 20 6d 69 67 68 74 20 63   the RHS might c
13d70 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a  ontains NULLs..*
13d80 2a 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69  * All this routi
13d90 6e 65 20 64 6f 65 73 20 69 73 20 69 6e 69 74 69  ne does is initi
13da0 61 6c 69 7a 65 20 74 68 65 20 72 65 67 69 73 74  alize the regist
13db0 65 72 20 67 69 76 65 6e 20 62 79 20 72 4d 61 79  er given by rMay
13dc0 48 61 76 65 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 4e  HaveNull.** to N
13dd0 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67 20 72 6f  ULL.  Calling ro
13de0 75 74 69 6e 65 73 20 77 69 6c 6c 20 74 61 6b 65  utines will take
13df0 20 63 61 72 65 20 6f 66 20 63 68 61 6e 67 69 6e   care of changin
13e00 67 20 74 68 69 73 20 72 65 67 69 73 74 65 72 0a  g this register.
13e10 2a 2a 20 76 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d  ** value to non-
13e20 4e 55 4c 4c 20 69 66 20 74 68 65 20 52 48 53 20  NULL if the RHS 
13e30 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a  is NULL-free..**
13e40 0a 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54  .** For a SELECT
13e50 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61   or EXISTS opera
13e60 74 6f 72 2c 20 72 65 74 75 72 6e 20 74 68 65 20  tor, return the 
13e70 72 65 67 69 73 74 65 72 20 74 68 61 74 20 68 6f  register that ho
13e80 6c 64 73 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  lds the.** resul
13e90 74 2e 20 20 46 6f 72 20 61 20 6d 75 6c 74 69 2d  t.  For a multi-
13ea0 63 6f 6c 75 6d 6e 20 53 45 4c 45 43 54 2c 20 74  column SELECT, t
13eb0 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f  he result is sto
13ec0 72 65 64 20 69 6e 20 61 20 63 6f 6e 74 69 67 75  red in a contigu
13ed0 6f 75 73 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20  ous.** array of 
13ee0 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68  registers and th
13ef0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
13f00 73 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6f  s the register o
13f10 66 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a  f the left-most.
13f20 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  ** result column
13f30 2e 20 20 52 65 74 75 72 6e 20 30 20 66 6f 72 20  .  Return 0 for 
13f40 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f 72 20  IN operators or 
13f50 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
13f60 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  rs..*/.#ifndef S
13f70 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
13f80 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  ERY.int sqlite3C
13f90 6f 64 65 53 75 62 73 65 6c 65 63 74 28 0a 20 20  odeSubselect(.  
13fa0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
13fb0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
13fc0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
13fd0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
13fe0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49          /* The I
13ff0 4e 2c 20 53 45 4c 45 43 54 2c 20 6f 72 20 45 58  N, SELECT, or EX
14000 49 53 54 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f  ISTS operator */
14010 0a 20 20 69 6e 74 20 72 48 61 73 4e 75 6c 6c 46  .  int rHasNullF
14020 6c 61 67 2c 20 20 20 20 20 20 20 2f 2a 20 52 65  lag,       /* Re
14030 67 69 73 74 65 72 20 74 68 61 74 20 72 65 63 6f  gister that reco
14040 72 64 73 20 77 68 65 74 68 65 72 20 4e 55 4c 4c  rds whether NULL
14050 73 20 65 78 69 73 74 20 69 6e 20 52 48 53 20 2a  s exist in RHS *
14060 2f 0a 20 20 69 6e 74 20 69 73 52 6f 77 69 64 20  /.  int isRowid 
14070 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
14080 66 20 74 72 75 65 2c 20 4c 48 53 20 6f 66 20 49  f true, LHS of I
14090 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20  N operator is a 
140a0 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  rowid */.){.  in
140b0 74 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d  t jmpIfDynamic =
140c0 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   -1;            
140d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
140e0 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64 72 65  -time test addre
140f0 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67  ss */.  int rReg
14100 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
14110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14120 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74 6f 72  /* Register stor
14130 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f  ing resulting */
14140 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
14150 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
14160 73 65 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  se);.  if( NEVER
14170 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20  (v==0) ) return 
14180 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  0;.  sqlite3Expr
14190 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
141a0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 65 76 61  );..  /* The eva
141b0 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49  luation of the I
141c0 4e 2f 45 58 49 53 54 53 2f 53 45 4c 45 43 54 20  N/EXISTS/SELECT 
141d0 6d 75 73 74 20 62 65 20 72 65 70 65 61 74 65 64  must be repeated
141e0 20 65 76 65 72 79 20 74 69 6d 65 20 69 74 0a 20   every time it. 
141f0 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   ** is encounter
14200 65 64 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  ed if any of the
14210 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72   following is tr
14220 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ue:.  **.  **   
14230 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61   *  The right-ha
14240 6e 64 20 73 69 64 65 20 69 73 20 61 20 63 6f 72  nd side is a cor
14250 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79  related subquery
14260 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  .  **    *  The 
14270 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
14280 69 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  is an expression
14290 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67   list containing
142a0 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20   variables.  ** 
142b0 20 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73     *  We are ins
142c0 69 64 65 20 61 20 74 72 69 67 67 65 72 0a 20 20  ide a trigger.  
142d0 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f  **.  ** If all o
142e0 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20  f the above are 
142f0 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63  false, then we c
14300 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65  an run this code
14310 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20   just once.  ** 
14320 73 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 73  save the results
14330 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68 65 20  , and reuse the 
14340 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73  same result on s
14350 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61  ubsequent invoca
14360 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
14370 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
14380 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72  ty(pExpr, EP_Var
14390 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6a  Select) ){.    j
143a0 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 73 71  mpIfDynamic = sq
143b0 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50  lite3CodeOnce(pP
143c0 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72  arse); VdbeCover
143d0 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 23 69 66  age(v);.  }..#if
143e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
143f0 5f 45 58 50 4c 41 49 4e 0a 20 20 69 66 28 20 70  _EXPLAIN.  if( p
14400 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
14410 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  2 ){.    char *z
14420 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
14430 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c  intf(pParse->db,
14440 20 22 45 58 45 43 55 54 45 20 25 73 25 73 20 53   "EXECUTE %s%s S
14450 55 42 51 55 45 52 59 20 25 64 22 2c 0a 20 20 20  UBQUERY %d",.   
14460 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69       jmpIfDynami
14470 63 3e 3d 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41  c>=0?"":"CORRELA
14480 54 45 44 20 22 2c 0a 20 20 20 20 20 20 20 20 70  TED ",.        p
14490 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f  Expr->op==TK_IN?
144a0 22 4c 49 53 54 22 3a 22 53 43 41 4c 41 52 22 2c  "LIST":"SCALAR",
144b0 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
144c0 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 0a 20  >iNextSelectId. 
144d0 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
144e0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
144f0 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73  P_Explain, pPars
14500 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c  e->iSelectId, 0,
14510 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e   0, zMsg, P4_DYN
14520 41 4d 49 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  AMIC);.  }.#endi
14530 66 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  f..  switch( pEx
14540 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
14550 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
14560 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20    int addr;     
14570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14580 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f   Address of OP_O
14590 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
145a0 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  truction */.    
145b0 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
145c0 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a  pExpr->pLeft; /*
145d0 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   the LHS of the 
145e0 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
145f0 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
14600 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20  eyInfo = 0;     
14610 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74   /* Key informat
14620 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ion */.      int
14630 20 6e 56 61 6c 3b 20 20 20 20 20 20 20 20 20 20   nVal;          
14640 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
14650 20 6f 66 20 76 65 63 74 6f 72 20 70 4c 65 66 74   of vector pLeft
14660 20 2a 2f 0a 20 20 20 20 20 20 0a 20 20 20 20 20   */.      .     
14670 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 45   nVal = sqlite3E
14680 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c  xprVectorSize(pL
14690 65 66 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  eft);.      asse
146a0 72 74 28 20 21 69 73 52 6f 77 69 64 20 7c 7c 20  rt( !isRowid || 
146b0 6e 56 61 6c 3d 3d 31 20 29 3b 0a 0a 20 20 20 20  nVal==1 );..    
146c0 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69    /* Whether thi
146d0 73 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45  s is an 'x IN(SE
146e0 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20  LECT...)' or an 
146f0 27 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e  'x IN(<exprlist>
14700 29 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72  )'.      ** expr
14710 65 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e  ession it is han
14720 64 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77 61  dled the same wa
14730 79 2e 20 20 41 6e 20 65 70 68 65 6d 65 72 61 6c  y.  An ephemeral
14740 20 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20   table is .     
14750 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20   ** filled with 
14760 69 6e 64 65 78 20 6b 65 79 73 20 72 65 70 72 65  index keys repre
14770 73 65 6e 74 69 6e 67 20 74 68 65 20 72 65 73 75  senting the resu
14780 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  lts from the .  
14790 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 6f 72      ** SELECT or
147a0 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e   the <exprlist>.
147b0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
147c0 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20 65 78  ** If the 'x' ex
147d0 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
147e0 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74  lumn value, or t
147f0 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20  he SELECT....   
14800 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
14810 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e  returns a column
14820 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65   value, then the
14830 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61   affinity of tha
14840 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  t.      ** colum
14850 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62 75 69  n is used to bui
14860 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79  ld the index key
14870 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27 20 61  s. If both 'x' a
14880 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  nd the.      ** 
14890 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d  SELECT... statem
148a0 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c  ent are columns,
148b0 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66   then numeric af
148c0 66 69 6e 69 74 79 20 69 73 20 75 73 65 64 0a 20  finity is used. 
148d0 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74 68 65       ** if eithe
148e0 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d  r column has NUM
148f0 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45 52 20  ERIC or INTEGER 
14900 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e 65 69  affinity. If nei
14910 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 27 78  ther.      ** 'x
14920 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43 54  ' nor the SELECT
14930 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72  ... statement ar
14940 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  e columns, then 
14950 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
14960 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73 65  .      ** is use
14970 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
14980 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
14990 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
149a0 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
149b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
149c0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
149d0 65 72 61 6c 2c 20 0a 20 20 20 20 20 20 20 20 20  eral, .         
149e0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
149f0 28 69 73 52 6f 77 69 64 3f 30 3a 6e 56 61 6c 29  (isRowid?0:nVal)
14a00 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66  );.      pKeyInf
14a10 6f 20 3d 20 69 73 52 6f 77 69 64 20 3f 20 30 20  o = isRowid ? 0 
14a20 3a 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  : sqlite3KeyInfo
14a30 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
14a40 2c 20 6e 56 61 6c 2c 20 31 29 3b 0a 0a 20 20 20  , nVal, 1);..   
14a50 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
14a60 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
14a70 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
14a80 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31         /* Case 1
14a90 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53  :     expr IN (S
14aa0 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20  ELECT ...).     
14ab0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
14ac0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
14ad0 6f 20 77 72 69 74 65 20 74 68 65 20 72 65 73 75  o write the resu
14ae0 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  lts of the selec
14af0 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f  t into the tempo
14b00 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  rary.        ** 
14b10 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20  table allocated 
14b20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f 76 65  and opened above
14b30 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
14b40 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
14b50 6c 65 63 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  lect = pExpr->x.
14b60 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20  pSelect;.       
14b70 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
14b80 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  t = pSelect->pEL
14b90 69 73 74 3b 0a 0a 20 20 20 20 20 20 20 20 61 73  ist;..        as
14ba0 73 65 72 74 28 20 21 69 73 52 6f 77 69 64 20 29  sert( !isRowid )
14bb0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  ;.        if( pE
14bc0 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 6e 56 61  List->nExpr!=nVa
14bd0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  l ){.          s
14be0 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45  qlite3SubselectE
14bf0 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 45 4c  rror(pParse, pEL
14c00 69 73 74 2d 3e 6e 45 78 70 72 2c 20 6e 56 61 6c  ist->nExpr, nVal
14c10 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
14c20 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65  {.          Sele
14c30 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20  ctDest dest;.   
14c40 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
14c50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
14c60 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
14c70 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45  est, SRT_Set, pE
14c80 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  xpr->iTable);.  
14c90 20 20 20 20 20 20 20 20 64 65 73 74 2e 7a 41 66          dest.zAf
14ca0 66 53 64 73 74 20 3d 20 65 78 70 72 49 4e 41 66  fSdst = exprINAf
14cb0 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 70  finity(pParse, p
14cc0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
14cd0 20 61 73 73 65 72 74 28 20 28 70 45 78 70 72 2d   assert( (pExpr-
14ce0 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30 46 46  >iTable&0x0000FF
14cf0 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  FF)==pExpr->iTab
14d00 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  le );.          
14d10 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20  pSelect->iLimit 
14d20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 74  = 0;.          t
14d30 65 73 74 63 61 73 65 28 20 70 53 65 6c 65 63 74  estcase( pSelect
14d40 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
14d50 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
14d60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14d70 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f  pKeyInfo==0 ); /
14d80 2a 20 43 61 75 73 65 64 20 62 79 20 4f 4f 4d 20  * Caused by OOM 
14d90 69 6e 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  in sqlite3KeyInf
14da0 6f 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20  oAlloc() */.    
14db0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
14dc0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
14dd0 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 20  pSelect, &dest) 
14de0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
14df0 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
14e00 72 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41  rse->db, dest.zA
14e10 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20  ffSdst);.       
14e20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49       sqlite3KeyI
14e30 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66  nfoUnref(pKeyInf
14e40 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  o);.            
14e50 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
14e60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
14e70 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
14e80 61 72 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a  arse->db, dest.z
14e90 41 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20  AffSdst);.      
14ea0 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79      assert( pKey
14eb0 49 6e 66 6f 21 3d 30 20 29 3b 20 2f 2a 20 4f 4f  Info!=0 ); /* OO
14ec0 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 65 78 69  M will cause exi
14ed0 74 20 61 66 74 65 72 20 73 71 6c 69 74 65 33 53  t after sqlite3S
14ee0 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20 20 20 20  elect() */.     
14ef0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c       assert( pEL
14f00 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist!=0 );.      
14f10 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
14f20 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
14f30 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
14f40 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
14f50 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49  sWriteable(pKeyI
14f60 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20  nfo) );.        
14f70 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61    for(i=0; i<nVa
14f80 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
14f90 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 28       Expr *p = (
14fa0 6e 56 61 6c 3e 31 29 20 3f 20 73 71 6c 69 74 65  nVal>1) ? sqlite
14fb0 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65  3VectorFieldSube
14fc0 78 70 72 28 70 4c 65 66 74 2c 20 69 29 20 3a 20  xpr(pLeft, i) : 
14fd0 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20  pLeft;.         
14fe0 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f     pKeyInfo->aCo
14ff0 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 42  ll[i] = sqlite3B
15000 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
15010 53 65 71 28 0a 20 20 20 20 20 20 20 20 20 20 20  Seq(.           
15020 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 2c 20       pParse, p, 
15030 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
15040 70 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  pr.            )
15050 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
15060 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
15070 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70  lse if( ALWAYS(p
15080 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30  Expr->x.pList!=0
15090 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
150a0 43 61 73 65 20 32 3a 20 20 20 20 20 65 78 70 72  Case 2:     expr
150b0 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20   IN (exprlist). 
150c0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
150d0 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78    ** For each ex
150e0 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20  pression, build 
150f0 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f  an index key fro
15100 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e  m the evaluation
15110 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
15120 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20  store it in the 
15130 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
15140 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20   If <expr> is a 
15150 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65  column, then use
15160 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
15170 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74   columns affinit
15180 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20  y when building 
15190 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c  index keys. If <
151a0 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20  expr> is not.   
151b0 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e       ** a column
151c0 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66  , use numeric af
151d0 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20  finity..        
151e0 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  */.        char 
151f0 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20 20  affinity;       
15200 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
15210 20 6f 66 20 74 68 65 20 4c 48 53 20 6f 66 20 74   of the LHS of t
15220 68 65 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20  he IN */.       
15230 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
15240 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
15250 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
15260 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  ;.        struct
15270 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
15280 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 69  pItem;.        i
15290 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 0a  nt r1, r2, r3;..
152a0 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79          affinity
152b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
152c0 66 69 6e 69 74 79 28 70 4c 65 66 74 29 3b 0a 20  finity(pLeft);. 
152d0 20 20 20 20 20 20 20 69 66 28 20 21 61 66 66 69         if( !affi
152e0 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20  nity ){.        
152f0 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c    affinity = SQL
15300 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20  ITE_AFF_BLOB;.  
15310 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15320 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  if( pKeyInfo ){.
15330 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
15340 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  ( sqlite3KeyInfo
15350 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79  IsWriteable(pKey
15360 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20  Info) );.       
15370 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f     pKeyInfo->aCo
15380 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 45  ll[0] = sqlite3E
15390 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
153a0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
153b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
153c0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72       /* Loop thr
153d0 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73  ough each expres
153e0 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73  sion in <exprlis
153f0 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  t>. */.        r
15400 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
15410 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
15420 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69         r2 = sqli
15430 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
15440 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69  arse);.        i
15450 66 28 20 69 73 52 6f 77 69 64 20 29 20 73 71 6c  f( isRowid ) sql
15460 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15470 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32  , OP_Null, 0, r2
15480 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
15490 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  =pList->nExpr, p
154a0 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
154b0 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
154c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
154d0 72 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e  r *pE2 = pItem->
154e0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
154f0 20 69 6e 74 20 69 56 61 6c 54 6f 49 6e 73 3b 0a   int iValToIns;.
15500 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
15510 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
15520 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20  is not constant 
15530 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65  then we will nee
15540 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a  d to.          *
15550 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65  * disable the te
15560 73 74 20 74 68 61 74 20 77 61 73 20 67 65 6e 65  st that was gene
15570 72 61 74 65 64 20 61 62 6f 76 65 20 74 68 61 74  rated above that
15580 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20   makes sure.    
15590 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f        ** this co
155a0 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73  de only executes
155b0 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20   once.  Because 
155c0 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61  for a non-consta
155d0 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nt.          ** 
155e0 65 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65  expression we ne
155f0 65 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73  ed to rerun this
15600 20 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e   code each time.
15610 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
15620 20 20 20 20 20 20 20 20 69 66 28 20 6a 6d 70 49          if( jmpI
15630 66 44 79 6e 61 6d 69 63 3e 3d 30 20 26 26 20 21  fDynamic>=0 && !
15640 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
15650 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20  stant(pE2) ){.  
15660 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15670 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
15680 70 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69  p(v, jmpIfDynami
15690 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  c);.            
156a0 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d  jmpIfDynamic = -
156b0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  1;.          }..
156c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61            /* Eva
156d0 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65 73  luate the expres
156e0 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20  sion and insert 
156f0 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70  it into the temp
15700 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
15710 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20      if( isRowid 
15720 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
15730 49 6e 74 65 67 65 72 28 70 45 32 2c 20 26 69 56  Integer(pE2, &iV
15740 61 6c 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20  alToIns) ){.    
15750 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15760 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
15770 49 6e 73 65 72 74 49 6e 74 2c 20 70 45 78 70 72  InsertInt, pExpr
15780 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 69 56  ->iTable, r2, iV
15790 61 6c 54 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20  alToIns);.      
157a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
157b0 20 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69         r3 = sqli
157c0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
157d0 74 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20 72  t(pParse, pE2, r
157e0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
157f0 69 66 28 20 69 73 52 6f 77 69 64 20 29 7b 0a 20  if( isRowid ){. 
15800 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
15810 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15820 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
15830 72 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r3,.            
15840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15850 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
15860 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29  urrentAddr(v)+2)
15870 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
15880 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
15890 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
158a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
158b0 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70  (v, OP_Insert, p
158c0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32  Expr->iTable, r2
158d0 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20 20  , r3);.         
158e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
158f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15900 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
15910 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20  MakeRecord, r3, 
15920 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79  1, r2, &affinity
15930 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
15940 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
15950 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
15960 67 65 28 70 50 61 72 73 65 2c 20 72 33 2c 20 31  ge(pParse, r3, 1
15970 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
15980 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15990 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
159a0 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  rt, pExpr->iTabl
159b0 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20  e, r2);.        
159c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
159d0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
159e0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
159f0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
15a00 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , r1);.        s
15a10 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
15a20 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29  pReg(pParse, r2)
15a30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15a40 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  if( pKeyInfo ){.
15a50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15a60 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61  dbeChangeP4(v, a
15a70 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65  ddr, (void *)pKe
15a80 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
15a90 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  O);.      }.    
15aa0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
15ab0 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53      case TK_EXIS
15ac0 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  TS:.    case TK_
15ad0 53 45 4c 45 43 54 3a 0a 20 20 20 20 64 65 66 61  SELECT:.    defa
15ae0 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ult: {.      /* 
15af0 43 61 73 65 20 33 3a 20 20 20 20 28 53 45 4c 45  Case 3:    (SELE
15b00 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29  CT ... FROM ...)
15b10 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 6f 72  .      **     or
15b20 3a 20 20 20 20 45 58 49 53 54 53 28 53 45 4c 45  :    EXISTS(SELE
15b30 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29  CT ... FROM ...)
15b40 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
15b50 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54 2c  ** For a SELECT,
15b60 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   generate code t
15b70 6f 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 73  o put the values
15b80 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73   for all columns
15b90 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   of.      ** the
15ba0 20 66 69 72 73 74 20 72 6f 77 20 69 6e 74 6f 20   first row into 
15bb0 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69  an array of regi
15bc0 73 74 65 72 73 20 61 6e 64 20 72 65 74 75 72 6e  sters and return
15bd0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 20 20   the index of.  
15be0 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74      ** the first
15bf0 20 72 65 67 69 73 74 65 72 2e 0a 20 20 20 20 20   register..     
15c00 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
15c10 74 68 69 73 20 69 73 20 61 6e 20 45 58 49 53 54  this is an EXIST
15c20 53 2c 20 77 72 69 74 65 20 61 6e 20 69 6e 74 65  S, write an inte
15c30 67 65 72 20 30 20 28 6e 6f 74 20 65 78 69 73 74  ger 0 (not exist
15c40 73 29 20 6f 72 20 31 20 28 65 78 69 73 74 73 29  s) or 1 (exists)
15c50 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61  .      ** into a
15c60 20 72 65 67 69 73 74 65 72 20 61 6e 64 20 72 65   register and re
15c70 74 75 72 6e 20 74 68 61 74 20 72 65 67 69 73 74  turn that regist
15c80 65 72 20 6e 75 6d 62 65 72 2e 0a 20 20 20 20 20  er number..     
15c90 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20   **.      ** In 
15ca0 62 6f 74 68 20 63 61 73 65 73 2c 20 74 68 65 20  both cases, the 
15cb0 71 75 65 72 79 20 69 73 20 61 75 67 6d 65 6e 74  query is augment
15cc0 65 64 20 77 69 74 68 20 22 4c 49 4d 49 54 20 31  ed with "LIMIT 1
15cd0 22 2e 20 20 41 6e 79 20 0a 20 20 20 20 20 20 2a  ".  Any .      *
15ce0 2a 20 70 72 65 65 78 69 73 74 69 6e 67 20 6c 69  * preexisting li
15cf0 6d 69 74 20 69 73 20 64 69 73 63 61 72 64 65 64  mit is discarded
15d00 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65   in place of the
15d10 20 6e 65 77 20 4c 49 4d 49 54 20 31 2e 0a 20 20   new LIMIT 1..  
15d20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c      */.      Sel
15d30 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 20  ect *pSel;      
15d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d50 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61     /* SELECT sta
15d60 74 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65  tement to encode
15d70 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74   */.      Select
15d80 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20  Dest dest;      
15d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15da0 2f 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c 20 77  /* How to deal w
15db0 69 74 68 20 53 45 4c 45 43 54 20 72 65 73 75 6c  ith SELECT resul
15dc0 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  t */.      int n
15dd0 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Reg;            
15de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15df0 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 74 6f   /* Registers to
15e00 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20 20   allocate */..  
15e10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
15e20 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53  xpr->op==TK_EXIS
15e30 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  TS );.      test
15e40 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
15e50 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20  =TK_SELECT );.  
15e60 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
15e70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  r->op==TK_EXISTS
15e80 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
15e90 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20  K_SELECT );.    
15ea0 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61    assert( ExprHa
15eb0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
15ec0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
15ed0 3b 0a 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20  ;..      pSel = 
15ee0 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
15ef0 3b 0a 20 20 20 20 20 20 6e 52 65 67 20 3d 20 70  ;.      nReg = p
15f00 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
15f10 45 43 54 20 3f 20 70 53 65 6c 2d 3e 70 45 4c 69  ECT ? pSel->pELi
15f20 73 74 2d 3e 6e 45 78 70 72 20 3a 20 31 3b 0a 20  st->nExpr : 1;. 
15f30 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
15f40 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
15f50 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65  , 0, pParse->nMe
15f60 6d 2b 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72  m+1);.      pPar
15f70 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67  se->nMem += nReg
15f80 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
15f90 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
15fa0 20 29 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74   ){.        dest
15fb0 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d  .eDest = SRT_Mem
15fc0 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 69  ;.        dest.i
15fd0 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53 44 50  Sdst = dest.iSDP
15fe0 61 72 6d 3b 0a 20 20 20 20 20 20 20 20 64 65 73  arm;.        des
15ff0 74 2e 6e 53 64 73 74 20 3d 20 6e 52 65 67 3b 0a  t.nSdst = nReg;.
16000 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16010 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
16020 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 53  Null, 0, dest.iS
16030 44 50 61 72 6d 2c 20 64 65 73 74 2e 69 53 44 50  DParm, dest.iSDP
16040 61 72 6d 2b 6e 52 65 67 2d 31 29 3b 0a 20 20 20  arm+nReg-1);.   
16050 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
16060 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62 71 75  ((v, "Init subqu
16070 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20  ery result"));. 
16080 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16090 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d      dest.eDest =
160a0 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20   SRT_Exists;.   
160b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
160c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
160d0 65 67 65 72 2c 20 30 2c 20 64 65 73 74 2e 69 53  eger, 0, dest.iS
160e0 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  DParm);.        
160f0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
16100 22 49 6e 69 74 20 45 58 49 53 54 53 20 72 65 73  "Init EXISTS res
16110 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a  ult"));.      }.
16120 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
16130 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
16140 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74  db, pSel->pLimit
16150 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 70  );.      pSel->p
16160 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50  Limit = sqlite3P
16170 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
16180 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c 0a 20  INTEGER, 0, 0,. 
16190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161b0 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65   &sqlite3IntToke
161c0 6e 73 5b 31 5d 29 3b 0a 20 20 20 20 20 20 70 53  ns[1]);.      pS
161d0 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  el->iLimit = 0;.
161e0 20 20 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46        pSel->selF
161f0 6c 61 67 73 20 26 3d 20 7e 53 46 5f 4d 75 6c 74  lags &= ~SF_Mult
16200 69 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 69 66  iValue;.      if
16210 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  ( sqlite3Select(
16220 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 26 64  pParse, pSel, &d
16230 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  est) ){.        
16240 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
16250 7d 0a 20 20 20 20 20 20 72 52 65 67 20 3d 20 64  }.      rReg = d
16260 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20  est.iSDParm;.   
16270 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f     ExprSetVVAPro
16280 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
16290 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20  NoReduce);.     
162a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
162b0 7d 0a 0a 20 20 69 66 28 20 72 48 61 73 4e 75 6c  }..  if( rHasNul
162c0 6c 46 6c 61 67 20 29 7b 0a 20 20 20 20 73 71 6c  lFlag ){.    sql
162d0 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c  ite3SetHasNullFl
162e0 61 67 28 76 2c 20 70 45 78 70 72 2d 3e 69 54 61  ag(v, pExpr->iTa
162f0 62 6c 65 2c 20 72 48 61 73 4e 75 6c 6c 46 6c 61  ble, rHasNullFla
16300 67 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6a  g);.  }..  if( j
16310 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20 29  mpIfDynamic>=0 )
16320 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
16330 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70  eJumpHere(v, jmp
16340 49 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20 7d 0a  IfDynamic);.  }.
16350 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
16360 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 0a  hePop(pParse);..
16370 20 20 72 65 74 75 72 6e 20 72 52 65 67 3b 0a 7d    return rReg;.}
16380 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
16390 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
163a0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
163b0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
163c0 0a 2f 2a 0a 2a 2a 20 45 78 70 72 20 70 49 6e 20  ./*.** Expr pIn 
163d0 69 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 65 78  is an IN(...) ex
163e0 70 72 65 73 73 69 6f 6e 2e 20 54 68 69 73 20 66  pression. This f
163f0 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 74  unction checks t
16400 68 61 74 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d  hat the .** sub-
16410 73 65 6c 65 63 74 20 6f 6e 20 74 68 65 20 52 48  select on the RH
16420 53 20 6f 66 20 74 68 65 20 49 4e 28 29 20 6f 70  S of the IN() op
16430 65 72 61 74 6f 72 20 68 61 73 20 74 68 65 20 73  erator has the s
16440 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a  ame number of .*
16450 2a 20 63 6f 6c 75 6d 6e 73 20 61 73 20 74 68 65  * columns as the
16460 20 76 65 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c   vector on the L
16470 48 53 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 52  HS. Or, if the R
16480 48 53 20 6f 66 20 74 68 65 20 49 4e 28 29 20 69  HS of the IN() i
16490 73 20 6e 6f 74 20 0a 2a 2a 20 61 20 73 75 62 2d  s not .** a sub-
164a0 71 75 65 72 79 2c 20 74 68 61 74 20 74 68 65 20  query, that the 
164b0 4c 48 53 20 69 73 20 61 20 76 65 63 74 6f 72 20  LHS is a vector 
164c0 6f 66 20 73 69 7a 65 20 31 2e 0a 2a 2f 0a 69 6e  of size 1..*/.in
164d0 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65  t sqlite3ExprChe
164e0 63 6b 49 4e 28 50 61 72 73 65 20 2a 70 50 61 72  ckIN(Parse *pPar
164f0 73 65 2c 20 45 78 70 72 20 2a 70 49 6e 29 7b 0a  se, Expr *pIn){.
16500 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 20 3d 20    int nVector = 
16510 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
16520 72 53 69 7a 65 28 70 49 6e 2d 3e 70 4c 65 66 74  rSize(pIn->pLeft
16530 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 2d 3e 66  );.  if( (pIn->f
16540 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c  lags & EP_xIsSel
16550 65 63 74 29 20 29 7b 0a 20 20 20 20 69 66 28 20  ect) ){.    if( 
16560 6e 56 65 63 74 6f 72 21 3d 70 49 6e 2d 3e 78 2e  nVector!=pIn->x.
16570 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
16580 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
16590 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74  sqlite3Subselect
165a0 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 49  Error(pParse, pI
165b0 6e 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  n->x.pSelect->pE
165c0 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 6e 56 65  List->nExpr, nVe
165d0 63 74 6f 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ctor);.      ret
165e0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
165f0 65 6c 73 65 20 69 66 28 20 6e 56 65 63 74 6f 72  else if( nVector
16600 21 3d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 28  !=1 ){.    if( (
16610 70 49 6e 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  pIn->pLeft->flag
16620 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
16630 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
16640 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72  e3SubselectError
16650 28 70 50 61 72 73 65 2c 20 6e 56 65 63 74 6f 72  (pParse, nVector
16660 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 1);.    }else{
16670 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
16680 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
16690 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65  row value misuse
166a0 64 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  d");.    }.    r
166b0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
166c0 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
166d0 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
166e0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
166f0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
16700 6f 64 65 20 66 6f 72 20 61 6e 20 49 4e 20 65 78  ode for an IN ex
16710 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
16720 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43       x IN (SELEC
16730 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20 20 20 78  T ...).**      x
16740 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75   IN (value, valu
16750 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  e, ...).**.** Th
16760 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65  e left-hand side
16770 20 28 4c 48 53 29 20 69 73 20 61 20 73 63 61 6c   (LHS) is a scal
16780 61 72 20 6f 72 20 76 65 63 74 6f 72 20 65 78 70  ar or vector exp
16790 72 65 73 73 69 6f 6e 2e 20 20 54 68 65 20 0a 2a  ression.  The .*
167a0 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  * right-hand sid
167b0 65 20 28 52 48 53 29 20 69 73 20 61 6e 20 61 72  e (RHS) is an ar
167c0 72 61 79 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d  ray of zero or m
167d0 6f 72 65 20 73 63 61 6c 61 72 20 76 61 6c 75 65  ore scalar value
167e0 73 2c 20 6f 72 20 61 0a 2a 2a 20 73 75 62 71 75  s, or a.** subqu
167f0 65 72 79 2e 20 20 49 66 20 74 68 65 20 52 48 53  ery.  If the RHS
16800 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2c 20   is a subquery, 
16810 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
16820 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 75 73  sult columns mus
16830 74 0a 2a 2a 20 6d 61 74 63 68 20 74 68 65 20 6e  t.** match the n
16840 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
16850 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72 20 6f   in the vector o
16860 6e 20 74 68 65 20 4c 48 53 2e 20 20 49 66 20 74  n the LHS.  If t
16870 68 65 20 52 48 53 20 69 73 0a 2a 2a 20 61 20 6c  he RHS is.** a l
16880 69 73 74 20 6f 66 20 76 61 6c 75 65 73 2c 20 74  ist of values, t
16890 68 65 20 4c 48 53 20 6d 75 73 74 20 62 65 20 61  he LHS must be a
168a0 20 73 63 61 6c 61 72 2e 20 0a 2a 2a 0a 2a 2a 20   scalar. .**.** 
168b0 54 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  The IN operator 
168c0 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 4c  is true if the L
168d0 48 53 20 76 61 6c 75 65 20 69 73 20 63 6f 6e 74  HS value is cont
168e0 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65  ained within the
168f0 20 52 48 53 2e 0a 2a 2a 20 54 68 65 20 72 65 73   RHS..** The res
16900 75 6c 74 20 69 73 20 66 61 6c 73 65 20 69 66 20  ult is false if 
16910 74 68 65 20 4c 48 53 20 69 73 20 64 65 66 69 6e  the LHS is defin
16920 69 74 65 6c 79 20 6e 6f 74 20 69 6e 20 74 68 65  itely not in the
16930 20 52 48 53 2e 20 20 54 68 65 20 0a 2a 2a 20 72   RHS.  The .** r
16940 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 20 69 66  esult is NULL if
16950 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66   the presence of
16960 20 74 68 65 20 4c 48 53 20 69 6e 20 74 68 65 20   the LHS in the 
16970 52 48 53 20 63 61 6e 6e 6f 74 20 62 65 20 0a 2a  RHS cannot be .*
16980 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 64 75 65  * determined due
16990 20 74 6f 20 4e 55 4c 4c 73 2e 0a 2a 2a 0a 2a 2a   to NULLs..**.**
169a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
169b0 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 68 61  nerates code tha
169c0 74 20 6a 75 6d 70 73 20 74 6f 20 64 65 73 74 49  t jumps to destI
169d0 66 46 61 6c 73 65 20 69 66 20 74 68 65 20 4c 48  fFalse if the LH
169e0 53 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e  S is not .** con
169f0 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68  tained within th
16a00 65 20 52 48 53 2e 20 20 49 66 20 64 75 65 20 74  e RHS.  If due t
16a10 6f 20 4e 55 4c 4c 73 20 77 65 20 63 61 6e 6e 6f  o NULLs we canno
16a20 74 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  t determine if t
16a30 68 65 20 4c 48 53 0a 2a 2a 20 69 73 20 63 6f 6e  he LHS.** is con
16a40 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48  tained in the RH
16a50 53 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 64  S then jump to d
16a60 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74  estIfNull.  If t
16a70 68 65 20 4c 48 53 20 69 73 20 63 6f 6e 74 61 69  he LHS is contai
16a80 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  ned.** within th
16a90 65 20 52 48 53 20 74 68 65 6e 20 66 61 6c 6c 20  e RHS then fall 
16aa0 74 68 72 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 53  through..**.** S
16ab0 65 65 20 74 68 65 20 73 65 70 61 72 61 74 65 20  ee the separate 
16ac0 69 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d 64 20 64  in-operator.md d
16ad0 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 69 6c  ocumentation fil
16ae0 65 20 69 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63  e in the canonic
16af0 61 6c 0a 2a 2a 20 53 51 4c 69 74 65 20 73 6f 75  al.** SQLite sou
16b00 72 63 65 20 74 72 65 65 20 66 6f 72 20 61 64 64  rce tree for add
16b10 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
16b20 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
16b30 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
16b40 6f 64 65 49 4e 28 0a 20 20 50 61 72 73 65 20 2a  odeIN(.  Parse *
16b50 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
16b60 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
16b70 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
16b80 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
16b90 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
16ba0 20 2f 2a 20 54 68 65 20 49 4e 20 65 78 70 72 65   /* The IN expre
16bb0 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64  ssion */.  int d
16bc0 65 73 74 49 66 46 61 6c 73 65 2c 20 20 20 20 20  estIfFalse,     
16bd0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
16be0 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74   LHS is not cont
16bf0 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53  ained in the RHS
16c00 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66   */.  int destIf
16c10 4e 75 6c 6c 20 20 20 20 20 20 20 20 2f 2a 20 4a  Null        /* J
16c20 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20  ump here if the 
16c30 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e 6b 6e  results are unkn
16c40 6f 77 6e 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73  own due to NULLs
16c50 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 52 68   */.){.  int rRh
16c60 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 20 20 2f  sHasNull = 0;  /
16c70 2a 20 52 65 67 69 73 74 65 72 20 74 68 61 74 20  * Register that 
16c80 69 73 20 74 72 75 65 20 69 66 20 52 48 53 20 63  is true if RHS c
16c90 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c  ontains NULL val
16ca0 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79  ues */.  int eTy
16cb0 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pe;            /
16cc0 2a 20 54 79 70 65 20 6f 66 20 74 68 65 20 52 48  * Type of the RH
16cd0 53 20 2a 2f 0a 20 20 69 6e 74 20 72 4c 68 73 3b  S */.  int rLhs;
16ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16cf0 52 65 67 69 73 74 65 72 28 73 29 20 68 6f 6c 64  Register(s) hold
16d00 69 6e 67 20 74 68 65 20 4c 48 53 20 76 61 6c 75  ing the LHS valu
16d10 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 4c 68 73  es */.  int rLhs
16d20 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 2f 2a  Orig;         /*
16d30 20 4c 48 53 20 76 61 6c 75 65 73 20 70 72 69 6f   LHS values prio
16d40 72 20 74 6f 20 72 65 6f 72 64 65 72 69 6e 67 20  r to reordering 
16d50 62 79 20 61 69 4d 61 70 5b 5d 20 2a 2f 0a 20 20  by aiMap[] */.  
16d60 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
16d70 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65        /* Stateme
16d80 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  nt under constru
16d90 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a  ction */.  int *
16da0 61 69 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20  aiMap = 0;      
16db0 20 2f 2a 20 4d 61 70 20 66 72 6f 6d 20 76 65 63   /* Map from vec
16dc0 74 6f 72 20 66 69 65 6c 64 20 74 6f 20 69 6e 64  tor field to ind
16dd0 65 78 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63  ex column */.  c
16de0 68 61 72 20 2a 7a 41 66 66 20 3d 20 30 3b 20 20  har *zAff = 0;  
16df0 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
16e00 20 73 74 72 69 6e 67 20 66 6f 72 20 63 6f 6d 70   string for comp
16e10 61 72 69 73 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  arisons */.  int
16e20 20 6e 56 65 63 74 6f 72 3b 20 20 20 20 20 20 20   nVector;       
16e30 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 76 65     /* Size of ve
16e40 63 74 6f 72 73 20 66 6f 72 20 74 68 69 73 20 49  ctors for this I
16e50 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
16e60 69 6e 74 20 69 44 75 6d 6d 79 3b 20 20 20 20 20  int iDummy;     
16e70 20 20 20 20 20 20 2f 2a 20 44 75 6d 6d 79 20 70        /* Dummy p
16e80 61 72 61 6d 65 74 65 72 20 74 6f 20 65 78 70 72  arameter to expr
16e90 43 6f 64 65 56 65 63 74 6f 72 28 29 20 2a 2f 0a  CodeVector() */.
16ea0 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 20 20    Expr *pLeft;  
16eb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c          /* The L
16ec0 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
16ed0 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  rator */.  int i
16ee0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16ef0 20 2f 2a 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* loop counter
16f00 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 53 74   */.  int destSt
16f10 65 70 32 3b 20 20 20 20 20 20 20 20 2f 2a 20 57  ep2;        /* W
16f20 68 65 72 65 20 74 6f 20 6a 75 6d 70 20 77 68 65  here to jump whe
16f30 6e 20 4e 55 4c 4c 73 20 73 65 65 6e 20 69 6e 20  n NULLs seen in 
16f40 73 74 65 70 20 32 20 2a 2f 0a 20 20 69 6e 74 20  step 2 */.  int 
16f50 64 65 73 74 53 74 65 70 36 20 3d 20 30 3b 20 20  destStep6 = 0;  
16f60 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 63 6f    /* Start of co
16f70 64 65 20 66 6f 72 20 53 74 65 70 20 36 20 2a 2f  de for Step 6 */
16f80 0a 20 20 69 6e 74 20 61 64 64 72 54 72 75 74 68  .  int addrTruth
16f90 4f 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72  Op;      /* Addr
16fa0 65 73 73 20 6f 66 20 6f 70 63 6f 64 65 20 74 68  ess of opcode th
16fb0 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68  at determines th
16fc0 65 20 49 4e 20 69 73 20 74 72 75 65 20 2a 2f 0a  e IN is true */.
16fd0 20 20 69 6e 74 20 64 65 73 74 4e 6f 74 4e 75 6c    int destNotNul
16fe0 6c 3b 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  l;      /* Jump 
16ff0 68 65 72 65 20 69 66 20 61 20 63 6f 6d 70 61 72  here if a compar
17000 69 73 6f 6e 20 69 73 20 6e 6f 74 20 74 72 75 65  ison is not true
17010 20 69 6e 20 73 74 65 70 20 36 20 2a 2f 0a 20 20   in step 6 */.  
17020 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20  int addrTop;    
17030 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
17040 74 68 65 20 73 74 65 70 2d 36 20 6c 6f 6f 70 20  the step-6 loop 
17050 2a 2f 20 0a 0a 20 20 70 4c 65 66 74 20 3d 20 70  */ ..  pLeft = p
17060 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69  Expr->pLeft;.  i
17070 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 68  f( sqlite3ExprCh
17080 65 63 6b 49 4e 28 70 50 61 72 73 65 2c 20 70 45  eckIN(pParse, pE
17090 78 70 72 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  xpr) ) return;. 
170a0 20 7a 41 66 66 20 3d 20 65 78 70 72 49 4e 41 66   zAff = exprINAf
170b0 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 70  finity(pParse, p
170c0 45 78 70 72 29 3b 0a 20 20 6e 56 65 63 74 6f 72  Expr);.  nVector
170d0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
170e0 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d 3e  ctorSize(pExpr->
170f0 70 4c 65 66 74 29 3b 0a 20 20 61 69 4d 61 70 20  pLeft);.  aiMap 
17100 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 44  = (int*)sqlite3D
17110 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20  bMallocZero(.   
17120 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e     pParse->db, n
17130 56 65 63 74 6f 72 2a 28 73 69 7a 65 6f 66 28 69  Vector*(sizeof(i
17140 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28 63 68 61  nt) + sizeof(cha
17150 72 29 29 20 2b 20 31 0a 20 20 29 3b 0a 20 20 69  r)) + 1.  );.  i
17160 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
17170 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
17180 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  to sqlite3ExprCo
17190 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3b 0a  deIN_oom_error;.
171a0 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f  .  /* Attempt to
171b0 20 63 6f 6d 70 75 74 65 20 74 68 65 20 52 48 53   compute the RHS
171c0 2e 20 41 66 74 65 72 20 74 68 69 73 20 73 74 65  . After this ste
171d0 70 2c 20 69 66 20 61 6e 79 74 68 69 6e 67 20 6f  p, if anything o
171e0 74 68 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 49  ther than.  ** I
171f0 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20  N_INDEX_NOOP is 
17200 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 74 61  returned, the ta
17210 62 6c 65 20 6f 70 65 6e 65 64 20 69 74 68 20 63  ble opened ith c
17220 75 72 73 6f 72 20 70 45 78 70 72 2d 3e 69 54 61  ursor pExpr->iTa
17230 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 6e 74 61 69  ble .  ** contai
17240 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20 74 68  ns the values th
17250 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 52  at make up the R
17260 48 53 2e 20 49 66 20 49 4e 5f 49 4e 44 45 58 5f  HS. If IN_INDEX_
17270 4e 4f 4f 50 20 69 73 20 72 65 74 75 72 6e 65 64  NOOP is returned
17280 2c 0a 20 20 2a 2a 20 74 68 65 20 52 48 53 20 68  ,.  ** the RHS h
17290 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  as not yet been 
172a0 63 6f 64 65 64 2e 20 20 2a 2f 0a 20 20 76 20 3d  coded.  */.  v =
172b0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
172c0 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
172d0 3b 20 20 20 20 20 20 20 2f 2a 20 4f 4f 4d 20 64  ;       /* OOM d
172e0 65 74 65 63 74 65 64 20 70 72 69 6f 72 20 74 6f  etected prior to
172f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f   this routine */
17300 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
17310 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 49 4e  nt((v, "begin IN
17320 20 65 78 70 72 22 29 29 3b 0a 20 20 65 54 79 70   expr"));.  eTyp
17330 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  e = sqlite3FindI
17340 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  nIndex(pParse, p
17350 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
17360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17370 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42     IN_INDEX_MEMB
17380 45 52 53 48 49 50 20 7c 20 49 4e 5f 49 4e 44 45  ERSHIP | IN_INDE
17390 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a 20 20 20 20 20  X_NOOP_OK,.     
173a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173b0 20 20 20 20 20 20 20 20 64 65 73 74 49 66 46 61          destIfFa
173c0 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20  lse==destIfNull 
173d0 3f 20 30 20 3a 20 26 72 52 68 73 48 61 73 4e 75  ? 0 : &rRhsHasNu
173e0 6c 6c 2c 20 61 69 4d 61 70 29 3b 0a 0a 20 20 61  ll, aiMap);..  a
173f0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
17400 45 72 72 20 7c 7c 20 6e 56 65 63 74 6f 72 3d 3d  Err || nVector==
17410 31 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49  1 || eType==IN_I
17420 4e 44 45 58 5f 45 50 48 0a 20 20 20 20 20 20 20  NDEX_EPH.       
17430 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  || eType==IN_IND
17440 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 7c 7c 20  EX_INDEX_ASC || 
17450 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
17460 49 4e 44 45 58 5f 44 45 53 43 20 0a 20 20 29 3b  INDEX_DESC .  );
17470 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
17480 45 42 55 47 0a 20 20 2f 2a 20 43 6f 6e 66 69 72  EBUG.  /* Confir
17490 6d 20 74 68 61 74 20 61 69 4d 61 70 5b 5d 20 63  m that aiMap[] c
174a0 6f 6e 74 61 69 6e 73 20 6e 56 65 63 74 6f 72 20  ontains nVector 
174b0 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 62  integer values b
174c0 65 74 77 65 65 6e 20 30 20 61 6e 64 0a 20 20 2a  etween 0 and.  *
174d0 2a 20 6e 56 65 63 74 6f 72 2d 31 2e 20 2a 2f 0a  * nVector-1. */.
174e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65    for(i=0; i<nVe
174f0 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ctor; i++){.    
17500 69 6e 74 20 6a 2c 20 63 6e 74 3b 0a 20 20 20 20  int j, cnt;.    
17510 66 6f 72 28 63 6e 74 3d 6a 3d 30 3b 20 6a 3c 6e  for(cnt=j=0; j<n
17520 56 65 63 74 6f 72 3b 20 6a 2b 2b 29 20 69 66 28  Vector; j++) if(
17530 20 61 69 4d 61 70 5b 6a 5d 3d 3d 69 20 29 20 63   aiMap[j]==i ) c
17540 6e 74 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  nt++;.    assert
17550 28 20 63 6e 74 3d 3d 31 20 29 3b 0a 20 20 7d 0a  ( cnt==1 );.  }.
17560 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 64  #endif..  /* Cod
17570 65 20 74 68 65 20 4c 48 53 2c 20 74 68 65 20 3c  e the LHS, the <
17580 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70  expr> from "<exp
17590 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 49 66  r> IN (...)". If
175a0 20 74 68 65 20 4c 48 53 20 69 73 20 61 20 0a 20   the LHS is a . 
175b0 20 2a 2a 20 76 65 63 74 6f 72 2c 20 74 68 65 6e   ** vector, then
175c0 20 69 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e   it is stored in
175d0 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6e 56 65   an array of nVe
175e0 63 74 6f 72 20 72 65 67 69 73 74 65 72 73 20 73  ctor registers s
175f0 74 61 72 74 69 6e 67 20 0a 20 20 2a 2a 20 61 74  tarting .  ** at
17600 20 72 31 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 73   r1..  **.  ** s
17610 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65  qlite3FindInInde
17620 78 28 29 20 6d 69 67 68 74 20 68 61 76 65 20 72  x() might have r
17630 65 6f 72 64 65 72 65 64 20 74 68 65 20 66 69 65  eordered the fie
17640 6c 64 73 20 6f 66 20 74 68 65 20 4c 48 53 20 76  lds of the LHS v
17650 65 63 74 6f 72 0a 20 20 2a 2a 20 73 6f 20 74 68  ector.  ** so th
17660 61 74 20 74 68 65 20 66 69 65 6c 64 73 20 61 72  at the fields ar
17670 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6f 72  e in the same or
17680 64 65 72 20 61 73 20 61 6e 20 65 78 69 73 74 69  der as an existi
17690 6e 67 20 69 6e 64 65 78 2e 20 20 20 54 68 65 0a  ng index.   The.
176a0 20 20 2a 2a 20 61 69 4d 61 70 5b 5d 20 61 72 72    ** aiMap[] arr
176b0 61 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61  ay contains a ma
176c0 70 70 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6f  pping from the o
176d0 72 69 67 69 6e 61 6c 20 4c 48 53 20 66 69 65 6c  riginal LHS fiel
176e0 64 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20  d order to.  ** 
176f0 74 68 65 20 66 69 65 6c 64 20 6f 72 64 65 72 20  the field order 
17700 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68 65  that matches the
17710 20 52 48 53 20 69 6e 64 65 78 2e 0a 20 20 2a 2f   RHS index..  */
17720 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
17730 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
17740 0a 20 20 72 4c 68 73 4f 72 69 67 20 3d 20 65 78  .  rLhsOrig = ex
17750 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61  prCodeVector(pPa
17760 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 69 44 75  rse, pLeft, &iDu
17770 6d 6d 79 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  mmy);.  for(i=0;
17780 20 69 3c 6e 56 65 63 74 6f 72 20 26 26 20 61 69   i<nVector && ai
17790 4d 61 70 5b 69 5d 3d 3d 69 3b 20 69 2b 2b 29 7b  Map[i]==i; i++){
177a0 7d 20 2f 2a 20 41 72 65 20 4c 48 53 20 66 69 65  } /* Are LHS fie
177b0 6c 64 73 20 72 65 6f 72 64 65 72 65 64 3f 20 2a  lds reordered? *
177c0 2f 0a 20 20 69 66 28 20 69 3d 3d 6e 56 65 63 74  /.  if( i==nVect
177d0 6f 72 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 48 53  or ){.    /* LHS
177e0 20 66 69 65 6c 64 73 20 61 72 65 20 6e 6f 74 20   fields are not 
177f0 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20  reordered */.   
17800 20 72 4c 68 73 20 3d 20 72 4c 68 73 4f 72 69 67   rLhs = rLhsOrig
17810 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
17820 2a 20 4e 65 65 64 20 74 6f 20 72 65 6f 72 64 65  * Need to reorde
17830 72 20 74 68 65 20 4c 48 53 20 66 69 65 6c 64 73  r the LHS fields
17840 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 61 69   according to ai
17850 4d 61 70 20 2a 2f 0a 20 20 20 20 72 4c 68 73 20  Map */.    rLhs 
17860 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
17870 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 56  Range(pParse, nV
17880 65 63 74 6f 72 29 3b 0a 20 20 20 20 66 6f 72 28  ector);.    for(
17890 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20  i=0; i<nVector; 
178a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
178b0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
178c0 20 4f 50 5f 43 6f 70 79 2c 20 72 4c 68 73 4f 72   OP_Copy, rLhsOr
178d0 69 67 2b 69 2c 20 72 4c 68 73 2b 61 69 4d 61 70  ig+i, rLhs+aiMap
178e0 5b 69 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  [i], 0);.    }. 
178f0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 71 6c 69   }..  /* If sqli
17900 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 29  te3FindInIndex()
17910 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 6f 72   did not find or
17920 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78   create an index
17930 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 73 75   that is.  ** su
17940 69 74 61 62 6c 65 20 66 6f 72 20 65 76 61 6c 75  itable for evalu
17950 61 74 69 6e 67 20 74 68 65 20 49 4e 20 6f 70 65  ating the IN ope
17960 72 61 74 6f 72 2c 20 74 68 65 6e 20 65 76 61 6c  rator, then eval
17970 75 61 74 65 20 75 73 69 6e 67 20 61 0a 20 20 2a  uate using a.  *
17980 2a 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63 6f  * sequence of co
17990 6d 70 61 72 69 73 6f 6e 73 2e 0a 20 20 2a 2a 0a  mparisons..  **.
179a0 20 20 2a 2a 20 54 68 69 73 20 69 73 20 73 74 65    ** This is ste
179b0 70 20 28 31 29 20 69 6e 20 74 68 65 20 69 6e 2d  p (1) in the in-
179c0 6f 70 65 72 61 74 6f 72 2e 6d 64 20 6f 70 74 69  operator.md opti
179d0 6d 69 7a 65 64 20 61 6c 67 6f 72 69 74 68 6d 2e  mized algorithm.
179e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
179f0 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  e==IN_INDEX_NOOP
17a00 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   ){.    ExprList
17a10 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
17a20 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 43 6f  >x.pList;.    Co
17a30 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
17a40 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
17a50 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  q(pParse, pExpr-
17a60 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 6e 74  >pLeft);.    int
17a70 20 6c 61 62 65 6c 4f 6b 20 3d 20 73 71 6c 69 74   labelOk = sqlit
17a80 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
17a90 76 29 3b 0a 20 20 20 20 69 6e 74 20 72 32 2c 20  v);.    int r2, 
17aa0 72 65 67 54 6f 46 72 65 65 3b 0a 20 20 20 20 69  regToFree;.    i
17ab0 6e 74 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 30  nt regCkNull = 0
17ac0 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  ;.    int ii;.  
17ad0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
17ae0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
17af0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
17b00 29 3b 0a 20 20 20 20 69 66 28 20 64 65 73 74 49  );.    if( destI
17b10 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c  fNull!=destIfFal
17b20 73 65 20 29 7b 0a 20 20 20 20 20 20 72 65 67 43  se ){.      regC
17b30 6b 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47  kNull = sqlite3G
17b40 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
17b50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17b60 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
17b70 5f 42 69 74 41 6e 64 2c 20 72 4c 68 73 2c 20 72  _BitAnd, rLhs, r
17b80 4c 68 73 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b  Lhs, regCkNull);
17b90 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
17ba0 69 3d 30 3b 20 69 69 3c 70 4c 69 73 74 2d 3e 6e  i=0; ii<pList->n
17bb0 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Expr; ii++){.   
17bc0 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
17bd0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
17be0 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 69 5d  se, pList->a[ii]
17bf0 2e 70 45 78 70 72 2c 20 26 72 65 67 54 6f 46 72  .pExpr, &regToFr
17c00 65 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ee);.      if( r
17c10 65 67 43 6b 4e 75 6c 6c 20 26 26 20 73 71 6c 69  egCkNull && sqli
17c20 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
17c30 28 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45  (pList->a[ii].pE
17c40 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
17c50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17c60 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20  3(v, OP_BitAnd, 
17c70 72 65 67 43 6b 4e 75 6c 6c 2c 20 72 32 2c 20 72  regCkNull, r2, r
17c80 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  egCkNull);.     
17c90 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 69 3c   }.      if( ii<
17ca0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 7c  pList->nExpr-1 |
17cb0 7c 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65  | destIfNull!=de
17cc0 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20  stIfFalse ){.   
17cd0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17ce0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 71 2c  AddOp4(v, OP_Eq,
17cf0 20 72 4c 68 73 2c 20 6c 61 62 65 6c 4f 6b 2c 20   rLhs, labelOk, 
17d00 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r2,.            
17d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
17d20 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  oid*)pColl, P4_C
17d30 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20  OLLSEQ);.       
17d40 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
17d50 76 2c 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  v, ii<pList->nEx
17d60 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 56  pr-1);.        V
17d70 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
17d80 20 69 69 3d 3d 70 4c 69 73 74 2d 3e 6e 45 78 70   ii==pList->nExp
17d90 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  r-1);.        sq
17da0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
17db0 35 28 76 2c 20 7a 41 66 66 5b 30 5d 29 3b 0a 20  5(v, zAff[0]);. 
17dc0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17dd0 20 20 20 20 61 73 73 65 72 74 28 20 64 65 73 74      assert( dest
17de0 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61  IfNull==destIfFa
17df0 6c 73 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73  lse );.        s
17e00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
17e10 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c 68 73 2c  (v, OP_Ne, rLhs,
17e20 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 32   destIfFalse, r2
17e30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17e40 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
17e50 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c  d*)pColl, P4_COL
17e60 4c 53 45 51 29 3b 20 56 64 62 65 43 6f 76 65 72  LSEQ); VdbeCover
17e70 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
17e80 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
17e90 65 50 35 28 76 2c 20 7a 41 66 66 5b 30 5d 20 7c  eP5(v, zAff[0] |
17ea0 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
17eb0 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  LL);.      }.   
17ec0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
17ed0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
17ee0 20 72 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20   regToFree);.   
17ef0 20 7d 0a 20 20 20 20 69 66 28 20 72 65 67 43 6b   }.    if( regCk
17f00 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  Null ){.      sq
17f10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17f20 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65  v, OP_IsNull, re
17f30 67 43 6b 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e  gCkNull, destIfN
17f40 75 6c 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ull); VdbeCovera
17f50 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
17f60 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
17f70 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
17f80 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
17f90 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
17fa0 76 2c 20 6c 61 62 65 6c 4f 6b 29 3b 0a 20 20 20  v, labelOk);.   
17fb0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
17fc0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
17fd0 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 67  egCkNull);.    g
17fe0 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43  oto sqlite3ExprC
17ff0 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64 3b 0a  odeIN_finished;.
18000 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 32    }..  /* Step 2
18010 3a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  : Check to see i
18020 66 20 74 68 65 20 4c 48 53 20 63 6f 6e 74 61 69  f the LHS contai
18030 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 63 6f 6c 75  ns any NULL colu
18040 6d 6e 73 2e 20 20 49 66 20 74 68 65 0a 20 20 2a  mns.  If the.  *
18050 2a 20 4c 48 53 20 64 6f 65 73 20 63 6f 6e 74 61  * LHS does conta
18060 69 6e 20 4e 55 4c 4c 73 20 74 68 65 6e 20 74 68  in NULLs then th
18070 65 20 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65  e result must be
18080 20 65 69 74 68 65 72 20 46 41 4c 53 45 20 6f 72   either FALSE or
18090 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 20 57 65 20 77   NULL..  ** We w
180a0 69 6c 6c 20 74 68 65 6e 20 73 6b 69 70 20 74 68  ill then skip th
180b0 65 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20  e binary search 
180c0 6f 66 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f  of the RHS..  */
180d0 0a 20 20 69 66 28 20 64 65 73 74 49 66 4e 75 6c  .  if( destIfNul
180e0 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29  l==destIfFalse )
180f0 7b 0a 20 20 20 20 64 65 73 74 53 74 65 70 32 20  {.    destStep2 
18100 3d 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20  = destIfFalse;. 
18110 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 73 74   }else{.    dest
18120 53 74 65 70 32 20 3d 20 64 65 73 74 53 74 65 70  Step2 = destStep
18130 36 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  6 = sqlite3VdbeM
18140 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 7d  akeLabel(v);.  }
18150 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56  .  for(i=0; i<nV
18160 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ector; i++){.   
18170 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74   Expr *p = sqlit
18180 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62  e3VectorFieldSub
18190 65 78 70 72 28 70 45 78 70 72 2d 3e 70 4c 65 66  expr(pExpr->pLef
181a0 74 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 73  t, i);.    if( s
181b0 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
181c0 75 6c 6c 28 70 29 20 29 7b 0a 20 20 20 20 20 20  ull(p) ){.      
181d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
181e0 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
181f0 72 4c 68 73 2b 69 2c 20 64 65 73 74 53 74 65 70  rLhs+i, destStep
18200 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  2);.      VdbeCo
18210 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d  verage(v);.    }
18220 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20  .  }..  /* Step 
18230 33 2e 20 20 54 68 65 20 4c 48 53 20 69 73 20 6e  3.  The LHS is n
18240 6f 77 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 6e  ow known to be n
18250 6f 6e 2d 4e 55 4c 4c 2e 20 20 44 6f 20 74 68 65  on-NULL.  Do the
18260 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 0a 20   binary search. 
18270 20 2a 2a 20 6f 66 20 74 68 65 20 52 48 53 20 75   ** of the RHS u
18280 73 69 6e 67 20 74 68 65 20 4c 48 53 20 61 73 20  sing the LHS as 
18290 61 20 70 72 6f 62 65 2e 20 20 49 66 20 66 6f 75  a probe.  If fou
182a0 6e 64 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69  nd, the result i
182b0 73 0a 20 20 2a 2a 20 74 72 75 65 2e 0a 20 20 2a  s.  ** true..  *
182c0 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49  /.  if( eType==I
182d0 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b  N_INDEX_ROWID ){
182e0 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20  .    /* In this 
182f0 63 61 73 65 2c 20 74 68 65 20 52 48 53 20 69 73  case, the RHS is
18300 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74 61   the ROWID of ta
18310 62 6c 65 20 62 2d 74 72 65 65 20 61 6e 64 20 73  ble b-tree and s
18320 6f 20 77 65 20 61 6c 73 6f 0a 20 20 20 20 2a 2a  o we also.    **
18330 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 52   know that the R
18340 48 53 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20  HS is non-NULL. 
18350 20 48 65 6e 63 65 2c 20 77 65 20 63 6f 6d 62 69   Hence, we combi
18360 6e 65 20 73 74 65 70 73 20 33 20 61 6e 64 20 34  ne steps 3 and 4
18370 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 20 73  .    ** into a s
18380 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 2a 2f  ingle opcode. */
18390 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
183a0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65  AddOp3(v, OP_See
183b0 6b 52 6f 77 69 64 2c 20 70 45 78 70 72 2d 3e 69  kRowid, pExpr->i
183c0 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c  Table, destIfFal
183d0 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20 20 20 56  se, rLhs);.    V
183e0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
183f0 20 20 20 20 61 64 64 72 54 72 75 74 68 4f 70 20      addrTruthOp 
18400 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
18410 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b  Op0(v, OP_Goto);
18420 20 20 2f 2a 20 52 65 74 75 72 6e 20 54 72 75 65    /* Return True
18430 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
18440 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18450 70 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74  p4(v, OP_Affinit
18460 79 2c 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72  y, rLhs, nVector
18470 2c 20 30 2c 20 7a 41 66 66 2c 20 6e 56 65 63 74  , 0, zAff, nVect
18480 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 64 65 73  or);.    if( des
18490 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66  tIfFalse==destIf
184a0 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Null ){.      /*
184b0 20 43 6f 6d 62 69 6e 65 20 53 74 65 70 20 33 20   Combine Step 3 
184c0 61 6e 64 20 53 74 65 70 20 35 20 69 6e 74 6f 20  and Step 5 into 
184d0 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 20  a single opcode 
184e0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
184f0 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
18500 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70 45   OP_NotFound, pE
18510 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73  xpr->iTable, des
18520 74 49 66 46 61 6c 73 65 2c 0a 20 20 20 20 20 20  tIfFalse,.      
18530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18540 20 20 20 20 20 72 4c 68 73 2c 20 6e 56 65 63 74       rLhs, nVect
18550 6f 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  or); VdbeCoverag
18560 65 28 76 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  e(v);.      goto
18570 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
18580 49 4e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20  IN_finished;.   
18590 20 7d 0a 20 20 20 20 2f 2a 20 4f 72 64 69 6e 61   }.    /* Ordina
185a0 72 79 20 53 74 65 70 20 33 2c 20 66 6f 72 20 74  ry Step 3, for t
185b0 68 65 20 63 61 73 65 20 77 68 65 72 65 20 46 41  he case where FA
185c0 4c 53 45 20 61 6e 64 20 4e 55 4c 4c 20 61 72 65  LSE and NULL are
185d0 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 20   distinct */.   
185e0 20 61 64 64 72 54 72 75 74 68 4f 70 20 3d 20 73   addrTruthOp = s
185f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
18600 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
18610 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
18620 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
18630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18640 20 20 20 20 20 20 20 20 20 72 4c 68 73 2c 20 6e           rLhs, n
18650 56 65 63 74 6f 72 29 3b 20 56 64 62 65 43 6f 76  Vector); VdbeCov
18660 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20  erage(v);.  }.. 
18670 20 2f 2a 20 53 74 65 70 20 34 2e 20 20 49 66 20   /* Step 4.  If 
18680 74 68 65 20 52 48 53 20 69 73 20 6b 6e 6f 77 6e  the RHS is known
18690 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 20   to be non-NULL 
186a0 61 6e 64 20 77 65 20 64 69 64 20 6e 6f 74 20 66  and we did not f
186b0 69 6e 64 0a 20 20 2a 2a 20 61 6e 20 6d 61 74 63  ind.  ** an matc
186c0 68 20 6f 6e 20 74 68 65 20 73 65 61 72 63 68 20  h on the search 
186d0 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20  above, then the 
186e0 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20 46  result must be F
186f0 41 4c 53 45 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ALSE..  */.  if(
18700 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26 20   rRhsHasNull && 
18710 6e 56 65 63 74 6f 72 3d 3d 31 20 29 7b 0a 20 20  nVector==1 ){.  
18720 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18730 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  Op2(v, OP_NotNul
18740 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20  l, rRhsHasNull, 
18750 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
18760 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
18770 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65  );.  }..  /* Ste
18780 70 20 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e  p 5.  If we do n
18790 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ot care about th
187a0 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
187b0 77 65 65 6e 20 4e 55 4c 4c 20 61 6e 64 0a 20 20  ween NULL and.  
187c0 2a 2a 20 46 41 4c 53 45 2c 20 74 68 65 6e 20 6a  ** FALSE, then j
187d0 75 73 74 20 72 65 74 75 72 6e 20 66 61 6c 73 65  ust return false
187e0 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65  . .  */.  if( de
187f0 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49  stIfFalse==destI
18800 66 4e 75 6c 6c 20 29 20 73 71 6c 69 74 65 33 56  fNull ) sqlite3V
18810 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 49  dbeGoto(v, destI
18820 66 46 61 6c 73 65 29 3b 0a 0a 20 20 2f 2a 20 53  fFalse);..  /* S
18830 74 65 70 20 36 3a 20 4c 6f 6f 70 20 74 68 72 6f  tep 6: Loop thro
18840 75 67 68 20 72 6f 77 73 20 6f 66 20 74 68 65 20  ugh rows of the 
18850 52 48 53 2e 20 20 43 6f 6d 70 61 72 65 20 65 61  RHS.  Compare ea
18860 63 68 20 72 6f 77 20 74 6f 20 74 68 65 20 4c 48  ch row to the LH
18870 53 2e 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 63  S..  ** If any c
18880 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 4e 55 4c  omparison is NUL
18890 4c 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  L, then the resu
188a0 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 49 66 20  lt is NULL.  If 
188b0 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6d 70 61 72 69  all.  ** compari
188c0 73 6f 6e 73 20 61 72 65 20 46 41 4c 53 45 20 74  sons are FALSE t
188d0 68 65 6e 20 74 68 65 20 66 69 6e 61 6c 20 72 65  hen the final re
188e0 73 75 6c 74 20 69 73 20 46 41 4c 53 45 2e 0a 20  sult is FALSE.. 
188f0 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 61 20 73   **.  ** For a s
18900 63 61 6c 61 72 20 4c 48 53 2c 20 69 74 20 69 73  calar LHS, it is
18910 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 63   sufficient to c
18920 68 65 63 6b 20 6a 75 73 74 20 74 68 65 20 66 69  heck just the fi
18930 72 73 74 20 72 6f 77 0a 20 20 2a 2a 20 6f 66 20  rst row.  ** of 
18940 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20  the RHS..  */.  
18950 69 66 28 20 64 65 73 74 53 74 65 70 36 20 29 20  if( destStep6 ) 
18960 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
18970 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 53  veLabel(v, destS
18980 74 65 70 36 29 3b 0a 20 20 61 64 64 72 54 6f 70  tep6);.  addrTop
18990 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
189a0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
189b0 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
189c0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
189d0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
189e0 29 3b 0a 20 20 69 66 28 20 6e 56 65 63 74 6f 72  );.  if( nVector
189f0 3e 31 20 29 7b 0a 20 20 20 20 64 65 73 74 4e 6f  >1 ){.    destNo
18a00 74 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56  tNull = sqlite3V
18a10 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
18a20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
18a30 20 46 6f 72 20 6e 56 65 63 74 6f 72 3d 3d 31 2c   For nVector==1,
18a40 20 63 6f 6d 62 69 6e 65 20 73 74 65 70 73 20 36   combine steps 6
18a50 20 61 6e 64 20 37 20 62 79 20 69 6d 6d 65 64 69   and 7 by immedi
18a60 61 74 65 6c 79 20 72 65 74 75 72 6e 69 6e 67 0a  ately returning.
18a70 20 20 20 20 2a 2a 20 46 41 4c 53 45 20 69 66 20      ** FALSE if 
18a80 74 68 65 20 66 69 72 73 74 20 63 6f 6d 70 61 72  the first compar
18a90 69 73 6f 6e 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ison is not NULL
18aa0 20 2a 2f 0a 20 20 20 20 64 65 73 74 4e 6f 74 4e   */.    destNotN
18ab0 75 6c 6c 20 3d 20 64 65 73 74 49 66 46 61 6c 73  ull = destIfFals
18ac0 65 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  e;.  }.  for(i=0
18ad0 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b  ; i<nVector; i++
18ae0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a  ){.    Expr *p;.
18af0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
18b00 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 72 33 20 3d  ll;.    int r3 =
18b10 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
18b20 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
18b30 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f  p = sqlite3Vecto
18b40 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 4c  rFieldSubexpr(pL
18b50 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 70 43 6f  eft, i);.    pCo
18b60 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
18b70 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
18b80 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  p);.    sqlite3V
18b90 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
18ba0 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69  Column, pExpr->i
18bb0 54 61 62 6c 65 2c 20 69 2c 20 72 33 29 3b 0a 20  Table, i, r3);. 
18bc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18bd0 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72  dOp4(v, OP_Ne, r
18be0 4c 68 73 2b 69 2c 20 64 65 73 74 4e 6f 74 4e 75  Lhs+i, destNotNu
18bf0 6c 6c 2c 20 72 33 2c 0a 20 20 20 20 20 20 20 20  ll, r3,.        
18c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
18c10 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  oid*)pColl, P4_C
18c20 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 56 64 62  OLLSEQ);.    Vdb
18c30 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
18c40 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
18c50 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
18c60 72 33 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  r3);.  }.  sqlit
18c70 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18c80 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74  OP_Goto, 0, dest
18c90 49 66 4e 75 6c 6c 29 3b 0a 20 20 69 66 28 20 6e  IfNull);.  if( n
18ca0 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20  Vector>1 ){.    
18cb0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
18cc0 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 4e  veLabel(v, destN
18cd0 6f 74 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c  otNull);.    sql
18ce0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
18cf0 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 45 78 70 72  , OP_Next, pExpr
18d00 2d 3e 69 54 61 62 6c 65 2c 20 61 64 64 72 54 6f  ->iTable, addrTo
18d10 70 2b 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  p+1);.    VdbeCo
18d20 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20  verage(v);..    
18d30 2f 2a 20 53 74 65 70 20 37 3a 20 20 49 66 20 77  /* Step 7:  If w
18d40 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
18d50 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  nt, we know that
18d60 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74   the result must
18d70 0a 20 20 20 20 2a 2a 20 62 65 20 66 61 6c 73 65  .    ** be false
18d80 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
18d90 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18da0 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66  _Goto, 0, destIf
18db0 46 61 6c 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  False);.  }..  /
18dc0 2a 20 4a 75 6d 70 73 20 68 65 72 65 20 69 6e 20  * Jumps here in 
18dd0 6f 72 64 65 72 20 74 6f 20 72 65 74 75 72 6e 20  order to return 
18de0 74 72 75 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  true. */.  sqlit
18df0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
18e00 2c 20 61 64 64 72 54 72 75 74 68 4f 70 29 3b 0a  , addrTruthOp);.
18e10 0a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65  .sqlite3ExprCode
18e20 49 4e 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20 69  IN_finished:.  i
18e30 66 28 20 72 4c 68 73 21 3d 72 4c 68 73 4f 72 69  f( rLhs!=rLhsOri
18e40 67 20 29 20 73 71 6c 69 74 65 33 52 65 6c 65 61  g ) sqlite3Relea
18e50 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
18e60 2c 20 72 4c 68 73 29 3b 0a 20 20 73 71 6c 69 74  , rLhs);.  sqlit
18e70 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
18e80 50 61 72 73 65 29 3b 0a 20 20 56 64 62 65 43 6f  Parse);.  VdbeCo
18e90 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 49  mment((v, "end I
18ea0 4e 20 65 78 70 72 22 29 29 3b 0a 73 71 6c 69 74  N expr"));.sqlit
18eb0 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d  e3ExprCodeIN_oom
18ec0 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65  _error:.  sqlite
18ed0 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e  3DbFree(pParse->
18ee0 64 62 2c 20 61 69 4d 61 70 29 3b 0a 20 20 73 71  db, aiMap);.  sq
18ef0 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
18f00 73 65 2d 3e 64 62 2c 20 7a 41 66 66 29 3b 0a 7d  se->db, zAff);.}
18f10 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
18f20 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
18f30 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
18f40 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
18f50 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e  _POINT./*.** Gen
18f60 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63  erate an instruc
18f70 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70  tion that will p
18f80 75 74 20 74 68 65 20 66 6c 6f 61 74 69 6e 67 20  ut the floating 
18f90 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 64  point.** value d
18fa0 65 73 63 72 69 62 65 64 20 62 79 20 7a 5b 30 2e  escribed by z[0.
18fb0 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73  .n-1] into regis
18fc0 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20  ter iMem..**.** 
18fd0 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77  The z[] string w
18fe0 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74  ill probably not
18ff0 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61   be zero-termina
19000 74 65 64 2e 20 20 42 75 74 20 74 68 65 20 0a 2a  ted.  But the .*
19010 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65 72  * z[n] character
19020 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
19030 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 20 74  o be something t
19040 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f  hat does not loo
19050 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f  k.** like the co
19060 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68  ntinuation of th
19070 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61  e number..*/.sta
19080 74 69 63 20 76 6f 69 64 20 63 6f 64 65 52 65 61  tic void codeRea
19090 6c 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74  l(Vdbe *v, const
190a0 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 65   char *z, int ne
190b0 67 61 74 65 46 6c 61 67 2c 20 69 6e 74 20 69 4d  gateFlag, int iM
190c0 65 6d 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59  em){.  if( ALWAY
190d0 53 28 7a 21 3d 30 29 20 29 7b 0a 20 20 20 20 64  S(z!=0) ){.    d
190e0 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20 20  ouble value;.   
190f0 20 73 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20   sqlite3AtoF(z, 
19100 26 76 61 6c 75 65 2c 20 73 71 6c 69 74 65 33 53  &value, sqlite3S
19110 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49  trlen30(z), SQLI
19120 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 61 73  TE_UTF8);.    as
19130 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 49 73  sert( !sqlite3Is
19140 4e 61 4e 28 76 61 6c 75 65 29 20 29 3b 20 2f 2a  NaN(value) ); /*
19150 20 54 68 65 20 6e 65 77 20 41 74 6f 46 20 6e 65   The new AtoF ne
19160 76 65 72 20 72 65 74 75 72 6e 73 20 4e 61 4e 20  ver returns NaN 
19170 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 67 61 74  */.    if( negat
19180 65 46 6c 61 67 20 29 20 76 61 6c 75 65 20 3d 20  eFlag ) value = 
19190 2d 76 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69  -value;.    sqli
191a0 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70  te3VdbeAddOp4Dup
191b0 38 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c  8(v, OP_Real, 0,
191c0 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26   iMem, 0, (u8*)&
191d0 76 61 6c 75 65 2c 20 50 34 5f 52 45 41 4c 29 3b  value, P4_REAL);
191e0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .  }.}.#endif...
191f0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
19200 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
19210 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20  at will put the 
19220 69 6e 74 65 67 65 72 20 64 65 73 63 72 69 62 65  integer describe
19230 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e   by.** text z[0.
19240 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73  .n-1] into regis
19250 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20  ter iMem..**.** 
19260 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 69 73  Expr.u.zToken is
19270 20 61 6c 77 61 79 73 20 55 54 46 38 20 61 6e 64   always UTF8 and
19280 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64   zero-terminated
19290 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
192a0 20 63 6f 64 65 49 6e 74 65 67 65 72 28 50 61 72   codeInteger(Par
192b0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
192c0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6e 65 67   *pExpr, int neg
192d0 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b  Flag, int iMem){
192e0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
192f0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66  rse->pVdbe;.  if
19300 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ( pExpr->flags &
19310 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a   EP_IntValue ){.
19320 20 20 20 20 69 6e 74 20 69 20 3d 20 70 45 78 70      int i = pExp
19330 72 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20  r->u.iValue;.   
19340 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 29 3b   assert( i>=0 );
19350 0a 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67  .    if( negFlag
19360 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20 73   ) i = -i;.    s
19370 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19380 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
19390 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73  i, iMem);.  }els
193a0 65 7b 0a 20 20 20 20 69 6e 74 20 63 3b 0a 20 20  e{.    int c;.  
193b0 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20 20    i64 value;.   
193c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
193d0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
193e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 21  ;.    assert( z!
193f0 3d 30 20 29 3b 0a 20 20 20 20 63 20 3d 20 73 71  =0 );.    c = sq
19400 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49  lite3DecOrHexToI
19410 36 34 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20  64(z, &value);. 
19420 20 20 20 69 66 28 20 63 3d 3d 30 20 7c 7c 20 28     if( c==0 || (
19430 63 3d 3d 32 20 26 26 20 6e 65 67 46 6c 61 67 29  c==2 && negFlag)
19440 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65   ){.      if( ne
19450 67 46 6c 61 67 20 29 7b 20 76 61 6c 75 65 20 3d  gFlag ){ value =
19460 20 63 3d 3d 32 20 3f 20 53 4d 41 4c 4c 45 53 54   c==2 ? SMALLEST
19470 5f 49 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b  _INT64 : -value;
19480 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
19490 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76  VdbeAddOp4Dup8(v
194a0 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69  , OP_Int64, 0, i
194b0 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76 61  Mem, 0, (u8*)&va
194c0 6c 75 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a  lue, P4_INT64);.
194d0 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65      }else{.#ifde
194e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
194f0 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
19500 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
19510 73 67 28 70 50 61 72 73 65 2c 20 22 6f 76 65 72  sg(pParse, "over
19520 73 69 7a 65 64 20 69 6e 74 65 67 65 72 3a 20 25  sized integer: %
19530 73 25 73 22 2c 20 6e 65 67 46 6c 61 67 20 3f 20  s%s", negFlag ? 
19540 22 2d 22 20 3a 20 22 22 2c 20 7a 29 3b 0a 23 65  "-" : "", z);.#e
19550 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  lse.#ifndef SQLI
19560 54 45 5f 4f 4d 49 54 5f 48 45 58 5f 49 4e 54 45  TE_OMIT_HEX_INTE
19570 47 45 52 0a 20 20 20 20 20 20 69 66 28 20 73 71  GER.      if( sq
19580 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a  lite3_strnicmp(z
19590 2c 22 30 78 22 2c 32 29 3d 3d 30 20 29 7b 0a 20  ,"0x",2)==0 ){. 
195a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
195b0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
195c0 68 65 78 20 6c 69 74 65 72 61 6c 20 74 6f 6f 20  hex literal too 
195d0 62 69 67 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20  big: %s", z);.  
195e0 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
195f0 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
19600 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20   codeReal(v, z, 
19610 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a  negFlag, iMem);.
19620 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
19630 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20     }.  }.}..#if 
19640 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
19650 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 56 65 72 69  EBUG)./*.** Veri
19660 66 79 20 74 68 65 20 63 6f 6e 73 69 73 74 65 6e  fy the consisten
19670 63 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  cy of the column
19680 20 63 61 63 68 65 0a 2a 2f 0a 73 74 61 74 69 63   cache.*/.static
19690 20 69 6e 74 20 63 61 63 68 65 49 73 56 61 6c 69   int cacheIsVali
196a0 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  d(Parse *pParse)
196b0 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  {.  int i, n;.  
196c0 66 6f 72 28 69 3d 6e 3d 30 3b 20 69 3c 53 51 4c  for(i=n=0; i<SQL
196d0 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
196e0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50  i++){.    if( pP
196f0 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
19700 69 5d 2e 69 52 65 67 3e 30 20 29 20 6e 2b 2b 3b  i].iReg>0 ) n++;
19710 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3d  .  }.  return n=
19720 3d 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  =pParse->nColCac
19730 68 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  he;.}.#endif../*
19740 0a 2a 2a 20 43 6c 65 61 72 20 61 20 63 61 63 68  .** Clear a cach
19750 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61 74  e entry..*/.stat
19760 69 63 20 76 6f 69 64 20 63 61 63 68 65 45 6e 74  ic void cacheEnt
19770 72 79 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70  ryClear(Parse *p
19780 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 79 43  Parse, struct yC
19790 6f 6c 43 61 63 68 65 20 2a 70 29 7b 0a 20 20 69  olCache *p){.  i
197a0 66 28 20 70 2d 3e 74 65 6d 70 52 65 67 20 29 7b  f( p->tempReg ){
197b0 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
197c0 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53  >nTempReg<ArrayS
197d0 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d  ize(pParse->aTem
197e0 70 52 65 67 29 20 29 7b 0a 20 20 20 20 20 20 70  pReg) ){.      p
197f0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
19800 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
19810 2b 2b 5d 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20  ++] = p->iReg;. 
19820 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74 65 6d 70     }.    p->temp
19830 52 65 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  Reg = 0;.  }.  p
19840 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 70 50  ->iReg = 0;.  pP
19850 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 2d  arse->nColCache-
19860 2d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  -;.  assert( pPa
19870 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
19880 61 69 6c 65 64 20 7c 7c 20 63 61 63 68 65 49 73  ailed || cacheIs
19890 56 61 6c 69 64 28 70 50 61 72 73 65 29 20 29 3b  Valid(pParse) );
198a0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72  .}.../*.** Recor
198b0 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d in the column 
198c0 63 61 63 68 65 20 74 68 61 74 20 61 20 70 61 72  cache that a par
198d0 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20 66  ticular column f
198e0 72 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69 63 75  rom a.** particu
198f0 6c 61 72 20 74 61 62 6c 65 20 69 73 20 73 74 6f  lar table is sto
19900 72 65 64 20 69 6e 20 61 20 70 61 72 74 69 63 75  red in a particu
19910 6c 61 72 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f  lar register..*/
19920 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
19930 72 43 61 63 68 65 53 74 6f 72 65 28 50 61 72 73  rCacheStore(Pars
19940 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
19950 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69  Tab, int iCol, i
19960 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt iReg){.  int 
19970 69 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72 75 3b  i;.  int minLru;
19980 0a 20 20 69 6e 74 20 69 64 78 4c 72 75 3b 0a 20  .  int idxLru;. 
19990 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
199a0 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 65  e *p;..  /* Unle
199b0 73 73 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  ss an error has 
199c0 6f 63 63 75 72 72 65 64 2c 20 72 65 67 69 73 74  occurred, regist
199d0 65 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  er numbers are a
199e0 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65 2e 20  lways positive. 
199f0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 52 65  */.  assert( iRe
19a00 67 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  g>0 || pParse->n
19a10 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  Err || pParse->d
19a20 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
19a30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f  );.  assert( iCo
19a40 6c 3e 3d 2d 31 20 26 26 20 69 43 6f 6c 3c 33 32  l>=-1 && iCol<32
19a50 37 36 38 20 29 3b 20 20 2f 2a 20 46 69 6e 69 74  768 );  /* Finit
19a60 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73  e column numbers
19a70 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51   */..  /* The SQ
19a80 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65  LITE_ColumnCache
19a90 20 66 6c 61 67 20 64 69 73 61 62 6c 65 73 20 74   flag disables t
19aa0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
19ab0 20 20 54 68 69 73 20 69 73 20 75 73 65 64 0a 20    This is used. 
19ac0 20 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20   ** for testing 
19ad0 6f 6e 6c 79 20 2d 20 74 6f 20 76 65 72 69 66 79  only - to verify
19ae0 20 74 68 61 74 20 53 51 4c 69 74 65 20 61 6c 77   that SQLite alw
19af0 61 79 73 20 67 65 74 73 20 74 68 65 20 73 61 6d  ays gets the sam
19b00 65 20 61 6e 73 77 65 72 0a 20 20 2a 2a 20 77 69  e answer.  ** wi
19b10 74 68 20 61 6e 64 20 77 69 74 68 6f 75 74 20 74  th and without t
19b20 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
19b30 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69  .  */.  if( Opti
19b40 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64  mizationDisabled
19b50 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c  (pParse->db, SQL
19b60 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 29  ITE_ColumnCache)
19b70 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
19b80 20 46 69 72 73 74 20 72 65 70 6c 61 63 65 20 61   First replace a
19b90 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72  ny existing entr
19ba0 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74  y..  **.  ** Act
19bb0 75 61 6c 6c 79 2c 20 74 68 65 20 77 61 79 20 74  ually, the way t
19bc0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
19bd0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 73 65  is currently use
19be0 64 2c 20 77 65 20 61 72 65 20 67 75 61 72 61 6e  d, we are guaran
19bf0 74 65 65 64 0a 20 20 2a 2a 20 74 68 61 74 20 74  teed.  ** that t
19c00 68 65 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 6e  he object will n
19c10 65 76 65 72 20 61 6c 72 65 61 64 79 20 62 65 20  ever already be 
19c20 69 6e 20 63 61 63 68 65 2e 20 20 56 65 72 69 66  in cache.  Verif
19c30 79 20 74 68 69 73 20 67 75 61 72 61 6e 74 65 65  y this guarantee
19c40 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ..  */.#ifndef N
19c50 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30 2c  DEBUG.  for(i=0,
19c60 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
19c70 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
19c80 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
19c90 70 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  p++){.    assert
19ca0 28 20 70 2d 3e 69 52 65 67 3d 3d 30 20 7c 7c 20  ( p->iReg==0 || 
19cb0 70 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20  p->iTable!=iTab 
19cc0 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69  || p->iColumn!=i
19cd0 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Col );.  }.#endi
19ce0 66 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 6e 20  f..  /* Find an 
19cf0 65 6d 70 74 79 20 73 6c 6f 74 20 61 6e 64 20 72  empty slot and r
19d00 65 70 6c 61 63 65 20 69 74 20 2a 2f 0a 20 20 66  eplace it */.  f
19d10 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
19d20 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
19d30 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
19d40 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
19d50 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 30 20   if( p->iReg==0 
19d60 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 65 76  ){.      p->iLev
19d70 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  el = pParse->iCa
19d80 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20  cheLevel;.      
19d90 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  p->iTable = iTab
19da0 3b 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f 6c 75  ;.      p->iColu
19db0 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20  mn = iCol;.     
19dc0 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b   p->iReg = iReg;
19dd0 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65  .      p->tempRe
19de0 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  g = 0;.      p->
19df0 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43  lru = pParse->iC
19e00 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20  acheCnt++;.     
19e10 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63   pParse->nColCac
19e20 68 65 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65  he++;.      asse
19e30 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  rt( pParse->db->
19e40 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
19e50 63 61 63 68 65 49 73 56 61 6c 69 64 28 70 50 61  cacheIsValid(pPa
19e60 72 73 65 29 20 29 3b 0a 20 20 20 20 20 20 72 65  rse) );.      re
19e70 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
19e80 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68  .  /* Replace th
19e90 65 20 6c 61 73 74 20 72 65 63 65 6e 74 6c 79 20  e last recently 
19ea0 75 73 65 64 20 2a 2f 0a 20 20 6d 69 6e 4c 72 75  used */.  minLru
19eb0 20 3d 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20   = 0x7fffffff;. 
19ec0 20 69 64 78 4c 72 75 20 3d 20 2d 31 3b 0a 20 20   idxLru = -1;.  
19ed0 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
19ee0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
19ef0 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
19f00 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
19f10 20 20 69 66 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e    if( p->lru<min
19f20 4c 72 75 20 29 7b 0a 20 20 20 20 20 20 69 64 78  Lru ){.      idx
19f30 4c 72 75 20 3d 20 69 3b 0a 20 20 20 20 20 20 6d  Lru = i;.      m
19f40 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72 75 3b 0a  inLru = p->lru;.
19f50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
19f60 41 4c 57 41 59 53 28 69 64 78 4c 72 75 3e 3d 30  ALWAYS(idxLru>=0
19f70 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 50  ) ){.    p = &pP
19f80 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
19f90 69 64 78 4c 72 75 5d 3b 0a 20 20 20 20 70 2d 3e  idxLru];.    p->
19fa0 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d  iLevel = pParse-
19fb0 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20  >iCacheLevel;.  
19fc0 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54    p->iTable = iT
19fd0 61 62 3b 0a 20 20 20 20 70 2d 3e 69 43 6f 6c 75  ab;.    p->iColu
19fe0 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70  mn = iCol;.    p
19ff0 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a 20  ->iReg = iReg;. 
1a000 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20     p->tempReg = 
1a010 30 3b 0a 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20  0;.    p->lru = 
1a020 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e  pParse->iCacheCn
1a030 74 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t++;.    assert(
1a040 20 63 61 63 68 65 49 73 56 61 6c 69 64 28 70 50   cacheIsValid(pP
1a050 61 72 73 65 29 20 29 3b 0a 20 20 20 20 72 65 74  arse) );.    ret
1a060 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  urn;.  }.}../*.*
1a070 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20  * Indicate that 
1a080 72 65 67 69 73 74 65 72 73 20 62 65 74 77 65 65  registers betwee
1a090 6e 20 69 52 65 67 2e 2e 69 52 65 67 2b 6e 52 65  n iReg..iReg+nRe
1a0a0 67 2d 31 20 61 72 65 20 62 65 69 6e 67 20 6f 76  g-1 are being ov
1a0b0 65 72 77 72 69 74 74 65 6e 2e 0a 2a 2a 20 50 75  erwritten..** Pu
1a0c0 72 67 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66  rge the range of
1a0d0 20 72 65 67 69 73 74 65 72 73 20 66 72 6f 6d 20   registers from 
1a0e0 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
1a0f0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1a100 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65  3ExprCacheRemove
1a110 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1a120 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52  int iReg, int nR
1a130 65 67 29 7b 0a 20 20 73 74 72 75 63 74 20 79 43  eg){.  struct yC
1a140 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 69 66  olCache *p;.  if
1a150 28 20 69 52 65 67 3c 3d 30 20 7c 7c 20 70 50 61  ( iReg<=0 || pPa
1a160 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3d 3d  rse->nColCache==
1a170 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20  0 ) return;.  p 
1a180 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43  = &pParse->aColC
1a190 61 63 68 65 5b 53 51 4c 49 54 45 5f 4e 5f 43 4f  ache[SQLITE_N_CO
1a1a0 4c 43 41 43 48 45 2d 31 5d 3b 0a 20 20 77 68 69  LCACHE-1];.  whi
1a1b0 6c 65 28 31 29 7b 0a 20 20 20 20 69 66 28 20 70  le(1){.    if( p
1a1c0 2d 3e 69 52 65 67 20 3e 3d 20 69 52 65 67 20 26  ->iReg >= iReg &
1a1d0 26 20 70 2d 3e 69 52 65 67 20 3c 20 69 52 65 67  & p->iReg < iReg
1a1e0 2b 6e 52 65 67 20 29 20 63 61 63 68 65 45 6e 74  +nReg ) cacheEnt
1a1f0 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20  ryClear(pParse, 
1a200 70 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 70  p);.    if( p==p
1a210 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
1a220 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 2d   ) break;.    p-
1a230 2d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  -;.  }.}../*.** 
1a240 52 65 6d 65 6d 62 65 72 20 74 68 65 20 63 75 72  Remember the cur
1a250 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68  rent column cach
1a260 65 20 63 6f 6e 74 65 78 74 2e 20 20 41 6e 79 20  e context.  Any 
1a270 6e 65 77 20 65 6e 74 72 69 65 73 20 61 64 64 65  new entries adde
1a280 64 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68  d.** added to th
1a290 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61  e column cache a
1a2a0 66 74 65 72 20 74 68 69 73 20 63 61 6c 6c 20 61  fter this call a
1a2b0 72 65 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 20  re removed when 
1a2c0 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  the.** correspon
1a2d0 64 69 6e 67 20 70 6f 70 20 6f 63 63 75 72 73 2e  ding pop occurs.
1a2e0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1a2f0 45 78 70 72 43 61 63 68 65 50 75 73 68 28 50 61  ExprCachePush(Pa
1a300 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
1a310 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1a320 76 65 6c 2b 2b 3b 0a 23 69 66 64 65 66 20 53 51  vel++;.#ifdef SQ
1a330 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
1a340 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
1a350 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
1a360 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
1a370 20 20 70 72 69 6e 74 66 28 22 50 55 53 48 20 74    printf("PUSH t
1a380 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72 73 65 2d  o %d\n", pParse-
1a390 3e 69 43 61 63 68 65 4c 65 76 65 6c 29 3b 0a 20  >iCacheLevel);. 
1a3a0 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
1a3b0 2a 2a 20 52 65 6d 6f 76 65 20 66 72 6f 6d 20 74  ** Remove from t
1a3c0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
1a3d0 61 6e 79 20 65 6e 74 72 69 65 73 20 74 68 61 74  any entries that
1a3e0 20 77 65 72 65 20 61 64 64 65 64 20 73 69 6e 63   were added sinc
1a3f0 65 20 74 68 65 0a 2a 2a 20 74 68 65 20 70 72 65  e the.** the pre
1a400 76 69 6f 75 73 20 73 71 6c 69 74 65 33 45 78 70  vious sqlite3Exp
1a410 72 43 61 63 68 65 50 75 73 68 20 6f 70 65 72 61  rCachePush opera
1a420 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20  tion.  In other 
1a430 77 6f 72 64 73 2c 20 72 65 73 74 6f 72 65 0a 2a  words, restore.*
1a440 2a 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 74  * the cache to t
1a450 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20  he state it was 
1a460 69 6e 20 70 72 69 6f 72 20 74 68 65 20 6d 6f 73  in prior the mos
1a470 74 20 72 65 63 65 6e 74 20 50 75 73 68 2e 0a 2a  t recent Push..*
1a480 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1a490 70 72 43 61 63 68 65 50 6f 70 28 50 61 72 73 65  prCachePop(Parse
1a4a0 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74   *pParse){.  int
1a4b0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
1a4c0 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 61 73 73  lCache *p;.  ass
1a4d0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 69 43 61  ert( pParse->iCa
1a4e0 63 68 65 4c 65 76 65 6c 3e 3d 31 20 29 3b 0a 20  cheLevel>=1 );. 
1a4f0 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
1a500 65 76 65 6c 2d 2d 3b 0a 23 69 66 64 65 66 20 53  evel--;.#ifdef S
1a510 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66  QLITE_DEBUG.  if
1a520 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  ( pParse->db->fl
1a530 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
1a540 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20  eAddopTrace ){. 
1a550 20 20 20 70 72 69 6e 74 66 28 22 50 4f 50 20 20     printf("POP  
1a560 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72 73 65  to %d\n", pParse
1a570 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 29 3b 0a  ->iCacheLevel);.
1a580 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72    }.#endif.  for
1a590 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
1a5a0 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
1a5b0 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
1a5c0 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
1a5d0 66 28 20 70 2d 3e 69 52 65 67 20 26 26 20 70 2d  f( p->iReg && p-
1a5e0 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e  >iLevel>pParse->
1a5f0 69 43 61 63 68 65 4c 65 76 65 6c 20 29 7b 0a 20  iCacheLevel ){. 
1a600 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43       cacheEntryC
1a610 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b  lear(pParse, p);
1a620 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1a630 0a 2a 2a 20 57 68 65 6e 20 61 20 63 61 63 68 65  .** When a cache
1a640 64 20 63 6f 6c 75 6d 6e 20 69 73 20 72 65 75 73  d column is reus
1a650 65 64 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  ed, make sure th
1a660 61 74 20 69 74 73 20 72 65 67 69 73 74 65 72 20  at its register 
1a670 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20  is.** no longer 
1a680 61 76 61 69 6c 61 62 6c 65 20 61 73 20 61 20 74  available as a t
1a690 65 6d 70 20 72 65 67 69 73 74 65 72 2e 20 20 74  emp register.  t
1a6a0 69 63 6b 65 74 20 23 33 38 37 39 3a 20 20 74 68  icket #3879:  th
1a6b0 61 74 20 73 61 6d 65 0a 2a 2a 20 72 65 67 69 73  at same.** regis
1a6c0 74 65 72 20 6d 69 67 68 74 20 62 65 20 69 6e 20  ter might be in 
1a6d0 74 68 65 20 63 61 63 68 65 20 69 6e 20 6d 75 6c  the cache in mul
1a6e0 74 69 70 6c 65 20 70 6c 61 63 65 73 2c 20 73 6f  tiple places, so
1a6f0 20 62 65 20 73 75 72 65 20 74 6f 0a 2a 2a 20 67   be sure to.** g
1a700 65 74 20 74 68 65 6d 20 61 6c 6c 2e 0a 2a 2f 0a  et them all..*/.
1a710 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
1a720 74 65 33 45 78 70 72 43 61 63 68 65 50 69 6e 52  te3ExprCachePinR
1a730 65 67 69 73 74 65 72 28 50 61 72 73 65 20 2a 70  egister(Parse *p
1a740 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29  Parse, int iReg)
1a750 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
1a760 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
1a770 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ;.  for(i=0, p=p
1a780 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
1a790 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
1a7a0 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
1a7b0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65  {.    if( p->iRe
1a7c0 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20 20  g==iReg ){.     
1a7d0 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b   p->tempReg = 0;
1a7e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1a7f0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1a800 68 61 74 20 77 69 6c 6c 20 6c 6f 61 64 20 69 6e  hat will load in
1a810 74 6f 20 72 65 67 69 73 74 65 72 20 72 65 67 4f  to register regO
1a820 75 74 20 61 20 76 61 6c 75 65 20 74 68 61 74 20  ut a value that 
1a830 69 73 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74  is.** appropriat
1a840 65 20 66 6f 72 20 74 68 65 20 69 49 64 78 43 6f  e for the iIdxCo
1a850 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 69  l-th column of i
1a860 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 76 6f  ndex pIdx..*/.vo
1a870 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
1a880 64 65 4c 6f 61 64 49 6e 64 65 78 43 6f 6c 75 6d  deLoadIndexColum
1a890 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
1a8a0 73 65 2c 20 20 2f 2a 20 54 68 65 20 70 61 72 73  se,  /* The pars
1a8b0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1a8c0 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20   Index *pIdx,   
1a8d0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 68   /* The index wh
1a8e0 6f 73 65 20 63 6f 6c 75 6d 6e 20 69 73 20 74 6f  ose column is to
1a8f0 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20   be loaded */.  
1a900 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20 20  int iTabCur,    
1a910 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69  /* Cursor pointi
1a920 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 72 6f  ng to a table ro
1a930 77 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43  w */.  int iIdxC
1a940 6f 6c 2c 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ol,    /* The co
1a950 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
1a960 78 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a  x to be loaded *
1a970 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20 20  /.  int regOut  
1a980 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
1a990 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 76 61   index column va
1a9a0 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65 67 69  lue in this regi
1a9b0 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 31 36  ster */.){.  i16
1a9c0 20 69 54 61 62 43 6f 6c 20 3d 20 70 49 64 78 2d   iTabCol = pIdx-
1a9d0 3e 61 69 43 6f 6c 75 6d 6e 5b 69 49 64 78 43 6f  >aiColumn[iIdxCo
1a9e0 6c 5d 3b 0a 20 20 69 66 28 20 69 54 61 62 43 6f  l];.  if( iTabCo
1a9f0 6c 3d 3d 58 4e 5f 45 58 50 52 20 29 7b 0a 20 20  l==XN_EXPR ){.  
1aa00 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
1aa10 61 43 6f 6c 45 78 70 72 20 29 3b 0a 20 20 20 20  aColExpr );.    
1aa20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 43  assert( pIdx->aC
1aa30 6f 6c 45 78 70 72 2d 3e 6e 45 78 70 72 3e 69 49  olExpr->nExpr>iI
1aa40 64 78 43 6f 6c 20 29 3b 0a 20 20 20 20 70 50 61  dxCol );.    pPa
1aa50 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20  rse->iSelfTab = 
1aa60 69 54 61 62 43 75 72 3b 0a 20 20 20 20 73 71 6c  iTabCur;.    sql
1aa70 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79  ite3ExprCodeCopy
1aa80 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 61  (pParse, pIdx->a
1aa90 43 6f 6c 45 78 70 72 2d 3e 61 5b 69 49 64 78 43  ColExpr->a[iIdxC
1aaa0 6f 6c 5d 2e 70 45 78 70 72 2c 20 72 65 67 4f 75  ol].pExpr, regOu
1aab0 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
1aac0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1aad0 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
1aae0 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
1aaf0 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20 69 54  pIdx->pTable, iT
1ab00 61 62 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20  abCur,.         
1ab10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab20 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62 43             iTabC
1ab30 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d  ol, regOut);.  }
1ab40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1ab50 74 65 20 63 6f 64 65 20 74 6f 20 65 78 74 72 61  te code to extra
1ab60 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ct the value of 
1ab70 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75  the iCol-th colu
1ab80 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a 2a  mn of a table..*
1ab90 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1aba0 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f  prCodeGetColumnO
1abb0 66 54 61 62 6c 65 28 0a 20 20 56 64 62 65 20 2a  fTable(.  Vdbe *
1abc0 76 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  v,        /* The
1abd0 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73   VDBE under cons
1abe0 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 61  truction */.  Ta
1abf0 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 2f 2a  ble *pTab,    /*
1ac00 20 54 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61   The table conta
1ac10 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20  ining the value 
1ac20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72  */.  int iTabCur
1ac30 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  ,    /* The tabl
1ac40 65 20 63 75 72 73 6f 72 2e 20 20 4f 72 20 74 68  e cursor.  Or th
1ac50 65 20 50 4b 20 63 75 72 73 6f 72 20 66 6f 72 20  e PK cursor for 
1ac60 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 2a 2f  WITHOUT ROWID */
1ac70 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20  .  int iCol,    
1ac80 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
1ac90 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65 78 74  he column to ext
1aca0 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ract */.  int re
1acb0 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 45 78 74  gOut      /* Ext
1acc0 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 69  ract the value i
1acd0 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73 74 65  nto this registe
1ace0 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 43  r */.){.  if( iC
1acf0 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54  ol<0 || iCol==pT
1ad00 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20  ab->iPKey ){.   
1ad10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ad20 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20  p2(v, OP_Rowid, 
1ad30 69 54 61 62 43 75 72 2c 20 72 65 67 4f 75 74 29  iTabCur, regOut)
1ad40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1ad50 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75 61  nt op = IsVirtua
1ad60 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f  l(pTab) ? OP_VCo
1ad70 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e  lumn : OP_Column
1ad80 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 69 43  ;.    int x = iC
1ad90 6f 6c 3b 0a 20 20 20 20 69 66 28 20 21 48 61 73  ol;.    if( !Has
1ada0 52 6f 77 69 64 28 70 54 61 62 29 20 26 26 20 21  Rowid(pTab) && !
1adb0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
1adc0 29 7b 0a 20 20 20 20 20 20 78 20 3d 20 73 71 6c  ){.      x = sql
1add0 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65  ite3ColumnOfInde
1ade0 78 28 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  x(sqlite3Primary
1adf0 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 2c 20  KeyIndex(pTab), 
1ae00 69 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  iCol);.    }.   
1ae10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ae20 70 33 28 76 2c 20 6f 70 2c 20 69 54 61 62 43 75  p3(v, op, iTabCu
1ae30 72 2c 20 78 2c 20 72 65 67 4f 75 74 29 3b 0a 20  r, x, regOut);. 
1ae40 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30   }.  if( iCol>=0
1ae50 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
1ae60 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20  olumnDefault(v, 
1ae70 70 54 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67 4f  pTab, iCol, regO
1ae80 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ut);.  }.}../*.*
1ae90 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1aea0 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63  that will extrac
1aeb0 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68  t the iColumn-th
1aec0 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20   column from.** 
1aed0 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 73  table pTab and s
1aee0 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  tore the column 
1aef0 76 61 6c 75 65 20 69 6e 20 61 20 72 65 67 69 73  value in a regis
1af00 74 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  ter. .**.** An e
1af10 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f  ffort is made to
1af20 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d   store the colum
1af30 6e 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  n value in regis
1af40 74 65 72 20 69 52 65 67 2e 20 20 54 68 69 73 0a  ter iReg.  This.
1af50 2a 2a 20 69 73 20 6e 6f 74 20 67 61 72 61 6e 74  ** is not garant
1af60 65 65 65 64 20 66 6f 72 20 47 65 74 43 6f 6c 75  eeed for GetColu
1af70 6d 6e 28 29 20 2d 20 74 68 65 20 72 65 73 75 6c  mn() - the resul
1af80 74 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64 20  t can be stored 
1af90 69 6e 0a 2a 2a 20 61 6e 79 20 72 65 67 69 73 74  in.** any regist
1afa0 65 72 2e 20 20 42 75 74 20 74 68 65 20 72 65 73  er.  But the res
1afb0 75 6c 74 20 69 73 20 67 75 61 72 61 6e 74 65 65  ult is guarantee
1afc0 64 20 74 6f 20 6c 61 6e 64 20 69 6e 20 72 65 67  d to land in reg
1afd0 69 73 74 65 72 20 69 52 65 67 0a 2a 2a 20 66 6f  ister iReg.** fo
1afe0 72 20 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67  r GetColumnToReg
1aff0 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  ()..**.** There 
1b000 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20  must be an open 
1b010 63 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20 69  cursor to pTab i
1b020 6e 20 69 54 61 62 6c 65 20 77 68 65 6e 20 74 68  n iTable when th
1b030 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  is routine.** is
1b040 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f   called.  If iCo
1b050 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65  lumn<0 then code
1b060 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 68   is generated th
1b070 61 74 20 65 78 74 72 61 63 74 73 20 74 68 65 20  at extracts the 
1b080 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rowid..*/.int sq
1b090 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
1b0a0 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20  Column(.  Parse 
1b0b0 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61  *pParse,   /* Pa
1b0c0 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
1b0d0 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
1b0e0 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  t */.  Table *pT
1b0f0 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72  ab,     /* Descr
1b100 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61  iption of the ta
1b110 62 6c 65 20 77 65 20 61 72 65 20 72 65 61 64 69  ble we are readi
1b120 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ng from */.  int
1b130 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a   iColumn,     /*
1b140 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61   Index of the ta
1b150 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ble column */.  
1b160 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
1b170 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70   /* The cursor p
1b180 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74  ointing to the t
1b190 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  able */.  int iR
1b1a0 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 74  eg,        /* St
1b1b0 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65 72 65  ore results here
1b1c0 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20   */.  u8 p5     
1b1d0 20 20 20 20 20 20 20 2f 2a 20 50 35 20 76 61 6c         /* P5 val
1b1e0 75 65 20 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e  ue for OP_Column
1b1f0 20 2b 20 46 4c 41 47 53 20 2a 2f 0a 29 7b 0a 20   + FLAGS */.){. 
1b200 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1b210 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
1b220 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
1b230 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72  Cache *p;..  for
1b240 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
1b250 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
1b260 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
1b270 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
1b280 66 28 20 70 2d 3e 69 52 65 67 3e 30 20 26 26 20  f( p->iReg>0 && 
1b290 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c  p->iTable==iTabl
1b2a0 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d  e && p->iColumn=
1b2b0 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  =iColumn ){.    
1b2c0 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73    p->lru = pPars
1b2d0 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a  e->iCacheCnt++;.
1b2e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1b2f0 72 43 61 63 68 65 50 69 6e 52 65 67 69 73 74 65  rCachePinRegiste
1b300 72 28 70 50 61 72 73 65 2c 20 70 2d 3e 69 52 65  r(pParse, p->iRe
1b310 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  g);.      return
1b320 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a   p->iReg;.    }.
1b330 20 20 7d 20 20 0a 20 20 61 73 73 65 72 74 28 20    }  .  assert( 
1b340 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  v!=0 );.  sqlite
1b350 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
1b360 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61  mnOfTable(v, pTa
1b370 62 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75  b, iTable, iColu
1b380 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 69 66 28  mn, iReg);.  if(
1b390 20 70 35 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   p5 ){.    sqlit
1b3a0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
1b3b0 2c 20 70 35 29 3b 0a 20 20 7d 65 6c 73 65 7b 20  , p5);.  }else{ 
1b3c0 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78    .    sqlite3Ex
1b3d0 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61  prCacheStore(pPa
1b3e0 72 73 65 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f  rse, iTable, iCo
1b3f0 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 7d  lumn, iReg);.  }
1b400 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a  .  return iReg;.
1b410 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  }.void sqlite3Ex
1b420 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 54  prCodeGetColumnT
1b430 6f 52 65 67 28 0a 20 20 50 61 72 73 65 20 2a 70  oReg(.  Parse *p
1b440 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73  Parse,   /* Pars
1b450 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
1b460 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
1b470 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
1b480 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70  ,     /* Descrip
1b490 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  tion of the tabl
1b4a0 65 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  e we are reading
1b4b0 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
1b4c0 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49  Column,     /* I
1b4d0 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c  ndex of the tabl
1b4e0 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e  e column */.  in
1b4f0 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f  t iTable,      /
1b500 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69  * The cursor poi
1b510 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62  nting to the tab
1b520 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67  le */.  int iReg
1b530 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72           /* Stor
1b540 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  e results here *
1b550 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20  /.){.  int r1 = 
1b560 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1b570 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  etColumn(pParse,
1b580 20 70 54 61 62 2c 20 69 43 6f 6c 75 6d 6e 2c 20   pTab, iColumn, 
1b590 69 54 61 62 6c 65 2c 20 69 52 65 67 2c 20 30 29  iTable, iReg, 0)
1b5a0 3b 0a 20 20 69 66 28 20 72 31 21 3d 69 52 65 67  ;.  if( r1!=iReg
1b5b0 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   ) sqlite3VdbeAd
1b5c0 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp2(pParse->pVd
1b5d0 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31  be, OP_SCopy, r1
1b5e0 2c 20 69 52 65 67 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  , iReg);.}.../*.
1b5f0 2a 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6c  ** Clear all col
1b600 75 6d 6e 20 63 61 63 68 65 20 65 6e 74 72 69 65  umn cache entrie
1b610 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1b620 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
1b630 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
1b640 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
1b650 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
1b660 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42  ..#if SQLITE_DEB
1b670 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  UG.  if( pParse-
1b680 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
1b690 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61  ITE_VdbeAddopTra
1b6a0 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  ce ){.    printf
1b6b0 28 22 43 4c 45 41 52 5c 6e 22 29 3b 0a 20 20 7d  ("CLEAR\n");.  }
1b6c0 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d  .#endif.  for(i=
1b6d0 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
1b6e0 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
1b6f0 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
1b700 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , p++){.    if( 
1b710 70 2d 3e 69 52 65 67 20 29 7b 0a 20 20 20 20 20  p->iReg ){.     
1b720 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72   cacheEntryClear
1b730 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
1b740 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
1b750 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
1b760 74 68 61 74 20 61 6e 20 61 66 66 69 6e 69 74 79  that an affinity
1b770 20 63 68 61 6e 67 65 20 68 61 73 20 6f 63 63 75   change has occu
1b780 72 72 65 64 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a  rred on iCount.*
1b790 2a 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  * registers star
1b7a0 74 69 6e 67 20 77 69 74 68 20 69 53 74 61 72 74  ting with iStart
1b7b0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1b7c0 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
1b7d0 74 79 43 68 61 6e 67 65 28 50 61 72 73 65 20 2a  tyChange(Parse *
1b7e0 70 50 61 72 73 65 2c 20 69 6e 74 20 69 53 74 61  pParse, int iSta
1b7f0 72 74 2c 20 69 6e 74 20 69 43 6f 75 6e 74 29 7b  rt, int iCount){
1b800 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
1b810 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65  cheRemove(pParse
1b820 2c 20 69 53 74 61 72 74 2c 20 69 43 6f 75 6e 74  , iStart, iCount
1b830 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
1b840 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76  rate code to mov
1b850 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72  e content from r
1b860 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e  egisters iFrom..
1b870 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a  .iFrom+nReg-1.**
1b880 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54   over to iTo..iT
1b890 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70 20 74  o+nReg-1. Keep t
1b8a0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
1b8b0 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76  up-to-date..*/.v
1b8c0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1b8d0 6f 64 65 4d 6f 76 65 28 50 61 72 73 65 20 2a 70  odeMove(Parse *p
1b8e0 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d  Parse, int iFrom
1b8f0 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e  , int iTo, int n
1b900 52 65 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Reg){.  assert( 
1b910 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52 65 67 20  iFrom>=iTo+nReg 
1b920 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65 67 3c 3d 69  || iFrom+nReg<=i
1b930 54 6f 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  To );.  sqlite3V
1b940 64 62 65 41 64 64 4f 70 33 28 70 50 61 72 73 65  dbeAddOp3(pParse
1b950 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65  ->pVdbe, OP_Move
1b960 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52  , iFrom, iTo, nR
1b970 65 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  eg);.  sqlite3Ex
1b980 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
1b990 61 72 73 65 2c 20 69 46 72 6f 6d 2c 20 6e 52 65  arse, iFrom, nRe
1b9a0 67 29 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e  g);.}..#if defin
1b9b0 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
1b9c0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
1b9d0 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54  TE_COVERAGE_TEST
1b9e0 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  )./*.** Return t
1b9f0 72 75 65 20 69 66 20 61 6e 79 20 72 65 67 69 73  rue if any regis
1ba00 74 65 72 20 69 6e 20 74 68 65 20 72 61 6e 67 65  ter in the range
1ba10 20 69 46 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63   iFrom..iTo (inc
1ba20 6c 75 73 69 76 65 29 0a 2a 2a 20 69 73 20 75 73  lusive).** is us
1ba30 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
1ba40 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a  e column cache..
1ba50 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1ba60 6e 65 20 69 73 20 75 73 65 64 20 77 69 74 68 69  ne is used withi
1ba70 6e 20 61 73 73 65 72 74 28 29 20 61 6e 64 20 74  n assert() and t
1ba80 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 73  estcase() macros
1ba90 20 6f 6e 6c 79 0a 2a 2a 20 61 6e 64 20 64 6f 65   only.** and doe
1baa0 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e 20  s not appear in 
1bab0 61 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 2e 0a  a normal build..
1bac0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 73  */.static int us
1bad0 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28  edAsColumnCache(
1bae0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1baf0 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54  nt iFrom, int iT
1bb00 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  o){.  int i;.  s
1bb10 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
1bb20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  *p;.  for(i=0, p
1bb30 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
1bb40 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
1bb50 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
1bb60 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20  +){.    int r = 
1bb70 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28  p->iReg;.    if(
1bb80 20 72 3e 3d 69 46 72 6f 6d 20 26 26 20 72 3c 3d   r>=iFrom && r<=
1bb90 69 54 6f 20 29 20 72 65 74 75 72 6e 20 31 3b 20  iTo ) return 1; 
1bba0 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20     /*NO_TEST*/. 
1bbb0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1bbc0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1bbd0 45 5f 44 45 42 55 47 20 7c 7c 20 53 51 4c 49 54  E_DEBUG || SQLIT
1bbe0 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54 20  E_COVERAGE_TEST 
1bbf0 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  */.../*.** Conve
1bc00 72 74 20 61 20 73 63 61 6c 61 72 20 65 78 70 72  rt a scalar expr
1bc10 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74 6f 20 61  ession node to a
1bc20 20 54 4b 5f 52 45 47 49 53 54 45 52 20 72 65 66   TK_REGISTER ref
1bc30 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 72 65 67 69  erencing.** regi
1bc40 73 74 65 72 20 69 52 65 67 2e 20 20 54 68 65 20  ster iReg.  The 
1bc50 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75  caller must ensu
1bc60 72 65 20 74 68 61 74 20 69 52 65 67 20 61 6c 72  re that iReg alr
1bc70 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  eady contains.**
1bc80 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
1bc90 75 65 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ue for the expre
1bca0 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssion..*/.static
1bcb0 20 76 6f 69 64 20 65 78 70 72 54 6f 52 65 67 69   void exprToRegi
1bcc0 73 74 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e  ster(Expr *p, in
1bcd0 74 20 69 52 65 67 29 7b 0a 20 20 70 2d 3e 6f 70  t iReg){.  p->op
1bce0 32 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 2d 3e  2 = p->op;.  p->
1bcf0 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52  op = TK_REGISTER
1bd00 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20  ;.  p->iTable = 
1bd10 69 52 65 67 3b 0a 20 20 45 78 70 72 43 6c 65 61  iReg;.  ExprClea
1bd20 72 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  rProperty(p, EP_
1bd30 53 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Skip);.}../*.** 
1bd40 45 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72  Evaluate an expr
1bd50 65 73 73 69 6f 6e 20 28 65 69 74 68 65 72 20 61  ession (either a
1bd60 20 76 65 63 74 6f 72 20 6f 72 20 61 20 73 63 61   vector or a sca
1bd70 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 29 20  lar expression) 
1bd80 61 6e 64 20 73 74 6f 72 65 0a 2a 2a 20 74 68 65  and store.** the
1bd90 20 72 65 73 75 6c 74 20 69 6e 20 63 6f 6e 74 69   result in conti
1bda0 6e 67 75 6f 75 73 20 74 65 6d 70 6f 72 61 72 79  nguous temporary
1bdb0 20 72 65 67 69 73 74 65 72 73 2e 20 20 52 65 74   registers.  Ret
1bdc0 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
1bdd0 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72 65  .** the first re
1bde0 67 69 73 74 65 72 20 75 73 65 64 20 74 6f 20 73  gister used to s
1bdf0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 2e  tore the result.
1be00 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
1be10 74 75 72 6e 65 64 20 72 65 73 75 6c 74 20 72 65  turned result re
1be20 67 69 73 74 65 72 20 69 73 20 61 20 74 65 6d 70  gister is a temp
1be30 6f 72 61 72 79 20 73 63 61 6c 61 72 2c 20 74 68  orary scalar, th
1be40 65 6e 20 61 6c 73 6f 20 77 72 69 74 65 0a 2a 2a  en also write.**
1be50 20 74 68 61 74 20 72 65 67 69 73 74 65 72 20 6e   that register n
1be60 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 69 46 72  umber into *piFr
1be70 65 65 61 62 6c 65 2e 20 20 49 66 20 74 68 65 20  eeable.  If the 
1be80 72 65 74 75 72 6e 65 64 20 72 65 73 75 6c 74 20  returned result 
1be90 72 65 67 69 73 74 65 72 0a 2a 2a 20 69 73 20 6e  register.** is n
1bea0 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f  ot a temporary o
1beb0 72 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  r if the express
1bec0 69 6f 6e 20 69 73 20 61 20 76 65 63 74 6f 72 20  ion is a vector 
1bed0 73 65 74 20 2a 70 69 46 72 65 65 61 62 6c 65 0a  set *piFreeable.
1bee0 2a 2a 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74  ** to 0..*/.stat
1bef0 69 63 20 69 6e 74 20 65 78 70 72 43 6f 64 65 56  ic int exprCodeV
1bf00 65 63 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61  ector(Parse *pPa
1bf10 72 73 65 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e  rse, Expr *p, in
1bf20 74 20 2a 70 69 46 72 65 65 61 62 6c 65 29 7b 0a  t *piFreeable){.
1bf30 20 20 69 6e 74 20 69 52 65 73 75 6c 74 3b 0a 20    int iResult;. 
1bf40 20 69 6e 74 20 6e 52 65 73 75 6c 74 20 3d 20 73   int nResult = s
1bf50 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
1bf60 53 69 7a 65 28 70 29 3b 0a 20 20 69 66 28 20 6e  Size(p);.  if( n
1bf70 52 65 73 75 6c 74 3d 3d 31 20 29 7b 0a 20 20 20  Result==1 ){.   
1bf80 20 69 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74   iResult = sqlit
1bf90 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1bfa0 50 61 72 73 65 2c 20 70 2c 20 70 69 46 72 65 65  Parse, p, piFree
1bfb0 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  able);.  }else{.
1bfc0 20 20 20 20 2a 70 69 46 72 65 65 61 62 6c 65 20      *piFreeable 
1bfd0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  = 0;.    if( p->
1bfe0 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
1bff0 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d  .      iResult =
1c000 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
1c010 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
1c020 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73   0, 0);.    }els
1c030 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  e{.      int i;.
1c040 20 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20        iResult = 
1c050 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
1c060 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
1c070 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 3b 0a 20  em += nResult;. 
1c080 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1c090 6e 52 65 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20  nResult; i++){. 
1c0a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1c0b0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1c0c0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ->x.pList->a[i].
1c0d0 70 45 78 70 72 2c 20 69 2b 69 52 65 73 75 6c 74  pExpr, i+iResult
1c0e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1c0f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52  .  }.  return iR
1c100 65 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  esult;.}.../*.**
1c110 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
1c120 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20  nto the current 
1c130 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65  Vdbe to evaluate
1c140 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78   the given.** ex
1c150 70 72 65 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d  pression.  Attem
1c160 70 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  pt to store the 
1c170 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73  results in regis
1c180 74 65 72 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a  ter "target"..**
1c190 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69   Return the regi
1c1a0 73 74 65 72 20 77 68 65 72 65 20 72 65 73 75 6c  ster where resul
1c1b0 74 73 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a  ts are stored..*
1c1c0 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69 73 20 72  *.** With this r
1c1d0 6f 75 74 69 6e 65 2c 20 74 68 65 72 65 20 69 73  outine, there is
1c1e0 20 6e 6f 20 67 75 61 72 61 6e 74 65 65 20 74 68   no guarantee th
1c1f0 61 74 20 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a  at results will.
1c200 2a 2a 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ** be stored in 
1c210 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73  target.  The res
1c220 75 6c 74 20 6d 69 67 68 74 20 62 65 20 73 74 6f  ult might be sto
1c230 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65  red in some othe
1c240 72 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 66  r.** register if
1c250 20 69 74 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e   it is convenien
1c260 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65  t to do so.  The
1c270 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
1c280 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b 20  n.** must check 
1c290 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
1c2a0 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 72 65 73  and move the res
1c2b0 75 6c 74 73 20 74 6f 20 74 68 65 20 64 65 73 69  ults to the desi
1c2c0 72 65 64 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e  red.** register.
1c2d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
1c2e0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 50 61  xprCodeTarget(Pa
1c2f0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
1c300 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
1c310 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76  rget){.  Vdbe *v
1c320 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
1c330 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64  ;  /* The VM und
1c340 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
1c350 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  */.  int op;    
1c360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c370 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69  * The opcode bei
1c380 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  ng coded */.  in
1c390 74 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74  t inReg = target
1c3a0 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c  ;       /* Resul
1c3b0 74 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67  ts stored in reg
1c3c0 69 73 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20  ister inReg */. 
1c3d0 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
1c3e0 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  0;         /* If
1c3f0 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74   non-zero free t
1c400 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65  his temporary re
1c410 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
1c420 72 65 67 46 72 65 65 32 20 3d 20 30 3b 20 20 20  regFree2 = 0;   
1c430 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d        /* If non-
1c440 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74  zero free this t
1c450 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
1c460 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72  r */.  int r1, r
1c470 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
1c480 20 2f 2a 20 56 61 72 69 6f 75 73 20 72 65 67 69   /* Various regi
1c490 73 74 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a  ster numbers */.
1c4a0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1c4b0 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54  pParse->db; /* T
1c4c0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
1c4d0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ection */.  Expr
1c4e0 20 74 65 6d 70 58 3b 20 20 20 20 20 20 20 20 20   tempX;         
1c4f0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
1c500 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ry expression no
1c510 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 35 20 3d  de */.  int p5 =
1c520 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74   0;..  assert( t
1c530 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65  arget>0 && targe
1c540 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  t<=pParse->nMem 
1c550 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b  );.  if( v==0 ){
1c560 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1c570 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
1c580 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74  ailed );.    ret
1c590 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66  urn 0;.  }..  if
1c5a0 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20  ( pExpr==0 ){.  
1c5b0 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a    op = TK_NULL;.
1c5c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20    }else{.    op 
1c5d0 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d  = pExpr->op;.  }
1c5e0 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
1c5f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
1c600 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
1c610 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
1c620 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67  fo = pExpr->pAgg
1c630 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75  Info;.      stru
1c640 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
1c650 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f  pCol = &pAggInfo
1c660 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41  ->aCol[pExpr->iA
1c670 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21  gg];.      if( !
1c680 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
1c690 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Mode ){.        
1c6a0 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d  assert( pCol->iM
1c6b0 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  em>0 );.        
1c6c0 69 6e 52 65 67 20 3d 20 70 43 6f 6c 2d 3e 69 4d  inReg = pCol->iM
1c6d0 65 6d 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  em;.        brea
1c6e0 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  k;.      }else i
1c6f0 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65  f( pAggInfo->use
1c700 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20  SortingIdx ){.  
1c710 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1c720 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
1c730 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e  lumn, pAggInfo->
1c740 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62 2c 0a  sortingIdxPTab,.
1c750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
1c770 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
1c780 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  n, target);.    
1c790 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1c7a0 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65   }.      /* Othe
1c7b0 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75  rwise, fall thru
1c7c0 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c   into the TK_COL
1c7d0 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  UMN case */.    
1c7e0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
1c7f0 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  LUMN: {.      in
1c800 74 20 69 54 61 62 20 3d 20 70 45 78 70 72 2d 3e  t iTab = pExpr->
1c810 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 69 66  iTable;.      if
1c820 28 20 69 54 61 62 3c 30 20 29 7b 0a 20 20 20 20  ( iTab<0 ){.    
1c830 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
1c840 63 6b 42 61 73 65 3e 30 20 29 7b 0a 20 20 20 20  ckBase>0 ){.    
1c850 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
1c860 69 6e 67 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  ing CHECK constr
1c870 61 69 6e 74 73 20 6f 72 20 69 6e 73 65 72 74 69  aints or inserti
1c880 6e 67 20 69 6e 74 6f 20 70 61 72 74 69 61 6c 20  ng into partial 
1c890 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20  index */.       
1c8a0 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72     inReg = pExpr
1c8b0 2d 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70 50 61 72  ->iColumn + pPar
1c8c0 73 65 2d 3e 63 6b 42 61 73 65 3b 0a 20 20 20 20  se->ckBase;.    
1c8d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c8e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c8f0 20 20 20 20 20 20 2f 2a 20 43 6f 64 69 6e 67 20        /* Coding 
1c900 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
1c910 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
1c920 20 69 6e 64 65 78 20 77 68 65 72 65 20 63 6f 6c   index where col
1c930 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 20 20 20 20  umn names.      
1c940 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e      ** in the in
1c950 64 65 78 20 72 65 66 65 72 20 74 6f 20 74 68 65  dex refer to the
1c960 20 74 61 62 6c 65 20 74 6f 20 77 68 69 63 68 20   table to which 
1c970 74 68 65 20 69 6e 64 65 78 20 62 65 6c 6f 6e 67  the index belong
1c980 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  s */.          i
1c990 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 69 53  Tab = pParse->iS
1c9a0 65 6c 66 54 61 62 3b 0a 20 20 20 20 20 20 20 20  elfTab;.        
1c9b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1c9c0 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
1c9d0 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
1c9e0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1c9f0 70 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20  pTab,.          
1ca00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca10 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
1ca20 75 6d 6e 2c 20 69 54 61 62 2c 20 74 61 72 67 65  umn, iTab, targe
1ca30 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
1ca40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca50 20 20 70 45 78 70 72 2d 3e 6f 70 32 29 3b 0a 20    pExpr->op2);. 
1ca60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ca70 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
1ca80 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63  TEGER: {.      c
1ca90 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73  odeInteger(pPars
1caa0 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 74 61 72  e, pExpr, 0, tar
1cab0 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  get);.      brea
1cac0 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
1cad0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
1cae0 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
1caf0 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b  case TK_FLOAT: {
1cb00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1cb10 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1cb20 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
1cb30 75 65 29 20 29 3b 0a 20 20 20 20 20 20 63 6f 64  ue) );.      cod
1cb40 65 52 65 61 6c 28 76 2c 20 70 45 78 70 72 2d 3e  eReal(v, pExpr->
1cb50 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74 61 72  u.zToken, 0, tar
1cb60 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  get);.      brea
1cb70 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
1cb80 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
1cb90 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  NG: {.      asse
1cba0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1cbb0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
1cbc0 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
1cbd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61    sqlite3VdbeLoa
1cbe0 64 53 74 72 69 6e 67 28 76 2c 20 74 61 72 67 65  dString(v, targe
1cbf0 74 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t, pExpr->u.zTok
1cc00 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  en);.      break
1cc10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1cc20 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20   TK_NULL: {.    
1cc30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1cc40 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
1cc50 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
1cc60 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1cc70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1cc80 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a  IT_BLOB_LITERAL.
1cc90 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
1cca0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b  : {.      int n;
1ccb0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
1ccc0 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61 72  r *z;.      char
1ccd0 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20 61   *zBlob;.      a
1cce0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1ccf0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1cd00 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
1cd10 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
1cd20 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d  pr->u.zToken[0]=
1cd30 3d 27 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e 75  ='x' || pExpr->u
1cd40 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20  .zToken[0]=='X' 
1cd50 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1cd60 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1cd70 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20  [1]=='\'' );.   
1cd80 20 20 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e 75     z = &pExpr->u
1cd90 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20  .zToken[2];.    
1cda0 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72    n = sqlite3Str
1cdb0 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20 20  len30(z) - 1;.  
1cdc0 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b 6e 5d      assert( z[n]
1cdd0 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20  =='\'' );.      
1cde0 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 48  zBlob = sqlite3H
1cdf0 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33  exToBlob(sqlite3
1ce00 56 64 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29  VdbeDb(v), z, n)
1ce10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1ce20 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1ce30 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65  Blob, n/2, targe
1ce40 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f  t, 0, zBlob, P4_
1ce50 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
1ce60 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
1ce70 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  dif.    case TK_
1ce80 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20  VARIABLE: {.    
1ce90 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1cea0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1ceb0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1cec0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ced0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21  pExpr->u.zToken!
1cee0 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
1cef0 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
1cf00 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20  ken[0]!=0 );.   
1cf10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1cf20 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72 69 61  dOp2(v, OP_Varia
1cf30 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ble, pExpr->iCol
1cf40 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  umn, target);.  
1cf50 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 75      if( pExpr->u
1cf60 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20 29 7b  .zToken[1]!=0 ){
1cf70 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1cf80 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1cf90 5b 30 5d 3d 3d 27 3f 27 20 0a 20 20 20 20 20 20  [0]=='?' .      
1cfa0 20 20 20 20 20 20 20 7c 7c 20 73 74 72 63 6d 70         || strcmp
1cfb0 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
1cfc0 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b  , pParse->azVar[
1cfd0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31  pExpr->iColumn-1
1cfe0 5d 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ])==0 );.       
1cff0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1d000 67 65 50 34 28 76 2c 20 2d 31 2c 20 70 50 61 72  geP4(v, -1, pPar
1d010 73 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72 2d  se->azVar[pExpr-
1d020 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 2c 20 50 34 5f  >iColumn-1], P4_
1d030 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d  STATIC);.      }
1d040 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1d050 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1d060 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20  REGISTER: {.    
1d070 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d    inReg = pExpr-
1d080 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 62  >iTable;.      b
1d090 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
1d0a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1d0b0 43 41 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b  CAST.    case TK
1d0c0 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f  _CAST: {.      /
1d0d0 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  * Expressions of
1d0e0 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53   the form:   CAS
1d0f0 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e  T(pLeft AS token
1d100 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 52 65 67  ) */.      inReg
1d110 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1d120 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
1d130 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74   pExpr->pLeft, t
1d140 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66  arget);.      if
1d150 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20  ( inReg!=target 
1d160 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1d170 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1d180 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c  OP_SCopy, inReg,
1d190 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1d1a0 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74    inReg = target
1d1b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d1c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d1d0 32 28 76 2c 20 4f 50 5f 43 61 73 74 2c 20 74 61  2(v, OP_Cast, ta
1d1e0 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20  rget,.          
1d1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1d200 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
1d210 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  e(pExpr->u.zToke
1d220 6e 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 74 65  n, 0));.      te
1d230 73 74 63 61 73 65 28 20 75 73 65 64 41 73 43 6f  stcase( usedAsCo
1d240 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65  lumnCache(pParse
1d250 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65 67 29 20  , inReg, inReg) 
1d260 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1d270 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
1d280 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
1d290 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 20  inReg, 1);.     
1d2a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
1d2b0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1d2c0 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20  MIT_CAST */.    
1d2d0 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20  case TK_IS:.    
1d2e0 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20  case TK_ISNOT:. 
1d2f0 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54       op = (op==T
1d300 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20  K_IS) ? TK_EQ : 
1d310 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 70 35 20  TK_NE;.      p5 
1d320 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b  = SQLITE_NULLEQ;
1d330 0a 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 2d 74  .      /* fall-t
1d340 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61  hrough */.    ca
1d350 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
1d360 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
1d370 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
1d380 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
1d390 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
1d3a0 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
1d3b0 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
1d3c0 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
1d3d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
1d3e0 78 70 72 49 73 56 65 63 74 6f 72 28 70 4c 65 66  xprIsVector(pLef
1d3f0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  t) ){.        co
1d400 64 65 56 65 63 74 6f 72 43 6f 6d 70 61 72 65 28  deVectorCompare(
1d410 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
1d420 61 72 67 65 74 2c 20 6f 70 2c 20 70 35 29 3b 0a  arget, op, p5);.
1d430 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d440 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1d450 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1d460 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 72 65  arse, pLeft, &re
1d470 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20  gFree1);.       
1d480 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1d490 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1d4a0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1d4b0 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
1d4c0 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
1d4d0 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
1d4e0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
1d4f0 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  p,.            r
1d500 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51  1, r2, inReg, SQ
1d510 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 7c 20 70  LITE_STOREP2 | p
1d520 35 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  5);.        asse
1d530 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29  rt(TK_LT==OP_Lt)
1d540 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1d550 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Lt); VdbeCover
1d560 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
1d570 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  t);.        asse
1d580 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29  rt(TK_LE==OP_Le)
1d590 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1d5a0 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Le); VdbeCover
1d5b0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
1d5c0 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  e);.        asse
1d5d0 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29  rt(TK_GT==OP_Gt)
1d5e0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1d5f0 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Gt); VdbeCover
1d600 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
1d610 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  t);.        asse
1d620 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29  rt(TK_GE==OP_Ge)
1d630 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1d640 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Ge); VdbeCover
1d650 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
1d660 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  e);.        asse
1d670 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29  rt(TK_EQ==OP_Eq)
1d680 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1d690 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Eq); VdbeCover
1d6a0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45  ageIf(v,op==OP_E
1d6b0 71 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  q);.        asse
1d6c0 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29  rt(TK_NE==OP_Ne)
1d6d0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1d6e0 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Ne); VdbeCover
1d6f0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e  ageIf(v,op==OP_N
1d700 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  e);.        test
1d710 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1d720 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  0 );.        tes
1d730 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
1d740 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
1d750 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1d760 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
1d770 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  :.    case TK_OR
1d780 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c  :.    case TK_PL
1d790 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
1d7a0 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54  STAR:.    case T
1d7b0 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73  K_MINUS:.    cas
1d7c0 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61  e TK_REM:.    ca
1d7d0 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20  se TK_BITAND:.  
1d7e0 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a    case TK_BITOR:
1d7f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41  .    case TK_SLA
1d800 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  SH:.    case TK_
1d810 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65  LSHIFT:.    case
1d820 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20   TK_RSHIFT: .   
1d830 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a   case TK_CONCAT:
1d840 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1d850 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20   TK_AND==OP_And 
1d860 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 74 65  );            te
1d870 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41  stcase( op==TK_A
1d880 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ND );.      asse
1d890 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72  rt( TK_OR==OP_Or
1d8a0 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
1d8b0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1d8c0 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73  K_OR );.      as
1d8d0 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f  sert( TK_PLUS==O
1d8e0 50 5f 41 64 64 20 29 3b 20 20 20 20 20 20 20 20  P_Add );        
1d8f0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1d900 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20  =TK_PLUS );.    
1d910 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e    assert( TK_MIN
1d920 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20  US==OP_Subtract 
1d930 29 3b 20 20 20 20 20 74 65 73 74 63 61 73 65 28  );     testcase(
1d940 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b   op==TK_MINUS );
1d950 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1d960 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e  K_REM==OP_Remain
1d970 64 65 72 20 29 3b 20 20 20 20 20 20 74 65 73 74  der );      test
1d980 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d  case( op==TK_REM
1d990 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1d9a0 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f  ( TK_BITAND==OP_
1d9b0 42 69 74 41 6e 64 20 29 3b 20 20 20 20 20 20 74  BitAnd );      t
1d9c0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1d9d0 42 49 54 41 4e 44 20 29 3b 0a 20 20 20 20 20 20  BITAND );.      
1d9e0 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52  assert( TK_BITOR
1d9f0 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 20 20 20  ==OP_BitOr );   
1da00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1da10 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20  p==TK_BITOR );. 
1da20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1da30 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65  SLASH==OP_Divide
1da40 20 29 3b 20 20 20 20 20 20 20 74 65 73 74 63 61   );       testca
1da50 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48  se( op==TK_SLASH
1da60 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1da70 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f  ( TK_LSHIFT==OP_
1da80 53 68 69 66 74 4c 65 66 74 20 29 3b 20 20 20 74  ShiftLeft );   t
1da90 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1daa0 4c 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20  LSHIFT );.      
1dab0 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46  assert( TK_RSHIF
1dac0 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74  T==OP_ShiftRight
1dad0 20 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f   );  testcase( o
1dae0 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a  p==TK_RSHIFT );.
1daf0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1db00 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63  _CONCAT==OP_Conc
1db10 61 74 20 29 3b 20 20 20 20 20 20 74 65 73 74 63  at );      testc
1db20 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43  ase( op==TK_CONC
1db30 41 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  AT );.      r1 =
1db40 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1db50 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1db60 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1db70 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
1db80 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1db90 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1dba0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
1dbb0 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 73  gFree2);.      s
1dbc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1dbd0 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20  (v, op, r2, r1, 
1dbe0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 74  target);.      t
1dbf0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1dc00 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
1dc10 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
1dc20 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
1dc30 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1dc40 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a  se TK_UMINUS: {.
1dc50 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
1dc60 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
1dc70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1dc80 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69  pLeft );.      i
1dc90 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  f( pLeft->op==TK
1dca0 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
1dcb0 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28      codeInteger(
1dcc0 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 31  pParse, pLeft, 1
1dcd0 2c 20 74 61 72 67 65 74 29 3b 0a 23 69 66 6e 64  , target);.#ifnd
1dce0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
1dcf0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
1dd00 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c      }else if( pL
1dd10 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41  eft->op==TK_FLOA
1dd20 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  T ){.        ass
1dd30 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1dd40 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1dd50 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1dd60 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c       codeReal(v,
1dd70 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e   pLeft->u.zToken
1dd80 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 23 65  , 1, target);.#e
1dd90 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65  ndif.      }else
1dda0 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e  {.        tempX.
1ddb0 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45 52 3b  op = TK_INTEGER;
1ddc0 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 66  .        tempX.f
1ddd0 6c 61 67 73 20 3d 20 45 50 5f 49 6e 74 56 61 6c  lags = EP_IntVal
1dde0 75 65 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b  ue|EP_TokenOnly;
1ddf0 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 75  .        tempX.u
1de00 2e 69 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20  .iValue = 0;.   
1de10 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1de20 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1de30 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72  arse, &tempX, &r
1de40 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1de50 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1de60 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1de70 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1de80 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
1de90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1dea0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62  AddOp3(v, OP_Sub
1deb0 74 72 61 63 74 2c 20 72 32 2c 20 72 31 2c 20 74  tract, r2, r1, t
1dec0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1ded0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1dee0 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  e2==0 );.      }
1def0 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74  .      inReg = t
1df00 61 72 67 65 74 3b 0a 20 20 20 20 20 20 62 72 65  arget;.      bre
1df10 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1df20 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20  se TK_BITNOT:.  
1df30 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
1df40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1df50 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74  K_BITNOT==OP_Bit
1df60 4e 6f 74 20 29 3b 20 20 20 74 65 73 74 63 61 73  Not );   testcas
1df70 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54  e( op==TK_BITNOT
1df80 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1df90 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74  ( TK_NOT==OP_Not
1dfa0 20 29 3b 20 20 20 20 20 20 20 20 20 74 65 73 74   );         test
1dfb0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
1dfc0 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
1dfd0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1dfe0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1dff0 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1e000 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e1);.      testc
1e010 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1e020 20 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20   );.      inReg 
1e030 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  = target;.      
1e040 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e050 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52  2(v, op, r1, inR
1e060 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  eg);.      break
1e070 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e080 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
1e090 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
1e0a0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
1e0b0 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
1e0c0 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
1e0d0 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63  sNull );   testc
1e0e0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
1e0f0 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  LL );.      asse
1e100 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d  rt( TK_NOTNULL==
1e110 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65  OP_NotNull ); te
1e120 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
1e130 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  OTNULL );.      
1e140 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e150 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1e160 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
1e170 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1e180 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1e190 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1e1a0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1e1b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1e1c0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1e1d0 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
1e1e0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 6f  3VdbeAddOp1(v, o
1e1f0 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64  p, r1);.      Vd
1e200 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1e210 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a  op==TK_ISNULL);.
1e220 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1e230 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e  geIf(v, op==TK_N
1e240 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  OTNULL);.      s
1e250 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1e260 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1e270 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
1e280 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1e290 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
1e2a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e2b0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
1e2c0 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
1e2d0 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49       AggInfo *pI
1e2e0 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67  nfo = pExpr->pAg
1e2f0 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28  gInfo;.      if(
1e300 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20   pInfo==0 ){.   
1e310 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1e320 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1e330 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1e340 29 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) );.        sql
1e350 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1e360 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20  rse, "misuse of 
1e370 61 67 67 72 65 67 61 74 65 3a 20 25 73 28 29 22  aggregate: %s()"
1e380 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1e390 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
1e3a0 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
1e3b0 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45   pInfo->aFunc[pE
1e3c0 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b  xpr->iAgg].iMem;
1e3d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
1e3e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1e3f0 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
1e400 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69  : {.      ExprLi
1e410 73 74 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20  st *pFarg;      
1e420 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63   /* List of func
1e430 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a  tion arguments *
1e440 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 61 72  /.      int nFar
1e450 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  g;             /
1e460 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6e 63  * Number of func
1e470 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a  tion arguments *
1e480 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  /.      FuncDef 
1e490 2a 70 44 65 66 3b 20 20 20 20 20 20 20 20 20 2f  *pDef;         /
1e4a0 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 64  * The function d
1e4b0 65 66 69 6e 69 74 69 6f 6e 20 6f 62 6a 65 63 74  efinition object
1e4c0 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
1e4d0 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20  char *zId;      
1e4e0 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e   /* The function
1e4f0 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 75   name */.      u
1e500 33 32 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30  32 constMask = 0
1e510 3b 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66  ;     /* Mask of
1e520 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   function argume
1e530 6e 74 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e  nts that are con
1e540 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69  stant */.      i
1e550 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
1e560 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
1e570 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 75  unter */.      u
1e580 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  8 enc = ENC(db);
1e590 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78        /* The tex
1e5a0 74 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64 20  t encoding used 
1e5b0 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65  by this database
1e5c0 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65   */.      CollSe
1e5d0 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20  q *pColl = 0;   
1e5e0 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20   /* A collating 
1e5f0 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20  sequence */..   
1e600 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1e610 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1e620 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1e630 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78   );.      if( Ex
1e640 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1e650 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  xpr, EP_TokenOnl
1e660 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  y) ){.        pF
1e670 61 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  arg = 0;.      }
1e680 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46  else{.        pF
1e690 61 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  arg = pExpr->x.p
1e6a0 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  List;.      }.  
1e6b0 20 20 20 20 6e 46 61 72 67 20 3d 20 70 46 61 72      nFarg = pFar
1e6c0 67 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70 72  g ? pFarg->nExpr
1e6d0 20 3a 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   : 0;.      asse
1e6e0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1e6f0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
1e700 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
1e710 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 75    zId = pExpr->u
1e720 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 70  .zToken;.      p
1e730 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
1e740 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49  dFunction(db, zI
1e750 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30  d, nFarg, enc, 0
1e760 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
1e770 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f  _ENABLE_UNKNOWN_
1e780 53 51 4c 5f 46 55 4e 43 54 49 4f 4e 0a 20 20 20  SQL_FUNCTION.   
1e790 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 26     if( pDef==0 &
1e7a0 26 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  & pParse->explai
1e7b0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  n ){.        pDe
1e7c0 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
1e7d0 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 75 6e 6b  unction(db, "unk
1e7e0 6e 6f 77 6e 22 2c 20 6e 46 61 72 67 2c 20 65 6e  nown", nFarg, en
1e7f0 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23  c, 0);.      }.#
1e800 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
1e810 70 44 65 66 3d 3d 30 20 7c 7c 20 70 44 65 66 2d  pDef==0 || pDef-
1e820 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b  >xFinalize!=0 ){
1e830 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1e840 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1e850 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69   "unknown functi
1e860 6f 6e 3a 20 25 73 28 29 22 2c 20 7a 49 64 29 3b  on: %s()", zId);
1e870 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1e880 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1e890 2a 20 41 74 74 65 6d 70 74 20 61 20 64 69 72 65  * Attempt a dire
1e8a0 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ct implementatio
1e8b0 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69  n of the built-i
1e8c0 6e 20 43 4f 41 4c 45 53 43 45 28 29 20 61 6e 64  n COALESCE() and
1e8d0 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c  .      ** IFNULL
1e8e0 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54  () functions.  T
1e8f0 68 69 73 20 61 76 6f 69 64 73 20 75 6e 6e 65 63  his avoids unnec
1e900 65 73 73 61 72 79 20 65 76 61 6c 75 61 74 69 6f  essary evaluatio
1e910 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61 72  n of.      ** ar
1e920 67 75 6d 65 6e 74 73 20 70 61 73 74 20 74 68 65  guments past the
1e930 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20   first non-NULL 
1e940 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20  argument..      
1e950 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  */.      if( pDe
1e960 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
1e970 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45  QLITE_FUNC_COALE
1e980 53 43 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69  SCE ){.        i
1e990 6e 74 20 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d  nt endCoalesce =
1e9a0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1e9b0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
1e9c0 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e    assert( nFarg>
1e9d0 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  =2 );.        sq
1e9e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1e9f0 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30  arse, pFarg->a[0
1ea00 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
1ea10 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
1ea20 31 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29  1; i<nFarg; i++)
1ea30 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
1ea40 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ea50 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72   OP_NotNull, tar
1ea60 67 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65  get, endCoalesce
1ea70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
1ea80 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1ea90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1eaa0 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70  xprCacheRemove(p
1eab0 50 61 72 73 65 2c 20 74 61 72 67 65 74 2c 20 31  Parse, target, 1
1eac0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
1ead0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
1eae0 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
1eaf0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1eb00 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61  Code(pParse, pFa
1eb10 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  rg->a[i].pExpr, 
1eb20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1eb30 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1eb40 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
1eb50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1eb60 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1eb70 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
1eb80 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20  Coalesce);.     
1eb90 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1eba0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  }..      /* The 
1ebb0 55 4e 4c 49 4b 45 4c 59 28 29 20 66 75 6e 63 74  UNLIKELY() funct
1ebc0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
1ebd0 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 74   The result is t
1ebe0 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a  he value.      *
1ebf0 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 61  * of the first a
1ec00 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a  rgument..      *
1ec10 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  /.      if( pDef
1ec20 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
1ec30 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45  LITE_FUNC_UNLIKE
1ec40 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  LY ){.        as
1ec50 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 31 20 29  sert( nFarg>=1 )
1ec60 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  ;.        inReg 
1ec70 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1ec80 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
1ec90 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
1eca0 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
1ecb0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1ecc0 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   }..      for(i=
1ecd0 30 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29  0; i<nFarg; i++)
1ece0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c  {.        if( i<
1ecf0 33 32 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  32 && sqlite3Exp
1ed00 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 46 61 72  rIsConstant(pFar
1ed10 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  g->a[i].pExpr) )
1ed20 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  {.          test
1ed30 63 61 73 65 28 20 69 3d 3d 33 31 20 29 3b 0a 20  case( i==31 );. 
1ed40 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61           constMa
1ed50 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 33 32 28  sk |= MASKBIT32(
1ed60 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i);.        }.  
1ed70 20 20 20 20 20 20 69 66 28 20 28 70 44 65 66 2d        if( (pDef-
1ed80 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
1ed90 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c  ITE_FUNC_NEEDCOL
1eda0 4c 29 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20  L)!=0 && !pColl 
1edb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  ){.          pCo
1edc0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
1edd0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1ede0 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70  pFarg->a[i].pExp
1edf0 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
1ee00 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1ee10 70 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20  pFarg ){.       
1ee20 20 69 66 28 20 63 6f 6e 73 74 4d 61 73 6b 20 29   if( constMask )
1ee30 7b 0a 20 20 20 20 20 20 20 20 20 20 72 31 20 3d  {.          r1 =
1ee40 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
1ee50 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
1ee60 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 46 61 72 67  e->nMem += nFarg
1ee70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1ee80 0a 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20  .          r1 = 
1ee90 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
1eea0 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 46 61 72  nge(pParse, nFar
1eeb0 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  g);.        }.. 
1eec0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 65         /* For le
1eed0 6e 67 74 68 28 29 20 61 6e 64 20 74 79 70 65 6f  ngth() and typeo
1eee0 66 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 77 69  f() functions wi
1eef0 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67 75  th a column argu
1ef00 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a  ment,.        **
1ef10 20 73 65 74 20 74 68 65 20 50 35 20 70 61 72 61   set the P5 para
1ef20 6d 65 74 65 72 20 74 6f 20 74 68 65 20 4f 50 5f  meter to the OP_
1ef30 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74 6f  Column opcode to
1ef40 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52   OPFLAG_LENGTHAR
1ef50 47 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20  G.        ** or 
1ef60 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47  OPFLAG_TYPEOFARG
1ef70 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20 74   respectively, t
1ef80 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73  o avoid unnecess
1ef90 61 72 79 20 64 61 74 61 0a 20 20 20 20 20 20 20  ary data.       
1efa0 20 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20 20   ** loading..   
1efb0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1efc0 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46  if( (pDef->funcF
1efd0 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 46  lags & (SQLITE_F
1efe0 55 4e 43 5f 4c 45 4e 47 54 48 7c 53 51 4c 49 54  UNC_LENGTH|SQLIT
1eff0 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29 29 21  E_FUNC_TYPEOF))!
1f000 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1f010 75 38 20 65 78 70 72 4f 70 3b 0a 20 20 20 20 20  u8 exprOp;.     
1f020 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61       assert( nFa
1f030 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  rg==1 );.       
1f040 20 20 20 61 73 73 65 72 74 28 20 70 46 61 72 67     assert( pFarg
1f050 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20  ->a[0].pExpr!=0 
1f060 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70  );.          exp
1f070 72 4f 70 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30  rOp = pFarg->a[0
1f080 5d 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20  ].pExpr->op;.   
1f090 20 20 20 20 20 20 20 69 66 28 20 65 78 70 72 4f         if( exprO
1f0a0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p==TK_COLUMN || 
1f0b0 65 78 70 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43  exprOp==TK_AGG_C
1f0c0 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20  OLUMN ){.       
1f0d0 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c       assert( SQL
1f0e0 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 3d  ITE_FUNC_LENGTH=
1f0f0 3d 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52  =OPFLAG_LENGTHAR
1f100 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  G );.           
1f110 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
1f120 46 55 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f 50 46  FUNC_TYPEOF==OPF
1f130 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20 29 3b  LAG_TYPEOFARG );
1f140 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
1f150 74 63 61 73 65 28 20 70 44 65 66 2d 3e 66 75 6e  tcase( pDef->fun
1f160 63 46 6c 61 67 73 20 26 20 4f 50 46 4c 41 47 5f  cFlags & OPFLAG_
1f170 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20  LENGTHARG );.   
1f180 20 20 20 20 20 20 20 20 20 70 46 61 72 67 2d 3e           pFarg->
1f190 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 32 20  a[0].pExpr->op2 
1f1a0 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
1f1b0 20 20 20 20 20 70 44 65 66 2d 3e 66 75 6e 63 46       pDef->funcF
1f1c0 6c 61 67 73 20 26 20 28 4f 50 46 4c 41 47 5f 4c  lags & (OPFLAG_L
1f1d0 45 4e 47 54 48 41 52 47 7c 4f 50 46 4c 41 47 5f  ENGTHARG|OPFLAG_
1f1e0 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20  TYPEOFARG);.    
1f1f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f200 7d 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  }..        sqlit
1f210 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
1f220 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20  pParse);     /* 
1f230 54 69 63 6b 65 74 20 32 65 61 32 34 32 35 64 33  Ticket 2ea2425d3
1f240 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  4be */.        s
1f250 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
1f260 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
1f270 46 61 72 67 2c 20 72 31 2c 20 30 2c 0a 20 20 20  Farg, r1, 0,.   
1f280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f290 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
1f2a0 49 54 45 5f 45 43 45 4c 5f 44 55 50 7c 53 51 4c  ITE_ECEL_DUP|SQL
1f2b0 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29  ITE_ECEL_FACTOR)
1f2c0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1f2d0 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
1f2e0 61 72 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 54  arse);      /* T
1f2f0 69 63 6b 65 74 20 32 65 61 32 34 32 35 64 33 34  icket 2ea2425d34
1f300 62 65 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73  be */.      }els
1f310 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  e{.        r1 = 
1f320 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  0;.      }.#ifnd
1f330 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1f340 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
1f350 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76    /* Possibly ov
1f360 65 72 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74  erload the funct
1f370 69 6f 6e 20 69 66 20 74 68 65 20 66 69 72 73 74  ion if the first
1f380 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 20 20 20   argument is.   
1f390 20 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20     ** a virtual 
1f3a0 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20  table column..  
1f3b0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
1f3c0 46 6f 72 20 69 6e 66 69 78 20 66 75 6e 63 74 69  For infix functi
1f3d0 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c  ons (LIKE, GLOB,
1f3e0 20 52 45 47 45 58 50 2c 20 61 6e 64 20 4d 41 54   REGEXP, and MAT
1f3f0 43 48 29 20 75 73 65 20 74 68 65 0a 20 20 20 20  CH) use the.    
1f400 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75    ** second argu
1f410 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66 69  ment, not the fi
1f420 72 73 74 2c 20 61 73 20 74 68 65 20 61 72 67 75  rst, as the argu
1f430 6d 65 6e 74 20 74 6f 20 74 65 73 74 20 74 6f 0a  ment to test to.
1f440 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20        ** see if 
1f450 69 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69  it is a column i
1f460 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  n a virtual tabl
1f470 65 2e 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65  e.  This is done
1f480 20 62 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a   because.      *
1f490 2a 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61  * the left opera
1f4a0 6e 64 20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63  nd of infix func
1f4b0 74 69 6f 6e 73 20 28 74 68 65 20 6f 70 65 72 61  tions (the opera
1f4c0 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 0a 20 20  nd we want to.  
1f4d0 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f      ** control o
1f4e0 76 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73  verloading) ends
1f4f0 20 75 70 20 61 73 20 74 68 65 20 73 65 63 6f 6e   up as the secon
1f500 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
1f510 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74  e.      ** funct
1f520 69 6f 6e 2e 20 20 54 68 65 20 65 78 70 72 65 73  ion.  The expres
1f530 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22 20  sion "A glob B" 
1f540 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
1f550 20 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62   .      ** "glob
1f560 28 42 2c 41 29 2e 20 20 57 65 20 77 61 6e 74 20  (B,A).  We want 
1f570 74 6f 20 75 73 65 20 74 68 65 20 41 20 69 6e 20  to use the A in 
1f580 22 41 20 67 6c 6f 62 20 42 22 20 74 6f 20 74 65  "A glob B" to te
1f590 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  st.      ** for 
1f5a0 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61  function overloa
1f5b0 64 69 6e 67 2e 20 20 42 75 74 20 77 65 20 75 73  ding.  But we us
1f5c0 65 20 74 68 65 20 42 20 74 65 72 6d 20 69 6e 20  e the B term in 
1f5d0 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20  "glob(B,A)"..   
1f5e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
1f5f0 6e 46 61 72 67 3e 3d 32 20 26 26 20 28 70 45 78  nFarg>=2 && (pEx
1f600 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49  pr->flags & EP_I
1f610 6e 66 69 78 46 75 6e 63 29 20 29 7b 0a 20 20 20  nfixFunc) ){.   
1f620 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
1f630 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46  te3VtabOverloadF
1f640 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66  unction(db, pDef
1f650 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e  , nFarg, pFarg->
1f660 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[1].pExpr);.   
1f670 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 61     }else if( nFa
1f680 72 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  rg>0 ){.        
1f690 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74  pDef = sqlite3Vt
1f6a0 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69  abOverloadFuncti
1f6b0 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61  on(db, pDef, nFa
1f6c0 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  rg, pFarg->a[0].
1f6d0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
1f6e0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
1f6f0 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73   pDef->funcFlags
1f700 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e   & SQLITE_FUNC_N
1f710 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20  EEDCOLL ){.     
1f720 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
1f730 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
1f740 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20  tColl; .        
1f750 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1f760 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c  4(v, OP_CollSeq,
1f770 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20   0, 0, 0, (char 
1f780 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
1f790 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  SEQ);.      }.  
1f7a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1f7b0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63  ddOp4(v, OP_Func
1f7c0 74 69 6f 6e 30 2c 20 63 6f 6e 73 74 4d 61 73 6b  tion0, constMask
1f7d0 2c 20 72 31 2c 20 74 61 72 67 65 74 2c 0a 20 20  , r1, target,.  
1f7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7f0 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 44 65        (char*)pDe
1f800 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  f, P4_FUNCDEF);.
1f810 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f820 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38  eChangeP5(v, (u8
1f830 29 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 69  )nFarg);.      i
1f840 66 28 20 6e 46 61 72 67 20 26 26 20 63 6f 6e 73  f( nFarg && cons
1f850 74 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  tMask==0 ){.    
1f860 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
1f870 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
1f880 73 65 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a  se, r1, nFarg);.
1f890 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
1f8a0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
1f8b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1f8c0 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
1f8d0 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20   TK_EXISTS:.    
1f8e0 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
1f8f0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c  {.      int nCol
1f900 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1f910 28 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20  ( op==TK_EXISTS 
1f920 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1f930 65 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  e( op==TK_SELECT
1f940 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70   );.      if( op
1f950 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 28  ==TK_SELECT && (
1f960 6e 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e  nCol = pExpr->x.
1f970 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
1f980 3e 6e 45 78 70 72 29 21 3d 31 20 29 7b 0a 20 20  >nExpr)!=1 ){.  
1f990 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 75 62        sqlite3Sub
1f9a0 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72  selectError(pPar
1f9b0 73 65 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20  se, nCol, 1);.  
1f9c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f9d0 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
1f9e0 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
1f9f0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30  pParse, pExpr, 0
1fa00 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
1fa10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1fa20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
1fa30 45 43 54 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20  ECT_COLUMN: {.  
1fa40 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
1fa50 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20  Left->iTable==0 
1fa60 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  ){.        pExpr
1fa70 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20  ->pLeft->iTable 
1fa80 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62  = sqlite3CodeSub
1fa90 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
1faa0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 2c 20  Expr->pLeft, 0, 
1fab0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
1fac0 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d    inReg = pExpr-
1fad0 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20 2b  >pLeft->iTable +
1fae0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
1faf0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1fb00 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1fb10 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  IN: {.      int 
1fb20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71  destIfFalse = sq
1fb30 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1fb40 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74  el(v);.      int
1fb50 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71   destIfNull = sq
1fb60 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1fb70 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  el(v);.      sql
1fb80 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1fb90 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
1fba0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  rget);.      sql
1fbb0 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70  ite3ExprCodeIN(p
1fbc0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
1fbd0 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49  stIfFalse, destI
1fbe0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
1fbf0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1fc00 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
1fc10 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1fc20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1fc30 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
1fc40 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20  IfFalse);.      
1fc50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1fc60 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
1fc70 74 61 72 67 65 74 2c 20 30 29 3b 0a 20 20 20 20  target, 0);.    
1fc80 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1fc90 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
1fca0 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
1fcb0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
1fcc0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1fcd0 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
1fce0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
1fcf0 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e    x BETWEEN y AN
1fd00 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  D z.    **.    *
1fd10 2a 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61  * This is equiva
1fd20 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20  lent to.    **. 
1fd30 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e     **    x>=y AN
1fd40 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20  D x<=z.    **.  
1fd50 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64    ** X is stored
1fd60 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   in pExpr->pLeft
1fd70 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74  ..    ** Y is st
1fd80 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70  ored in pExpr->p
1fd90 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
1fda0 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74  ..    ** Z is st
1fdb0 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70  ored in pExpr->p
1fdc0 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
1fdd0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1fde0 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
1fdf0 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65        exprCodeBe
1fe00 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45  tween(pParse, pE
1fe10 78 70 72 2c 20 74 61 72 67 65 74 2c 20 30 2c 20  xpr, target, 0, 
1fe20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
1fe30 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1fe40 54 4b 5f 53 50 41 4e 3a 0a 20 20 20 20 63 61 73  TK_SPAN:.    cas
1fe50 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20 0a 20  e TK_COLLATE: . 
1fe60 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53     case TK_UPLUS
1fe70 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20  : {.      inReg 
1fe80 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1fe90 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
1fea0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61  pExpr->pLeft, ta
1feb0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65  rget);.      bre
1fec0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
1fed0 61 73 65 20 54 4b 5f 54 52 49 47 47 45 52 3a 20  ase TK_TRIGGER: 
1fee0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
1fef0 65 20 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f 54  e opcode is TK_T
1ff00 52 49 47 47 45 52 2c 20 74 68 65 6e 20 74 68 65  RIGGER, then the
1ff10 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
1ff20 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 20   reference.     
1ff30 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20   ** to a column 
1ff40 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20  in the new.* or 
1ff50 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  old.* pseudo-tab
1ff60 6c 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  les available to
1ff70 0a 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65  .      ** trigge
1ff80 72 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74  r programs. In t
1ff90 68 69 73 20 63 61 73 65 20 45 78 70 72 2e 69 54  his case Expr.iT
1ffa0 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 31  able is set to 1
1ffb0 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a   for the.      *
1ffc0 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74  * new.* pseudo-t
1ffd0 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20 74  able, or 0 for t
1ffe0 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  he old.* pseudo-
1fff0 74 61 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c  table. Expr.iCol
20000 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  umn.      ** is 
20010 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d  set to the colum
20020 6e 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d  n of the pseudo-
20030 74 61 62 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f  table to read, o
20040 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20  r to -1 to.     
20050 20 2a 2a 20 72 65 61 64 20 74 68 65 20 72 6f 77   ** read the row
20060 69 64 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20  id field..      
20070 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  **.      ** The 
20080 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69 6d  expression is im
20090 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20  plemented using 
200a0 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70 63 6f  an OP_Param opco
200b0 64 65 2e 20 54 68 65 20 70 31 0a 20 20 20 20 20  de. The p1.     
200c0 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73   ** parameter is
200d0 20 73 65 74 20 74 6f 20 30 20 66 6f 72 20 61 6e   set to 0 for an
200e0 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66 65 72   old.rowid refer
200f0 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69 2b 31  ence, or to (i+1
20100 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65  ).      ** to re
20110 66 65 72 65 6e 63 65 20 61 6e 6f 74 68 65 72 20  ference another 
20120 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6f 6c  column of the ol
20130 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  d.* pseudo-table
20140 2c 20 77 68 65 72 65 20 0a 20 20 20 20 20 20 2a  , where .      *
20150 2a 20 69 20 69 73 20 74 68 65 20 69 6e 64 65 78  * i is the index
20160 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20   of the column. 
20170 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69 64 20  For a new.rowid 
20180 72 65 66 65 72 65 6e 63 65 2c 20 70 31 20 69 73  reference, p1 is
20190 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f  .      ** set to
201a0 20 28 6e 2b 31 29 2c 20 77 68 65 72 65 20 6e 20   (n+1), where n 
201b0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
201c0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61 63 68   columns in each
201d0 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 20   pseudo-table.. 
201e0 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 72 65       ** For a re
201f0 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 6f  ference to any o
20200 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ther column in t
20210 68 65 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d  he new.* pseudo-
20220 74 61 62 6c 65 2c 20 70 31 0a 20 20 20 20 20 20  table, p1.      
20230 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 28 6e 2b  ** is set to (n+
20240 32 2b 69 29 2c 20 77 68 65 72 65 20 6e 20 61 6e  2+i), where n an
20250 64 20 69 20 61 72 65 20 61 73 20 64 65 66 69 6e  d i are as defin
20260 65 64 20 70 72 65 76 69 6f 75 73 6c 79 2e 20 46  ed previously. F
20270 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65 78 61 6d  or.      ** exam
20280 70 6c 65 2c 20 69 66 20 74 68 65 20 74 61 62 6c  ple, if the tabl
20290 65 20 6f 6e 20 77 68 69 63 68 20 74 72 69 67 67  e on which trigg
202a0 65 72 73 20 61 72 65 20 62 65 69 6e 67 20 66 69  ers are being fi
202b0 72 65 64 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  red is.      ** 
202c0 64 65 63 6c 61 72 65 64 20 61 73 3a 0a 20 20 20  declared as:.   
202d0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
202e0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
202f0 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 2a 2a  (a, b);.      **
20300 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 70  .      ** Then p
20310 31 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  1 is interpreted
20320 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
20330 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
20340 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20 20 6f   p1==0   ->    o
20350 6c 64 2e 72 6f 77 69 64 20 20 20 20 20 70 31 3d  ld.rowid     p1=
20360 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 72  =3   ->    new.r
20370 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a 20 20 20  owid.      **   
20380 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20 6f 6c  p1==1   ->    ol
20390 64 2e 61 20 20 20 20 20 20 20 20 20 70 31 3d 3d  d.a         p1==
203a0 34 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 61 0a  4   ->    new.a.
203b0 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 32        **   p1==2
203c0 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62 20 20     ->    old.b  
203d0 20 20 20 20 20 20 20 70 31 3d 3d 35 20 20 20 2d         p1==5   -
203e0 3e 20 20 20 20 6e 65 77 2e 62 20 20 20 20 20 20  >    new.b      
203f0 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
20400 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
20410 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Expr->pTab;.    
20420 20 20 69 6e 74 20 70 31 20 3d 20 70 45 78 70 72    int p1 = pExpr
20430 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70 54 61 62  ->iTable * (pTab
20440 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20 2b 20  ->nCol+1) + 1 + 
20450 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
20460 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
20470 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20  Expr->iTable==0 
20480 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  || pExpr->iTable
20490 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ==1 );.      ass
204a0 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ert( pExpr->iCol
204b0 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78 70 72  umn>=-1 && pExpr
204c0 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e  ->iColumn<pTab->
204d0 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 61 73  nCol );.      as
204e0 73 65 72 74 28 20 70 54 61 62 2d 3e 69 50 4b 65  sert( pTab->iPKe
204f0 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 43  y<0 || pExpr->iC
20500 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69 50 4b  olumn!=pTab->iPK
20510 65 79 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ey );.      asse
20520 72 74 28 20 70 31 3e 3d 30 20 26 26 20 70 31 3c  rt( p1>=0 && p1<
20530 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b 32 29  (pTab->nCol*2+2)
20540 20 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74   );..      sqlit
20550 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
20560 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20 74 61  OP_Param, p1, ta
20570 72 67 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62  rget);.      Vdb
20580 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
20590 2e 25 73 20 2d 3e 20 24 25 64 22 2c 0a 20 20 20  .%s -> $%d",.   
205a0 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69 54 61       (pExpr->iTa
205b0 62 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20 22 6f  ble ? "new" : "o
205c0 6c 64 22 29 2c 0a 20 20 20 20 20 20 20 20 28 70  ld"),.        (p
205d0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Expr->iColumn<0 
205e0 3f 20 22 72 6f 77 69 64 22 20 3a 20 70 45 78 70  ? "rowid" : pExp
205f0 72 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45  r->pTab->aCol[pE
20600 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e  xpr->iColumn].zN
20610 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 74 61  ame),.        ta
20620 72 67 65 74 0a 20 20 20 20 20 20 29 29 3b 0a 0a  rget.      ));..
20630 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
20640 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
20650 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  NT.      /* If t
20660 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 52 45  he column has RE
20670 41 4c 20 61 66 66 69 6e 69 74 79 2c 20 69 74 20  AL affinity, it 
20680 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65  may currently be
20690 20 73 74 6f 72 65 64 20 61 73 20 61 6e 0a 20 20   stored as an.  
206a0 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20      ** integer. 
206b0 55 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e  Use OP_RealAffin
206c0 69 74 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ity to make sure
206d0 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65   it is really re
206e0 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  al..      **.   
206f0 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
20700 46 3a 20 52 2d 36 30 39 38 35 2d 35 37 36 36 32  F: R-60985-57662
20710 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 63 6f 6e   SQLite will con
20720 76 65 72 74 20 74 68 65 20 76 61 6c 75 65 20 62  vert the value b
20730 61 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ack to.      ** 
20740 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 77  floating point w
20750 68 65 6e 20 65 78 74 72 61 63 74 69 6e 67 20 69  hen extracting i
20760 74 20 66 72 6f 6d 20 74 68 65 20 72 65 63 6f 72  t from the recor
20770 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  d.  */.      if(
20780 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
20790 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 54  =0 .       && pT
207a0 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e  ab->aCol[pExpr->
207b0 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74  iColumn].affinit
207c0 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  y==SQLITE_AFF_RE
207d0 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  AL.      ){.    
207e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
207f0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c  ddOp1(v, OP_Real
20800 41 66 66 69 6e 69 74 79 2c 20 74 61 72 67 65 74  Affinity, target
20810 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
20820 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  f.      break;. 
20830 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54     }..    case T
20840 4b 5f 56 45 43 54 4f 52 3a 20 7b 0a 20 20 20 20  K_VECTOR: {.    
20850 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
20860 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76  g(pParse, "row v
20870 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a  alue misused");.
20880 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20890 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
208a0 2a 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a  * Form A:.    **
208b0 20 20 20 43 41 53 45 20 78 20 57 48 45 4e 20 65     CASE x WHEN e
208c0 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65  1 THEN r1 WHEN e
208d0 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48  2 THEN r2 ... WH
208e0 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c  EN eN THEN rN EL
208f0 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a  SE y END.    **.
20900 20 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20      ** Form B:. 
20910 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45     **   CASE WHE
20920 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  N e1 THEN r1 WHE
20930 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e  N e2 THEN r2 ...
20940 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e   WHEN eN THEN rN
20950 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20   ELSE y END.    
20960 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41  **.    ** Form A
20970 20 69 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73   is can be trans
20980 66 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20  formed into the 
20990 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20  equivalent form 
209a0 42 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  B as follows:.  
209b0 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e    **   CASE WHEN
209c0 20 78 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48   x=e1 THEN r1 WH
209d0 45 4e 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20  EN x=e2 THEN r2 
209e0 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ....    **      
209f0 20 20 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e    WHEN x=eN THEN
20a00 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
20a10 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28     **.    ** X (
20a20 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73  if it exists) is
20a30 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   in pExpr->pLeft
20a40 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e  ..    ** Y is in
20a50 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e   the last elemen
20a60 74 20 6f 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c  t of pExpr->x.pL
20a70 69 73 74 20 69 66 20 70 45 78 70 72 2d 3e 78 2e  ist if pExpr->x.
20a80 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 69 73 0a  pList->nExpr is.
20a90 20 20 20 20 2a 2a 20 6f 64 64 2e 20 20 54 68 65      ** odd.  The
20aa0 20 59 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f   Y is also optio
20ab0 6e 61 6c 2e 20 20 49 66 20 74 68 65 20 6e 75 6d  nal.  If the num
20ac0 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
20ad0 69 6e 20 78 2e 70 4c 69 73 74 0a 20 20 20 20 2a  in x.pList.    *
20ae0 2a 20 69 73 20 65 76 65 6e 2c 20 74 68 65 6e 20  * is even, then 
20af0 59 20 69 73 20 6f 6d 69 74 74 65 64 20 61 6e 64  Y is omitted and
20b00 20 74 68 65 20 22 6f 74 68 65 72 77 69 73 65 22   the "otherwise"
20b10 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e   result is NULL.
20b20 0a 20 20 20 20 2a 2a 20 45 69 20 69 73 20 69 6e  .    ** Ei is in
20b30 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
20b40 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20 69 73 20  [i*2] and Ri is 
20b50 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
20b60 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20  i*2+1]..    **. 
20b70 20 20 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74     ** The result
20b80 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
20b90 6f 6e 20 69 73 20 74 68 65 20 52 69 20 66 6f 72  on is the Ri for
20ba0 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
20bb0 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f  ing Ei,.    ** o
20bc0 72 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  r if there is no
20bd0 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 20 74 68   matching Ei, th
20be0 65 20 45 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f  e ELSE term Y, o
20bf0 72 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20  r if there is.  
20c00 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72    ** no ELSE ter
20c10 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a  m, NULL..    */.
20c20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
20c30 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45  ert( op==TK_CASE
20c40 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20   ); {.      int 
20c50 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20 20 20  endLabel;       
20c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20c70 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20   GOTO label for 
20c80 65 6e 64 20 6f 66 20 43 41 53 45 20 73 74 6d 74  end of CASE stmt
20c90 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 65   */.      int ne
20ca0 78 74 43 61 73 65 3b 20 20 20 20 20 20 20 20 20  xtCase;         
20cb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
20cc0 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65  OTO label for ne
20cd0 78 74 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a  xt WHEN clause *
20ce0 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70  /.      int nExp
20cf0 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
20d00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 78 20            /* 2x 
20d10 6e 75 6d 62 65 72 20 6f 66 20 57 48 45 4e 20 74  number of WHEN t
20d20 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  erms */.      in
20d30 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
20d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d50 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
20d60 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
20d70 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
20d80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
20d90 73 74 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73  st of WHEN terms
20da0 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
20db0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
20dc0 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41  aListelem;  /* A
20dd0 72 72 61 79 20 6f 66 20 57 48 45 4e 20 74 65 72  rray of WHEN ter
20de0 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  ms */.      Expr
20df0 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20 20 20   opCompare;     
20e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20e10 20 54 68 65 20 58 3d 3d 45 69 20 65 78 70 72 65   The X==Ei expre
20e20 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ssion */.      E
20e30 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20  xpr *pX;        
20e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e50 20 2f 2a 20 54 68 65 20 58 20 65 78 70 72 65 73   /* The X expres
20e60 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78  sion */.      Ex
20e70 70 72 20 2a 70 54 65 73 74 20 3d 20 30 3b 20 20  pr *pTest = 0;  
20e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e90 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41  /* X==Ei (form A
20ea0 29 20 6f 72 20 6a 75 73 74 20 45 69 20 28 66 6f  ) or just Ei (fo
20eb0 72 6d 20 42 29 20 2a 2f 0a 20 20 20 20 20 20 56  rm B) */.      V
20ec0 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 69 43 61  VA_ONLY( int iCa
20ed0 63 68 65 4c 65 76 65 6c 20 3d 20 70 50 61 72 73  cheLevel = pPars
20ee0 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 20  e->iCacheLevel; 
20ef0 29 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  )..      assert(
20f00 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
20f10 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
20f20 65 6c 65 63 74 29 20 26 26 20 70 45 78 70 72 2d  elect) && pExpr-
20f30 3e 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20 20  >x.pList );.    
20f40 20 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e    assert(pExpr->
20f50 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e  x.pList->nExpr >
20f60 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73   0);.      pELis
20f70 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
20f80 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65  st;.      aListe
20f90 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b  lem = pEList->a;
20fa0 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70  .      nExpr = p
20fb0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
20fc0 20 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73      endLabel = s
20fd0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
20fe0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66  bel(v);.      if
20ff0 28 20 28 70 58 20 3d 20 70 45 78 70 72 2d 3e 70  ( (pX = pExpr->p
21000 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  Left)!=0 ){.    
21010 20 20 20 20 74 65 6d 70 58 20 3d 20 2a 70 58 3b      tempX = *pX;
21020 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
21030 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  e( pX->op==TK_CO
21040 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
21050 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 26  exprToRegister(&
21060 74 65 6d 70 58 2c 20 65 78 70 72 43 6f 64 65 56  tempX, exprCodeV
21070 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20 26 74  ector(pParse, &t
21080 65 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31 29  empX, &regFree1)
21090 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
210a0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
210b0 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73   );.        mems
210c0 65 74 28 26 6f 70 43 6f 6d 70 61 72 65 2c 20 30  et(&opCompare, 0
210d0 2c 20 73 69 7a 65 6f 66 28 6f 70 43 6f 6d 70 61  , sizeof(opCompa
210e0 72 65 29 29 3b 0a 20 20 20 20 20 20 20 20 6f 70  re));.        op
210f0 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f  Compare.op = TK_
21100 45 51 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f  EQ;.        opCo
21110 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d 20 26 74  mpare.pLeft = &t
21120 65 6d 70 58 3b 0a 20 20 20 20 20 20 20 20 70 54  empX;.        pT
21130 65 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65  est = &opCompare
21140 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 69 63  ;.        /* Tic
21150 6b 65 74 20 62 33 35 31 64 39 35 66 39 63 64 35  ket b351d95f9cd5
21160 65 66 31 37 65 39 64 39 64 62 61 65 31 38 66 35  ef17e9d9dbae18f5
21170 63 61 38 36 31 31 31 39 30 30 30 31 3a 0a 20 20  ca8611190001:.  
21180 20 20 20 20 20 20 2a 2a 20 54 68 65 20 76 61 6c        ** The val
21190 75 65 20 69 6e 20 72 65 67 46 72 65 65 31 20 6d  ue in regFree1 m
211a0 69 67 68 74 20 67 65 74 20 53 43 6f 70 79 2d 65  ight get SCopy-e
211b0 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20  d into the file 
211c0 72 65 73 75 6c 74 2e 0a 20 20 20 20 20 20 20 20  result..        
211d0 2a 2a 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20  ** So make sure 
211e0 74 68 61 74 20 74 68 65 20 72 65 67 46 72 65 65  that the regFree
211f0 31 20 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f  1 register is no
21200 74 20 72 65 75 73 65 64 20 66 6f 72 20 6f 74 68  t reused for oth
21210 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 75  er.        ** pu
21220 72 70 6f 73 65 73 20 61 6e 64 20 70 6f 73 73 69  rposes and possi
21230 62 6c 79 20 6f 76 65 72 77 72 69 74 74 65 6e 2e  bly overwritten.
21240 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67    */.        reg
21250 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 20 20 20  Free1 = 0;.     
21260 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
21270 3b 20 69 3c 6e 45 78 70 72 2d 31 3b 20 69 3d 69  ; i<nExpr-1; i=i
21280 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  +2){.        sql
21290 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
212a0 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
212b0 20 20 20 69 66 28 20 70 58 20 29 7b 0a 20 20 20     if( pX ){.   
212c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
212d0 54 65 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Test!=0 );.     
212e0 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70       opCompare.p
212f0 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65 6c 65  Right = aListele
21300 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  m[i].pExpr;.    
21310 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21320 20 20 20 20 20 70 54 65 73 74 20 3d 20 61 4c 69       pTest = aLi
21330 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b  stelem[i].pExpr;
21340 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21350 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20 73 71     nextCase = sq
21360 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
21370 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74  el(v);.        t
21380 65 73 74 63 61 73 65 28 20 70 54 65 73 74 2d 3e  estcase( pTest->
21390 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
213a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
213b0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
213c0 73 65 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43  se, pTest, nextC
213d0 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ase, SQLITE_JUMP
213e0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20  IFNULL);.       
213f0 20 74 65 73 74 63 61 73 65 28 20 61 4c 69 73 74   testcase( aList
21400 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d  elem[i+1].pExpr-
21410 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
21420 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
21430 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
21440 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d  , aListelem[i+1]
21450 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
21460 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21470 56 64 62 65 47 6f 74 6f 28 76 2c 20 65 6e 64 4c  VdbeGoto(v, endL
21480 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  abel);.        s
21490 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
214a0 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
214b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
214c0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e  esolveLabel(v, n
214d0 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20  extCase);.      
214e0 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6e 45 78  }.      if( (nEx
214f0 70 72 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20  pr&1)!=0 ){.    
21500 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
21510 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
21520 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
21530 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
21540 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6e 45 78 70  , pEList->a[nExp
21550 72 2d 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  r-1].pExpr, targ
21560 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  et);.        sql
21570 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
21580 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
21590 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
215a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
215b0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
215c0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d  target);.      }
215d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64  .      assert( d
215e0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
215f0 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  || pParse->nErr>
21600 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  0 .           ||
21610 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
21620 65 76 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76 65  evel==iCacheLeve
21630 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  l );.      sqlit
21640 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
21650 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b  el(v, endLabel);
21660 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
21670 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
21680 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
21690 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53      case TK_RAIS
216a0 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  E: {.      asser
216b0 74 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  t( pExpr->affini
216c0 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20  ty==OE_Rollback 
216d0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
216e0 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
216f0 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20 20 20 20  OE_Abort.       
21700 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66      || pExpr->af
21710 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a  finity==OE_Fail.
21720 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45             || pE
21730 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
21740 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20 20 29  E_Ignore.      )
21750 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ;.      if( !pPa
21760 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62  rse->pTriggerTab
21770 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
21780 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
21790 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
217a0 20 20 20 20 20 20 20 20 20 20 20 22 52 41 49 53             "RAIS
217b0 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  E() may only be 
217c0 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 74 72  used within a tr
217d0 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b  igger-program");
217e0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
217f0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
21800 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69   if( pExpr->affi
21810 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  nity==OE_Abort )
21820 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
21830 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65  3MayAbort(pParse
21840 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
21850 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
21860 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
21870 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
21880 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
21890 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49  ->affinity==OE_I
218a0 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20  gnore ){.       
218b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
218c0 70 34 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  p4(.            
218d0 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49  v, OP_Halt, SQLI
218e0 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65  TE_OK, OE_Ignore
218f0 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  , 0, pExpr->u.zT
21900 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20 20  oken,0);.       
21910 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
21920 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
21930 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61         sqlite3Ha
21940 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  ltConstraint(pPa
21950 72 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rse, SQLITE_CONS
21960 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52 2c 0a  TRAINT_TRIGGER,.
21970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
21990 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20 70  xpr->affinity, p
219a0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
219b0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  0, 0);.      }..
219c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
219d0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
219e0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
219f0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
21a00 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
21a10 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
21a20 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
21a30 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 52  2);.  return inR
21a40 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61 63  eg;.}../*.** Fac
21a50 74 6f 72 20 6f 75 74 20 74 68 65 20 63 6f 64 65  tor out the code
21a60 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   of the given ex
21a70 70 72 65 73 73 69 6f 6e 20 74 6f 20 69 6e 69 74  pression to init
21a80 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e  ialization time.
21a90 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
21aa0 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 0a  ExprCodeAtInit(.
21ab0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
21ac0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
21ad0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
21ae0 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a   *pExpr,      /*
21af0 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
21b00 74 6f 20 63 6f 64 65 20 77 68 65 6e 20 74 68 65  to code when the
21b10 20 56 44 42 45 20 69 6e 69 74 69 61 6c 69 7a 65   VDBE initialize
21b20 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 65  s */.  int regDe
21b30 73 74 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72  st,      /* Stor
21b40 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74  e the value in t
21b50 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
21b60 20 20 75 38 20 72 65 75 73 61 62 6c 65 20 20 20    u8 reusable   
21b70 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
21b80 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69  his expression i
21b90 73 20 72 65 75 73 61 62 6c 65 20 2a 2f 0a 29 7b  s reusable */.){
21ba0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 3b 0a  .  ExprList *p;.
21bb0 20 20 61 73 73 65 72 74 28 20 43 6f 6e 73 74 46    assert( ConstF
21bc0 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20  actorOk(pParse) 
21bd0 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d  );.  p = pParse-
21be0 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 70  >pConstExpr;.  p
21bf0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
21c00 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  prDup(pParse->db
21c10 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 70  , pExpr, 0);.  p
21c20 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
21c30 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
21c40 20 70 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66   p, pExpr);.  if
21c50 28 20 70 20 29 7b 0a 20 20 20 20 20 73 74 72 75  ( p ){.     stru
21c60 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
21c70 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b   *pItem = &p->a[
21c80 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20  p->nExpr-1];.   
21c90 20 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73    pItem->u.iCons
21ca0 74 45 78 70 72 52 65 67 20 3d 20 72 65 67 44 65  tExprReg = regDe
21cb0 73 74 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e  st;.     pItem->
21cc0 72 65 75 73 61 62 6c 65 20 3d 20 72 65 75 73 61  reusable = reusa
21cd0 62 6c 65 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73  ble;.  }.  pPars
21ce0 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 20 3d 20  e->pConstExpr = 
21cf0 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  p;.}../*.** Gene
21d00 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61  rate code to eva
21d10 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65 73 73  luate an express
21d20 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68  ion and store th
21d30 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74  e results.** int
21d40 6f 20 61 20 72 65 67 69 73 74 65 72 2e 20 20 52  o a register.  R
21d50 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74  eturn the regist
21d60 65 72 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20  er number where 
21d70 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61  the results.** a
21d80 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  re stored..**.**
21d90 20 49 66 20 74 68 65 20 72 65 67 69 73 74 65 72   If the register
21da0 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
21db0 72 65 67 69 73 74 65 72 20 74 68 61 74 20 63 61  register that ca
21dc0 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61 74 65 64  n be deallocated
21dd0 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20  ,.** then write 
21de0 69 74 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  its number into 
21df0 2a 70 52 65 67 2e 20 20 49 66 20 74 68 65 20 72  *pReg.  If the r
21e00 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20 69  esult register i
21e10 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f  s not.** a tempo
21e20 72 61 72 79 2c 20 74 68 65 6e 20 73 65 74 20 2a  rary, then set *
21e30 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a  pReg to zero..**
21e40 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20  .** If pExpr is 
21e50 61 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e  a constant, then
21e60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   this routine mi
21e70 67 68 74 20 67 65 6e 65 72 61 74 65 20 74 68 69  ght generate thi
21e80 73 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 66 69 6c  s.** code to fil
21e90 6c 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69  l the register i
21ea0 6e 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  n the initializa
21eb0 74 69 6f 6e 20 73 65 63 74 69 6f 6e 20 6f 66 20  tion section of 
21ec0 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67  the.** VDBE prog
21ed0 72 61 6d 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f  ram, in order to
21ee0 20 66 61 63 74 6f 72 20 69 74 20 6f 75 74 20 6f   factor it out o
21ef0 66 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e  f the evaluation
21f00 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71   loop..*/.int sq
21f10 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
21f20 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  p(Parse *pParse,
21f30 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
21f40 74 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74 20  t *pReg){.  int 
21f50 72 32 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71  r2;.  pExpr = sq
21f60 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
21f70 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20 69  late(pExpr);.  i
21f80 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b  f( ConstFactorOk
21f90 28 70 50 61 72 73 65 29 0a 20 20 20 26 26 20 70  (pParse).   && p
21fa0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47  Expr->op!=TK_REG
21fb0 49 53 54 45 52 0a 20 20 20 26 26 20 73 71 6c 69  ISTER.   && sqli
21fc0 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
21fd0 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 0a  tNotJoin(pExpr).
21fe0 20 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73    ){.    ExprLis
21ff0 74 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  t *p = pParse->p
22000 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 20 20 69  ConstExpr;.    i
22010 6e 74 20 69 3b 0a 20 20 20 20 2a 70 52 65 67 20  nt i;.    *pReg 
22020 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 20   = 0;.    if( p 
22030 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
22040 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
22050 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28  Item;.      for(
22060 70 49 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d 70 2d  pItem=p->a, i=p-
22070 3e 6e 45 78 70 72 3b 20 69 3e 30 3b 20 70 49 74  >nExpr; i>0; pIt
22080 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20 20 20  em++, i--){.    
22090 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 72      if( pItem->r
220a0 65 75 73 61 62 6c 65 20 26 26 20 73 71 6c 69 74  eusable && sqlit
220b0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 49  e3ExprCompare(pI
220c0 74 65 6d 2d 3e 70 45 78 70 72 2c 70 45 78 70 72  tem->pExpr,pExpr
220d0 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,-1)==0 ){.     
220e0 20 20 20 20 20 72 65 74 75 72 6e 20 70 49 74 65       return pIte
220f0 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52  m->u.iConstExprR
22100 65 67 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  eg;.        }.  
22110 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
22120 72 32 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  r2 = ++pParse->n
22130 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
22140 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70  ExprCodeAtInit(p
22150 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 32  Parse, pExpr, r2
22160 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 1);.  }else{. 
22170 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
22180 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
22190 61 72 73 65 29 3b 0a 20 20 20 20 72 32 20 3d 20  arse);.    r2 = 
221a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
221b0 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
221c0 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20 69 66  xpr, r1);.    if
221d0 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20  ( r2==r1 ){.    
221e0 20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20 20    *pReg = r1;.  
221f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
22200 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
22210 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
22220 3b 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d 20  ;.      *pReg = 
22230 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
22240 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a  eturn r2;.}../*.
22250 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
22260 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75   that will evalu
22270 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  ate expression p
22280 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74  Expr and store t
22290 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e  he.** results in
222a0 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
222b0 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  .  The results a
222c0 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
222d0 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65   appear.** in re
222e0 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a  gister target..*
222f0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
22300 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50  prCode(Parse *pP
22310 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
22320 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
22330 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20    int inReg;..  
22340 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
22350 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72   && target<=pPar
22360 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66  se->nMem );.  if
22370 28 20 70 45 78 70 72 20 26 26 20 70 45 78 70 72  ( pExpr && pExpr
22380 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ->op==TK_REGISTE
22390 52 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  R ){.    sqlite3
223a0 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73  VdbeAddOp2(pPars
223b0 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70  e->pVdbe, OP_Cop
223c0 79 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  y, pExpr->iTable
223d0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c  , target);.  }el
223e0 73 65 7b 0a 20 20 20 20 69 6e 52 65 67 20 3d 20  se{.    inReg = 
223f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
22400 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
22410 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
22420 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
22430 2d 3e 70 56 64 62 65 21 3d 30 20 7c 7c 20 70 50  ->pVdbe!=0 || pP
22440 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
22450 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66  Failed );.    if
22460 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20  ( inReg!=target 
22470 26 26 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  && pParse->pVdbe
22480 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
22490 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72  3VdbeAddOp2(pPar
224a0 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43  se->pVdbe, OP_SC
224b0 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67  opy, inReg, targ
224c0 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  et);.    }.  }.}
224d0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74  ../*.** Make a t
224e0 72 61 6e 73 69 65 6e 74 20 63 6f 70 79 20 6f 66  ransient copy of
224f0 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
22500 72 20 61 6e 64 20 74 68 65 6e 20 63 6f 64 65 20  r and then code 
22510 69 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69  it using.** sqli
22520 74 65 33 45 78 70 72 43 6f 64 65 28 29 2e 20 20  te3ExprCode().  
22530 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72  This routine wor
22540 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c  ks just like sql
22550 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 0a 2a  ite3ExprCode().*
22560 2a 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68  * except that th
22570 65 20 69 6e 70 75 74 20 65 78 70 72 65 73 73 69  e input expressi
22580 6f 6e 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  on is guaranteed
22590 20 74 6f 20 62 65 20 75 6e 63 68 61 6e 67 65 64   to be unchanged
225a0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
225b0 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28 50 61  3ExprCodeCopy(Pa
225c0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
225d0 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
225e0 72 67 65 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  rget){.  sqlite3
225f0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
22600 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c  b;.  pExpr = sql
22610 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
22620 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28  pExpr, 0);.  if(
22630 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
22640 65 64 20 29 20 73 71 6c 69 74 65 33 45 78 70 72  ed ) sqlite3Expr
22650 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
22660 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 73  pr, target);.  s
22670 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
22680 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a  (db, pExpr);.}..
22690 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
226a0 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76  ode that will ev
226b0 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f  aluate expressio
226c0 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72  n pExpr and stor
226d0 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73  e the.** results
226e0 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72   in register tar
226f0 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74  get.  The result
22700 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  s are guaranteed
22710 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e   to appear.** in
22720 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
22730 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73  .  If the expres
22740 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
22750 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
22760 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 63 68 6f  ine.** might cho
22770 6f 73 65 20 74 6f 20 63 6f 64 65 20 74 68 65 20  ose to code the 
22780 65 78 70 72 65 73 73 69 6f 6e 20 61 74 20 69 6e  expression at in
22790 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d  itialization tim
227a0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
227b0 65 33 45 78 70 72 43 6f 64 65 46 61 63 74 6f 72  e3ExprCodeFactor
227c0 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
227d0 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
227e0 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
227f0 69 66 28 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f  if( pParse->okCo
22800 6e 73 74 46 61 63 74 6f 72 20 26 26 20 73 71 6c  nstFactor && sql
22810 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
22820 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  nt(pExpr) ){.   
22830 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
22840 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70  AtInit(pParse, p
22850 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20 30 29  Expr, target, 0)
22860 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
22870 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
22880 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
22890 72 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  rget);.  }.}../*
228a0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
228b0 65 20 74 68 61 74 20 65 76 61 6c 75 61 74 65 73  e that evaluates
228c0 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
228d0 73 73 69 6f 6e 20 61 6e 64 20 70 75 74 73 20 74  ssion and puts t
228e0 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20  he result.** in 
228f0 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
22900 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65  .**.** Also make
22910 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65   a copy of the e
22920 78 70 72 65 73 73 69 6f 6e 20 72 65 73 75 6c 74  xpression result
22930 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22  s into another "
22940 63 61 63 68 65 22 20 72 65 67 69 73 74 65 72 0a  cache" register.
22950 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68  ** and modify th
22960 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f 20  e expression so 
22970 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 74 69  that the next ti
22980 6d 65 20 69 74 20 69 73 20 65 76 61 6c 75 61 74  me it is evaluat
22990 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  ed,.** the resul
229a0 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74  t is a copy of t
229b0 68 65 20 63 61 63 68 65 20 72 65 67 69 73 74 65  he cache registe
229c0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
229d0 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
229e0 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  r expressions th
229f0 61 74 20 61 72 65 20 75 73 65 64 20 6d 75 6c 74  at are used mult
22a00 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20  iple .** times. 
22a10 20 54 68 65 79 20 61 72 65 20 65 76 61 6c 75 61   They are evalua
22a20 74 65 64 20 6f 6e 63 65 20 61 6e 64 20 74 68 65  ted once and the
22a30 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
22a40 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72  expression.** ar
22a50 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69  e reused..*/.voi
22a60 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
22a70 65 41 6e 64 43 61 63 68 65 28 50 61 72 73 65 20  eAndCache(Parse 
22a80 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
22a90 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
22aa0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
22ab0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
22ac0 69 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20 61 73 73  int iMem;..  ass
22ad0 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b  ert( target>0 );
22ae0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
22af0 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45  ->op!=TK_REGISTE
22b00 52 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  R );.  sqlite3Ex
22b10 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
22b20 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
22b30 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65   iMem = ++pParse
22b40 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65  ->nMem;.  sqlite
22b50 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
22b60 50 5f 43 6f 70 79 2c 20 74 61 72 67 65 74 2c 20  P_Copy, target, 
22b70 69 4d 65 6d 29 3b 0a 20 20 65 78 70 72 54 6f 52  iMem);.  exprToR
22b80 65 67 69 73 74 65 72 28 70 45 78 70 72 2c 20 69  egister(pExpr, i
22b90 4d 65 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Mem);.}../*.** G
22ba0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
22bb0 74 20 70 75 73 68 65 73 20 74 68 65 20 76 61 6c  t pushes the val
22bc0 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d  ue of every elem
22bd0 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e  ent of the given
22be0 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
22bf0 69 73 74 20 69 6e 74 6f 20 61 20 73 65 71 75 65  ist into a seque
22c00 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nce of registers
22c10 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 61   beginning at ta
22c20 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  rget..**.** Retu
22c30 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
22c40 20 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75 61   elements evalua
22c50 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53  ted..**.** The S
22c60 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 20 66  QLITE_ECEL_DUP f
22c70 6c 61 67 20 70 72 65 76 65 6e 74 73 20 74 68 65  lag prevents the
22c80 20 61 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20   arguments from 
22c90 62 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64 20  being.** filled 
22ca0 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2e 20  using OP_SCopy. 
22cb0 20 4f 50 5f 43 6f 70 79 20 6d 75 73 74 20 62 65   OP_Copy must be
22cc0 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a   used instead..*
22cd0 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f  *.** The SQLITE_
22ce0 45 43 45 4c 5f 46 41 43 54 4f 52 20 61 72 67 75  ECEL_FACTOR argu
22cf0 6d 65 6e 74 20 61 6c 6c 6f 77 73 20 63 6f 6e 73  ment allows cons
22d00 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 74  tant arguments t
22d10 6f 20 62 65 0a 2a 2a 20 66 61 63 74 6f 72 65 64  o be.** factored
22d20 20 6f 75 74 20 69 6e 74 6f 20 69 6e 69 74 69 61   out into initia
22d30 6c 69 7a 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 2a  lization code..*
22d40 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f  *.** The SQLITE_
22d50 45 43 45 4c 5f 52 45 46 20 66 6c 61 67 20 6d 65  ECEL_REF flag me
22d60 61 6e 73 20 74 68 61 74 20 65 78 70 72 65 73 73  ans that express
22d70 69 6f 6e 73 20 69 6e 20 74 68 65 20 6c 69 73 74  ions in the list
22d80 20 77 69 74 68 0a 2a 2a 20 45 78 70 72 4c 69 73   with.** ExprLis
22d90 74 2e 61 5b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  t.a[].u.x.iOrder
22da0 42 79 43 6f 6c 3e 30 20 68 61 76 65 20 61 6c 72  ByCol>0 have alr
22db0 65 61 64 79 20 62 65 65 6e 20 65 76 61 6c 75 61  eady been evalua
22dc0 74 65 64 20 61 6e 64 20 73 74 6f 72 65 64 0a 2a  ted and stored.*
22dd0 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73 20 61  * in registers a
22de0 74 20 73 72 63 52 65 67 2c 20 61 6e 64 20 73 6f  t srcReg, and so
22df0 20 74 68 65 20 76 61 6c 75 65 20 63 61 6e 20 62   the value can b
22e00 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68  e copied from th
22e10 65 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ere..*/.int sqli
22e20 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
22e30 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ist(.  Parse *pP
22e40 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72  arse,     /* Par
22e50 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
22e60 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
22e70 74 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72  t,   /* The expr
22e80 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62  ession list to b
22e90 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  e coded */.  int
22ea0 20 74 61 72 67 65 74 2c 20 20 20 20 20 20 20 20   target,        
22eb0 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74  /* Where to writ
22ec0 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  e results */.  i
22ed0 6e 74 20 73 72 63 52 65 67 2c 20 20 20 20 20 20  nt srcReg,      
22ee0 20 20 2f 2a 20 53 6f 75 72 63 65 20 72 65 67 69    /* Source regi
22ef0 73 74 65 72 73 20 69 66 20 53 51 4c 49 54 45 5f  sters if SQLITE_
22f00 45 43 45 4c 5f 52 45 46 20 2a 2f 0a 20 20 75 38  ECEL_REF */.  u8
22f10 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
22f20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f   /* SQLITE_ECEL_
22f30 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  * flags */.){.  
22f40 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
22f50 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
22f60 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 75 38  nt i, j, n;.  u8
22f70 20 63 6f 70 79 4f 70 20 3d 20 28 66 6c 61 67 73   copyOp = (flags
22f80 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44   & SQLITE_ECEL_D
22f90 55 50 29 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20  UP) ? OP_Copy : 
22fa0 4f 50 5f 53 43 6f 70 79 3b 0a 20 20 56 64 62 65  OP_SCopy;.  Vdbe
22fb0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
22fc0 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  dbe;.  assert( p
22fd0 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  List!=0 );.  ass
22fe0 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b  ert( target>0 );
22ff0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
23000 65 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b 20 20  e->pVdbe!=0 );  
23010 2f 2a 20 4e 65 76 65 72 20 67 65 74 73 20 74 68  /* Never gets th
23020 69 73 20 66 61 72 20 6f 74 68 65 72 77 69 73 65  is far otherwise
23030 20 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d   */.  n = pList-
23040 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 21 43  >nExpr;.  if( !C
23050 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61  onstFactorOk(pPa
23060 72 73 65 29 20 29 20 66 6c 61 67 73 20 26 3d 20  rse) ) flags &= 
23070 7e 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43  ~SQLITE_ECEL_FAC
23080 54 4f 52 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  TOR;.  for(pItem
23090 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
230a0 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  i<n; i++, pItem+
230b0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
230c0 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78  xpr = pItem->pEx
230d0 70 72 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61  pr;.    if( (fla
230e0 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs & SQLITE_ECEL
230f0 5f 52 45 46 29 21 3d 30 20 26 26 20 28 6a 20 3d  _REF)!=0 && (j =
23100 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 75 2e 78   pList->a[i].u.x
23110 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29 3e 30 20  .iOrderByCol)>0 
23120 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
23130 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 63 6f  VdbeAddOp2(v, co
23140 70 79 4f 70 2c 20 6a 2b 73 72 63 52 65 67 2d 31  pyOp, j+srcReg-1
23150 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20  , target+i);.   
23160 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67   }else if( (flag
23170 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  s & SQLITE_ECEL_
23180 46 41 43 54 4f 52 29 21 3d 30 20 26 26 20 73 71  FACTOR)!=0 && sq
23190 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
231a0 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20  ant(pExpr) ){.  
231b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
231c0 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65  odeAtInit(pParse
231d0 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b  , pExpr, target+
231e0 69 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  i, 0);.    }else
231f0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 6e 52 65  {.      int inRe
23200 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
23210 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
23220 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b  , pExpr, target+
23230 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e  i);.      if( in
23240 52 65 67 21 3d 74 61 72 67 65 74 2b 69 20 29 7b  Reg!=target+i ){
23250 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20  .        VdbeOp 
23260 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20 20 69 66  *pOp;.        if
23270 28 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70  ( copyOp==OP_Cop
23280 79 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  y.         && (p
23290 4f 70 3d 73 71 6c 69 74 65 33 56 64 62 65 47 65  Op=sqlite3VdbeGe
232a0 74 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f 70 63  tOp(v, -1))->opc
232b0 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20  ode==OP_Copy.   
232c0 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 31        && pOp->p1
232d0 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65  +pOp->p3+1==inRe
232e0 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4f  g.         && pO
232f0 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d  p->p2+pOp->p3+1=
23300 3d 74 61 72 67 65 74 2b 69 0a 20 20 20 20 20 20  =target+i.      
23310 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
23320 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20 20 20  Op->p3++;.      
23330 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23340 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
23350 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20  dOp2(v, copyOp, 
23360 69 6e 52 65 67 2c 20 74 61 72 67 65 74 2b 69 29  inReg, target+i)
23370 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23380 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
23390 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
233a0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
233b0 20 66 6f 72 20 61 20 42 45 54 57 45 45 4e 20 6f   for a BETWEEN o
233c0 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  perator..**.**  
233d0 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e    x BETWEEN y AN
233e0 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62  D z.**.** The ab
233f0 6f 76 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ove is equivalen
23400 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78  t to .**.**    x
23410 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a  >=y AND x<=z.**.
23420 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73 75  ** Code it as su
23430 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65 20  ch, taking care 
23440 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e  to do the common
23450 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a   subexpression.*
23460 2a 20 65 6c 69 6d 69 6e 61 74 69 6f 6e 20 6f 66  * elimination of
23470 20 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 78 4a   x..**.** The xJ
23480 75 6d 70 49 66 20 70 61 72 61 6d 65 74 65 72 20  umpIf parameter 
23490 64 65 74 65 72 6d 69 6e 65 73 20 64 65 74 61 69  determines detai
234a0 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 55 4c  ls:.**.**    NUL
234b0 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  L:              
234c0 20 20 20 20 20 53 74 6f 72 65 20 74 68 65 20 62       Store the b
234d0 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 69 6e  oolean result in
234e0 20 72 65 67 5b 64 65 73 74 5d 0a 2a 2a 20 20 20   reg[dest].**   
234f0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
23500 75 65 3a 20 20 20 20 20 20 4a 75 6d 70 20 74 6f  ue:      Jump to
23510 20 64 65 73 74 20 69 66 20 74 72 75 65 0a 2a 2a   dest if true.**
23520 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
23530 66 46 61 6c 73 65 3a 20 20 20 20 20 4a 75 6d 70  fFalse:     Jump
23540 20 74 6f 20 64 65 73 74 20 69 66 20 66 61 6c 73   to dest if fals
23550 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 75 6d 70  e.**.** The jump
23560 49 66 4e 75 6c 6c 20 70 61 72 61 6d 65 74 65 72  IfNull parameter
23570 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20 78   is ignored if x
23580 4a 75 6d 70 49 66 20 69 73 20 4e 55 4c 4c 2e 0a  JumpIf is NULL..
23590 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
235a0 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 0a  xprCodeBetween(.
235b0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
235c0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
235d0 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
235e0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
235f0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
23600 20 20 2f 2a 20 54 68 65 20 42 45 54 57 45 45 4e    /* The BETWEEN
23610 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
23620 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20   int dest,      
23630 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69     /* Jump desti
23640 6e 61 74 69 6f 6e 20 6f 72 20 73 74 6f 72 61 67  nation or storag
23650 65 20 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  e location */.  
23660 76 6f 69 64 20 28 2a 78 4a 75 6d 70 29 28 50 61  void (*xJump)(Pa
23670 72 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 69  rse*,Expr*,int,i
23680 6e 74 29 2c 20 2f 2a 20 41 63 74 69 6f 6e 20 74  nt), /* Action t
23690 6f 20 74 61 6b 65 20 2a 2f 0a 20 20 69 6e 74 20  o take */.  int 
236a0 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a  jumpIfNull    /*
236b0 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   Take the jump i
236c0 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 73  f the BETWEEN is
236d0 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 45 78 70   NULL */.){. Exp
236e0 72 20 65 78 70 72 41 6e 64 3b 20 20 20 20 20 2f  r exprAnd;     /
236f0 2a 20 54 68 65 20 41 4e 44 20 6f 70 65 72 61 74  * The AND operat
23700 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20  or in  x>=y AND 
23710 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20  x<=z  */.  Expr 
23720 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20  compLeft;    /* 
23730 54 68 65 20 20 78 3e 3d 79 20 20 74 65 72 6d 20  The  x>=y  term 
23740 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 52 69  */.  Expr compRi
23750 67 68 74 3b 20 20 20 2f 2a 20 54 68 65 20 20 78  ght;   /* The  x
23760 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45  <=z  term */.  E
23770 78 70 72 20 65 78 70 72 58 3b 20 20 20 20 20 20  xpr exprX;      
23780 20 2f 2a 20 54 68 65 20 20 78 20 20 73 75 62 65   /* The  x  sube
23790 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
237a0 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
237b0 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73   /* Temporary us
237c0 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 0a  e register */...
237d0 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 4c 65    memset(&compLe
237e0 66 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78  ft, 0, sizeof(Ex
237f0 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  pr));.  memset(&
23800 63 6f 6d 70 52 69 67 68 74 2c 20 30 2c 20 73 69  compRight, 0, si
23810 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 6d  zeof(Expr));.  m
23820 65 6d 73 65 74 28 26 65 78 70 72 41 6e 64 2c 20  emset(&exprAnd, 
23830 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  0, sizeof(Expr))
23840 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  ;..  assert( !Ex
23850 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
23860 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
23870 74 29 20 29 3b 0a 20 20 65 78 70 72 58 20 3d 20  t) );.  exprX = 
23880 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20  *pExpr->pLeft;. 
23890 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b   exprAnd.op = TK
238a0 5f 41 4e 44 3b 0a 20 20 65 78 70 72 41 6e 64 2e  _AND;.  exprAnd.
238b0 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66  pLeft = &compLef
238c0 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 52 69  t;.  exprAnd.pRi
238d0 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74  ght = &compRight
238e0 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20  ;.  compLeft.op 
238f0 3d 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c  = TK_GE;.  compL
23900 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70  eft.pLeft = &exp
23910 72 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70  rX;.  compLeft.p
23920 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78  Right = pExpr->x
23930 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  .pList->a[0].pEx
23940 70 72 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e  pr;.  compRight.
23950 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f  op = TK_LE;.  co
23960 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20  mpRight.pLeft = 
23970 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 52 69  &exprX;.  compRi
23980 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78  ght.pRight = pEx
23990 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31  pr->x.pList->a[1
239a0 5d 2e 70 45 78 70 72 3b 0a 20 20 65 78 70 72 54  ].pExpr;.  exprT
239b0 6f 52 65 67 69 73 74 65 72 28 26 65 78 70 72 58  oRegister(&exprX
239c0 2c 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72  , exprCodeVector
239d0 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 58 2c  (pParse, &exprX,
239e0 20 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20   &regFree1));.  
239f0 69 66 28 20 78 4a 75 6d 70 20 29 7b 0a 20 20 20  if( xJump ){.   
23a00 20 78 4a 75 6d 70 28 70 50 61 72 73 65 2c 20 26   xJump(pParse, &
23a10 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a  exprAnd, dest, j
23a20 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65  umpIfNull);.  }e
23a30 6c 73 65 7b 0a 20 20 20 20 65 78 70 72 58 2e 66  lse{.    exprX.f
23a40 6c 61 67 73 20 7c 3d 20 45 50 5f 46 72 6f 6d 4a  lags |= EP_FromJ
23a50 6f 69 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  oin;.    sqlite3
23a60 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
23a70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c  Parse, &exprAnd,
23a80 20 64 65 73 74 29 3b 0a 20 20 7d 0a 20 20 73 71   dest);.  }.  sq
23a90 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
23aa0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
23ab0 72 65 65 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73  ree1);..  /* Ens
23ac0 75 72 65 20 61 64 65 71 75 61 74 65 20 74 65 73  ure adequate tes
23ad0 74 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20  t coverage */.  
23ae0 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d  testcase( xJump=
23af0 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72  =sqlite3ExprIfTr
23b00 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  ue  && jumpIfNul
23b10 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l==0 && regFree1
23b20 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==0 );.  testcas
23b30 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
23b40 33 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20  3ExprIfTrue  && 
23b50 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26  jumpIfNull==0 &&
23b60 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a   regFree1!=0 );.
23b70 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
23b80 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
23b90 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e  True  && jumpIfN
23ba0 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65  ull!=0 && regFre
23bb0 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
23bc0 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
23bd0 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20 26  te3ExprIfTrue  &
23be0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20  & jumpIfNull!=0 
23bf0 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29  && regFree1!=0 )
23c00 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
23c10 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ump==sqlite3Expr
23c20 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49  IfFalse && jumpI
23c30 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46  fNull==0 && regF
23c40 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73  ree1==0 );.  tes
23c50 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
23c60 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
23c70 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
23c80 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30  0 && regFree1!=0
23c90 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
23ca0 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78  xJump==sqlite3Ex
23cb0 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d  prIfFalse && jum
23cc0 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65  pIfNull!=0 && re
23cd0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74  gFree1==0 );.  t
23ce0 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
23cf0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
23d00 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  se && jumpIfNull
23d10 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21  !=0 && regFree1!
23d20 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
23d30 28 20 78 4a 75 6d 70 3d 3d 30 20 29 3b 0a 7d 0a  ( xJump==0 );.}.
23d40 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
23d50 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65  code for a boole
23d60 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75  an expression su
23d70 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69  ch that a jump i
23d80 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65  s made.** to the
23d90 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66   label "dest" if
23da0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
23db0 69 73 20 74 72 75 65 20 62 75 74 20 65 78 65 63  is true but exec
23dc0 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75  ution.** continu
23dd0 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75  es straight thru
23de0 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
23df0 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a  on is false..**.
23e00 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
23e10 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74  sion evaluates t
23e20 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20  o NULL (neither 
23e30 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c  true nor false),
23e40 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68   then.** take th
23e50 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75  e jump if the ju
23e60 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73  mpIfNull flag is
23e70 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
23e80 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  LL..**.** This c
23e90 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  ode depends on t
23ea0 68 65 20 66 61 63 74 20 74 68 61 74 20 63 65 72  he fact that cer
23eb0 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65  tain token value
23ec0 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a  s (ex: TK_EQ).**
23ed0 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73   are the same as
23ee0 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28   opcode values (
23ef0 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20  ex: OP_Eq) that 
23f00 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
23f10 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f  rresponding.** o
23f20 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69  peration.  Speci
23f30 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76  al comments in v
23f40 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b  dbe.c and the mk
23f50 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69  opcodeh.awk scri
23f60 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b  pt in.** the mak
23f70 65 20 70 72 6f 63 65 73 73 20 63 61 75 73 65 20  e process cause 
23f80 74 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20  these values to 
23f90 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29  align.  Assert()
23fa0 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a  s in the code.**
23fb0 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68   below verify th
23fc0 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61  at the numbers a
23fd0 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65  re aligned corre
23fe0 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ctly..*/.void sq
23ff0 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
24000 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
24010 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
24020 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66  dest, int jumpIf
24030 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76  Null){.  Vdbe *v
24040 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
24050 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a  ;.  int op = 0;.
24060 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
24070 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
24080 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31  e2 = 0;.  int r1
24090 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28  , r2;..  assert(
240a0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c   jumpIfNull==SQL
240b0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c  ITE_JUMPIFNULL |
240c0 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  | jumpIfNull==0 
240d0 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76  );.  if( NEVER(v
240e0 3d 3d 30 29 20 29 20 20 20 20 20 72 65 74 75 72  ==0) )     retur
240f0 6e 3b 20 20 2f 2a 20 45 78 69 73 74 65 6e 63 65  n;  /* Existence
24100 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65 64   of VDBE checked
24110 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20   by caller */.  
24120 69 66 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d  if( NEVER(pExpr=
24130 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  =0) ) return;  /
24140 2a 20 4e 6f 20 77 61 79 20 74 68 69 73 20 63 61  * No way this ca
24150 6e 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 6f 70  n happen */.  op
24160 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
24170 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
24180 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b    case TK_AND: {
24190 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20  .      int d2 = 
241a0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
241b0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74  abel(v);.      t
241c0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
241d0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
241e0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
241f0 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
24200 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70  ->pLeft, d2,jump
24210 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55  IfNull^SQLITE_JU
24220 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
24230 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
24240 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
24250 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
24260 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
24270 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
24280 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
24290 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
242a0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
242b0 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , d2);.      sql
242c0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
242d0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
242e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
242f0 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20   case TK_OR: {. 
24300 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
24310 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
24320 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
24330 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
24340 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
24350 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
24360 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
24370 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
24380 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
24390 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
243a0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
243b0 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
243c0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
243d0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
243e0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
243f0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
24400 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
24410 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
24420 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
24430 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
24440 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
24450 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
24460 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
24470 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
24480 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
24490 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IS:.    case T
244a0 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74  K_ISNOT:.      t
244b0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
244c0 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  IS );.      test
244d0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
244e0 4f 54 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d  OT );.      op =
244f0 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54   (op==TK_IS) ? T
24500 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20  K_EQ : TK_NE;.  
24510 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d      jumpIfNull =
24520 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a   SQLITE_NULLEQ;.
24530 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
24540 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  ru */.    case T
24550 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
24560 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
24570 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
24580 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
24590 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
245a0 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 69 66  K_EQ: {.      if
245b0 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56  ( sqlite3ExprIsV
245c0 65 63 74 6f 72 28 70 45 78 70 72 2d 3e 70 4c 65  ector(pExpr->pLe
245d0 66 74 29 20 29 20 67 6f 74 6f 20 64 65 66 61 75  ft) ) goto defau
245e0 6c 74 5f 65 78 70 72 3b 0a 20 20 20 20 20 20 74  lt_expr;.      t
245f0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
24600 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
24610 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
24620 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
24630 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
24640 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
24650 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
24660 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
24670 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
24680 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
24690 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
246a0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
246b0 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
246c0 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
246d0 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
246e0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
246f0 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ll);.      asser
24700 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b  t(TK_LT==OP_Lt);
24710 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
24720 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Lt); VdbeCovera
24730 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74  geIf(v,op==OP_Lt
24740 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
24750 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74  TK_LE==OP_Le); t
24760 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
24770 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
24780 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  If(v,op==OP_Le);
24790 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
247a0 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73  _GT==OP_Gt); tes
247b0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29  tcase(op==OP_Gt)
247c0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
247d0 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20  (v,op==OP_Gt);. 
247e0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
247f0 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63  E==OP_Ge); testc
24800 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20  ase(op==OP_Ge); 
24810 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
24820 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20  ,op==OP_Ge);.   
24830 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d     assert(TK_EQ=
24840 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73  =OP_Eq); testcas
24850 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20  e(op==OP_Eq);.  
24860 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
24870 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20  If(v, op==OP_Eq 
24880 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  && jumpIfNull==S
24890 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
248a0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
248b0 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71  eIf(v, op==OP_Eq
248c0 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
248d0 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
248e0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
248f0 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74  NE==OP_Ne); test
24900 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  case(op==OP_Ne);
24910 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
24920 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
24930 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Ne && jumpIfNull
24940 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  ==SQLITE_NULLEQ)
24950 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
24960 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
24970 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  _Ne && jumpIfNul
24980 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  l!=SQLITE_NULLEQ
24990 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
249a0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
249b0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
249c0 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
249d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
249e0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
249f0 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
24a00 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
24a10 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
24a20 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c  ISNULL==OP_IsNul
24a30 6c 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28  l );   testcase(
24a40 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
24a50 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
24a60 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e  TK_NOTNULL==OP_N
24a70 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61  otNull ); testca
24a80 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  se( op==TK_NOTNU
24a90 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  LL );.      r1 =
24aa0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
24ab0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
24ac0 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
24ad0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree1);.      sql
24ae0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
24af0 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b  , op, r1, dest);
24b00 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
24b10 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
24b20 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56  ISNULL);.      V
24b30 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
24b40 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29   op==TK_NOTNULL)
24b50 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
24b60 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
24b70 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
24b80 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
24b90 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
24ba0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
24bb0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
24bc0 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65    exprCodeBetwee
24bd0 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  n(pParse, pExpr,
24be0 20 64 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78   dest, sqlite3Ex
24bf0 70 72 49 66 54 72 75 65 2c 20 6a 75 6d 70 49 66  prIfTrue, jumpIf
24c00 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
24c10 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
24c20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
24c30 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
24c40 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
24c50 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d  nt destIfFalse =
24c60 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
24c70 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
24c80 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d  int destIfNull =
24c90 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65   jumpIfNull ? de
24ca0 73 74 20 3a 20 64 65 73 74 49 66 46 61 6c 73 65  st : destIfFalse
24cb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
24cc0 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65  xprCodeIN(pParse
24cd0 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49 66 46  , pExpr, destIfF
24ce0 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c  alse, destIfNull
24cf0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
24d00 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74  VdbeGoto(v, dest
24d10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
24d20 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
24d30 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  (v, destIfFalse)
24d40 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
24d50 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
24d60 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64  default: {.    d
24d70 65 66 61 75 6c 74 5f 65 78 70 72 3a 0a 20 20 20  efault_expr:.   
24d80 20 20 20 69 66 28 20 65 78 70 72 41 6c 77 61 79     if( exprAlway
24d90 73 54 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a  sTrue(pExpr) ){.
24da0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
24db0 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29  dbeGoto(v, dest)
24dc0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
24dd0 28 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73  ( exprAlwaysFals
24de0 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  e(pExpr) ){.    
24df0 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a      /* No-op */.
24e00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
24e10 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
24e20 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
24e30 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65  arse, pExpr, &re
24e40 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20  gFree1);.       
24e50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24e60 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c  p3(v, OP_If, r1,
24e70 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
24e80 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56  l!=0);.        V
24e90 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
24ea0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
24eb0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
24ec0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
24ed0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
24ee0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
24ef0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
24f00 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
24f10 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
24f20 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20  e, regFree1);.  
24f30 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
24f40 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
24f50 67 46 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a  gFree2);  .}../*
24f60 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
24f70 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20  e for a boolean 
24f80 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20  expression such 
24f90 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d  that a jump is m
24fa0 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61  ade.** to the la
24fb0 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68  bel "dest" if th
24fc0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
24fd0 66 61 6c 73 65 20 62 75 74 20 65 78 65 63 75 74  false but execut
24fe0 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73  ion.** continues
24ff0 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69   straight thru i
25000 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
25010 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20   is true..**.** 
25020 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
25030 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  n evaluates to N
25040 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75  ULL (neither tru
25050 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65  e nor false) the
25060 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d  n.** jump if jum
25070 70 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54  pIfNull is SQLIT
25080 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20  E_JUMPIFNULL or 
25090 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20  fall through if 
250a0 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73  jumpIfNull.** is
250b0 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69   0..*/.void sqli
250c0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 50  te3ExprIfFalse(P
250d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
250e0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64  pr *pExpr, int d
250f0 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  est, int jumpIfN
25100 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ull){.  Vdbe *v 
25110 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
25120 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20  .  int op = 0;. 
25130 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
25140 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
25150 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c  2 = 0;.  int r1,
25160 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   r2;..  assert( 
25170 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
25180 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c  TE_JUMPIFNULL ||
25190 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
251a0 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d  ;.  if( NEVER(v=
251b0 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a  =0) ) return; /*
251c0 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44   Existence of VD
251d0 42 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61  BE checked by ca
251e0 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 70 45  ller */.  if( pE
251f0 78 70 72 3d 3d 30 20 29 20 20 20 20 72 65 74 75  xpr==0 )    retu
25200 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61  rn;..  /* The va
25210 6c 75 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70  lue of pExpr->op
25220 20 61 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61   and op are rela
25230 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
25240 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
25250 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20  pExpr->op       
25260 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20       op.  **    
25270 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20     ---------    
25280 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d        ----------
25290 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49  .  **       TK_I
252a0 53 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f  SNULL          O
252b0 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20  P_NotNull.  **  
252c0 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20       TK_NOTNULL 
252d0 20 20 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c          OP_IsNul
252e0 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  l.  **       TK_
252f0 4e 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  NE              
25300 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Eq.  **      
25310 20 54 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20   TK_EQ          
25320 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20      OP_Ne.  **  
25330 20 20 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20       TK_GT      
25340 20 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20          OP_Le.  
25350 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20  **       TK_LE  
25360 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47              OP_G
25370 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  t.  **       TK_
25380 47 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  GE              
25390 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Lt.  **      
253a0 20 54 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20   TK_LT          
253b0 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20      OP_Ge.  **. 
253c0 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61   ** For other va
253d0 6c 75 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f  lues of pExpr->o
253e0 70 2c 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e  p, op is undefin
253f0 65 64 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20  ed and unused.. 
25400 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   ** The value of
25410 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e   TK_ and OP_ con
25420 73 74 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e  stants are arran
25430 67 65 64 20 73 75 63 68 20 74 68 61 74 20 77 65  ged such that we
25440 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74  .  ** can comput
25450 65 20 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62  e the mapping ab
25460 6f 76 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f  ove using the fo
25470 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69  llowing expressi
25480 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28  on..  ** Assert(
25490 29 73 20 76 65 72 69 66 79 20 74 68 61 74 20 74  )s verify that t
254a0 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69  he computation i
254b0 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a  s correct..  */.
254c0 20 20 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e    op = ((pExpr->
254d0 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29  op+(TK_ISNULL&1)
254e0 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26  )^1)-(TK_ISNULL&
254f0 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79  1);..  /* Verify
25500 20 63 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65   correct alignme
25510 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50  nt of TK_ and OP
25520 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f  _ constants.  */
25530 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
25540 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ->op!=TK_ISNULL 
25550 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  || op==OP_NotNul
25560 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
25570 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54  Expr->op!=TK_NOT
25580 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49  NULL || op==OP_I
25590 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  sNull );.  asser
255a0 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
255b0 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71  _NE || op==OP_Eq
255c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
255d0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c  xpr->op!=TK_EQ |
255e0 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20  | op==OP_Ne );. 
255f0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
25600 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d  op!=TK_LT || op=
25610 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Ge );.  asse
25620 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
25630 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47  K_LE || op==OP_G
25640 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
25650 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20  Expr->op!=TK_GT 
25660 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a  || op==OP_Le );.
25670 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
25680 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70  >op!=TK_GE || op
25690 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77  ==OP_Lt );..  sw
256a0 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
256b0 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
256c0 4e 44 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  ND: {.      test
256d0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
256e0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
256f0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
25700 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
25710 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
25720 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
25730 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
25740 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
25750 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
25760 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
25770 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
25780 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
25790 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
257a0 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
257b0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
257c0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
257d0 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_OR: {.      in
257e0 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t d2 = sqlite3Vd
257f0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
25800 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
25810 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
25820 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
25830 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
25840 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
25850 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51  2, jumpIfNull^SQ
25860 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
25870 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
25880 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
25890 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
258a0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
258b0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
258c0 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
258d0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
258e0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
258f0 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20  eLabel(v, d2);. 
25900 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
25910 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
25920 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
25930 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
25940 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  _NOT: {.      te
25950 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
25960 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
25970 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
25980 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
25990 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
259a0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
259b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
259c0 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20   case TK_IS:.   
259d0 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a   case TK_ISNOT:.
259e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
259f0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
25a00 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
25a10 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
25a20 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20  K_ISNOT );.     
25a30 20 6f 70 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70   op = (pExpr->op
25a40 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45  ==TK_IS) ? TK_NE
25a50 20 3a 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20   : TK_EQ;.      
25a60 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c  jumpIfNull = SQL
25a70 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20  ITE_NULLEQ;.    
25a80 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a    /* Fall thru *
25a90 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  /.    case TK_LT
25aa0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
25ab0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
25ac0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
25ad0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
25ae0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
25af0 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  : {.      if( sq
25b00 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f  lite3ExprIsVecto
25b10 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20  r(pExpr->pLeft) 
25b20 29 20 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65  ) goto default_e
25b30 78 70 72 3b 0a 20 20 20 20 20 20 74 65 73 74 63  xpr;.      testc
25b40 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
25b50 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  =0 );.      r1 =
25b60 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
25b70 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
25b80 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
25b90 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
25ba0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
25bb0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
25bc0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
25bd0 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63  gFree2);.      c
25be0 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
25bf0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
25c00 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
25c10 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
25c20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65        r1, r2, de
25c30 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
25c40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
25c50 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73  _LT==OP_Lt); tes
25c60 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29  tcase(op==OP_Lt)
25c70 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
25c80 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20  (v,op==OP_Lt);. 
25c90 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
25ca0 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63  E==OP_Le); testc
25cb0 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20  ase(op==OP_Le); 
25cc0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
25cd0 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20  ,op==OP_Le);.   
25ce0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d     assert(TK_GT=
25cf0 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73  =OP_Gt); testcas
25d00 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64  e(op==OP_Gt); Vd
25d10 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
25d20 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20  p==OP_Gt);.     
25d30 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f   assert(TK_GE==O
25d40 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Ge); testcase(
25d50 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65  op==OP_Ge); Vdbe
25d60 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
25d70 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61  =OP_Ge);.      a
25d80 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f  ssert(TK_EQ==OP_
25d90 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Eq); testcase(op
25da0 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20  ==OP_Eq);.      
25db0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
25dc0 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a  , op==OP_Eq && j
25dd0 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54  umpIfNull!=SQLIT
25de0 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
25df0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
25e00 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20  v, op==OP_Eq && 
25e10 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
25e20 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
25e30 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d    assert(TK_NE==
25e40 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ne); testcase
25e50 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20  (op==OP_Ne);.   
25e60 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
25e70 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26  f(v, op==OP_Ne &
25e80 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51  & jumpIfNull!=SQ
25e90 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
25ea0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
25eb0 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20  If(v, op==OP_Ne 
25ec0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  && jumpIfNull==S
25ed0 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
25ee0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
25ef0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
25f00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
25f10 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
25f20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
25f30 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
25f40 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
25f50 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
25f60 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
25f70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
25f80 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
25f90 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
25fa0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
25fb0 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64  Op2(v, op, r1, d
25fc0 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
25fd0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
25fe0 55 4c 4c 20 29 3b 20 20 20 56 64 62 65 43 6f 76  ULL );   VdbeCov
25ff0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
26000 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  K_ISNULL);.     
26010 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
26020 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 20 20 56 64  K_NOTNULL );  Vd
26030 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
26040 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b  op==TK_NOTNULL);
26050 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
26060 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
26070 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26080 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
26090 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
260a0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
260b0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
260c0 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
260d0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
260e0 64 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70  dest, sqlite3Exp
260f0 72 49 66 46 61 6c 73 65 2c 20 6a 75 6d 70 49 66  rIfFalse, jumpIf
26100 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
26110 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
26120 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
26130 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
26140 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
26150 66 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b  f( jumpIfNull ){
26160 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
26170 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73  ExprCodeIN(pPars
26180 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
26190 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dest);.      }el
261a0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
261b0 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c  destIfNull = sql
261c0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
261d0 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  l(v);.        sq
261e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
261f0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
26200 65 73 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  est, destIfNull)
26210 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
26220 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
26230 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  l(v, destIfNull)
26240 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26250 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
26260 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  dif.    default:
26270 20 7b 0a 20 20 20 20 64 65 66 61 75 6c 74 5f 65   {.    default_e
26280 78 70 72 3a 20 0a 20 20 20 20 20 20 69 66 28 20  xpr: .      if( 
26290 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
262a0 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
262b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
262c0 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  o(v, dest);.    
262d0 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72    }else if( expr
262e0 41 6c 77 61 79 73 54 72 75 65 28 70 45 78 70 72  AlwaysTrue(pExpr
262f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
26300 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d  no-op */.      }
26310 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31  else{.        r1
26320 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
26330 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
26340 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29  Expr, &regFree1)
26350 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
26360 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
26370 50 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73  P_IfNot, r1, des
26380 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  t, jumpIfNull!=0
26390 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
263a0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
263b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
263c0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
263d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
263e0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
263f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
26400 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
26410 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
26420 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
26430 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69  egFree1);.  sqli
26440 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
26450 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
26460 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69  e2);.}../*.** Li
26470 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  ke sqlite3ExprIf
26480 46 61 6c 73 65 28 29 20 65 78 63 65 70 74 20 74  False() except t
26490 68 61 74 20 61 20 63 6f 70 79 20 69 73 20 6d 61  hat a copy is ma
264a0 64 65 20 6f 66 20 70 45 78 70 72 20 62 65 66 6f  de of pExpr befo
264b0 72 65 0a 2a 2a 20 63 6f 64 65 20 67 65 6e 65 72  re.** code gener
264c0 61 74 69 6f 6e 2c 20 61 6e 64 20 74 68 61 74 20  ation, and that 
264d0 63 6f 70 79 20 69 73 20 64 65 6c 65 74 65 64 20  copy is deleted 
264e0 61 66 74 65 72 20 63 6f 64 65 20 67 65 6e 65 72  after code gener
264f0 61 74 69 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20 65  ation. This.** e
26500 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20  nsures that the 
26510 6f 72 69 67 69 6e 61 6c 20 70 45 78 70 72 20 69  original pExpr i
26520 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  s unchanged..*/.
26530 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
26540 49 66 46 61 6c 73 65 44 75 70 28 50 61 72 73 65  IfFalseDup(Parse
26550 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
26560 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c  pExpr, int dest,
26570 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
26580 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
26590 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45   pParse->db;.  E
265a0 78 70 72 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c  xpr *pCopy = sql
265b0 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
265c0 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28  pExpr, 0);.  if(
265d0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
265e0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  d==0 ){.    sqli
265f0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
26600 50 61 72 73 65 2c 20 70 43 6f 70 79 2c 20 64 65  Parse, pCopy, de
26610 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
26620 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
26630 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f  prDelete(db, pCo
26640 70 79 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44  py);.}.../*.** D
26650 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69  o a deep compari
26660 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65  son of two expre
26670 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65  ssion trees.  Re
26680 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77  turn 0 if the tw
26690 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73  o.** expressions
266a0 20 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20   are completely 
266b0 69 64 65 6e 74 69 63 61 6c 2e 20 20 52 65 74 75  identical.  Retu
266c0 72 6e 20 31 20 69 66 20 74 68 65 79 20 64 69 66  rn 1 if they dif
266d0 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61  fer only.** by a
266e0 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
266f0 72 20 61 74 20 74 68 65 20 74 6f 70 20 6c 65 76  r at the top lev
26700 65 6c 2e 20 20 52 65 74 75 72 6e 20 32 20 69 66  el.  Return 2 if
26710 20 74 68 65 72 65 20 61 72 65 20 64 69 66 66 65   there are diffe
26720 72 65 6e 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20  rences.** other 
26730 74 68 61 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76  than the top-lev
26740 65 6c 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61  el COLLATE opera
26750 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  tor..**.** If an
26760 79 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20  y subelement of 
26770 70 42 20 68 61 73 20 45 78 70 72 2e 69 54 61 62  pB has Expr.iTab
26780 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74  le==(-1) then it
26790 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74   is allowed.** t
267a0 6f 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20  o compare equal 
267b0 74 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74  to an equivalent
267c0 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77   element in pA w
267d0 69 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d  ith Expr.iTable=
267e0 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  =iTab..**.** The
267f0 20 70 41 20 73 69 64 65 20 6d 69 67 68 74 20 62   pA side might b
26800 65 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53  e using TK_REGIS
26810 54 45 52 2e 20 20 49 66 20 74 68 61 74 20 69 73  TER.  If that is
26820 20 74 68 65 20 63 61 73 65 20 61 6e 64 20 70 42   the case and pB
26830 20 69 73 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67   is.** not using
26840 20 54 4b 5f 52 45 47 49 53 54 45 52 20 62 75 74   TK_REGISTER but
26850 20 69 73 20 6f 74 68 65 72 77 69 73 65 20 65 71   is otherwise eq
26860 75 69 76 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73  uivalent, then s
26870 74 69 6c 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a  till return 0..*
26880 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74  *.** Sometimes t
26890 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
268a0 20 72 65 74 75 72 6e 20 32 20 65 76 65 6e 20 69   return 2 even i
268b0 66 20 74 68 65 20 74 77 6f 20 65 78 70 72 65 73  f the two expres
268c0 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20  sions.** really 
268d0 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20  are equivalent. 
268e0 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72   If we cannot pr
268f0 6f 76 65 20 74 68 61 74 20 74 68 65 20 65 78 70  ove that the exp
26900 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20  ressions are.** 
26910 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65  identical, we re
26920 74 75 72 6e 20 32 20 6a 75 73 74 20 74 6f 20 62  turn 2 just to b
26930 65 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20 74  e safe.  So if t
26940 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
26950 65 74 75 72 6e 73 20 32 2c 20 74 68 65 6e 20 79  eturns 2, then y
26960 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79  ou do not really
26970 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69   know for certai
26980 6e 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20  n if the two.** 
26990 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
269a0 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69  the same.  But i
269b0 66 20 79 6f 75 20 67 65 74 20 61 20 30 20 6f 72  f you get a 0 or
269c0 20 31 20 72 65 74 75 72 6e 2c 20 74 68 65 6e 20   1 return, then 
269d0 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75  you.** can be su
269e0 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  re the expressio
269f0 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e  ns are the same.
26a00 20 20 49 6e 20 74 68 65 20 70 6c 61 63 65 73 20    In the places 
26a10 77 68 65 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  where.** this ro
26a20 75 74 69 6e 65 20 69 73 20 75 73 65 64 2c 20 69  utine is used, i
26a30 74 20 64 6f 65 73 20 6e 6f 74 20 68 75 72 74 20  t does not hurt 
26a40 74 6f 20 67 65 74 20 61 6e 20 65 78 74 72 61 20  to get an extra 
26a50 32 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74  2 - that.** just
26a60 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e   might result in
26a70 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20 73   some slightly s
26a80 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20 42 75 74  lower code.  But
26a90 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e   returning.** an
26aa0 20 69 6e 63 6f 72 72 65 63 74 20 30 20 6f 72 20   incorrect 0 or 
26ab0 31 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  1 could lead to 
26ac0 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a  a malfunction..*
26ad0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
26ae0 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70  rCompare(Expr *p
26af0 41 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74  A, Expr *pB, int
26b00 20 69 54 61 62 29 7b 0a 20 20 75 33 32 20 63 6f   iTab){.  u32 co
26b10 6d 62 69 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69  mbinedFlags;.  i
26b20 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d  f( pA==0 || pB==
26b30 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
26b40 70 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a  pB==pA ? 0 : 2;.
26b50 20 20 7d 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c    }.  combinedFl
26b60 61 67 73 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20  ags = pA->flags 
26b70 7c 20 70 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69  | pB->flags;.  i
26b80 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  f( combinedFlags
26b90 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29   & EP_IntValue )
26ba0 7b 0a 20 20 20 20 69 66 28 20 28 70 41 2d 3e 66  {.    if( (pA->f
26bb0 6c 61 67 73 26 70 42 2d 3e 66 6c 61 67 73 26 45  lags&pB->flags&E
26bc0 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 20 26  P_IntValue)!=0 &
26bd0 26 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d  & pA->u.iValue==
26be0 70 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a  pB->u.iValue ){.
26bf0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
26c00 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
26c10 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41   2;.  }.  if( pA
26c20 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a  ->op!=pB->op ){.
26c30 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d      if( pA->op==
26c40 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71  TK_COLLATE && sq
26c50 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
26c60 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2c 20  (pA->pLeft, pB, 
26c70 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20  iTab)<2 ){.     
26c80 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
26c90 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 6f 70 3d  .    if( pB->op=
26ca0 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73  =TK_COLLATE && s
26cb0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
26cc0 65 28 70 41 2c 20 70 42 2d 3e 70 4c 65 66 74 2c  e(pA, pB->pLeft,
26cd0 20 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20   iTab)<2 ){.    
26ce0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
26cf0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a  }.    return 2;.
26d00 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70    }.  if( pA->op
26d10 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  !=TK_COLUMN && p
26d20 41 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f  A->op!=TK_AGG_CO
26d30 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 75 2e 7a 54  LUMN && pA->u.zT
26d40 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20  oken ){.    if( 
26d50 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54  pA->op==TK_FUNCT
26d60 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ION ){.      if(
26d70 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
26d80 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d  pA->u.zToken,pB-
26d90 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20  >u.zToken)!=0 ) 
26da0 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 65  return 2;.    }e
26db0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 70  lse if( strcmp(p
26dc0 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e  A->u.zToken,pB->
26dd0 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a  u.zToken)!=0 ){.
26de0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 41 2d        return pA-
26df0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
26e00 3f 20 31 20 3a 20 32 3b 0a 20 20 20 20 7d 0a 20  ? 1 : 2;.    }. 
26e10 20 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c   }.  if( (pA->fl
26e20 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
26e30 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26  t)!=(pB->flags &
26e40 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20   EP_Distinct) ) 
26e50 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20  return 2;.  if( 
26e60 41 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e 65 64  ALWAYS((combined
26e70 46 6c 61 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e  Flags & EP_Token
26e80 4f 6e 6c 79 29 3d 3d 30 29 20 29 7b 0a 20 20 20  Only)==0) ){.   
26e90 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61   if( combinedFla
26ea0 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63  gs & EP_xIsSelec
26eb0 74 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  t ) return 2;.  
26ec0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
26ed0 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65  rCompare(pA->pLe
26ee0 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69  ft, pB->pLeft, i
26ef0 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b  Tab) ) return 2;
26f00 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
26f10 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
26f20 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67  pRight, pB->pRig
26f30 68 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75  ht, iTab) ) retu
26f40 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71  rn 2;.    if( sq
26f50 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d  lite3ExprListCom
26f60 70 61 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74  pare(pA->x.pList
26f70 2c 20 70 42 2d 3e 78 2e 70 4c 69 73 74 2c 20 69  , pB->x.pList, i
26f80 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b  Tab) ) return 2;
26f90 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28  .    if( ALWAYS(
26fa0 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26  (combinedFlags &
26fb0 20 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 29   EP_Reduced)==0)
26fc0 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 53   && pA->op!=TK_S
26fd0 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 69  TRING ){.      i
26fe0 66 28 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  f( pA->iColumn!=
26ff0 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65  pB->iColumn ) re
27000 74 75 72 6e 20 32 3b 0a 20 20 20 20 20 20 69 66  turn 2;.      if
27010 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42  ( pA->iTable!=pB
27020 2d 3e 69 54 61 62 6c 65 20 0a 20 20 20 20 20 20  ->iTable .      
27030 20 26 26 20 28 70 41 2d 3e 69 54 61 62 6c 65 21   && (pA->iTable!
27040 3d 69 54 61 62 20 7c 7c 20 4e 45 56 45 52 28 70  =iTab || NEVER(p
27050 42 2d 3e 69 54 61 62 6c 65 3e 3d 30 29 29 20 29  B->iTable>=0)) )
27060 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d   return 2;.    }
27070 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
27080 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
27090 65 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f  e two ExprList o
270a0 62 6a 65 63 74 73 2e 20 20 52 65 74 75 72 6e 20  bjects.  Return 
270b0 30 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64  0 if they are id
270c0 65 6e 74 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20  entical and .** 
270d0 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 79  non-zero if they
270e0 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77   differ in any w
270f0 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  ay..**.** If any
27100 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70   subelement of p
27110 42 20 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c  B has Expr.iTabl
27120 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20  e==(-1) then it 
27130 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f  is allowed.** to
27140 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74   compare equal t
27150 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20  o an equivalent 
27160 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69  element in pA wi
27170 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d  th Expr.iTable==
27180 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  iTab..**.** This
27190 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72   routine might r
271a0 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66  eturn non-zero f
271b0 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20 45 78  or equivalent Ex
271c0 70 72 4c 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a  prLists.  The.**
271d0 20 6f 6e 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63   only consequenc
271e0 65 20 77 69 6c 6c 20 62 65 20 64 69 73 61 62 6c  e will be disabl
271f0 65 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  ed optimizations
27200 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f 75 74  .  But this rout
27210 69 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65  ine.** must neve
27220 72 20 72 65 74 75 72 6e 20 30 20 69 66 20 74 68  r return 0 if th
27230 65 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f  e two ExprList o
27240 62 6a 65 63 74 73 20 61 72 65 20 64 69 66 66 65  bjects are diffe
27250 72 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61  rent, or.** a ma
27260 6c 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72  lfunction will r
27270 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f  esult..**.** Two
27280 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61   NULL pointers a
27290 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  re considered to
272a0 20 62 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42   be the same.  B
272b0 75 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  ut a NULL pointe
272c0 72 0a 2a 2a 20 61 6c 77 61 79 73 20 64 69 66 66  r.** always diff
272d0 65 72 73 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e  ers from a non-N
272e0 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a  ULL pointer..*/.
272f0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 4c  int sqlite3ExprL
27300 69 73 74 43 6f 6d 70 61 72 65 28 45 78 70 72 4c  istCompare(ExprL
27310 69 73 74 20 2a 70 41 2c 20 45 78 70 72 4c 69 73  ist *pA, ExprLis
27320 74 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29  t *pB, int iTab)
27330 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
27340 20 70 41 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20   pA==0 && pB==0 
27350 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
27360 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30  ( pA==0 || pB==0
27370 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
27380 66 28 20 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42  f( pA->nExpr!=pB
27390 2d 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e  ->nExpr ) return
273a0 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   1;.  for(i=0; i
273b0 3c 70 41 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  <pA->nExpr; i++)
273c0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
273d0 72 41 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45  rA = pA->a[i].pE
273e0 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  xpr;.    Expr *p
273f0 45 78 70 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d  ExprB = pB->a[i]
27400 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
27410 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  pA->a[i].sortOrd
27420 65 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72  er!=pB->a[i].sor
27430 74 4f 72 64 65 72 20 29 20 72 65 74 75 72 6e 20  tOrder ) return 
27440 31 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  1;.    if( sqlit
27450 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45  e3ExprCompare(pE
27460 78 70 72 41 2c 20 70 45 78 70 72 42 2c 20 69 54  xprA, pExprB, iT
27470 61 62 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ab) ) return 1;.
27480 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
27490 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
274a0 74 72 75 65 20 69 66 20 77 65 20 63 61 6e 20 70  true if we can p
274b0 72 6f 76 65 20 74 68 65 20 70 45 32 20 77 69 6c  rove the pE2 wil
274c0 6c 20 61 6c 77 61 79 73 20 62 65 20 74 72 75 65  l always be true
274d0 20 69 66 20 70 45 31 20 69 73 0a 2a 2a 20 74 72   if pE1 is.** tr
274e0 75 65 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73  ue.  Return fals
274f0 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 63  e if we cannot c
27500 6f 6d 70 6c 65 74 65 20 74 68 65 20 70 72 6f 6f  omplete the proo
27510 66 20 6f 72 20 69 66 20 70 45 32 20 6d 69 67 68  f or if pE2 migh
27520 74 0a 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 20  t.** be false.  
27530 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  Examples:.**.** 
27540 20 20 20 20 70 45 31 3a 20 78 3d 3d 35 20 20 20      pE1: x==5   
27550 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20      pE2: x==5   
27560 20 20 20 20 20 20 20 20 20 20 52 65 73 75 6c 74            Result
27570 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45  : true.**     pE
27580 31 3a 20 78 3e 30 20 20 20 20 20 20 20 20 70 45  1: x>0        pE
27590 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20  2: x==5         
275a0 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73      Result: fals
275b0 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3d  e.**     pE1: x=
275c0 32 31 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d  21       pE2: x=
275d0 32 31 20 4f 52 20 79 3d 34 33 20 20 20 20 20 52  21 OR y=43     R
275e0 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20  esult: true.**  
275f0 20 20 20 70 45 31 3a 20 78 21 3d 31 32 33 20 20     pE1: x!=123  
27600 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54     pE2: x IS NOT
27610 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a   NULL    Result:
27620 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31   true.**     pE1
27630 3a 20 78 21 3d 3f 31 20 20 20 20 20 20 70 45 32  : x!=?1      pE2
27640 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  : x IS NOT NULL 
27650 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a     Result: true.
27660 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49 53  **     pE1: x IS
27670 20 4e 55 4c 4c 20 20 70 45 32 3a 20 78 20 49 53   NULL  pE2: x IS
27680 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73   NOT NULL    Res
27690 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20  ult: false.**   
276a0 20 20 70 45 31 3a 20 78 20 49 53 20 3f 32 20 20    pE1: x IS ?2  
276b0 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20    pE2: x IS NOT 
276c0 4e 55 4c 4c 20 20 20 20 52 65 75 73 6c 74 3a 20  NULL    Reuslt: 
276d0 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  false.**.** When
276e0 20 63 6f 6d 70 61 72 69 6e 67 20 54 4b 5f 43 4f   comparing TK_CO
276f0 4c 55 4d 4e 20 6e 6f 64 65 73 20 62 65 74 77 65  LUMN nodes betwe
27700 65 6e 20 70 45 31 20 61 6e 64 20 70 45 32 2c 20  en pE1 and pE2, 
27710 69 66 20 70 45 32 20 68 61 73 0a 2a 2a 20 45 78  if pE2 has.** Ex
27720 70 72 2e 69 54 61 62 6c 65 3c 30 20 74 68 65 6e  pr.iTable<0 then
27730 20 61 73 73 75 6d 65 20 61 20 74 61 62 6c 65 20   assume a table 
27740 6e 75 6d 62 65 72 20 67 69 76 65 6e 20 62 79 20  number given by 
27750 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  iTab..**.** When
27760 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72   in doubt, retur
27770 6e 20 66 61 6c 73 65 2e 20 20 52 65 74 75 72 6e  n false.  Return
27780 69 6e 67 20 74 72 75 65 20 6d 69 67 68 74 20 67  ing true might g
27790 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  ive a performanc
277a0 65 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74  e.** improvement
277b0 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 66 61 6c  .  Returning fal
277c0 73 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 61  se might cause a
277d0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64   performance red
277e0 75 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69  uction, but.** i
277f0 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 67 69  t will always gi
27800 76 65 20 74 68 65 20 63 6f 72 72 65 63 74 20 61  ve the correct a
27810 6e 73 77 65 72 20 61 6e 64 20 69 73 20 68 65 6e  nswer and is hen
27820 63 65 20 61 6c 77 61 79 73 20 73 61 66 65 2e 0a  ce always safe..
27830 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
27840 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 45 78  prImpliesExpr(Ex
27850 70 72 20 2a 70 45 31 2c 20 45 78 70 72 20 2a 70  pr *pE1, Expr *p
27860 45 32 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20  E2, int iTab){. 
27870 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
27880 43 6f 6d 70 61 72 65 28 70 45 31 2c 20 70 45 32  Compare(pE1, pE2
27890 2c 20 69 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20  , iTab)==0 ){.  
278a0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
278b0 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54    if( pE2->op==T
278c0 4b 5f 4f 52 0a 20 20 20 26 26 20 28 73 71 6c 69  K_OR.   && (sqli
278d0 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78  te3ExprImpliesEx
278e0 70 72 28 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65  pr(pE1, pE2->pLe
278f0 66 74 2c 20 69 54 61 62 29 0a 20 20 20 20 20 20  ft, iTab).      
27900 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
27910 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72  3ExprImpliesExpr
27920 28 70 45 31 2c 20 70 45 32 2d 3e 70 52 69 67 68  (pE1, pE2->pRigh
27930 74 2c 20 69 54 61 62 29 20 29 0a 20 20 29 7b 0a  t, iTab) ).  ){.
27940 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
27950 7d 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d  }.  if( pE2->op=
27960 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26  =TK_NOTNULL.   &
27970 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  & sqlite3ExprCom
27980 70 61 72 65 28 70 45 31 2d 3e 70 4c 65 66 74 2c  pare(pE1->pLeft,
27990 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61   pE2->pLeft, iTa
279a0 62 29 3d 3d 30 0a 20 20 20 26 26 20 28 70 45 31  b)==0.   && (pE1
279b0 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ->op!=TK_ISNULL 
279c0 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49  && pE1->op!=TK_I
279d0 53 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  S).  ){.    retu
279e0 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
279f0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 0;.}../*.** A
27a00 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
27a10 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
27a20 63 74 75 72 65 20 69 73 20 75 73 65 64 20 62 79  cture is used by
27a30 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 65 72   the tree walker
27a40 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  .** to determine
27a50 20 69 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   if an expressio
27a60 6e 20 63 61 6e 20 62 65 20 65 76 61 6c 75 61 74  n can be evaluat
27a70 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 65 20  ed by reference 
27a80 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20  to the.** index 
27a90 6f 6e 6c 79 2c 20 77 69 74 68 6f 75 74 20 68 61  only, without ha
27aa0 76 69 6e 67 20 74 6f 20 64 6f 20 61 20 73 65 61  ving to do a sea
27ab0 72 63 68 20 66 6f 72 20 74 68 65 20 63 6f 72 72  rch for the corr
27ac0 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 61 62  esponding.** tab
27ad0 6c 65 20 65 6e 74 72 79 2e 20 20 54 68 65 20 49  le entry.  The I
27ae0 64 78 43 6f 76 65 72 2e 70 49 64 78 20 66 69 65  dxCover.pIdx fie
27af0 6c 64 20 69 73 20 74 68 65 20 69 6e 64 65 78 2e  ld is the index.
27b00 20 20 49 64 78 43 6f 76 65 72 2e 69 43 75 72 0a    IdxCover.iCur.
27b10 2a 2a 20 69 73 20 74 68 65 20 63 75 72 73 6f 72  ** is the cursor
27b20 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 0a   for the table..
27b30 2a 2f 0a 73 74 72 75 63 74 20 49 64 78 43 6f 76  */.struct IdxCov
27b40 65 72 20 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  er {.  Index *pI
27b50 64 78 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69  dx;     /* The i
27b60 6e 64 65 78 20 74 6f 20 62 65 20 74 65 73 74 65  ndex to be teste
27b70 64 20 66 6f 72 20 63 6f 76 65 72 61 67 65 20 2a  d for coverage *
27b80 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20  /.  int iCur;   
27b90 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
27ba0 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
27bb0 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ble correspondin
27bc0 67 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 2a  g to the index *
27bd0 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  /.};../*.** Chec
27be0 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  k to see if ther
27bf0 65 20 61 72 65 20 72 65 66 65 72 65 6e 63 65 73  e are references
27c00 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   to columns in t
27c10 61 62 6c 65 20 0a 2a 2a 20 70 57 61 6c 6b 65 72  able .** pWalker
27c20 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69  ->u.pIdxCover->i
27c30 43 75 72 20 63 61 6e 20 62 65 20 73 61 74 69 73  Cur can be satis
27c40 66 69 65 64 20 75 73 69 6e 67 20 74 68 65 20 69  fied using the i
27c50 6e 64 65 78 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d  ndex.** pWalker-
27c60 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 70 49  >u.pIdxCover->pI
27c70 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  dx..*/.static in
27c80 74 20 65 78 70 72 49 64 78 43 6f 76 65 72 28 57  t exprIdxCover(W
27c90 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
27ca0 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
27cb0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
27cc0 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70  K_COLUMN.   && p
27cd0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57  Expr->iTable==pW
27ce0 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76  alker->u.pIdxCov
27cf0 65 72 2d 3e 69 43 75 72 0a 20 20 20 26 26 20 73  er->iCur.   && s
27d00 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
27d10 64 65 78 28 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  dex(pWalker->u.p
27d20 49 64 78 43 6f 76 65 72 2d 3e 70 49 64 78 2c 20  IdxCover->pIdx, 
27d30 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3c  pExpr->iColumn)<
27d40 30 0a 20 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b  0.  ){.    pWalk
27d50 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20  er->eCode = 1;. 
27d60 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
27d70 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ort;.  }.  retur
27d80 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
27d90 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  }../*.** Determi
27da0 6e 65 20 69 66 20 61 6e 20 69 6e 64 65 78 20 70  ne if an index p
27db0 49 64 78 20 6f 6e 20 74 61 62 6c 65 20 77 69 74  Idx on table wit
27dc0 68 20 63 75 72 73 6f 72 20 69 43 75 72 20 63 6f  h cursor iCur co
27dd0 6e 74 61 69 6e 73 20 77 69 6c 6c 0a 2a 2a 20 74  ntains will.** t
27de0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  he expression pE
27df0 78 70 72 2e 20 20 52 65 74 75 72 6e 20 74 72 75  xpr.  Return tru
27e00 65 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 64  e if the index d
27e10 6f 65 73 20 63 6f 76 65 72 20 74 68 65 0a 2a 2a  oes cover the.**
27e20 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
27e30 66 61 6c 73 65 20 69 66 20 74 68 65 20 70 45 78  false if the pEx
27e40 70 72 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  pr expression re
27e50 66 65 72 65 6e 63 65 73 20 74 61 62 6c 65 20 63  ferences table c
27e60 6f 6c 75 6d 6e 73 0a 2a 2a 20 74 68 61 74 20 61  olumns.** that a
27e70 72 65 20 6e 6f 74 20 66 6f 75 6e 64 20 69 6e 20  re not found in 
27e80 74 68 65 20 69 6e 64 65 78 20 70 49 64 78 2e 0a  the index pIdx..
27e90 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 64 65 78 20 63  **.** An index c
27ea0 6f 76 65 72 69 6e 67 20 61 6e 20 65 78 70 72 65  overing an expre
27eb0 73 73 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74  ssion means that
27ec0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
27ed0 63 61 6e 20 62 65 0a 2a 2a 20 65 76 61 6c 75 61  can be.** evalua
27ee0 74 65 64 20 75 73 69 6e 67 20 6f 6e 6c 79 20 74  ted using only t
27ef0 68 65 20 69 6e 64 65 78 20 61 6e 64 20 77 69 74  he index and wit
27f00 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 6c  hout having to l
27f10 6f 6f 6b 75 70 20 74 68 65 0a 2a 2a 20 63 6f 72  ookup the.** cor
27f20 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65  responding table
27f30 20 65 6e 74 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73   entry..*/.int s
27f40 71 6c 69 74 65 33 45 78 70 72 43 6f 76 65 72 65  qlite3ExprCovere
27f50 64 42 79 49 6e 64 65 78 28 0a 20 20 45 78 70 72  dByIndex(.  Expr
27f60 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
27f70 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20  /* The index to 
27f80 62 65 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69  be tested */.  i
27f90 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20  nt iCur,        
27fa0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
27fb0 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
27fc0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
27fd0 62 6c 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ble */.  Index *
27fe0 70 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20  pIdx         /* 
27ff0 54 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 6d  The index that m
28000 69 67 68 74 20 62 65 20 75 73 65 64 20 66 6f 72  ight be used for
28010 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 29 7b 0a   coverage */.){.
28020 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74    Walker w;.  st
28030 72 75 63 74 20 49 64 78 43 6f 76 65 72 20 78 63  ruct IdxCover xc
28040 6f 76 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c  ov;.  memset(&w,
28050 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a   0, sizeof(w));.
28060 20 20 78 63 6f 76 2e 69 43 75 72 20 3d 20 69 43    xcov.iCur = iC
28070 75 72 3b 0a 20 20 78 63 6f 76 2e 70 49 64 78 20  ur;.  xcov.pIdx 
28080 3d 20 70 49 64 78 3b 0a 20 20 77 2e 78 45 78 70  = pIdx;.  w.xExp
28090 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
280a0 49 64 78 43 6f 76 65 72 3b 0a 20 20 77 2e 75 2e  IdxCover;.  w.u.
280b0 70 49 64 78 43 6f 76 65 72 20 3d 20 26 78 63 6f  pIdxCover = &xco
280c0 76 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  v;.  sqlite3Walk
280d0 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b  Expr(&w, pExpr);
280e0 0a 20 20 72 65 74 75 72 6e 20 21 77 2e 65 43 6f  .  return !w.eCo
280f0 64 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e  de;.}.../*.** An
28100 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
28110 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
28120 74 75 72 65 20 69 73 20 75 73 65 64 20 62 79 20  ture is used by 
28130 74 68 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a  the tree walker.
28140 2a 2a 20 74 6f 20 63 6f 75 6e 74 20 72 65 66 65  ** to count refe
28150 72 65 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 20  rences to table 
28160 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 61  columns in the a
28170 72 67 75 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a  rguments of an .
28180 2a 2a 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ** aggregate fun
28190 63 74 69 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20  ction, in order 
281a0 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
281b0 0a 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74  .** sqlite3Funct
281c0 69 6f 6e 54 68 69 73 53 72 63 28 29 20 72 6f 75  ionThisSrc() rou
281d0 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  tine..*/.struct 
281e0 53 72 63 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63  SrcCount {.  Src
281f0 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a  List *pSrc;   /*
28200 20 4f 6e 65 20 70 61 72 74 69 63 75 6c 61 72 20   One particular 
28210 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 61  FROM clause in a
28220 20 6e 65 73 74 65 64 20 71 75 65 72 79 20 2a 2f   nested query */
28230 0a 20 20 69 6e 74 20 6e 54 68 69 73 3b 20 20 20  .  int nThis;   
28240 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
28250 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63   references to c
28260 6f 6c 75 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69  olumns in pSrcLi
28270 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68  st */.  int nOth
28280 65 72 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  er;      /* Numb
28290 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
282a0 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f   to columns in o
282b0 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65  ther FROM clause
282c0 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  s */.};../*.** C
282d0 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
282e0 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
282f0 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61   columns..*/.sta
28300 74 69 63 20 69 6e 74 20 65 78 70 72 53 72 63 43  tic int exprSrcC
28310 6f 75 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61  ount(Walker *pWa
28320 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
28330 72 29 7b 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56  r){.  /* The NEV
28340 45 52 28 29 20 6f 6e 20 74 68 65 20 73 65 63 6f  ER() on the seco
28350 6e 64 20 74 65 72 6d 20 69 73 20 62 65 63 61 75  nd term is becau
28360 73 65 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69  se sqlite3Functi
28370 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 29 0a  onUsesThisSrc().
28380 20 20 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 63    ** is always c
28390 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 73 71 6c  alled before sql
283a0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
283b0 67 67 72 65 67 61 74 65 73 28 29 20 61 6e 64 20  ggregates() and 
283c0 73 6f 20 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43  so the.  ** TK_C
283d0 4f 4c 55 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20  OLUMNs have not 
283e0 79 65 74 20 62 65 65 6e 20 63 6f 6e 76 65 72 74  yet been convert
283f0 65 64 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43  ed into TK_AGG_C
28400 4f 4c 55 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20  OLUMN.  If.  ** 
28410 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55  sqlite3FunctionU
28420 73 65 73 54 68 69 73 53 72 63 28 29 20 69 73 20  sesThisSrc() is 
28430 75 73 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79  used differently
28440 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20   in the future, 
28450 74 68 65 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29  the.  ** NEVER()
28460 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65   will need to be
28470 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69   removed. */.  i
28480 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
28490 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52  _COLUMN || NEVER
284a0 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41  (pExpr->op==TK_A
284b0 47 47 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20  GG_COLUMN) ){.  
284c0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72    int i;.    str
284d0 75 63 74 20 53 72 63 43 6f 75 6e 74 20 2a 70 20  uct SrcCount *p 
284e0 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72  = pWalker->u.pSr
284f0 63 43 6f 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c  cCount;.    SrcL
28500 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70  ist *pSrc = p->p
28510 53 72 63 3b 0a 20 20 20 20 69 6e 74 20 6e 53 72  Src;.    int nSr
28520 63 20 3d 20 70 53 72 63 20 3f 20 70 53 72 63 2d  c = pSrc ? pSrc-
28530 3e 6e 53 72 63 20 3a 20 30 3b 0a 20 20 20 20 66  >nSrc : 0;.    f
28540 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 72 63 3b 20  or(i=0; i<nSrc; 
28550 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
28560 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
28570 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  Src->a[i].iCurso
28580 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  r ) break;.    }
28590 0a 20 20 20 20 69 66 28 20 69 3c 6e 53 72 63 20  .    if( i<nSrc 
285a0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 54 68 69  ){.      p->nThi
285b0 73 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  s++;.    }else{.
285c0 20 20 20 20 20 20 70 2d 3e 6e 4f 74 68 65 72 2b        p->nOther+
285d0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  +;.    }.  }.  r
285e0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
285f0 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74  ue;.}../*.** Det
28600 65 72 6d 69 6e 65 20 69 66 20 61 6e 79 20 6f 66  ermine if any of
28610 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74   the arguments t
28620 6f 20 74 68 65 20 70 45 78 70 72 20 46 75 6e 63  o the pExpr Func
28630 74 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 0a 2a  tion reference.*
28640 2a 20 70 53 72 63 4c 69 73 74 2e 20 20 52 65 74  * pSrcList.  Ret
28650 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 79  urn true if they
28660 20 64 6f 2e 20 20 41 6c 73 6f 20 72 65 74 75 72   do.  Also retur
28670 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 66 75  n true if the fu
28680 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f  nction.** has no
28690 20 61 72 67 75 6d 65 6e 74 73 20 6f 72 20 68 61   arguments or ha
286a0 73 20 6f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20  s only constant 
286b0 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75  arguments.  Retu
286c0 72 6e 20 66 61 6c 73 65 20 69 66 20 70 45 78 70  rn false if pExp
286d0 72 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20  r.** references 
286e0 63 6f 6c 75 6d 6e 73 20 62 75 74 20 6e 6f 74 20  columns but not 
286f0 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 61 62 6c 65  columns of table
28700 73 20 66 6f 75 6e 64 20 69 6e 20 70 53 72 63 4c  s found in pSrcL
28710 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ist..*/.int sqli
28720 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54  te3FunctionUsesT
28730 68 69 73 53 72 63 28 45 78 70 72 20 2a 70 45 78  hisSrc(Expr *pEx
28740 70 72 2c 20 53 72 63 4c 69 73 74 20 2a 70 53 72  pr, SrcList *pSr
28750 63 4c 69 73 74 29 7b 0a 20 20 57 61 6c 6b 65 72  cList){.  Walker
28760 20 77 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63   w;.  struct Src
28770 43 6f 75 6e 74 20 63 6e 74 3b 0a 20 20 61 73 73  Count cnt;.  ass
28780 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
28790 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
287a0 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  );.  memset(&w, 
287b0 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
287c0 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
287d0 20 3d 20 65 78 70 72 53 72 63 43 6f 75 6e 74 3b   = exprSrcCount;
287e0 0a 20 20 77 2e 75 2e 70 53 72 63 43 6f 75 6e 74  .  w.u.pSrcCount
287f0 20 3d 20 26 63 6e 74 3b 0a 20 20 63 6e 74 2e 70   = &cnt;.  cnt.p
28800 53 72 63 20 3d 20 70 53 72 63 4c 69 73 74 3b 0a  Src = pSrcList;.
28810 20 20 63 6e 74 2e 6e 54 68 69 73 20 3d 20 30 3b    cnt.nThis = 0;
28820 0a 20 20 63 6e 74 2e 6e 4f 74 68 65 72 20 3d 20  .  cnt.nOther = 
28830 30 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  0;.  sqlite3Walk
28840 45 78 70 72 4c 69 73 74 28 26 77 2c 20 70 45 78  ExprList(&w, pEx
28850 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
28860 72 65 74 75 72 6e 20 63 6e 74 2e 6e 54 68 69 73  return cnt.nThis
28870 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65 72  >0 || cnt.nOther
28880 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  ==0;.}../*.** Ad
28890 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
288a0 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d  to the pAggInfo-
288b0 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20  >aCol[] array.  
288c0 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
288d0 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65   of.** the new e
288e0 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  lement.  Return 
288f0 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
28900 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  r if malloc fail
28910 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
28920 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d   addAggInfoColum
28930 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41  n(sqlite3 *db, A
28940 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  ggInfo *pInfo){.
28950 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f    int i;.  pInfo
28960 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33  ->aCol = sqlite3
28970 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
28980 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20        db,.      
28990 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20   pInfo->aCol,.  
289a0 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66       sizeof(pInf
289b0 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20  o->aCol[0]),.   
289c0 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c      &pInfo->nCol
289d0 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 69 0a 20  umn,.       &i. 
289e0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a   );.  return i;.
289f0 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  }    ../*.** Add
28a00 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
28a10 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e  o the pAggInfo->
28a20 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20  aFunc[] array.  
28a30 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
28a40 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65   of.** the new e
28a50 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  lement.  Return 
28a60 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
28a70 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  r if malloc fail
28a80 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
28a90 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28   addAggInfoFunc(
28aa0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67  sqlite3 *db, Agg
28ab0 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20  Info *pInfo){.  
28ac0 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e  int i;.  pInfo->
28ad0 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41  aFunc = sqlite3A
28ae0 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20  rrayAllocate(.  
28af0 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20       db, .      
28b00 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20   pInfo->aFunc,. 
28b10 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e        sizeof(pIn
28b20 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20  fo->aFunc[0]),. 
28b30 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46        &pInfo->nF
28b40 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20  unc,.       &i. 
28b50 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a   );.  return i;.
28b60 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  }    ../*.** Thi
28b70 73 20 69 73 20 74 68 65 20 78 45 78 70 72 43 61  s is the xExprCa
28b80 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20 74 72 65  llback for a tre
28b90 65 20 77 61 6c 6b 65 72 2e 20 20 49 74 20 69 73  e walker.  It is
28ba0 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c   used to.** impl
28bb0 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 45 78 70  ement sqlite3Exp
28bc0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
28bd0 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74  es().  See sqlit
28be0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
28bf0 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61  regates.** for a
28c00 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
28c10 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
28c20 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72   int analyzeAggr
28c30 65 67 61 74 65 28 57 61 6c 6b 65 72 20 2a 70 57  egate(Walker *pW
28c40 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
28c50 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  pr){.  int i;.  
28c60 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
28c70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e   = pWalker->u.pN
28c80 43 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  C;.  Parse *pPar
28c90 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
28ca0 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  ;.  SrcList *pSr
28cb0 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  cList = pNC->pSr
28cc0 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f  cList;.  AggInfo
28cd0 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43   *pAggInfo = pNC
28ce0 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 73  ->pAggInfo;..  s
28cf0 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
28d00 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
28d10 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20  AGG_COLUMN:.    
28d20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
28d30 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
28d40 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
28d50 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  AGG_COLUMN );.  
28d60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
28d70 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
28d80 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43  MN );.      /* C
28d90 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
28da0 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20  he column is in 
28db0 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  one of the table
28dc0 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20  s in the FROM.  
28dd0 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66      ** clause of
28de0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71   the aggregate q
28df0 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66  uery */.      if
28e00 28 20 41 4c 57 41 59 53 28 70 53 72 63 4c 69 73  ( ALWAYS(pSrcLis
28e10 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  t!=0) ){.       
28e20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
28e30 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53  item *pItem = pS
28e40 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  rcList->a;.     
28e50 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53     for(i=0; i<pS
28e60 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  rcList->nSrc; i+
28e70 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
28e80 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
28e90 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b  gInfo_col *pCol;
28ea0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
28eb0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
28ec0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f  rty(pExpr, EP_To
28ed0 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
28ee0 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ed) );.         
28ef0 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
28f00 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73  le==pItem->iCurs
28f10 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
28f20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
28f30 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20   this point, it 
28f40 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78 70 72  means that pExpr
28f50 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
28f60 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
28f70 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65  * that is in the
28f80 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
28f90 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75  the aggregate qu
28fa0 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20  ery.  .         
28fb0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
28fc0 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74    ** Make an ent
28fd0 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ry for the colum
28fe0 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  n in pAggInfo->a
28ff0 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20  Col[] if there. 
29000 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73             ** is
29010 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68   not an entry th
29020 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
29030 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
29040 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20          int k;. 
29050 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20             pCol 
29060 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  = pAggInfo->aCol
29070 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
29080 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66  r(k=0; k<pAggInf
29090 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c  o->nColumn; k++,
290a0 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   pCol++){.      
290b0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
290c0 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d  ->iTable==pExpr-
290d0 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20  >iTable &&.     
290e0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
290f0 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70  l->iColumn==pExp
29100 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  r->iColumn ){.  
29110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
29120 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
29130 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
29140 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
29150 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d  f( (k>=pAggInfo-
29160 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20  >nColumn).      
29170 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61         && (k = a
29180 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28  ddAggInfoColumn(
29190 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67  pParse->db, pAgg
291a0 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20  Info))>=0 .     
291b0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
291c0 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26          pCol = &
291d0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b  pAggInfo->aCol[k
291e0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
291f0 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45   pCol->pTab = pE
29200 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
29210 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
29220 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69  Table = pExpr->i
29230 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
29240 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75       pCol->iColu
29250 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  mn = pExpr->iCol
29260 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  umn;.           
29270 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20     pCol->iMem = 
29280 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
29290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
292a0 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
292b0 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
292c0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70        pCol->pExp
292d0 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  r = pExpr;.     
292e0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67           if( pAg
292f0 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20  gInfo->pGroupBy 
29300 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
29310 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20     int j, n;.   
29320 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
29330 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67  rList *pGB = pAg
29340 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b  gInfo->pGroupBy;
29350 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29360 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
29370 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70  _item *pTerm = p
29380 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20  GB->a;.         
29390 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e         n = pGB->
293a0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  nExpr;.         
293b0 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
293c0 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b  j<n; j++, pTerm+
293d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
293e0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
293f0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
29400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29410 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
29420 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54  COLUMN && pE->iT
29430 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61  able==pExpr->iTa
29440 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20  ble &&.         
29450 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 2d               pE-
29460 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
29470 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
29480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29490 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
294a0 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  umn = j;.       
294b0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
294c0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
294d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
294e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
294f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29500 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
29510 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c  ->iSorterColumn<
29520 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
29530 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
29540 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49  erColumn = pAggI
29550 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c  nfo->nSortingCol
29560 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  umn++;.         
29570 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
29580 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
29590 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77   /* There is now
295a0 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45   an entry for pE
295b0 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  xpr in pAggInfo-
295c0 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a  >aCol[] (either.
295d0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62              ** b
295e0 65 63 61 75 73 65 20 69 74 20 77 61 73 20 74 68  ecause it was th
295f0 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65  ere before or be
29600 63 61 75 73 65 20 77 65 20 6a 75 73 74 20 63 72  cause we just cr
29610 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20  eated it)..     
29620 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72         ** Conver
29630 74 20 74 68 65 20 70 45 78 70 72 20 74 6f 20 62  t the pExpr to b
29640 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  e a TK_AGG_COLUM
29650 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74  N referring to t
29660 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  hat.            
29670 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  ** pAggInfo->aCo
29680 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20  l[] entry..     
29690 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
296a0 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41        ExprSetVVA
296b0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
296c0 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
296d0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
296e0 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67  >pAggInfo = pAgg
296f0 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  Info;.          
29700 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
29710 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  _AGG_COLUMN;.   
29720 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
29730 69 41 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20  iAgg = (i16)k;. 
29740 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
29750 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a  ;.          } /*
29760 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54   endif pExpr->iT
29770 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75  able==pItem->iCu
29780 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rsor */.        
29790 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76  } /* end loop ov
297a0 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20  er pSrcList */. 
297b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
297c0 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
297d0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
297e0 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  _AGG_FUNCTION: {
297f0 0a 20 20 20 20 20 20 69 66 28 20 28 70 4e 43 2d  .      if( (pNC-
29800 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e  >ncFlags & NC_In
29810 41 67 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20  AggFunc)==0.    
29820 20 20 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77     && pWalker->w
29830 61 6c 6b 65 72 44 65 70 74 68 3d 3d 70 45 78 70  alkerDepth==pExp
29840 72 2d 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a  r->op2.      ){.
29850 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
29860 20 74 6f 20 73 65 65 20 69 66 20 70 45 78 70 72   to see if pExpr
29870 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20   is a duplicate 
29880 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65  of another aggre
29890 67 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  gate .        **
298a0 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
298b0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
298c0 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74   pAggInfo struct
298d0 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ure.        */. 
298e0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
298f0 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65  gInfo_func *pIte
29900 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  m = pAggInfo->aF
29910 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  unc;.        for
29920 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
29930 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49  ->nFunc; i++, pI
29940 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
29950 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
29960 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e  rCompare(pItem->
29970 70 45 78 70 72 2c 20 70 45 78 70 72 2c 20 2d 31  pExpr, pExpr, -1
29980 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
29990 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
299a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
299b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d  .        if( i>=
299c0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20  pAggInfo->nFunc 
299d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
299e0 70 45 78 70 72 20 69 73 20 6f 72 69 67 69 6e 61  pExpr is origina
299f0 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77 20 65  l.  Make a new e
29a00 6e 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66 6f  ntry in pAggInfo
29a10 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20  ->aFunc[].      
29a20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
29a30 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50   u8 enc = ENC(pP
29a40 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20  arse->db);.     
29a50 20 20 20 20 20 69 20 3d 20 61 64 64 41 67 67 49       i = addAggI
29a60 6e 66 6f 46 75 6e 63 28 70 50 61 72 73 65 2d 3e  nfoFunc(pParse->
29a70 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20  db, pAggInfo);. 
29a80 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d           if( i>=
29a90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
29aa0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
29ab0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
29ac0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
29ad0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
29ae0 74 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  tem = &pAggInfo-
29af0 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20  >aFunc[i];.     
29b00 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45         pItem->pE
29b10 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  xpr = pExpr;.   
29b20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
29b30 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
29b40 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20  >nMem;.         
29b50 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
29b60 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
29b70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
29b80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
29b90 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71  Item->pFunc = sq
29ba0 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
29bb0 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20  n(pParse->db,.  
29bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29bd0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
29be0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
29bf0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70        pExpr->x.p
29c00 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e  List ? pExpr->x.
29c10 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
29c20 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
29c30 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
29c40 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
29c50 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20  tinct ){.       
29c60 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44         pItem->iD
29c70 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65  istinct = pParse
29c80 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
29c90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
29ca0 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
29cb0 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31  ->iDistinct = -1
29cc0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
29cd0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
29ce0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
29cf0 20 4d 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e   Make pExpr poin
29d00 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72  t to the appropr
29d10 69 61 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61  iate pAggInfo->a
29d20 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20  Func[] entry.   
29d30 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
29d40 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
29d50 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
29d60 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
29d70 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
29d80 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72      ExprSetVVAPr
29d90 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
29da0 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20  _NoReduce);.    
29db0 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
29dc0 3d 20 28 69 31 36 29 69 3b 0a 20 20 20 20 20 20  = (i16)i;.      
29dd0 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66    pExpr->pAggInf
29de0 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20  o = pAggInfo;.  
29df0 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
29e00 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 65  _Prune;.      }e
29e10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74  lse{.        ret
29e20 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
29e30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
29e40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43    }.  return WRC
29e50 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61  _Continue;.}.sta
29e60 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41  tic int analyzeA
29e70 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63  ggregatesInSelec
29e80 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  t(Walker *pWalke
29e90 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  r, Select *pSele
29ea0 63 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ct){.  UNUSED_PA
29eb0 52 41 4d 45 54 45 52 28 70 57 61 6c 6b 65 72 29  RAMETER(pWalker)
29ec0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
29ed0 45 54 45 52 28 70 53 65 6c 65 63 74 29 3b 0a 20  ETER(pSelect);. 
29ee0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
29ef0 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  inue;.}../*.** A
29f00 6e 61 6c 79 7a 65 20 74 68 65 20 70 45 78 70 72  nalyze the pExpr
29f10 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b   expression look
29f20 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74  ing for aggregat
29f30 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a  e functions and.
29f40 2a 2a 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73  ** for variables
29f50 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
29f60 20 61 64 64 65 64 20 74 6f 20 41 67 67 49 6e 66   added to AggInf
29f70 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 20 70 4e  o object that pN
29f80 43 2d 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70  C->pAggInfo.** p
29f90 6f 69 6e 74 73 20 74 6f 2e 20 20 41 64 64 69 74  oints to.  Addit
29fa0 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 61 72  ional entries ar
29fb0 65 20 6d 61 64 65 20 6f 6e 20 74 68 65 20 41 67  e made on the Ag
29fc0 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a  gInfo object as.
29fd0 2a 2a 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  ** necessary..**
29fe0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
29ff0 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
2a000 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65  called after the
2a010 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
2a020 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64  been.** analyzed
2a030 20 62 79 20 73 71 6c 69 74 65 33 52 65 73 6f 6c   by sqlite3Resol
2a040 76 65 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a  veExprNames()..*
2a050 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
2a060 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
2a070 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20  tes(NameContext 
2a080 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70  *pNC, Expr *pExp
2a090 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  r){.  Walker w;.
2a0a0 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
2a0b0 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e  sizeof(w));.  w.
2a0c0 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
2a0d0 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
2a0e0 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
2a0f0 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41  lback = analyzeA
2a100 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63  ggregatesInSelec
2a110 74 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70  t;.  w.u.pNC = p
2a120 4e 43 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e  NC;.  assert( pN
2a130 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30 20 29  C->pSrcList!=0 )
2a140 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
2a150 78 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a  xpr(&w, pExpr);.
2a160 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71  }../*.** Call sq
2a170 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
2a180 41 67 67 72 65 67 61 74 65 73 28 29 20 66 6f 72  Aggregates() for
2a190 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
2a1a0 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65  n in an.** expre
2a1b0 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74  ssion list.  Ret
2a1c0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
2a1d0 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20  f errors..**.** 
2a1e0 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 66  If an error is f
2a1f0 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79 73  ound, the analys
2a200 69 73 20 69 73 20 63 75 74 20 73 68 6f 72 74 2e  is is cut short.
2a210 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2a220 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
2a230 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  st(NameContext *
2a240 70 4e 43 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  pNC, ExprList *p
2a250 4c 69 73 74 29 7b 0a 20 20 73 74 72 75 63 74 20  List){.  struct 
2a260 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
2a270 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
2a280 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
2a290 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
2a2a0 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69  t->a, i=0; i<pLi
2a2b0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  st->nExpr; i++, 
2a2c0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
2a2d0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2a2e0 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 4e 43  zeAggregates(pNC
2a2f0 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
2a300 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
2a310 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 73  .** Allocate a s
2a320 69 6e 67 6c 65 20 6e 65 77 20 72 65 67 69 73 74  ingle new regist
2a330 65 72 20 66 6f 72 20 75 73 65 20 74 6f 20 68 6f  er for use to ho
2a340 6c 64 20 73 6f 6d 65 20 69 6e 74 65 72 6d 65 64  ld some intermed
2a350 69 61 74 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a  iate result..*/.
2a360 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65  int sqlite3GetTe
2a370 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70 50 61  mpReg(Parse *pPa
2a380 72 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72  rse){.  if( pPar
2a390 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20  se->nTempReg==0 
2a3a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 2b  ){.    return ++
2a3b0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2a3c0 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73  }.  return pPars
2a3d0 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50  e->aTempReg[--pP
2a3e0 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b  arse->nTempReg];
2a3f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f  .}../*.** Deallo
2a400 63 61 74 65 20 61 20 72 65 67 69 73 74 65 72 2c  cate a register,
2a410 20 6d 61 6b 69 6e 67 20 61 76 61 69 6c 61 62 6c   making availabl
2a420 65 20 66 6f 72 20 72 65 75 73 65 20 66 6f 72 20  e for reuse for 
2a430 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 75  some other.** pu
2a440 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rpose..**.** If 
2a450 61 20 72 65 67 69 73 74 65 72 20 69 73 20 63 75  a register is cu
2a460 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 75 73  rrently being us
2a470 65 64 20 62 79 20 74 68 65 20 63 6f 6c 75 6d 6e  ed by the column
2a480 20 63 61 63 68 65 2c 20 74 68 65 6e 0a 2a 2a 20   cache, then.** 
2a490 74 68 65 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e  the deallocation
2a4a0 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74   is deferred unt
2a4b0 69 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  il the column ca
2a4c0 63 68 65 20 6c 69 6e 65 20 74 68 61 74 20 75 73  che line that us
2a4d0 65 73 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74  es.** the regist
2a4e0 65 72 20 62 65 63 6f 6d 65 73 20 73 74 61 6c 65  er becomes stale
2a4f0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2a500 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
2a510 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
2a520 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 66 28 20  nt iReg){.  if( 
2a530 69 52 65 67 20 26 26 20 70 50 61 72 73 65 2d 3e  iReg && pParse->
2a540 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69  nTempReg<ArraySi
2a550 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  ze(pParse->aTemp
2a560 52 65 67 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  Reg) ){.    int 
2a570 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20 79 43  i;.    struct yC
2a580 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 20 20  olCache *p;.    
2a590 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
2a5a0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
2a5b0 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
2a5c0 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
2a5d0 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d      if( p->iReg=
2a5e0 3d 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20 20  =iReg ){.       
2a5f0 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 31 3b   p->tempReg = 1;
2a600 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
2a610 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2a620 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70     pParse->aTemp
2a630 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d  Reg[pParse->nTem
2a640 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a  pReg++] = iReg;.
2a650 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
2a660 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63  ocate or dealloc
2a670 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e  ate a block of n
2a680 52 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65 20  Reg consecutive 
2a690 72 65 67 69 73 74 65 72 73 0a 2a 2f 0a 69 6e 74  registers.*/.int
2a6a0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
2a6b0 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  ange(Parse *pPar
2a6c0 73 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  se, int nReg){. 
2a6d0 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 20 3d   int i, n;.  i =
2a6e0 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
2a6f0 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73 65  eg;.  n = pParse
2a700 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20 69  ->nRangeReg;.  i
2a710 66 28 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20 20  f( nReg<=n ){.  
2a720 20 20 61 73 73 65 72 74 28 20 21 75 73 65 64 41    assert( !usedA
2a730 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61  sColumnCache(pPa
2a740 72 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29  rse, i, i+n-1) )
2a750 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52  ;.    pParse->iR
2a760 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b  angeReg += nReg;
2a770 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61  .    pParse->nRa
2a780 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a  ngeReg -= nReg;.
2a790 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d    }else{.    i =
2a7a0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
2a7b0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
2a7c0 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20  m += nReg;.  }. 
2a7d0 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69   return i;.}.voi
2a7e0 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65  d sqlite3Release
2a7f0 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20  TempRange(Parse 
2a800 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
2a810 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  g, int nReg){.  
2a820 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
2a830 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69  Remove(pParse, i
2a840 52 65 67 2c 20 6e 52 65 67 29 3b 0a 20 20 69 66  Reg, nReg);.  if
2a850 28 20 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e  ( nReg>pParse->n
2a860 52 61 6e 67 65 52 65 67 20 29 7b 0a 20 20 20 20  RangeReg ){.    
2a870 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
2a880 67 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50  g = nReg;.    pP
2a890 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20  arse->iRangeReg 
2a8a0 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = iReg;.  }.}../
2a8b0 2a 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65  *.** Mark all te
2a8c0 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
2a8d0 73 20 61 73 20 62 65 69 6e 67 20 75 6e 61 76 61  s as being unava
2a8e0 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65  ilable for reuse
2a8f0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2a900 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63  3ClearTempRegCac
2a910 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  he(Parse *pParse
2a920 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 65  ){.  pParse->nTe
2a930 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 70 50 61  mpReg = 0;.  pPa
2a940 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d  rse->nRangeReg =
2a950 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c   0;.}../*.** Val
2a960 69 64 61 74 65 20 74 68 61 74 20 6e 6f 20 74 65  idate that no te
2a970 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
2a980 20 66 61 6c 6c 73 20 77 69 74 68 69 6e 20 74 68   falls within th
2a990 65 20 72 61 6e 67 65 20 6f 66 0a 2a 2a 20 69 46  e range of.** iF
2a9a0 69 72 73 74 2e 2e 69 4c 61 73 74 2c 20 69 6e 63  irst..iLast, inc
2a9b0 6c 75 73 69 76 65 2e 20 20 54 68 69 73 20 72 6f  lusive.  This ro
2a9c0 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
2a9d0 6c 6c 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61  ll from within a
2a9e0 73 73 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65  ssert().** state
2a9f0 6d 65 6e 74 73 2e 0a 2a 2f 0a 23 69 66 64 65 66  ments..*/.#ifdef
2aa00 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e   SQLITE_DEBUG.in
2aa10 74 20 73 71 6c 69 74 65 33 4e 6f 54 65 6d 70 73  t sqlite3NoTemps
2aa20 49 6e 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70  InRange(Parse *p
2aa30 50 61 72 73 65 2c 20 69 6e 74 20 69 46 69 72 73  Parse, int iFirs
2aa40 74 2c 20 69 6e 74 20 69 4c 61 73 74 29 7b 0a 20  t, int iLast){. 
2aa50 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 50   int i;.  if( pP
2aa60 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3e  arse->nRangeReg>
2aa70 30 0a 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e  0.   && pParse->
2aa80 69 52 61 6e 67 65 52 65 67 2b 70 50 61 72 73 65  iRangeReg+pParse
2aa90 2d 3e 6e 52 61 6e 67 65 52 65 67 3c 69 4c 61 73  ->nRangeReg<iLas
2aaa0 74 0a 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e  t.   && pParse->
2aab0 69 52 61 6e 67 65 52 65 67 3e 3d 69 46 69 72 73  iRangeReg>=iFirs
2aac0 74 0a 20 20 29 7b 0a 20 20 20 20 20 72 65 74 75  t.  ){.     retu
2aad0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  rn 0;.  }.  for(
2aae0 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
2aaf0 54 65 6d 70 52 65 67 3b 20 69 2b 2b 29 7b 0a 20  TempReg; i++){. 
2ab00 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61     if( pParse->a
2ab10 54 65 6d 70 52 65 67 5b 69 5d 3e 3d 69 46 69 72  TempReg[i]>=iFir
2ab20 73 74 20 26 26 20 70 50 61 72 73 65 2d 3e 61 54  st && pParse->aT
2ab30 65 6d 70 52 65 67 5b 69 5d 3c 3d 69 4c 61 73 74  empReg[i]<=iLast
2ab40 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2ab50 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
2ab60 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
2ab70 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
2ab80 55 47 20 2a 2f 0a                                UG */.