/ Hex Artifact Content
Login

Artifact 3dc226ccd9eebee600253eba07b8d97534e49337:


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 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ar expression.  
16790 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
167a0 69 64 65 20 28 52 48 53 29 0a 2a 2a 20 69 73 20  ide (RHS).** is 
167b0 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65 72 6f  an array of zero
167c0 20 6f 72 20 6d 6f 72 65 20 76 61 6c 75 65 73 2e   or more values.
167d0 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e    The expression
167e0 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
167f0 4c 48 53 20 69 73 0a 2a 2a 20 63 6f 6e 74 61 69  LHS is.** contai
16800 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52  ned within the R
16810 48 53 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6f  HS.  The value o
16820 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
16830 20 69 73 20 75 6e 6b 6e 6f 77 6e 20 28 4e 55 4c   is unknown (NUL
16840 4c 29 0a 2a 2a 20 69 66 20 74 68 65 20 4c 48 53  L).** if the LHS
16850 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74   is NULL or if t
16860 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f  he LHS is not co
16870 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74  ntained within t
16880 68 65 20 52 48 53 20 61 6e 64 20 74 68 65 0a 2a  he RHS and the.*
16890 2a 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 6f  * RHS contains o
168a0 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20  ne or more NULL 
168b0 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  values..**.** Th
168c0 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
168d0 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 6a  ates code that j
168e0 75 6d 70 73 20 74 6f 20 64 65 73 74 49 66 46 61  umps to destIfFa
168f0 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53 20 69  lse if the LHS i
16900 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61 69  s not .** contai
16910 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52  ned within the R
16920 48 53 2e 20 20 49 66 20 64 75 65 20 74 6f 20 4e  HS.  If due to N
16930 55 4c 4c 73 20 77 65 20 63 61 6e 6e 6f 74 20 64  ULLs we cannot d
16940 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
16950 4c 48 53 0a 2a 2a 20 69 73 20 63 6f 6e 74 61 69  LHS.** is contai
16960 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 20 74  ned in the RHS t
16970 68 65 6e 20 6a 75 6d 70 20 74 6f 20 64 65 73 74  hen jump to dest
16980 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 20  IfNull.  If the 
16990 4c 48 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  LHS is contained
169a0 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 52  .** within the R
169b0 48 53 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72  HS then fall thr
169c0 6f 75 67 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ough..*/.static 
169d0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
169e0 43 6f 64 65 49 4e 28 0a 20 20 50 61 72 73 65 20  CodeIN(.  Parse 
169f0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
16a00 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
16a10 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
16a20 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
16a30 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
16a40 20 20 2f 2a 20 54 68 65 20 49 4e 20 65 78 70 72    /* The IN expr
16a50 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
16a60 64 65 73 74 49 66 46 61 6c 73 65 2c 20 20 20 20  destIfFalse,    
16a70 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
16a80 66 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e  f LHS is not con
16a90 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48  tained in the RH
16aa0 53 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49  S */.  int destI
16ab0 66 4e 75 6c 6c 20 20 20 20 20 20 20 20 2f 2a 20  fNull        /* 
16ac0 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65  Jump here if the
16ad0 20 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e 6b   results are unk
16ae0 6e 6f 77 6e 20 64 75 65 20 74 6f 20 4e 55 4c 4c  nown due to NULL
16af0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 52  s */.){.  int rR
16b00 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 20 20  hsHasNull = 0;  
16b10 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 61 74  /* Register that
16b20 20 69 73 20 74 72 75 65 20 69 66 20 52 48 53 20   is true if RHS 
16b30 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61  contains NULL va
16b40 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 65 54  lues */.  int eT
16b50 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ype;            
16b60 2f 2a 20 54 79 70 65 20 6f 66 20 74 68 65 20 52  /* Type of the R
16b70 48 53 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20  HS */.  int r1, 
16b80 72 32 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r2;           /*
16b90 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72   Temporary use r
16ba0 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 56 64  egisters */.  Vd
16bb0 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
16bc0 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74      /* Statement
16bd0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
16be0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69  ion */.  int *ai
16bf0 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  Map = 0;       /
16c00 2a 20 4d 61 70 20 66 72 6f 6d 20 76 65 63 74 6f  * Map from vecto
16c10 72 20 66 69 65 6c 64 20 74 6f 20 69 6e 64 65 78  r field to index
16c20 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61   column */.  cha
16c30 72 20 2a 7a 41 66 66 20 3d 20 30 3b 20 20 20 20  r *zAff = 0;    
16c40 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 73     /* Affinity s
16c50 74 72 69 6e 67 20 66 6f 72 20 63 6f 6d 70 61 72  tring for compar
16c60 69 73 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  isons */.  int n
16c70 56 65 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20  Vector;         
16c80 20 2f 2a 20 53 69 7a 65 20 6f 66 20 76 65 63 74   /* Size of vect
16c90 6f 72 73 20 66 6f 72 20 74 68 69 73 20 49 4e 28  ors for this IN(
16ca0 2e 2e 2e 29 20 6f 70 20 2a 2f 0a 20 20 69 6e 74  ...) op */.  int
16cb0 20 69 44 75 6d 6d 79 3b 20 20 20 20 20 20 20 20   iDummy;        
16cc0 20 20 20 2f 2a 20 44 75 6d 6d 79 20 70 61 72 61     /* Dummy para
16cd0 6d 65 74 65 72 20 74 6f 20 65 78 70 72 43 6f 64  meter to exprCod
16ce0 65 56 65 63 74 6f 72 28 29 20 2a 2f 0a 20 20 45  eVector() */.  E
16cf0 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
16d00 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69 6e 74  pr->pLeft;.  int
16d10 20 69 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74   i;..  if( sqlit
16d20 65 33 45 78 70 72 43 68 65 63 6b 49 4e 28 70 50  e3ExprCheckIN(pP
16d30 61 72 73 65 2c 20 70 45 78 70 72 29 20 29 20 72  arse, pExpr) ) r
16d40 65 74 75 72 6e 3b 0a 20 20 7a 41 66 66 20 3d 20  eturn;.  zAff = 
16d50 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28 70  exprINAffinity(p
16d60 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
16d70 20 69 66 28 20 7a 41 66 66 3d 3d 30 20 29 20 72   if( zAff==0 ) r
16d80 65 74 75 72 6e 3b 0a 20 20 6e 56 65 63 74 6f 72  eturn;.  nVector
16d90 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
16da0 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d 3e  ctorSize(pExpr->
16db0 70 4c 65 66 74 29 3b 0a 20 20 61 69 4d 61 70 20  pLeft);.  aiMap 
16dc0 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 44  = (int*)sqlite3D
16dd0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20  bMallocZero(.   
16de0 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e     pParse->db, n
16df0 56 65 63 74 6f 72 2a 28 73 69 7a 65 6f 66 28 69  Vector*(sizeof(i
16e00 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28 63 68 61  nt) + sizeof(cha
16e10 72 29 29 20 2b 20 31 0a 20 20 29 3b 0a 20 20 69  r)) + 1.  );.  i
16e20 66 28 20 61 69 4d 61 70 3d 3d 30 20 29 7b 0a 20  f( aiMap==0 ){. 
16e30 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
16e40 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 41 66  (pParse->db, zAf
16e50 66 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  f);.    return;.
16e60 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 74 65 6d 70    }..  /* Attemp
16e70 74 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  t to compute the
16e80 20 52 48 53 2e 20 41 66 74 65 72 20 74 68 69 73   RHS. After this
16e90 20 73 74 65 70 2c 20 69 66 20 61 6e 79 74 68 69   step, if anythi
16ea0 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 0a 20 20  ng other than.  
16eb0 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  ** IN_INDEX_NOOP
16ec0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
16ed0 65 20 74 61 62 6c 65 20 6f 70 65 6e 65 64 20 69  e table opened i
16ee0 74 68 20 63 75 72 73 6f 72 20 70 45 78 70 72 2d  th cursor pExpr-
16ef0 3e 69 54 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f  >iTable .  ** co
16f00 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65  ntains the value
16f10 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74  s that make up t
16f20 68 65 20 52 48 53 2e 20 49 66 20 49 4e 5f 49 4e  he RHS. If IN_IN
16f30 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72 65 74 75  DEX_NOOP is retu
16f40 72 6e 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 52  rned,.  ** the R
16f50 48 53 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  HS has not yet b
16f60 65 65 6e 20 63 6f 64 65 64 2e 20 20 2a 2f 0a 20  een coded.  */. 
16f70 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
16f80 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  be;.  assert( v!
16f90 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f  =0 );       /* O
16fa0 4f 4d 20 64 65 74 65 63 74 65 64 20 70 72 69 6f  OM detected prio
16fb0 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  r to this routin
16fc0 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43  e */.  VdbeNoopC
16fd0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69  omment((v, "begi
16fe0 6e 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 20 20  n IN expr"));.  
16ff0 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46  eType = sqlite3F
17000 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73  indInIndex(pPars
17010 65 2c 20 70 45 78 70 72 2c 0a 20 20 20 20 20 20  e, pExpr,.      
17020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17030 20 20 20 20 20 20 20 49 4e 5f 49 4e 44 45 58 5f         IN_INDEX_
17040 4d 45 4d 42 45 52 53 48 49 50 20 7c 20 49 4e 5f  MEMBERSHIP | IN_
17050 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a 20  INDEX_NOOP_OK,. 
17060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17070 20 20 20 20 20 20 20 20 20 20 20 20 64 65 73 74              dest
17080 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e  IfFalse==destIfN
17090 75 6c 6c 20 3f 20 30 20 3a 20 26 72 52 68 73 48  ull ? 0 : &rRhsH
170a0 61 73 4e 75 6c 6c 2c 20 61 69 4d 61 70 29 3b 0a  asNull, aiMap);.
170b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
170c0 65 2d 3e 6e 45 72 72 20 7c 7c 20 6e 56 65 63 74  e->nErr || nVect
170d0 6f 72 3d 3d 31 20 7c 7c 20 65 54 79 70 65 3d 3d  or==1 || eType==
170e0 49 4e 5f 49 4e 44 45 58 5f 45 50 48 0a 20 20 20  IN_INDEX_EPH.   
170f0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e      || eType==IN
17100 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43  _INDEX_INDEX_ASC
17110 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e   || eType==IN_IN
17120 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 0a  DEX_INDEX_DESC .
17130 20 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 64 65 20    );..  /* Code 
17140 74 68 65 20 4c 48 53 2c 20 74 68 65 20 3c 65 78  the LHS, the <ex
17150 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e  pr> from "<expr>
17160 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 49 66 20 74   IN (...)". If t
17170 68 65 20 4c 48 53 20 69 73 20 61 20 0a 20 20 2a  he LHS is a .  *
17180 2a 20 76 65 63 74 6f 72 2c 20 74 68 65 6e 20 69  * vector, then i
17190 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  t is stored in a
171a0 6e 20 61 72 72 61 79 20 6f 66 20 6e 56 65 63 74  n array of nVect
171b0 6f 72 20 72 65 67 69 73 74 65 72 73 20 73 74 61  or registers sta
171c0 72 74 69 6e 67 20 0a 20 20 2a 2a 20 61 74 20 72  rting .  ** at r
171d0 31 2e 0a 20 20 2a 2f 0a 20 20 72 31 20 3d 20 73  1..  */.  r1 = s
171e0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
171f0 67 65 28 70 50 61 72 73 65 2c 20 6e 56 65 63 74  ge(pParse, nVect
17200 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  or);.  sqlite3Ex
17210 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
17220 73 65 29 3b 0a 20 20 72 32 20 3d 20 65 78 70 72  se);.  r2 = expr
17230 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72 73  CodeVector(pPars
17240 65 2c 20 70 4c 65 66 74 2c 20 26 69 44 75 6d 6d  e, pLeft, &iDumm
17250 79 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  y);.  for(i=0; i
17260 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a  <nVector; i++){.
17270 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17280 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp3(v, OP_Copy
17290 2c 20 72 32 2b 69 2c 20 72 31 2b 61 69 4d 61 70  , r2+i, r1+aiMap
172a0 5b 69 5d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  [i], 0);.  }..  
172b0 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 46 69 6e  /* If sqlite3Fin
172c0 64 49 6e 49 6e 64 65 78 28 29 20 64 69 64 20 6e  dInIndex() did n
172d0 6f 74 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74  ot find or creat
172e0 65 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  e an index that 
172f0 69 73 0a 20 20 2a 2a 20 73 75 69 74 61 62 6c 65  is.  ** suitable
17300 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20   for evaluating 
17310 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c  the IN operator,
17320 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20 75   then evaluate u
17330 73 69 6e 67 20 61 0a 20 20 2a 2a 20 73 65 71 75  sing a.  ** sequ
17340 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73  ence of comparis
17350 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
17360 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
17370 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 45 78 70 72  NOOP ){.    Expr
17380 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
17390 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
173a0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
173b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
173c0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
173d0 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
173e0 20 69 6e 74 20 6c 61 62 65 6c 4f 6b 20 3d 20 73   int labelOk = s
173f0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
17400 62 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74 20  bel(v);.    int 
17410 72 32 2c 20 72 65 67 54 6f 46 72 65 65 3b 0a 20  r2, regToFree;. 
17420 20 20 20 69 6e 74 20 72 65 67 43 6b 4e 75 6c 6c     int regCkNull
17430 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 69   = 0;.    int ii
17440 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
17450 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
17460 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
17470 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 64  ct) );.    if( d
17480 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49  estIfNull!=destI
17490 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20  fFalse ){.      
174a0 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c 69  regCkNull = sqli
174b0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
174c0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
174d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
174e0 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 31 2c  , OP_BitAnd, r1,
174f0 20 72 31 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b   r1, regCkNull);
17500 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
17510 69 3d 30 3b 20 69 69 3c 70 4c 69 73 74 2d 3e 6e  i=0; ii<pList->n
17520 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Expr; ii++){.   
17530 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
17540 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
17550 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 69 5d  se, pList->a[ii]
17560 2e 70 45 78 70 72 2c 20 26 72 65 67 54 6f 46 72  .pExpr, &regToFr
17570 65 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ee);.      if( r
17580 65 67 43 6b 4e 75 6c 6c 20 26 26 20 73 71 6c 69  egCkNull && sqli
17590 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
175a0 28 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45  (pList->a[ii].pE
175b0 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
175c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
175d0 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20  3(v, OP_BitAnd, 
175e0 72 65 67 43 6b 4e 75 6c 6c 2c 20 72 32 2c 20 72  regCkNull, r2, r
175f0 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  egCkNull);.     
17600 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 69 3c   }.      if( ii<
17610 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 7c  pList->nExpr-1 |
17620 7c 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65  | destIfNull!=de
17630 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20  stIfFalse ){.   
17640 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17650 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 71 2c  AddOp4(v, OP_Eq,
17660 20 72 31 2c 20 6c 61 62 65 6c 4f 6b 2c 20 72 32   r1, labelOk, r2
17670 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17680 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
17690 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c  d*)pColl, P4_COL
176a0 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 56  LSEQ);.        V
176b0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
176c0 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72   ii<pList->nExpr
176d0 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  -1);.        Vdb
176e0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 69  eCoverageIf(v, i
176f0 69 3d 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  i==pList->nExpr-
17700 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
17710 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
17720 76 2c 20 7a 41 66 66 5b 30 5d 29 3b 0a 20 20 20  v, zAff[0]);.   
17730 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17740 20 20 61 73 73 65 72 74 28 20 64 65 73 74 49 66    assert( destIf
17750 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73  Null==destIfFals
17760 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e );.        sql
17770 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
17780 2c 20 4f 50 5f 4e 65 2c 20 72 31 2c 20 64 65 73  , OP_Ne, r1, des
17790 74 49 66 46 61 6c 73 65 2c 20 72 32 2c 0a 20 20  tIfFalse, r2,.  
177a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
177b0 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
177c0 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
177d0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
177e0 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
177f0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
17800 76 2c 20 7a 41 66 66 5b 30 5d 20 7c 20 53 51 4c  v, zAff[0] | SQL
17810 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
17820 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
17830 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
17840 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
17850 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20  ToFree);.    }. 
17860 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c     if( regCkNull
17870 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
17880 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17890 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 43 6b 4e  P_IsNull, regCkN
178a0 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  ull, destIfNull)
178b0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
178c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
178d0 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74  VdbeGoto(v, dest
178e0 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 7d 0a  IfFalse);.    }.
178f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
17900 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
17910 61 62 65 6c 4f 6b 29 3b 0a 20 20 20 20 73 71 6c  abelOk);.    sql
17920 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
17930 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 43 6b  eg(pParse, regCk
17940 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Null);.  }else{.
17950 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79    .    /* If any
17960 20 76 61 6c 75 65 20 6f 6e 20 74 68 65 20 4c 48   value on the LH
17970 53 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72  S is NULL, the r
17980 65 73 75 6c 74 20 6f 66 20 74 68 65 20 49 4e 28  esult of the IN(
17990 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 0a 20 20  ...) operator.  
179a0 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74    ** must be eit
179b0 68 65 72 20 66 61 6c 73 65 20 6f 72 20 4e 55 4c  her false or NUL
179c0 4c 2e 20 49 66 20 74 68 65 73 65 20 74 77 6f 20  L. If these two 
179d0 61 72 65 20 68 61 6e 64 6c 65 64 20 69 64 65 6e  are handled iden
179e0 74 69 63 61 6c 6c 79 2c 0a 20 20 20 20 2a 2a 20  tically,.    ** 
179f0 74 65 73 74 20 74 68 65 20 4c 48 53 20 66 6f 72  test the LHS for
17a00 20 4e 55 4c 4c 73 20 61 6e 64 20 6a 75 6d 70 20   NULLs and jump 
17a10 64 69 72 65 63 74 6c 79 20 74 6f 20 64 65 73 74  directly to dest
17a20 49 66 4e 75 6c 6c 20 69 66 20 61 6e 79 20 61 72  IfNull if any ar
17a30 65 0a 20 20 20 20 2a 2a 20 66 6f 75 6e 64 2e 20  e.    ** found. 
17a40 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f  .    **.    ** O
17a50 74 68 65 72 77 69 73 65 2c 20 69 66 20 4e 55 4c  therwise, if NUL
17a60 4c 20 61 6e 64 20 66 61 6c 73 65 20 61 72 65 20  L and false are 
17a70 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e  handled differen
17a80 74 6c 79 2c 20 61 6e 64 20 74 68 65 0a 20 20 20  tly, and the.   
17a90 20 2a 2a 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72   ** IN(...) oper
17aa0 61 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61 20 76  ation is not a v
17ab0 65 63 74 6f 72 20 6f 70 65 72 61 74 69 6f 6e 2c  ector operation,
17ac0 20 61 6e 64 20 74 68 65 20 4c 48 53 20 6f 66 20   and the LHS of 
17ad0 74 68 65 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  the.    ** opera
17ae0 74 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  tor is NULL, the
17af0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  n the result is 
17b00 66 61 6c 73 65 20 69 66 20 74 68 65 20 69 6e 64  false if the ind
17b10 65 78 20 69 73 20 0a 20 20 20 20 2a 2a 20 63 6f  ex is .    ** co
17b20 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2c 20  mpletely empty, 
17b30 6f 72 20 4e 55 4c 4c 20 6f 74 68 65 72 77 69 73  or NULL otherwis
17b40 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64  e.  */.    if( d
17b50 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49  estIfNull==destI
17b60 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20  fFalse ){.      
17b70 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74  for(i=0; i<nVect
17b80 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  or; i++){.      
17b90 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
17ba0 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
17bb0 62 65 78 70 72 28 70 45 78 70 72 2d 3e 70 4c 65  bexpr(pExpr->pLe
17bc0 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  ft, i);.        
17bd0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
17be0 61 6e 42 65 4e 75 6c 6c 28 70 29 20 29 7b 0a 20  anBeNull(p) ){. 
17bf0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17c00 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17c10 5f 49 73 4e 75 6c 6c 2c 20 72 31 2b 61 69 4d 61  _IsNull, r1+aiMa
17c20 70 5b 69 5d 2c 20 64 65 73 74 49 66 4e 75 6c 6c  p[i], destIfNull
17c30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
17c40 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
17c50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
17c60 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56      }else if( nV
17c70 65 63 74 6f 72 3d 3d 31 20 26 26 20 73 71 6c 69  ector==1 && sqli
17c80 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
17c90 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29  (pExpr->pLeft) )
17ca0 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
17cb0 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
17cc0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e  ddOp1(v, OP_NotN
17cd0 75 6c 6c 2c 20 72 31 29 3b 20 56 64 62 65 43 6f  ull, r1); VdbeCo
17ce0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
17cf0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17d00 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
17d10 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
17d20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
17d30 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
17d40 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
17d50 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65  e3VdbeGoto(v, de
17d60 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
17d70 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
17d80 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
17d90 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
17da0 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
17db0 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20  _ROWID ){.      
17dc0 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  /* In this case,
17dd0 20 74 68 65 20 52 48 53 20 69 73 20 74 68 65 20   the RHS is the 
17de0 52 4f 57 49 44 20 6f 66 20 74 61 62 6c 65 20 62  ROWID of table b
17df0 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 73  -tree */.      s
17e00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
17e10 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64  (v, OP_SeekRowid
17e20 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
17e30 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31   destIfFalse, r1
17e40 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
17e50 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 65  erage(v);.    }e
17e60 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  lse{.      /* In
17e70 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20   this case, the 
17e80 52 48 53 20 69 73 20 61 6e 20 69 6e 64 65 78 20  RHS is an index 
17e90 62 2d 74 72 65 65 2e 20 41 70 70 6c 79 20 74 68  b-tree. Apply th
17ea0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20  e comparison.   
17eb0 20 20 20 2a 2a 20 61 66 66 69 6e 69 74 69 65 73     ** affinities
17ec0 20 74 6f 20 65 61 63 68 20 76 61 6c 75 65 20 6f   to each value o
17ed0 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65  n the LHS of the
17ee0 20 6f 70 65 72 61 74 6f 72 2e 20 20 2a 2f 0a 20   operator.  */. 
17ef0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17f00 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66  AddOp4(v, OP_Aff
17f10 69 6e 69 74 79 2c 20 72 31 2c 20 6e 56 65 63 74  inity, r1, nVect
17f20 6f 72 2c 20 30 2c 20 7a 41 66 66 2c 20 6e 56 65  or, 0, zAff, nVe
17f30 63 74 6f 72 29 3b 0a 20 20 20 20 20 20 0a 20 20  ctor);.      .  
17f40 20 20 20 20 69 66 28 20 6e 56 65 63 74 6f 72 3e      if( nVector>
17f50 31 20 26 26 20 64 65 73 74 49 66 4e 75 6c 6c 21  1 && destIfNull!
17f60 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a  =destIfFalse ){.
17f70 20 20 20 20 20 20 20 20 69 6e 74 20 69 49 64 78          int iIdx
17f80 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
17f90 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  ;.        int ad
17fa0 64 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  dr;.        int 
17fb0 61 64 64 72 4e 65 78 74 3b 0a 0a 20 20 20 20 20  addrNext;..     
17fc0 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65     /* Search the
17fd0 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b   index for the k
17fe0 65 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ey. */.        a
17ff0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
18000 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
18010 5f 46 6f 75 6e 64 2c 20 69 49 64 78 2c 20 30 2c  _Found, iIdx, 0,
18020 20 72 31 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20   r1, nVector);. 
18030 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
18040 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 20  age(v);..       
18050 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
18060 74 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  t the specified 
18070 6b 65 79 20 69 73 20 6e 6f 74 20 70 72 65 73 65  key is not prese
18080 6e 74 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c  nt in the index,
18090 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20   .        ** so 
180a0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
180b0 65 20 49 4e 28 2e 2e 29 20 6f 70 65 72 61 74 6f  e IN(..) operato
180c0 72 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  r must be either
180d0 20 4e 55 4c 4c 20 6f 72 0a 20 20 20 20 20 20 20   NULL or.       
180e0 20 2a 2a 20 30 2e 20 54 68 65 20 76 64 62 65 20   ** 0. The vdbe 
180f0 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
18100 65 6c 6f 77 20 66 69 67 75 72 65 73 20 6f 75 74  elow figures out
18110 20 77 68 69 63 68 2e 20 20 2a 2f 0a 20 20 20 20   which.  */.    
18120 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20 31      addrNext = 1
18130 2b 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f  +sqlite3VdbeAddO
18140 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
18150 20 69 49 64 78 2c 20 64 65 73 74 49 66 46 61 6c   iIdx, destIfFal
18160 73 65 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  se);.        Vdb
18170 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
18180 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
18190 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b  i<nVector; i++){
181a0 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
181b0 2a 70 3b 0a 20 20 20 20 20 20 20 20 20 20 43 6f  *p;.          Co
181c0 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
181d0 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d          int r2 =
181e0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
181f0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
18200 20 20 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65        p = sqlite
18210 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65  3VectorFieldSube
18220 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20  xpr(pLeft, i);. 
18230 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
18240 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
18250 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  Seq(pParse, p);.
18260 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
18270 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
18280 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 2c  OP_Column, iIdx,
18290 20 69 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20   i, r2);.       
182a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
182b0 64 4f 70 34 28 76 2c 20 4f 50 5f 45 71 2c 20 72  dOp4(v, OP_Eq, r
182c0 31 2b 69 2c 20 30 2c 20 72 32 2c 20 28 76 6f 69  1+i, 0, r2, (voi
182d0 64 2a 29 70 43 6f 6c 6c 2c 50 34 5f 43 4f 4c 4c  d*)pColl,P4_COLL
182e0 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20 20  SEQ);.          
182f0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
18300 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4a 55  eP5(v, SQLITE_JU
18310 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
18320 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
18330 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
18340 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18350 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 49  2(v, OP_Next, iI
18360 64 78 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20  dx, addrNext);. 
18370 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
18380 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
18390 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
183a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
183b0 2c 20 30 2c 20 64 65 73 74 49 66 46 61 6c 73 65  , 0, destIfFalse
183c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
183d0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
183e0 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
183f0 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 33 29  urrentAddr(v)-3)
18400 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
18410 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
18420 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
18430 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
18440 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18450 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
18460 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 0a  , destIfNull);..
18470 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b          /* The k
18480 65 79 20 77 61 73 20 66 6f 75 6e 64 20 69 6e 20  ey was found in 
18490 74 68 65 20 69 6e 64 65 78 2e 20 49 66 20 69 74  the index. If it
184a0 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55   contains any NU
184b0 4c 4c 20 76 61 6c 75 65 73 2c 0a 20 20 20 20 20  LL values,.     
184c0 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 72     ** then the r
184d0 65 73 75 6c 74 20 6f 66 20 74 68 65 20 49 4e 28  esult of the IN(
184e0 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20 69 73  ...) operator is
184f0 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73 65   NULL. Otherwise
18500 2c 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  , the.        **
18510 20 72 65 73 75 6c 74 20 69 73 20 31 2e 20 20 2a   result is 1.  *
18520 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
18530 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
18540 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20   addr);.        
18550 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74  for(i=0; i<nVect
18560 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  or; i++){.      
18570 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
18580 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
18590 53 75 62 65 78 70 72 28 70 45 78 70 72 2d 3e 70  Subexpr(pExpr->p
185a0 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Left, i);.      
185b0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
185c0 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 29 20  xprCanBeNull(p) 
185d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
185e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
185f0 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
18600 31 2b 61 69 4d 61 70 5b 69 5d 2c 20 64 65 73 74  1+aiMap[i], dest
18610 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  IfNull);.       
18620 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
18630 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
18640 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  }.        }..   
18650 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 52 68     }else if( rRh
18660 73 48 61 73 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20  sHasNull==0 ){. 
18670 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
18680 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20 69 74  ranch runs if it
18690 20 69 73 20 6b 6e 6f 77 6e 20 61 74 20 63 6f 6d   is known at com
186a0 70 69 6c 65 20 74 69 6d 65 20 74 68 61 74 20 74  pile time that t
186b0 68 65 20 52 48 53 0a 20 20 20 20 20 20 20 20 2a  he RHS.        *
186c0 2a 20 63 61 6e 6e 6f 74 20 63 6f 6e 74 61 69 6e  * cannot contain
186d0 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 20 54 68   NULL values. Th
186e0 69 73 20 68 61 70 70 65 6e 73 20 61 73 20 61 20  is happens as a 
186f0 72 65 73 75 6c 74 0a 20 20 20 20 20 20 20 20 2a  result.        *
18700 2a 20 6f 66 20 22 4e 4f 54 20 4e 55 4c 4c 22 20  * of "NOT NULL" 
18710 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74  constraints in t
18720 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
18730 6d 61 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ma..        **. 
18740 20 20 20 20 20 20 20 2a 2a 20 41 6c 73 6f 20 72         ** Also r
18750 75 6e 20 74 68 69 73 20 62 72 61 6e 63 68 20 69  un this branch i
18760 66 20 4e 55 4c 4c 20 69 73 20 65 71 75 69 76 61  f NULL is equiva
18770 6c 65 6e 74 20 74 6f 20 46 41 4c 53 45 0a 20 20  lent to FALSE.  
18780 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 69        ** for thi
18790 73 20 70 61 72 74 69 63 75 6c 61 72 20 49 4e 20  s particular IN 
187a0 6f 70 65 72 61 74 6f 72 2e 20 20 2a 2f 0a 20 20  operator.  */.  
187b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
187c0 65 41 64 64 4f 70 34 49 6e 74 28 0a 20 20 20 20  eAddOp4Int(.    
187d0 20 20 20 20 20 20 20 20 76 2c 20 4f 50 5f 4e 6f          v, OP_No
187e0 74 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  tFound, pExpr->i
187f0 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c  Table, destIfFal
18800 73 65 2c 20 72 31 2c 20 6e 56 65 63 74 6f 72 0a  se, r1, nVector.
18810 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
18820 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
18830 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  v);.      }else{
18840 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  .        /* In t
18850 68 69 73 20 62 72 61 6e 63 68 2c 20 74 68 65 20  his branch, the 
18860 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6d 69  RHS of the IN mi
18870 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55  ght contain a NU
18880 4c 4c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  LL and.        *
18890 2a 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f  * the presence o
188a0 66 20 61 20 4e 55 4c 4c 20 6f 6e 20 74 68 65 20  f a NULL on the 
188b0 52 48 53 20 6d 61 6b 65 73 20 61 20 64 69 66 66  RHS makes a diff
188c0 65 72 65 6e 63 65 20 69 6e 20 74 68 65 0a 20 20  erence in the.  
188d0 20 20 20 20 20 20 2a 2a 20 6f 75 74 63 6f 6d 65        ** outcome
188e0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
188f0 20 20 20 20 20 69 6e 74 20 61 64 64 72 31 3b 0a       int addr1;.
18900 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  .        /* Firs
18910 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  t check to see i
18920 66 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e  f the LHS is con
18930 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48  tained in the RH
18940 53 2e 20 20 49 66 20 73 6f 2c 0a 20 20 20 20 20  S.  If so,.     
18950 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 61     ** then the a
18960 6e 73 77 65 72 20 69 73 20 54 52 55 45 20 74 68  nswer is TRUE th
18970 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 4e 55  e presence of NU
18980 4c 4c 73 20 69 6e 20 74 68 65 20 52 48 53 20 64  LLs in the RHS d
18990 6f 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  oes.        ** n
189a0 6f 74 20 6d 61 74 74 65 72 2e 20 20 49 66 20 74  ot matter.  If t
189b0 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f  he LHS is not co
189c0 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52  ntained in the R
189d0 48 53 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  HS, then the.   
189e0 20 20 20 20 20 2a 2a 20 61 6e 73 77 65 72 20 69       ** answer i
189f0 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 52 48  s NULL if the RH
18a00 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73  S contains NULLs
18a10 20 61 6e 64 20 74 68 65 20 61 6e 73 77 65 72 20   and the answer 
18a20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 41  is.        ** FA
18a30 4c 53 45 20 69 66 20 74 68 65 20 52 48 53 20 69  LSE if the RHS i
18a40 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 20 20 20  s NULL-free..   
18a50 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
18a60 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
18a70 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
18a80 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d  OP_Found, pExpr-
18a90 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72 31 2c 20  >iTable, 0, r1, 
18aa0 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  1);.        Vdbe
18ab0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
18ac0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18ad0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
18ae0 75 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c  ull, rRhsHasNull
18af0 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
18b00 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
18b10 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
18b20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
18b30 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
18b40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18b50 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
18b60 61 64 64 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a  addr1);.      }.
18b70 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
18b80 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
18b90 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
18ba0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
18bb0 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
18bc0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
18bd0 61 72 73 65 2d 3e 64 62 2c 20 61 69 4d 61 70 29  arse->db, aiMap)
18be0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
18bf0 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 41  e(pParse->db, zA
18c00 66 66 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65  ff);.  VdbeComme
18c10 6e 74 28 28 76 2c 20 22 65 6e 64 20 49 4e 20 65  nt((v, "end IN e
18c20 78 70 72 22 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  xpr"));.}.#endif
18c30 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
18c40 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66  SUBQUERY */..#if
18c50 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18c60 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
18c70 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
18c80 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
18c90 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20  at will put the 
18ca0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a  floating point.*
18cb0 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69 62 65  * value describe
18cc0 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69  d by z[0..n-1] i
18cd0 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65  nto register iMe
18ce0 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d  m..**.** The z[]
18cf0 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f   string will pro
18d00 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72  bably not be zer
18d10 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42  o-terminated.  B
18d20 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20  ut the .** z[n] 
18d30 63 68 61 72 61 63 74 65 72 20 69 73 20 67 75 61  character is gua
18d40 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f  ranteed to be so
18d50 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65  mething that doe
18d60 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69  s not look.** li
18d70 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74  ke the continuat
18d80 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ion of the numbe
18d90 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
18da0 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20  d codeReal(Vdbe 
18db0 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *v, const char *
18dc0 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61  z, int negateFla
18dd0 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20  g, int iMem){.  
18de0 69 66 28 20 41 4c 57 41 59 53 28 7a 21 3d 30 29  if( ALWAYS(z!=0)
18df0 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76   ){.    double v
18e00 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  alue;.    sqlite
18e10 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c  3AtoF(z, &value,
18e20 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
18e30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  (z), SQLITE_UTF8
18e40 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
18e50 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c  sqlite3IsNaN(val
18e60 75 65 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65  ue) ); /* The ne
18e70 77 20 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74  w AtoF never ret
18e80 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20  urns NaN */.    
18e90 69 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29  if( negateFlag )
18ea0 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b   value = -value;
18eb0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
18ec0 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50  AddOp4Dup8(v, OP
18ed0 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20  _Real, 0, iMem, 
18ee0 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20  0, (u8*)&value, 
18ef0 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a  P4_REAL);.  }.}.
18f00 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47  #endif.../*.** G
18f10 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72  enerate an instr
18f20 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  uction that will
18f30 20 70 75 74 20 74 68 65 20 69 6e 74 65 67 65 72   put the integer
18f40 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20   describe by.** 
18f50 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69  text z[0..n-1] i
18f60 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65  nto register iMe
18f70 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e  m..**.** Expr.u.
18f80 7a 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79 73  zToken is always
18f90 20 55 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d 74   UTF8 and zero-t
18fa0 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74  erminated..*/.st
18fb0 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e  atic void codeIn
18fc0 74 65 67 65 72 28 50 61 72 73 65 20 2a 70 50 61  teger(Parse *pPa
18fd0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
18fe0 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69  , int negFlag, i
18ff0 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65  nt iMem){.  Vdbe
19000 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
19010 64 62 65 3b 0a 20 20 69 66 28 20 70 45 78 70 72  dbe;.  if( pExpr
19020 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74  ->flags & EP_Int
19030 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e 74  Value ){.    int
19040 20 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56   i = pExpr->u.iV
19050 61 6c 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  alue;.    assert
19060 28 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  ( i>=0 );.    if
19070 28 20 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20  ( negFlag ) i = 
19080 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  -i;.    sqlite3V
19090 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
190a0 49 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d  Integer, i, iMem
190b0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
190c0 69 6e 74 20 63 3b 0a 20 20 20 20 69 36 34 20 76  int c;.    i64 v
190d0 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  alue;.    const 
190e0 63 68 61 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d  char *z = pExpr-
190f0 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61  >u.zToken;.    a
19100 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20  ssert( z!=0 );. 
19110 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 44 65     c = sqlite3De
19120 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26  cOrHexToI64(z, &
19130 76 61 6c 75 65 29 3b 0a 20 20 20 20 69 66 28 20  value);.    if( 
19140 63 3d 3d 30 20 7c 7c 20 28 63 3d 3d 32 20 26 26  c==0 || (c==2 &&
19150 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20 20 20   negFlag) ){.   
19160 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29     if( negFlag )
19170 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d 32 20 3f  { value = c==2 ?
19180 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20   SMALLEST_INT64 
19190 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20 20 20  : -value; }.    
191a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
191b0 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 49 6e  Op4Dup8(v, OP_In
191c0 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c  t64, 0, iMem, 0,
191d0 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34   (u8*)&value, P4
191e0 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c  _INT64);.    }el
191f0 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  se{.#ifdef SQLIT
19200 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
19210 50 4f 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69  POINT.      sqli
19220 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
19230 73 65 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69  se, "oversized i
19240 6e 74 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e  nteger: %s%s", n
19250 65 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22  egFlag ? "-" : "
19260 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 23 69 66  ", z);.#else.#if
19270 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19280 5f 48 45 58 5f 49 4e 54 45 47 45 52 0a 20 20 20  _HEX_INTEGER.   
19290 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
192a0 74 72 6e 69 63 6d 70 28 7a 2c 22 30 78 22 2c 32  trnicmp(z,"0x",2
192b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
192c0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
192d0 70 50 61 72 73 65 2c 20 22 68 65 78 20 6c 69 74  pParse, "hex lit
192e0 65 72 61 6c 20 74 6f 6f 20 62 69 67 3a 20 25 73  eral too big: %s
192f0 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ", z);.      }el
19300 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
19310 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65  {.        codeRe
19320 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67  al(v, z, negFlag
19330 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d  , iMem);.      }
19340 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
19350 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  }.}..#if defined
19360 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
19370 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 65 20  *.** Verify the 
19380 63 6f 6e 73 69 73 74 65 6e 63 79 20 6f 66 20 74  consistency of t
19390 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 0a  he column cache.
193a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61  */.static int ca
193b0 63 68 65 49 73 56 61 6c 69 64 28 50 61 72 73 65  cheIsValid(Parse
193c0 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74   *pParse){.  int
193d0 20 69 2c 20 6e 3b 0a 20 20 66 6f 72 28 69 3d 6e   i, n;.  for(i=n
193e0 3d 30 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  =0; i<SQLITE_N_C
193f0 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 29 7b 0a 20  OLCACHE; i++){. 
19400 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61     if( pParse->a
19410 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67  ColCache[i].iReg
19420 3e 30 20 29 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20  >0 ) n++;.  }.  
19430 72 65 74 75 72 6e 20 6e 3d 3d 70 50 61 72 73 65  return n==pParse
19440 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 0a 7d 0a 23  ->nColCache;.}.#
19450 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  endif../*.** Cle
19460 61 72 20 61 20 63 61 63 68 65 20 65 6e 74 72 79  ar a cache entry
19470 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
19480 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72   cacheEntryClear
19490 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
194a0 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
194b0 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74   *p){.  if( p->t
194c0 65 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 69 66  empReg ){.    if
194d0 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  ( pParse->nTempR
194e0 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61  eg<ArraySize(pPa
194f0 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29  rse->aTempReg) )
19500 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
19510 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d  aTempReg[pParse-
19520 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70  >nTempReg++] = p
19530 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20  ->iReg;.    }.  
19540 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30    p->tempReg = 0
19550 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 52 65 67 20  ;.  }.  p->iReg 
19560 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
19570 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 61 73  ColCache--;.  as
19580 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
19590 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
195a0 7c 20 63 61 63 68 65 49 73 56 61 6c 69 64 28 70  | cacheIsValid(p
195b0 50 61 72 73 65 29 20 29 3b 0a 7d 0a 0a 0a 2f 2a  Parse) );.}.../*
195c0 0a 2a 2a 20 52 65 63 6f 72 64 20 69 6e 20 74 68  .** Record in th
195d0 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 74  e column cache t
195e0 68 61 74 20 61 20 70 61 72 74 69 63 75 6c 61 72  hat a particular
195f0 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a   column from a.*
19600 2a 20 70 61 72 74 69 63 75 6c 61 72 20 74 61 62  * particular tab
19610 6c 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  le is stored in 
19620 61 20 70 61 72 74 69 63 75 6c 61 72 20 72 65 67  a particular reg
19630 69 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ister..*/.void s
19640 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53  qlite3ExprCacheS
19650 74 6f 72 65 28 50 61 72 73 65 20 2a 70 50 61 72  tore(Parse *pPar
19660 73 65 2c 20 69 6e 74 20 69 54 61 62 2c 20 69 6e  se, int iTab, in
19670 74 20 69 43 6f 6c 2c 20 69 6e 74 20 69 52 65 67  t iCol, int iReg
19680 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
19690 74 20 6d 69 6e 4c 72 75 3b 0a 20 20 69 6e 74 20  t minLru;.  int 
196a0 69 64 78 4c 72 75 3b 0a 20 20 73 74 72 75 63 74  idxLru;.  struct
196b0 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a   yColCache *p;..
196c0 20 20 2f 2a 20 55 6e 6c 65 73 73 20 61 6e 20 65    /* Unless an e
196d0 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
196e0 64 2c 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  d, register numb
196f0 65 72 73 20 61 72 65 20 61 6c 77 61 79 73 20 70  ers are always p
19700 6f 73 69 74 69 76 65 2e 20 2a 2f 0a 20 20 61 73  ositive. */.  as
19710 73 65 72 74 28 20 69 52 65 67 3e 30 20 7c 7c 20  sert( iReg>0 || 
19720 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
19730 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
19740 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 61 73  ocFailed );.  as
19750 73 65 72 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26  sert( iCol>=-1 &
19760 26 20 69 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20  & iCol<32768 ); 
19770 20 2f 2a 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d   /* Finite colum
19780 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20  n numbers */..  
19790 2f 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 43 6f  /* The SQLITE_Co
197a0 6c 75 6d 6e 43 61 63 68 65 20 66 6c 61 67 20 64  lumnCache flag d
197b0 69 73 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 75  isables the colu
197c0 6d 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  mn cache.  This 
197d0 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 66 6f 72  is used.  ** for
197e0 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 20 2d 20   testing only - 
197f0 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 53  to verify that S
19800 51 4c 69 74 65 20 61 6c 77 61 79 73 20 67 65 74  QLite always get
19810 73 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  s the same answe
19820 72 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e 64 20  r.  ** with and 
19830 77 69 74 68 6f 75 74 20 74 68 65 20 63 6f 6c 75  without the colu
19840 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20  mn cache..  */. 
19850 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f   if( Optimizatio
19860 6e 44 69 73 61 62 6c 65 64 28 70 50 61 72 73 65  nDisabled(pParse
19870 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 6c  ->db, SQLITE_Col
19880 75 6d 6e 43 61 63 68 65 29 20 29 20 72 65 74 75  umnCache) ) retu
19890 72 6e 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20  rn;..  /* First 
198a0 72 65 70 6c 61 63 65 20 61 6e 79 20 65 78 69 73  replace any exis
198b0 74 69 6e 67 20 65 6e 74 72 79 2e 0a 20 20 2a 2a  ting entry..  **
198c0 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20  .  ** Actually, 
198d0 74 68 65 20 77 61 79 20 74 68 65 20 63 6f 6c 75  the way the colu
198e0 6d 6e 20 63 61 63 68 65 20 69 73 20 63 75 72 72  mn cache is curr
198f0 65 6e 74 6c 79 20 75 73 65 64 2c 20 77 65 20 61  ently used, we a
19900 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20  re guaranteed.  
19910 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 62 6a 65  ** that the obje
19920 63 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 6c  ct will never al
19930 72 65 61 64 79 20 62 65 20 69 6e 20 63 61 63 68  ready be in cach
19940 65 2e 20 20 56 65 72 69 66 79 20 74 68 69 73 20  e.  Verify this 
19950 67 75 61 72 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a  guarantee..  */.
19960 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
19970 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
19980 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
19990 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
199a0 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
199b0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 52     assert( p->iR
199c0 65 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 54 61 62  eg==0 || p->iTab
199d0 6c 65 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e 69  le!=iTab || p->i
199e0 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a  Column!=iCol );.
199f0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
19a00 20 46 69 6e 64 20 61 6e 20 65 6d 70 74 79 20 73   Find an empty s
19a10 6c 6f 74 20 61 6e 64 20 72 65 70 6c 61 63 65 20  lot and replace 
19a20 69 74 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  it */.  for(i=0,
19a30 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
19a40 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
19a50 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
19a60 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
19a70 3e 69 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20  >iReg==0 ){.    
19a80 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50    p->iLevel = pP
19a90 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
19aa0 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 54 61 62  l;.      p->iTab
19ab0 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20  le = iTab;.     
19ac0 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43   p->iColumn = iC
19ad0 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65  ol;.      p->iRe
19ae0 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 20 20  g = iReg;.      
19af0 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a  p->tempReg = 0;.
19b00 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70        p->lru = p
19b10 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74  Parse->iCacheCnt
19b20 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  ++;.      pParse
19b30 2d 3e 6e 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20  ->nColCache++;. 
19b40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
19b50 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
19b60 61 69 6c 65 64 20 7c 7c 20 63 61 63 68 65 49 73  ailed || cacheIs
19b70 56 61 6c 69 64 28 70 50 61 72 73 65 29 20 29 3b  Valid(pParse) );
19b80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
19b90 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
19ba0 65 70 6c 61 63 65 20 74 68 65 20 6c 61 73 74 20  eplace the last 
19bb0 72 65 63 65 6e 74 6c 79 20 75 73 65 64 20 2a 2f  recently used */
19bc0 0a 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66  .  minLru = 0x7f
19bd0 66 66 66 66 66 66 3b 0a 20 20 69 64 78 4c 72 75  ffffff;.  idxLru
19be0 20 3d 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30   = -1;.  for(i=0
19bf0 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
19c00 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
19c10 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
19c20 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
19c30 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20 29 7b 0a  ->lru<minLru ){.
19c40 20 20 20 20 20 20 69 64 78 4c 72 75 20 3d 20 69        idxLru = i
19c50 3b 0a 20 20 20 20 20 20 6d 69 6e 4c 72 75 20 3d  ;.      minLru =
19c60 20 70 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d 0a 20   p->lru;.    }. 
19c70 20 7d 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28   }.  if( ALWAYS(
19c80 69 64 78 4c 72 75 3e 3d 30 29 20 29 7b 0a 20 20  idxLru>=0) ){.  
19c90 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61    p = &pParse->a
19ca0 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72 75 5d  ColCache[idxLru]
19cb0 3b 0a 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20  ;.    p->iLevel 
19cc0 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
19cd0 4c 65 76 65 6c 3b 0a 20 20 20 20 70 2d 3e 69 54  Level;.    p->iT
19ce0 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20  able = iTab;.   
19cf0 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43   p->iColumn = iC
19d00 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69 52 65 67 20  ol;.    p->iReg 
19d10 3d 20 69 52 65 67 3b 0a 20 20 20 20 70 2d 3e 74  = iReg;.    p->t
19d20 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20  empReg = 0;.    
19d30 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d  p->lru = pParse-
19d40 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20  >iCacheCnt++;.  
19d50 20 20 61 73 73 65 72 74 28 20 63 61 63 68 65 49    assert( cacheI
19d60 73 56 61 6c 69 64 28 70 50 61 72 73 65 29 20 29  sValid(pParse) )
19d70 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
19d80 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63  }.}../*.** Indic
19d90 61 74 65 20 74 68 61 74 20 72 65 67 69 73 74 65  ate that registe
19da0 72 73 20 62 65 74 77 65 65 6e 20 69 52 65 67 2e  rs between iReg.
19db0 2e 69 52 65 67 2b 6e 52 65 67 2d 31 20 61 72 65  .iReg+nReg-1 are
19dc0 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74   being overwritt
19dd0 65 6e 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68 65  en..** Purge the
19de0 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74   range of regist
19df0 65 72 73 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c  ers from the col
19e00 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f  umn cache..*/.vo
19e10 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
19e20 63 68 65 52 65 6d 6f 76 65 28 50 61 72 73 65 20  cheRemove(Parse 
19e30 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
19e40 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  g, int nReg){.  
19e50 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
19e60 20 2a 70 3b 0a 20 20 69 66 28 20 69 52 65 67 3c   *p;.  if( iReg<
19e70 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 43  =0 || pParse->nC
19e80 6f 6c 43 61 63 68 65 3d 3d 30 20 29 20 72 65 74  olCache==0 ) ret
19e90 75 72 6e 3b 0a 20 20 70 20 3d 20 26 70 50 61 72  urn;.  p = &pPar
19ea0 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 53 51  se->aColCache[SQ
19eb0 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 2d  LITE_N_COLCACHE-
19ec0 31 5d 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a  1];.  while(1){.
19ed0 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20      if( p->iReg 
19ee0 3e 3d 20 69 52 65 67 20 26 26 20 70 2d 3e 69 52  >= iReg && p->iR
19ef0 65 67 20 3c 20 69 52 65 67 2b 6e 52 65 67 20 29  eg < iReg+nReg )
19f00 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72   cacheEntryClear
19f10 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
19f20 20 69 66 28 20 70 3d 3d 70 50 61 72 73 65 2d 3e   if( p==pParse->
19f30 61 43 6f 6c 43 61 63 68 65 20 29 20 62 72 65 61  aColCache ) brea
19f40 6b 3b 0a 20 20 20 20 70 2d 2d 3b 0a 20 20 7d 0a  k;.    p--;.  }.
19f50 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65  }../*.** Remembe
19f60 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  r the current co
19f70 6c 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74 65  lumn cache conte
19f80 78 74 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e 74  xt.  Any new ent
19f90 72 69 65 73 20 61 64 64 65 64 0a 2a 2a 20 61 64  ries added.** ad
19fa0 64 65 64 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d  ded to the colum
19fb0 6e 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  n cache after th
19fc0 69 73 20 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f  is call are remo
19fd0 76 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20  ved when the.** 
19fe0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f  corresponding po
19ff0 70 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69  p occurs..*/.voi
1a000 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
1a010 68 65 50 75 73 68 28 50 61 72 73 65 20 2a 70 50  hePush(Parse *pP
1a020 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d  arse){.  pParse-
1a030 3e 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a  >iCacheLevel++;.
1a040 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1a050 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65  BUG.  if( pParse
1a060 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1a070 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72  LITE_VdbeAddopTr
1a080 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  ace ){.    print
1a090 66 28 22 50 55 53 48 20 74 6f 20 25 64 5c 6e 22  f("PUSH to %d\n"
1a0a0 2c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  , pParse->iCache
1a0b0 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64  Level);.  }.#end
1a0c0 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  if.}../*.** Remo
1a0d0 76 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75  ve from the colu
1a0e0 6d 6e 20 63 61 63 68 65 20 61 6e 79 20 65 6e 74  mn cache any ent
1a0f0 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20 61  ries that were a
1a100 64 64 65 64 20 73 69 6e 63 65 20 74 68 65 0a 2a  dded since the.*
1a110 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  * the previous s
1a120 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1a130 75 73 68 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ush operation.  
1a140 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1a150 72 65 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20 63  restore.** the c
1a160 61 63 68 65 20 74 6f 20 74 68 65 20 73 74 61 74  ache to the stat
1a170 65 20 69 74 20 77 61 73 20 69 6e 20 70 72 69 6f  e it was in prio
1a180 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  r the most recen
1a190 74 20 50 75 73 68 2e 0a 2a 2f 0a 76 6f 69 64 20  t Push..*/.void 
1a1a0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1a1b0 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  Pop(Parse *pPars
1a1c0 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  e){.  int i;.  s
1a1d0 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
1a1e0 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  *p;.  assert( pP
1a1f0 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
1a200 6c 3e 3d 31 20 29 3b 0a 20 20 70 50 61 72 73 65  l>=1 );.  pParse
1a210 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2d 2d 3b  ->iCacheLevel--;
1a220 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1a230 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73  EBUG.  if( pPars
1a240 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1a250 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
1a260 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e  race ){.    prin
1a270 74 66 28 22 50 4f 50 20 20 74 6f 20 25 64 5c 6e  tf("POP  to %d\n
1a280 22 2c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  ", pParse->iCach
1a290 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e  eLevel);.  }.#en
1a2a0 64 69 66 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  dif.  for(i=0, p
1a2b0 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
1a2c0 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
1a2d0 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
1a2e0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
1a2f0 52 65 67 20 26 26 20 70 2d 3e 69 4c 65 76 65 6c  Reg && p->iLevel
1a300 3e 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c  >pParse->iCacheL
1a310 65 76 65 6c 20 29 7b 0a 20 20 20 20 20 20 63 61  evel ){.      ca
1a320 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50  cheEntryClear(pP
1a330 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a  arse, p);.    }.
1a340 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65    }.}../*.** Whe
1a350 6e 20 61 20 63 61 63 68 65 64 20 63 6f 6c 75 6d  n a cached colum
1a360 6e 20 69 73 20 72 65 75 73 65 64 2c 20 6d 61 6b  n is reused, mak
1a370 65 20 73 75 72 65 20 74 68 61 74 20 69 74 73 20  e sure that its 
1a380 72 65 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e  register is.** n
1a390 6f 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c 61 62  o longer availab
1a3a0 6c 65 20 61 73 20 61 20 74 65 6d 70 20 72 65 67  le as a temp reg
1a3b0 69 73 74 65 72 2e 20 20 74 69 63 6b 65 74 20 23  ister.  ticket #
1a3c0 33 38 37 39 3a 20 20 74 68 61 74 20 73 61 6d 65  3879:  that same
1a3d0 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 6d 69 67  .** register mig
1a3e0 68 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63  ht be in the cac
1a3f0 68 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70  he in multiple p
1a400 6c 61 63 65 73 2c 20 73 6f 20 62 65 20 73 75 72  laces, so be sur
1a410 65 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d  e to.** get them
1a420 20 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   all..*/.static 
1a430 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1a440 43 61 63 68 65 50 69 6e 52 65 67 69 73 74 65 72  CachePinRegister
1a450 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1a460 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74  int iReg){.  int
1a470 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
1a480 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72  lCache *p;.  for
1a490 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
1a4a0 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
1a4b0 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
1a4c0 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
1a4d0 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67  f( p->iReg==iReg
1a4e0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d   ){.      p->tem
1a4f0 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pReg = 0;.    }.
1a500 20 20 7d 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61    }.}../* Genera
1a510 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
1a520 6c 20 6c 6f 61 64 20 69 6e 74 6f 20 72 65 67 69  l load into regi
1a530 73 74 65 72 20 72 65 67 4f 75 74 20 61 20 76 61  ster regOut a va
1a540 6c 75 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 61  lue that is.** a
1a550 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
1a560 68 65 20 69 49 64 78 43 6f 6c 2d 74 68 20 63 6f  he iIdxCol-th co
1a570 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49  lumn of index pI
1a580 64 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  dx..*/.void sqli
1a590 74 65 33 45 78 70 72 43 6f 64 65 4c 6f 61 64 49  te3ExprCodeLoadI
1a5a0 6e 64 65 78 43 6f 6c 75 6d 6e 28 0a 20 20 50 61  ndexColumn(.  Pa
1a5b0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 2f 2a  rse *pParse,  /*
1a5c0 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
1a5d0 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20  text */.  Index 
1a5e0 2a 70 49 64 78 2c 20 20 20 20 2f 2a 20 54 68 65  *pIdx,    /* The
1a5f0 20 69 6e 64 65 78 20 77 68 6f 73 65 20 63 6f 6c   index whose col
1a600 75 6d 6e 20 69 73 20 74 6f 20 62 65 20 6c 6f 61  umn is to be loa
1a610 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ded */.  int iTa
1a620 62 43 75 72 2c 20 20 20 20 2f 2a 20 43 75 72 73  bCur,    /* Curs
1a630 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  or pointing to a
1a640 20 74 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20   table row */.  
1a650 69 6e 74 20 69 49 64 78 43 6f 6c 2c 20 20 20 20  int iIdxCol,    
1a660 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 66  /* The column of
1a670 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65   the index to be
1a680 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74   loaded */.  int
1a690 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20   regOut      /* 
1a6a0 53 74 6f 72 65 20 74 68 65 20 69 6e 64 65 78 20  Store the index 
1a6b0 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20  column value in 
1a6c0 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f  this register */
1a6d0 0a 29 7b 0a 20 20 69 31 36 20 69 54 61 62 43 6f  .){.  i16 iTabCo
1a6e0 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  l = pIdx->aiColu
1a6f0 6d 6e 5b 69 49 64 78 43 6f 6c 5d 3b 0a 20 20 69  mn[iIdxCol];.  i
1a700 66 28 20 69 54 61 62 43 6f 6c 3d 3d 58 4e 5f 45  f( iTabCol==XN_E
1a710 58 50 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72  XPR ){.    asser
1a720 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70  t( pIdx->aColExp
1a730 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  r );.    assert(
1a740 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d   pIdx->aColExpr-
1a750 3e 6e 45 78 70 72 3e 69 49 64 78 43 6f 6c 20 29  >nExpr>iIdxCol )
1a760 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53  ;.    pParse->iS
1a770 65 6c 66 54 61 62 20 3d 20 69 54 61 62 43 75 72  elfTab = iTabCur
1a780 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1a790 72 43 6f 64 65 43 6f 70 79 28 70 50 61 72 73 65  rCodeCopy(pParse
1a7a0 2c 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72  , pIdx->aColExpr
1a7b0 2d 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e 70 45 78  ->a[iIdxCol].pEx
1a7c0 70 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d  pr, regOut);.  }
1a7d0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
1a7e0 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
1a7f0 6d 6e 4f 66 54 61 62 6c 65 28 70 50 61 72 73 65  mnOfTable(pParse
1a800 2d 3e 70 56 64 62 65 2c 20 70 49 64 78 2d 3e 70  ->pVdbe, pIdx->p
1a810 54 61 62 6c 65 2c 20 69 54 61 62 43 75 72 2c 0a  Table, iTabCur,.
1a820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a840 20 20 20 20 69 54 61 62 43 6f 6c 2c 20 72 65 67      iTabCol, reg
1a850 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Out);.  }.}../*.
1a860 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1a870 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65 20   to extract the 
1a880 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 43 6f  value of the iCo
1a890 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  l-th column of a
1a8a0 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20   table..*/.void 
1a8b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1a8c0 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28  etColumnOfTable(
1a8d0 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
1a8e0 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 75     /* The VDBE u
1a8f0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
1a900 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  n */.  Table *pT
1a910 61 62 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61  ab,    /* The ta
1a920 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
1a930 68 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e  he value */.  in
1a940 74 20 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a  t iTabCur,    /*
1a950 20 54 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f   The table curso
1a960 72 2e 20 20 4f 72 20 74 68 65 20 50 4b 20 63 75  r.  Or the PK cu
1a970 72 73 6f 72 20 66 6f 72 20 57 49 54 48 4f 55 54  rsor for WITHOUT
1a980 20 52 4f 57 49 44 20 2a 2f 0a 20 20 69 6e 74 20   ROWID */.  int 
1a990 69 43 6f 6c 2c 20 20 20 20 20 20 20 2f 2a 20 49  iCol,       /* I
1a9a0 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75  ndex of the colu
1a9b0 6d 6e 20 74 6f 20 65 78 74 72 61 63 74 20 2a 2f  mn to extract */
1a9c0 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20 20 20  .  int regOut   
1a9d0 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68     /* Extract th
1a9e0 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 69  e value into thi
1a9f0 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b  s register */.){
1aa00 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c  .  if( iCol<0 ||
1aa10 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b   iCol==pTab->iPK
1aa20 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
1aa30 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1aa40 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 43 75 72  P_Rowid, iTabCur
1aa50 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c  , regOut);.  }el
1aa60 73 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d  se{.    int op =
1aa70 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
1aa80 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20   ? OP_VColumn : 
1aa90 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69  OP_Column;.    i
1aaa0 6e 74 20 78 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  nt x = iCol;.   
1aab0 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70   if( !HasRowid(p
1aac0 54 61 62 29 20 26 26 20 21 49 73 56 69 72 74 75  Tab) && !IsVirtu
1aad0 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
1aae0 20 20 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c    x = sqlite3Col
1aaf0 75 6d 6e 4f 66 49 6e 64 65 78 28 73 71 6c 69 74  umnOfIndex(sqlit
1ab00 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
1ab10 78 28 70 54 61 62 29 2c 20 69 43 6f 6c 29 3b 0a  x(pTab), iCol);.
1ab20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1ab30 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f  3VdbeAddOp3(v, o
1ab40 70 2c 20 69 54 61 62 43 75 72 2c 20 78 2c 20 72  p, iTabCur, x, r
1ab50 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 66  egOut);.  }.  if
1ab60 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20  ( iCol>=0 ){.   
1ab70 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65   sqlite3ColumnDe
1ab80 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69  fault(v, pTab, i
1ab90 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  Col, regOut);.  
1aba0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
1abb0 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
1abc0 6c 6c 20 65 78 74 72 61 63 74 20 74 68 65 20 69  ll extract the i
1abd0 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e  Column-th column
1abe0 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70   from.** table p
1abf0 54 61 62 20 61 6e 64 20 73 74 6f 72 65 20 74 68  Tab and store th
1ac00 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  e column value i
1ac10 6e 20 61 20 72 65 67 69 73 74 65 72 2e 20 0a 2a  n a register. .*
1ac20 2a 0a 2a 2a 20 41 6e 20 65 66 66 6f 72 74 20 69  *.** An effort i
1ac30 73 20 6d 61 64 65 20 74 6f 20 73 74 6f 72 65 20  s made to store 
1ac40 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  the column value
1ac50 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65   in register iRe
1ac60 67 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6e  g.  This.** is n
1ac70 6f 74 20 67 61 72 61 6e 74 65 65 65 64 20 66 6f  ot garanteeed fo
1ac80 72 20 47 65 74 43 6f 6c 75 6d 6e 28 29 20 2d 20  r GetColumn() - 
1ac90 74 68 65 20 72 65 73 75 6c 74 20 63 61 6e 20 62  the result can b
1aca0 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 61  e stored in.** a
1acb0 6e 79 20 72 65 67 69 73 74 65 72 2e 20 20 42 75  ny register.  Bu
1acc0 74 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  t the result is 
1acd0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 61  guaranteed to la
1ace0 6e 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  nd in register i
1acf0 52 65 67 0a 2a 2a 20 66 6f 72 20 47 65 74 43 6f  Reg.** for GetCo
1ad00 6c 75 6d 6e 54 6f 52 65 67 28 29 2e 0a 2a 2a 0a  lumnToReg()..**.
1ad10 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  ** There must be
1ad20 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20   an open cursor 
1ad30 74 6f 20 70 54 61 62 20 69 6e 20 69 54 61 62 6c  to pTab in iTabl
1ad40 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
1ad50 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
1ad60 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20  .  If iColumn<0 
1ad70 74 68 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e  then code is gen
1ad80 65 72 61 74 65 64 20 74 68 61 74 20 65 78 74 72  erated that extr
1ad90 61 63 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a  acts the rowid..
1ada0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
1adb0 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
1adc0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1add0 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61  ,   /* Parsing a
1ade0 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
1adf0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1ae00 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
1ae10 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
1ae20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20  of the table we 
1ae30 61 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d  are reading from
1ae40 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
1ae50 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20  n,     /* Index 
1ae60 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c  of the table col
1ae70 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  umn */.  int iTa
1ae80 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ble,      /* The
1ae90 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   cursor pointing
1aea0 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   to the table */
1aeb0 0a 20 20 69 6e 74 20 69 52 65 67 2c 20 20 20 20  .  int iReg,    
1aec0 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73      /* Store res
1aed0 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 75  ults here */.  u
1aee0 38 20 70 35 20 20 20 20 20 20 20 20 20 20 20 20  8 p5            
1aef0 2f 2a 20 50 35 20 76 61 6c 75 65 20 66 6f 72 20  /* P5 value for 
1af00 4f 50 5f 43 6f 6c 75 6d 6e 20 2b 20 46 4c 41 47  OP_Column + FLAG
1af10 53 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  S */.){.  Vdbe *
1af20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1af30 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
1af40 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
1af50 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  p;..  for(i=0, p
1af60 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
1af70 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
1af80 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
1af90 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
1afa0 52 65 67 3e 30 20 26 26 20 70 2d 3e 69 54 61 62  Reg>0 && p->iTab
1afb0 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 2d  le==iTable && p-
1afc0 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d  >iColumn==iColum
1afd0 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6c 72  n ){.      p->lr
1afe0 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  u = pParse->iCac
1aff0 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73  heCnt++;.      s
1b000 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1b010 69 6e 52 65 67 69 73 74 65 72 28 70 50 61 72 73  inRegister(pPars
1b020 65 2c 20 70 2d 3e 69 52 65 67 29 3b 0a 20 20 20  e, p->iReg);.   
1b030 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 52 65     return p->iRe
1b040 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20  g;.    }.  }  . 
1b050 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
1b060 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  .  sqlite3ExprCo
1b070 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62  deGetColumnOfTab
1b080 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 54 61 62  le(v, pTab, iTab
1b090 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65  le, iColumn, iRe
1b0a0 67 29 3b 0a 20 20 69 66 28 20 70 35 20 29 7b 0a  g);.  if( p5 ){.
1b0b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1b0c0 68 61 6e 67 65 50 35 28 76 2c 20 70 35 29 3b 0a  hangeP5(v, p5);.
1b0d0 20 20 7d 65 6c 73 65 7b 20 20 20 0a 20 20 20 20    }else{   .    
1b0e0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1b0f0 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 54  Store(pParse, iT
1b100 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69  able, iColumn, i
1b110 52 65 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Reg);.  }.  retu
1b120 72 6e 20 69 52 65 67 3b 0a 7d 0a 76 6f 69 64 20  rn iReg;.}.void 
1b130 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1b140 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 0a 20  etColumnToReg(. 
1b150 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1b160 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
1b170 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
1b180 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61   context */.  Ta
1b190 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f  ble *pTab,     /
1b1a0 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * Description of
1b1b0 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72   the table we ar
1b1c0 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a  e reading from *
1b1d0 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c  /.  int iColumn,
1b1e0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1b1f0 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d   the table colum
1b200 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  n */.  int iTabl
1b210 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  e,      /* The c
1b220 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
1b230 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  o the table */. 
1b240 20 69 6e 74 20 69 52 65 67 20 20 20 20 20 20 20   int iReg       
1b250 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c    /* Store resul
1b260 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
1b270 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
1b280 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
1b290 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  n(pParse, pTab, 
1b2a0 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 6c 65 2c  iColumn, iTable,
1b2b0 20 69 52 65 67 2c 20 30 29 3b 0a 20 20 69 66 28   iReg, 0);.  if(
1b2c0 20 72 31 21 3d 69 52 65 67 20 29 20 73 71 6c 69   r1!=iReg ) sqli
1b2d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50  te3VdbeAddOp2(pP
1b2e0 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
1b2f0 53 43 6f 70 79 2c 20 72 31 2c 20 69 52 65 67 29  SCopy, r1, iReg)
1b300 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ;.}.../*.** Clea
1b310 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63  r all column cac
1b320 68 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76  he entries..*/.v
1b330 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1b340 61 63 68 65 43 6c 65 61 72 28 50 61 72 73 65 20  acheClear(Parse 
1b350 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20  *pParse){.  int 
1b360 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
1b370 43 61 63 68 65 20 2a 70 3b 0a 0a 23 69 66 20 53  Cache *p;..#if S
1b380 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66  QLITE_DEBUG.  if
1b390 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  ( pParse->db->fl
1b3a0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
1b3b0 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20  eAddopTrace ){. 
1b3c0 20 20 20 70 72 69 6e 74 66 28 22 43 4c 45 41 52     printf("CLEAR
1b3d0 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  \n");.  }.#endif
1b3e0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
1b3f0 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
1b400 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
1b410 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
1b420 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67  .    if( p->iReg
1b430 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45   ){.      cacheE
1b440 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65  ntryClear(pParse
1b450 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , p);.    }.  }.
1b460 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20  }../*.** Record 
1b470 74 68 65 20 66 61 63 74 20 74 68 61 74 20 61 6e  the fact that an
1b480 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65   affinity change
1b490 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 6f 6e   has occurred on
1b4a0 20 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73   iCount.** regis
1b4b0 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 77 69  ters starting wi
1b4c0 74 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f  th iStart..*/.vo
1b4d0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
1b4e0 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
1b4f0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1b500 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74   int iStart, int
1b510 20 69 43 6f 75 6e 74 29 7b 0a 20 20 73 71 6c 69   iCount){.  sqli
1b520 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
1b530 76 65 28 70 50 61 72 73 65 2c 20 69 53 74 61 72  ve(pParse, iStar
1b540 74 2c 20 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f  t, iCount);.}../
1b550 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1b560 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65  de to move conte
1b570 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72  nt from register
1b580 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b  s iFrom...iFrom+
1b590 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74  nReg-1.** over t
1b5a0 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d  o iTo..iTo+nReg-
1b5b0 31 2e 20 4b 65 65 70 20 74 68 65 20 63 6f 6c 75  1. Keep the colu
1b5c0 6d 6e 20 63 61 63 68 65 20 75 70 2d 74 6f 2d 64  mn cache up-to-d
1b5d0 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ate..*/.void sql
1b5e0 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
1b5f0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1b600 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
1b610 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  To, int nReg){. 
1b620 20 61 73 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d   assert( iFrom>=
1b630 69 54 6f 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f  iTo+nReg || iFro
1b640 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20  m+nReg<=iTo );. 
1b650 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b660 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p3(pParse->pVdbe
1b670 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d  , OP_Move, iFrom
1b680 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 20 20  , iTo, nReg);.  
1b690 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1b6a0 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69  Remove(pParse, i
1b6b0 46 72 6f 6d 2c 20 6e 52 65 67 29 3b 0a 7d 0a 0a  From, nReg);.}..
1b6c0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1b6d0 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
1b6e0 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45  ined(SQLITE_COVE
1b6f0 52 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  RAGE_TEST)./*.**
1b700 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
1b710 61 6e 79 20 72 65 67 69 73 74 65 72 20 69 6e 20  any register in 
1b720 74 68 65 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e  the range iFrom.
1b730 2e 69 54 6f 20 28 69 6e 63 6c 75 73 69 76 65 29  .iTo (inclusive)
1b740 0a 2a 2a 20 69 73 20 75 73 65 64 20 61 73 20 70  .** is used as p
1b750 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  art of the colum
1b760 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54  n cache..**.** T
1b770 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
1b780 73 65 64 20 77 69 74 68 69 6e 20 61 73 73 65 72  sed within asser
1b790 74 28 29 20 61 6e 64 20 74 65 73 74 63 61 73 65  t() and testcase
1b7a0 28 29 20 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a  () macros only.*
1b7b0 2a 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61  * and does not a
1b7c0 70 70 65 61 72 20 69 6e 20 61 20 6e 6f 72 6d 61  ppear in a norma
1b7d0 6c 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74  l build..*/.stat
1b7e0 69 63 20 69 6e 74 20 75 73 65 64 41 73 43 6f 6c  ic int usedAsCol
1b7f0 75 6d 6e 43 61 63 68 65 28 50 61 72 73 65 20 2a  umnCache(Parse *
1b800 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f  pParse, int iFro
1b810 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69  m, int iTo){.  i
1b820 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
1b830 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66  ColCache *p;.  f
1b840 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
1b850 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
1b860 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
1b870 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
1b880 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67   int r = p->iReg
1b890 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 46 72  ;.    if( r>=iFr
1b8a0 6f 6d 20 26 26 20 72 3c 3d 69 54 6f 20 29 20 72  om && r<=iTo ) r
1b8b0 65 74 75 72 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f  eturn 1;    /*NO
1b8c0 5f 54 45 53 54 2a 2f 0a 20 20 7d 0a 20 20 72 65  _TEST*/.  }.  re
1b8d0 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
1b8e0 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
1b8f0 20 7c 7c 20 53 51 4c 49 54 45 5f 43 4f 56 45 52   || SQLITE_COVER
1b900 41 47 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a  AGE_TEST */.../*
1b910 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 73 63  .** Convert a sc
1b920 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20  alar expression 
1b930 6e 6f 64 65 20 74 6f 20 61 20 54 4b 5f 52 45 47  node to a TK_REG
1b940 49 53 54 45 52 20 72 65 66 65 72 65 6e 63 69 6e  ISTER referencin
1b950 67 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 52  g.** register iR
1b960 65 67 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20  eg.  The caller 
1b970 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74  must ensure that
1b980 20 69 52 65 67 20 61 6c 72 65 61 64 79 20 63 6f   iReg already co
1b990 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 63 6f  ntains.** the co
1b9a0 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20  rrect value for 
1b9b0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  the expression..
1b9c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
1b9d0 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 45 78  xprToRegister(Ex
1b9e0 70 72 20 2a 70 2c 20 69 6e 74 20 69 52 65 67 29  pr *p, int iReg)
1b9f0 7b 0a 20 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e  {.  p->op2 = p->
1ba00 6f 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b  op;.  p->op = TK
1ba10 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e  _REGISTER;.  p->
1ba20 69 54 61 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20  iTable = iReg;. 
1ba30 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72   ExprClearProper
1ba40 74 79 28 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a  ty(p, EP_Skip);.
1ba50 7d 0a 0a 2f 2a 0a 2a 2a 20 45 76 61 6c 75 61 74  }../*.** Evaluat
1ba60 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
1ba70 28 65 69 74 68 65 72 20 61 20 76 65 63 74 6f 72  (either a vector
1ba80 20 6f 72 20 61 20 73 63 61 6c 61 72 20 65 78 70   or a scalar exp
1ba90 72 65 73 73 69 6f 6e 29 20 61 6e 64 20 73 74 6f  ression) and sto
1baa0 72 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  re.** the result
1bab0 20 69 6e 20 63 6f 6e 74 69 6e 67 75 6f 75 73 20   in continguous 
1bac0 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
1bad0 65 72 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ers.  Return the
1bae0 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
1baf0 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
1bb00 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  used to store th
1bb10 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20  e result..**.** 
1bb20 49 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  If the returned 
1bb30 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20  result register 
1bb40 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 73  is a temporary s
1bb50 63 61 6c 61 72 2c 20 74 68 65 6e 20 61 6c 73 6f  calar, then also
1bb60 20 77 72 69 74 65 0a 2a 2a 20 74 68 61 74 20 72   write.** that r
1bb70 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 69  egister number i
1bb80 6e 74 6f 20 2a 70 69 46 72 65 65 61 62 6c 65 2e  nto *piFreeable.
1bb90 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 65    If the returne
1bba0 64 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  d result registe
1bbb0 72 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 74 65  r.** is not a te
1bbc0 6d 70 6f 72 61 72 79 20 6f 72 20 69 66 20 74 68  mporary or if th
1bbd0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1bbe0 61 20 76 65 63 74 6f 72 20 73 65 74 20 2a 70 69  a vector set *pi
1bbf0 46 72 65 65 61 62 6c 65 0a 2a 2a 20 74 6f 20 30  Freeable.** to 0
1bc00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1bc10 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 50  exprCodeVector(P
1bc20 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
1bc30 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 69 46 72  pr *p, int *piFr
1bc40 65 65 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69  eeable){.  int i
1bc50 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 6e 52  Result;.  int nR
1bc60 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 45  esult = sqlite3E
1bc70 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 29  xprVectorSize(p)
1bc80 3b 0a 20 20 69 66 28 20 6e 52 65 73 75 6c 74 3d  ;.  if( nResult=
1bc90 3d 31 20 29 7b 0a 20 20 20 20 69 52 65 73 75 6c  =1 ){.    iResul
1bca0 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  t = sqlite3ExprC
1bcb0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1bcc0 70 2c 20 70 69 46 72 65 65 61 62 6c 65 29 3b 0a  p, piFreeable);.
1bcd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 69    }else{.    *pi
1bce0 46 72 65 65 61 62 6c 65 20 3d 20 30 3b 0a 20 20  Freeable = 0;.  
1bcf0 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
1bd00 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20  SELECT ){.      
1bd10 69 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65  iResult = sqlite
1bd20 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
1bd30 50 61 72 73 65 2c 20 70 2c 20 30 2c 20 30 29 3b  Parse, p, 0, 0);
1bd40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1bd50 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
1bd60 52 65 73 75 6c 74 20 3d 20 70 50 61 72 73 65 2d  Result = pParse-
1bd70 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 70  >nMem+1;.      p
1bd80 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
1bd90 52 65 73 75 6c 74 3b 0a 20 20 20 20 20 20 66 6f  Result;.      fo
1bda0 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74  r(i=0; i<nResult
1bdb0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1bdc0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1bdd0 70 50 61 72 73 65 2c 20 70 2d 3e 78 2e 70 4c 69  pParse, p->x.pLi
1bde0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
1bdf0 69 2b 69 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  i+iResult);.    
1be00 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1be10 72 65 74 75 72 6e 20 69 52 65 73 75 6c 74 3b 0a  return iResult;.
1be20 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
1be30 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65  te code into the
1be40 20 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f   current Vdbe to
1be50 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69   evaluate the gi
1be60 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
1be70 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73  n.  Attempt to s
1be80 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
1be90 20 69 6e 20 72 65 67 69 73 74 65 72 20 22 74 61   in register "ta
1bea0 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e  rget"..** Return
1beb0 20 74 68 65 20 72 65 67 69 73 74 65 72 20 77 68   the register wh
1bec0 65 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  ere results are 
1bed0 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69  stored..**.** Wi
1bee0 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  th this routine,
1bef0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61   there is no gua
1bf00 72 61 6e 74 65 65 20 74 68 61 74 20 72 65 73 75  rantee that resu
1bf10 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73  lts will.** be s
1bf20 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e  tored in target.
1bf30 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67    The result mig
1bf40 68 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ht be stored in 
1bf50 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65  some other.** re
1bf60 67 69 73 74 65 72 20 69 66 20 69 74 20 69 73 20  gister if it is 
1bf70 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f  convenient to do
1bf80 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e   so.  The callin
1bf90 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  g function.** mu
1bfa0 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74  st check the ret
1bfb0 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76  urn code and mov
1bfc0 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f  e the results to
1bfd0 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20   the desired.** 
1bfe0 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74  register..*/.int
1bff0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c000 54 61 72 67 65 74 28 50 61 72 73 65 20 2a 70 50  Target(Parse *pP
1c010 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1c020 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
1c030 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1c040 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54  se->pVdbe;  /* T
1c050 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73  he VM under cons
1c060 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
1c070 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
1c080 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
1c090 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65  pcode being code
1c0a0 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67  d */.  int inReg
1c0b0 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20 20 20   = target;      
1c0c0 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72   /* Results stor
1c0d0 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ed in register i
1c0e0 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65  nReg */.  int re
1c0f0 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20  gFree1 = 0;     
1c100 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
1c110 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d  ro free this tem
1c120 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
1c130 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  */.  int regFree
1c140 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  2 = 0;         /
1c150 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72  * If non-zero fr
1c160 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  ee this temporar
1c170 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  y register */.  
1c180 69 6e 74 20 72 31 2c 20 72 32 3b 20 20 20 20 20  int r1, r2;     
1c190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 72            /* Var
1c1a0 69 6f 75 73 20 72 65 67 69 73 74 65 72 20 6e 75  ious register nu
1c1b0 6d 62 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74  mbers */.  sqlit
1c1c0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1c1d0 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61  >db; /* The data
1c1e0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1c1f0 2a 2f 0a 20 20 45 78 70 72 20 74 65 6d 70 58 3b  */.  Expr tempX;
1c200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c210 2a 20 54 65 6d 70 6f 72 61 72 79 20 65 78 70 72  * Temporary expr
1c220 65 73 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f 0a 20  ession node */. 
1c230 20 69 6e 74 20 70 35 20 3d 20 30 3b 0a 0a 20 20   int p5 = 0;..  
1c240 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
1c250 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72   && target<=pPar
1c260 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66  se->nMem );.  if
1c270 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ( v==0 ){.    as
1c280 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
1c290 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1c2a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1c2b0 20 20 7d 0a 0a 20 20 69 66 28 20 70 45 78 70 72    }..  if( pExpr
1c2c0 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20  ==0 ){.    op = 
1c2d0 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65  TK_NULL;.  }else
1c2e0 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72  {.    op = pExpr
1c2f0 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74  ->op;.  }.  swit
1c300 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
1c310 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
1c320 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66  : {.      AggInf
1c330 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45  o *pAggInfo = pE
1c340 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20  xpr->pAggInfo;. 
1c350 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
1c360 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20  nfo_col *pCol = 
1c370 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  &pAggInfo->aCol[
1c380 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20  pExpr->iAgg];.  
1c390 20 20 20 20 69 66 28 20 21 70 41 67 67 49 6e 66      if( !pAggInf
1c3a0 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b  o->directMode ){
1c3b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1c3c0 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b   pCol->iMem>0 );
1c3d0 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
1c3e0 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20   pCol->iMem;.   
1c3f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c400 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67    }else if( pAgg
1c410 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67  Info->useSorting
1c420 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Idx ){.        s
1c430 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1c440 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70  (v, OP_Column, p
1c450 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67  AggInfo->sorting
1c460 49 64 78 50 54 61 62 2c 0a 20 20 20 20 20 20 20  IdxPTab,.       
1c470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c480 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
1c490 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67  rterColumn, targ
1c4a0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  et);.        bre
1c4b0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1c4c0 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    /* Otherwise, 
1c4d0 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74  fall thru into t
1c4e0 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73  he TK_COLUMN cas
1c4f0 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63  e */.    }.    c
1c500 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
1c510 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61 62 20  .      int iTab 
1c520 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  = pExpr->iTable;
1c530 0a 20 20 20 20 20 20 69 66 28 20 69 54 61 62 3c  .      if( iTab<
1c540 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
1c550 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e   pParse->ckBase>
1c560 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
1c570 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 43 48 45  * Generating CHE
1c580 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  CK constraints o
1c590 72 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f  r inserting into
1c5a0 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 2a   partial index *
1c5b0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 52 65  /.          inRe
1c5c0 67 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  g = pExpr->iColu
1c5d0 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b 42  mn + pParse->ckB
1c5e0 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ase;.          b
1c5f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
1c600 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
1c610 2a 20 43 6f 64 69 6e 67 20 61 6e 20 65 78 70 72  * Coding an expr
1c620 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 70  ession that is p
1c630 61 72 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  art of an index 
1c640 77 68 65 72 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  where column nam
1c650 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
1c660 69 6e 20 74 68 65 20 69 6e 64 65 78 20 72 65 66  in the index ref
1c670 65 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  er to the table 
1c680 74 6f 20 77 68 69 63 68 20 74 68 65 20 69 6e 64  to which the ind
1c690 65 78 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20  ex belongs */.  
1c6a0 20 20 20 20 20 20 20 20 69 54 61 62 20 3d 20 70          iTab = p
1c6b0 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 3b  Parse->iSelfTab;
1c6c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c6d0 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   }.      inReg =
1c6e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c6f0 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  GetColumn(pParse
1c700 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20  , pExpr->pTab,. 
1c710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1c730 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54  xpr->iColumn, iT
1c740 61 62 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20  ab, target,.    
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 70 45 78 70 72             pExpr
1c770 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 20 20 62 72  ->op2);.      br
1c780 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1c790 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
1c7a0 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65  {.      codeInte
1c7b0 67 65 72 28 70 50 61 72 73 65 2c 20 70 45 78 70  ger(pParse, pExp
1c7c0 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 0, target);. 
1c7d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c7e0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1c7f0 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
1c800 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b  OINT.    case TK
1c810 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
1c820 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1c830 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1c840 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1c850 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
1c860 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1c870 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  n, 0, target);. 
1c880 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c890 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
1c8a0 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20  e TK_STRING: {. 
1c8b0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1c8c0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1c8d0 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1c8e0 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) );.      sqlit
1c8f0 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67  e3VdbeLoadString
1c900 28 76 2c 20 74 61 72 67 65 74 2c 20 70 45 78 70  (v, target, pExp
1c910 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
1c920 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c930 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c  .    case TK_NUL
1c940 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
1c950 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1c960 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67  OP_Null, 0, targ
1c970 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  et);.      break
1c980 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1c990 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42  SQLITE_OMIT_BLOB
1c9a0 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73  _LITERAL.    cas
1c9b0 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_BLOB: {.   
1c9c0 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
1c9d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
1c9e0 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62       char *zBlob
1c9f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ca00 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1ca10 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1ca20 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73  lue) );.      as
1ca30 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
1ca40 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c  Token[0]=='x' ||
1ca50 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1ca60 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20  [0]=='X' );.    
1ca70 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1ca80 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c  >u.zToken[1]=='\
1ca90 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20  '' );.      z = 
1caa0 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  &pExpr->u.zToken
1cab0 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73  [2];.      n = s
1cac0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1cad0 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73  ) - 1;.      ass
1cae0 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20  ert( z[n]=='\'' 
1caf0 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d  );.      zBlob =
1cb00 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f   sqlite3HexToBlo
1cb10 62 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  b(sqlite3VdbeDb(
1cb20 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  v), z, n);.     
1cb30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1cb40 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e  p4(v, OP_Blob, n
1cb50 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a  /2, target, 0, z
1cb60 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43  Blob, P4_DYNAMIC
1cb70 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1cb80 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1cb90 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
1cba0 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  E: {.      asser
1cbb0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1cbc0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1cbd0 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1cbe0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1cbf0 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20  u.zToken!=0 );. 
1cc00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
1cc10 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21  pr->u.zToken[0]!
1cc20 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1cc30 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1cc40 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45   OP_Variable, pE
1cc50 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61  xpr->iColumn, ta
1cc60 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28  rget);.      if(
1cc70 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1cc80 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  [1]!=0 ){.      
1cc90 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1cca0 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f  >u.zToken[0]=='?
1ccb0 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ' .             
1ccc0 7c 7c 20 73 74 72 63 6d 70 28 70 45 78 70 72 2d  || strcmp(pExpr-
1ccd0 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 50 61 72 73  >u.zToken, pPars
1cce0 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72 2d 3e  e->azVar[pExpr->
1ccf0 69 43 6f 6c 75 6d 6e 2d 31 5d 29 3d 3d 30 20 29  iColumn-1])==0 )
1cd00 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1cd10 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
1cd20 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56   -1, pParse->azV
1cd30 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ar[pExpr->iColum
1cd40 6e 2d 31 5d 2c 20 50 34 5f 53 54 41 54 49 43 29  n-1], P4_STATIC)
1cd50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1cd60 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1cd70 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
1cd80 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67  R: {.      inReg
1cd90 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
1cda0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1cdb0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1cdc0 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20  ITE_OMIT_CAST.  
1cdd0 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20    case TK_CAST: 
1cde0 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65  {.      /* Expre
1cdf0 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f  ssions of the fo
1ce00 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74  rm:   CAST(pLeft
1ce10 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20   AS token) */.  
1ce20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
1ce30 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
1ce40 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
1ce50 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b  >pLeft, target);
1ce60 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67  .      if( inReg
1ce70 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20  !=target ){.    
1ce80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ce90 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
1cea0 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74  y, inReg, target
1ceb0 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  );.        inReg
1cec0 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20   = target;.     
1ced0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1cee0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1cef0 5f 43 61 73 74 2c 20 74 61 72 67 65 74 2c 0a 20  _Cast, target,. 
1cf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 66         sqlite3Af
1cf20 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70 72  finityType(pExpr
1cf30 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 29 3b  ->u.zToken, 0));
1cf40 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1cf50 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63   usedAsColumnCac
1cf60 68 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67  he(pParse, inReg
1cf70 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20 20 20 20  , inReg) );.    
1cf80 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1cf90 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
1cfa0 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20  (pParse, inReg, 
1cfb0 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
1cfc0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
1cfd0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53   SQLITE_OMIT_CAS
1cfe0 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  T */.    case TK
1cff0 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
1d000 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 6f 70  _ISNOT:.      op
1d010 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f   = (op==TK_IS) ?
1d020 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a   TK_EQ : TK_NE;.
1d030 20 20 20 20 20 20 70 35 20 3d 20 53 51 4c 49 54        p5 = SQLIT
1d040 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20  E_NULLEQ;.      
1d050 2f 2a 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68 20  /* fall-through 
1d060 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  */.    case TK_L
1d070 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
1d080 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
1d090 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
1d0a0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
1d0b0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
1d0c0 51 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20  Q: {.      Expr 
1d0d0 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
1d0e0 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 69 66 28  pLeft;.      if(
1d0f0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65   sqlite3ExprIsVe
1d100 63 74 6f 72 28 70 4c 65 66 74 29 20 29 7b 0a 20  ctor(pLeft) ){. 
1d110 20 20 20 20 20 20 20 63 6f 64 65 56 65 63 74 6f         codeVecto
1d120 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  rCompare(pParse,
1d130 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20   pExpr, target, 
1d140 6f 70 2c 20 70 35 29 3b 0a 20 20 20 20 20 20 7d  op, p5);.      }
1d150 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31  else{.        r1
1d160 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1d170 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1d180 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1d190 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73  ;.        r2 = s
1d1a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1d1b0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1d1c0 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
1d1d0 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  ee2);.        co
1d1e0 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
1d1f0 2c 20 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  , pLeft, pExpr->
1d200 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
1d210 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
1d220 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54  inReg, SQLITE_ST
1d230 4f 52 45 50 32 20 7c 20 70 35 29 3b 0a 20 20 20  OREP2 | p5);.   
1d240 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
1d250 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63  T==OP_Lt); testc
1d260 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20  ase(op==OP_Lt); 
1d270 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1d280 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20  ,op==OP_Lt);.   
1d290 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
1d2a0 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63  E==OP_Le); testc
1d2b0 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20  ase(op==OP_Le); 
1d2c0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1d2d0 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20  ,op==OP_Le);.   
1d2e0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
1d2f0 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63  T==OP_Gt); testc
1d300 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20  ase(op==OP_Gt); 
1d310 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1d320 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20  ,op==OP_Gt);.   
1d330 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
1d340 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63  E==OP_Ge); testc
1d350 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20  ase(op==OP_Ge); 
1d360 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1d370 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20  ,op==OP_Ge);.   
1d380 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45       assert(TK_E
1d390 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63  Q==OP_Eq); testc
1d3a0 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20  ase(op==OP_Eq); 
1d3b0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1d3c0 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20  ,op==OP_Eq);.   
1d3d0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e       assert(TK_N
1d3e0 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63  E==OP_Ne); testc
1d3f0 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20  ase(op==OP_Ne); 
1d400 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1d410 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20  ,op==OP_Ne);.   
1d420 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1d430 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1d440 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1d450 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
1d460 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
1d470 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1d480 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63  se TK_AND:.    c
1d490 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63  ase TK_OR:.    c
1d4a0 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20  ase TK_PLUS:.   
1d4b0 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20   case TK_STAR:. 
1d4c0 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53     case TK_MINUS
1d4d0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  :.    case TK_RE
1d4e0 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  M:.    case TK_B
1d4f0 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20  ITAND:.    case 
1d500 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61  TK_BITOR:.    ca
1d510 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20  se TK_SLASH:.   
1d520 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a   case TK_LSHIFT:
1d530 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48  .    case TK_RSH
1d540 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54  IFT: .    case T
1d550 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20  K_CONCAT: {.    
1d560 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44    assert( TK_AND
1d570 3d 3d 4f 50 5f 41 6e 64 20 29 3b 20 20 20 20 20  ==OP_And );     
1d580 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1d590 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20   op==TK_AND );. 
1d5a0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1d5b0 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20 20 20  OR==OP_Or );    
1d5c0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
1d5d0 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b  se( op==TK_OR );
1d5e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1d5f0 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29  K_PLUS==OP_Add )
1d600 3b 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;           test
1d610 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55  case( op==TK_PLU
1d620 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  S );.      asser
1d630 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f  t( TK_MINUS==OP_
1d640 53 75 62 74 72 61 63 74 20 29 3b 20 20 20 20 20  Subtract );     
1d650 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1d660 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20 20 20  _MINUS );.      
1d670 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d  assert( TK_REM==
1d680 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 20  OP_Remainder ); 
1d690 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1d6a0 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20  p==TK_REM );.   
1d6b0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
1d6c0 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20  TAND==OP_BitAnd 
1d6d0 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65  );      testcase
1d6e0 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20  ( op==TK_BITAND 
1d6f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1d700 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69   TK_BITOR==OP_Bi
1d710 74 4f 72 20 29 3b 20 20 20 20 20 20 20 20 74 65  tOr );        te
1d720 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42  stcase( op==TK_B
1d730 49 54 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73  ITOR );.      as
1d740 73 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d  sert( TK_SLASH==
1d750 4f 50 5f 44 69 76 69 64 65 20 29 3b 20 20 20 20  OP_Divide );    
1d760 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1d770 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20  =TK_SLASH );.   
1d780 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53     assert( TK_LS
1d790 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65  HIFT==OP_ShiftLe
1d7a0 66 74 20 29 3b 20 20 20 74 65 73 74 63 61 73 65  ft );   testcase
1d7b0 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20  ( op==TK_LSHIFT 
1d7c0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1d7d0 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53   TK_RSHIFT==OP_S
1d7e0 68 69 66 74 52 69 67 68 74 20 29 3b 20 20 74 65  hiftRight );  te
1d7f0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52  stcase( op==TK_R
1d800 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61  SHIFT );.      a
1d810 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54  ssert( TK_CONCAT
1d820 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 20 20  ==OP_Concat );  
1d830 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1d840 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20  ==TK_CONCAT );. 
1d850 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1d860 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1d870 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1d880 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1d890 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
1d8a0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1d8b0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1d8c0 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
1d8d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1d8e0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c  dbeAddOp3(v, op,
1d8f0 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29   r2, r1, target)
1d900 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1d910 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1d920 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d930 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
1d940 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d950 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
1d960 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45  MINUS: {.      E
1d970 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
1d980 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
1d990 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29   assert( pLeft )
1d9a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66  ;.      if( pLef
1d9b0 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45  t->op==TK_INTEGE
1d9c0 52 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  R ){.        cod
1d9d0 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c  eInteger(pParse,
1d9e0 20 70 4c 65 66 74 2c 20 31 2c 20 74 61 72 67 65   pLeft, 1, targe
1d9f0 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t);.#ifndef SQLI
1da00 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
1da10 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65 6c  _POINT.      }el
1da20 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70  se if( pLeft->op
1da30 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20  ==TK_FLOAT ){.  
1da40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1da50 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1da60 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
1da70 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  e) );.        co
1da80 64 65 52 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d  deReal(v, pLeft-
1da90 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61  >u.zToken, 1, ta
1daa0 72 67 65 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rget);.#endif.  
1dab0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1dac0 20 20 20 74 65 6d 70 58 2e 6f 70 20 3d 20 54 4b     tempX.op = TK
1dad0 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20  _INTEGER;.      
1dae0 20 20 74 65 6d 70 58 2e 66 6c 61 67 73 20 3d 20    tempX.flags = 
1daf0 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 54  EP_IntValue|EP_T
1db00 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 20 20  okenOnly;.      
1db10 20 20 74 65 6d 70 58 2e 75 2e 69 56 61 6c 75 65    tempX.u.iValue
1db20 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 31   = 0;.        r1
1db30 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1db40 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26  deTemp(pParse, &
1db50 74 65 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31  tempX, &regFree1
1db60 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20  );.        r2 = 
1db70 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1db80 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1db90 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
1dba0 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ee2);.        sq
1dbb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1dbc0 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20  v, OP_Subtract, 
1dbd0 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b  r2, r1, target);
1dbe0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1dbf0 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
1dc00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1dc10 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a  inReg = target;.
1dc20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1dc30 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
1dc40 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20  ITNOT:.    case 
1dc50 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
1dc60 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f  assert( TK_BITNO
1dc70 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 20  T==OP_BitNot ); 
1dc80 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1dc90 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20  TK_BITNOT );.   
1dca0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
1dcb0 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20 20 20  T==OP_Not );    
1dcc0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1dcd0 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20  p==TK_NOT );.   
1dce0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1dcf0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1dd00 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1dd10 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1dd20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1dd30 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1dd40 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65     inReg = targe
1dd50 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
1dd60 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
1dd70 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20  , r1, inReg);.  
1dd80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1dd90 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
1dda0 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
1ddb0 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
1ddc0 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
1ddd0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e    assert( TK_ISN
1dde0 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29  ULL==OP_IsNull )
1ddf0 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  ;   testcase( op
1de00 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==TK_ISNULL );. 
1de10 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1de20 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e  NOTNULL==OP_NotN
1de30 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28  ull ); testcase(
1de40 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
1de50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1de60 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1de70 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72  _Integer, 1, tar
1de80 67 65 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  get);.      r1 =
1de90 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1dea0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1deb0 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1dec0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73  ree1);.      tes
1ded0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1dee0 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72  =0 );.      addr
1def0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1df00 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b  dOp1(v, op, r1);
1df10 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
1df20 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
1df30 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56  ISNULL);.      V
1df40 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1df50 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29   op==TK_NOTNULL)
1df60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1df70 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1df80 49 6e 74 65 67 65 72 2c 20 30 2c 20 74 61 72 67  Integer, 0, targ
1df90 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
1dfa0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
1dfb0 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 62  , addr);.      b
1dfc0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1dfd0 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
1dfe0 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67  TION: {.      Ag
1dff0 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70  gInfo *pInfo = p
1e000 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a  Expr->pAggInfo;.
1e010 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d        if( pInfo=
1e020 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
1e030 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1e040 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1e050 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1e060 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1e070 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d  orMsg(pParse, "m
1e080 69 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61  isuse of aggrega
1e090 74 65 3a 20 25 73 28 29 22 2c 20 70 45 78 70 72  te: %s()", pExpr
1e0a0 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
1e0b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e0c0 20 20 69 6e 52 65 67 20 3d 20 70 49 6e 66 6f 2d    inReg = pInfo-
1e0d0 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41  >aFunc[pExpr->iA
1e0e0 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20  gg].iMem;.      
1e0f0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
1e100 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1e110 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
1e120 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 61     ExprList *pFa
1e130 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  rg;       /* Lis
1e140 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  t of function ar
1e150 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
1e160 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20 20 20   int nFarg;     
1e170 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1e180 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  r of function ar
1e190 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
1e1a0 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20   FuncDef *pDef; 
1e1b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
1e1c0 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69  unction definiti
1e1d0 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  on object */.   
1e1e0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1e1f0 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Id;       /* The
1e200 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
1e210 2f 0a 20 20 20 20 20 20 75 33 32 20 63 6f 6e 73  /.      u32 cons
1e220 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 2f  tMask = 0;     /
1e230 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74 69  * Mask of functi
1e240 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61  on arguments tha
1e250 74 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 20 2a  t are constant *
1e260 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  /.      int i;  
1e270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e280 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
1e290 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d  /.      u8 enc =
1e2a0 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20 20 2f   ENC(db);      /
1e2b0 2a 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f 64  * The text encod
1e2c0 69 6e 67 20 75 73 65 64 20 62 79 20 74 68 69 73  ing used by this
1e2d0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
1e2e0 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
1e2f0 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20 63  l = 0;    /* A c
1e300 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1e310 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65  e */..      asse
1e320 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1e330 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
1e340 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
1e350 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
1e360 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1e370 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
1e380 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 30         pFarg = 0
1e390 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1e3a0 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 70         pFarg = p
1e3b0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
1e3c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 61       }.      nFa
1e3d0 72 67 20 3d 20 70 46 61 72 67 20 3f 20 70 46 61  rg = pFarg ? pFa
1e3e0 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20  rg->nExpr : 0;. 
1e3f0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1e400 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1e410 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1e420 29 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d  ) );.      zId =
1e430 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1e440 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73  ;.      pDef = s
1e450 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
1e460 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 46 61 72  on(db, zId, nFar
1e470 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 23 69 66 64  g, enc, 0);.#ifd
1e480 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1e490 5f 55 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e  _UNKNOWN_SQL_FUN
1e4a0 43 54 49 4f 4e 0a 20 20 20 20 20 20 69 66 28 20  CTION.      if( 
1e4b0 70 44 65 66 3d 3d 30 20 26 26 20 70 50 61 72 73  pDef==0 && pPars
1e4c0 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
1e4d0 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
1e4e0 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
1e4f0 28 64 62 2c 20 22 75 6e 6b 6e 6f 77 6e 22 2c 20  (db, "unknown", 
1e500 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a  nFarg, enc, 0);.
1e510 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1e520 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30       if( pDef==0
1e530 20 7c 7c 20 70 44 65 66 2d 3e 78 46 69 6e 61 6c   || pDef->xFinal
1e540 69 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize!=0 ){.      
1e550 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1e560 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f  g(pParse, "unkno
1e570 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73 28  wn function: %s(
1e580 29 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20  )", zId);.      
1e590 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1e5a0 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d  ..      /* Attem
1e5b0 70 74 20 61 20 64 69 72 65 63 74 20 69 6d 70 6c  pt a direct impl
1e5c0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
1e5d0 65 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c 45  e built-in COALE
1e5e0 53 43 45 28 29 20 61 6e 64 0a 20 20 20 20 20 20  SCE() and.      
1e5f0 2a 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63  ** IFNULL() func
1e600 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 61 76 6f  tions.  This avo
1e610 69 64 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20  ids unnecessary 
1e620 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 0a 20 20  evaluation of.  
1e630 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73      ** arguments
1e640 20 70 61 73 74 20 74 68 65 20 66 69 72 73 74 20   past the first 
1e650 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e  non-NULL argumen
1e660 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
1e670 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63    if( pDef->func
1e680 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
1e690 55 4e 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a  UNC_COALESCE ){.
1e6a0 20 20 20 20 20 20 20 20 69 6e 74 20 65 6e 64 43          int endC
1e6b0 6f 61 6c 65 73 63 65 20 3d 20 73 71 6c 69 74 65  oalesce = sqlite
1e6c0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1e6d0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1e6e0 74 28 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20  t( nFarg>=2 );. 
1e6f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1e700 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1e710 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
1e720 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1e730 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46     for(i=1; i<nF
1e740 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  arg; i++){.     
1e750 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e760 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp2(v, OP_Not
1e770 4e 75 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e  Null, target, en
1e780 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20  dCoalesce);.    
1e790 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1e7a0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
1e7b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1e7c0 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20  eRemove(pParse, 
1e7d0 74 61 72 67 65 74 2c 20 31 29 3b 0a 20 20 20 20  target, 1);.    
1e7e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1e7f0 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
1e800 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
1e810 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1e820 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69  arse, pFarg->a[i
1e830 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
1e840 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1e850 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
1e860 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
1e870 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
1e880 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1e890 65 6c 28 76 2c 20 65 6e 64 43 6f 61 6c 65 73 63  el(v, endCoalesc
1e8a0 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  e);.        brea
1e8b0 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
1e8c0 20 20 2f 2a 20 54 68 65 20 55 4e 4c 49 4b 45 4c    /* The UNLIKEL
1e8d0 59 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  Y() function is 
1e8e0 61 20 6e 6f 2d 6f 70 2e 20 20 54 68 65 20 72 65  a no-op.  The re
1e8f0 73 75 6c 74 20 69 73 20 74 68 65 20 76 61 6c 75  sult is the valu
1e900 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  e.      ** of th
1e910 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1e920 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1e930 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46   if( pDef->funcF
1e940 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
1e950 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20  NC_UNLIKELY ){. 
1e960 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
1e970 46 61 72 67 3e 3d 31 20 29 3b 0a 20 20 20 20 20  Farg>=1 );.     
1e980 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
1e990 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
1e9a0 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
1e9b0 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  a[0].pExpr, targ
1e9c0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  et);.        bre
1e9d0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
1e9e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46     for(i=0; i<nF
1e9f0 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  arg; i++){.     
1ea00 20 20 20 69 66 28 20 69 3c 33 32 20 26 26 20 73     if( i<32 && s
1ea10 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
1ea20 74 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d  tant(pFarg->a[i]
1ea30 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
1ea40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
1ea50 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20  ==31 );.        
1ea60 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d    constMask |= M
1ea70 41 53 4b 42 49 54 33 32 28 69 29 3b 0a 20 20 20  ASKBIT32(i);.   
1ea80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1ea90 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c  f( (pDef->funcFl
1eaa0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
1eab0 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26  C_NEEDCOLL)!=0 &
1eac0 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  & !pColl ){.    
1ead0 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
1eae0 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1eaf0 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
1eb00 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
1eb10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1eb20 20 20 20 20 20 69 66 28 20 70 46 61 72 67 20 29       if( pFarg )
1eb30 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  {.        if( co
1eb40 6e 73 74 4d 61 73 6b 20 29 7b 0a 20 20 20 20 20  nstMask ){.     
1eb50 20 20 20 20 20 72 31 20 3d 20 70 50 61 72 73 65       r1 = pParse
1eb60 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20  ->nMem+1;.      
1eb70 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
1eb80 20 2b 3d 20 6e 46 61 72 67 3b 0a 20 20 20 20 20   += nFarg;.     
1eb90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1eba0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1ebb0 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
1ebc0 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20  rse, nFarg);.   
1ebd0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1ebe0 2f 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28 29 20  /* For length() 
1ebf0 61 6e 64 20 74 79 70 65 6f 66 28 29 20 66 75 6e  and typeof() fun
1ec00 63 74 69 6f 6e 73 20 77 69 74 68 20 61 20 63 6f  ctions with a co
1ec10 6c 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a 20  lumn argument,. 
1ec20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68         ** set th
1ec30 65 20 50 35 20 70 61 72 61 6d 65 74 65 72 20 74  e P5 parameter t
1ec40 6f 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20  o the OP_Column 
1ec50 6f 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41 47  opcode to OPFLAG
1ec60 5f 4c 45 4e 47 54 48 41 52 47 0a 20 20 20 20 20  _LENGTHARG.     
1ec70 20 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47 5f     ** or OPFLAG_
1ec80 54 59 50 45 4f 46 41 52 47 20 72 65 73 70 65 63  TYPEOFARG respec
1ec90 74 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69 64  tively, to avoid
1eca0 20 75 6e 6e 65 63 65 73 73 61 72 79 20 64 61 74   unnecessary dat
1ecb0 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 61  a.        ** loa
1ecc0 64 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ding..        */
1ecd0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44  .        if( (pD
1ece0 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
1ecf0 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e  (SQLITE_FUNC_LEN
1ed00 47 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f  GTH|SQLITE_FUNC_
1ed10 54 59 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a 20  TYPEOF))!=0 ){. 
1ed20 20 20 20 20 20 20 20 20 20 75 38 20 65 78 70 72           u8 expr
1ed30 4f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  Op;.          as
1ed40 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29  sert( nFarg==1 )
1ed50 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
1ed60 72 74 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  rt( pFarg->a[0].
1ed70 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  pExpr!=0 );.    
1ed80 20 20 20 20 20 20 65 78 70 72 4f 70 20 3d 20 70        exprOp = p
1ed90 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
1eda0 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20  ->op;.          
1edb0 69 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 43  if( exprOp==TK_C
1edc0 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70 3d  OLUMN || exprOp=
1edd0 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
1ede0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
1edf0 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e  sert( SQLITE_FUN
1ee00 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41 47  C_LENGTH==OPFLAG
1ee10 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20  _LENGTHARG );.  
1ee20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1ee30 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59  ( SQLITE_FUNC_TY
1ee40 50 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59 50  PEOF==OPFLAG_TYP
1ee50 45 4f 46 41 52 47 20 29 3b 0a 20 20 20 20 20 20  EOFARG );.      
1ee60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ee70 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
1ee80 26 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41  & OPFLAG_LENGTHA
1ee90 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  RG );.          
1eea0 20 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45    pFarg->a[0].pE
1eeb0 78 70 72 2d 3e 6f 70 32 20 3d 20 0a 20 20 20 20  xpr->op2 = .    
1eec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44                pD
1eed0 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
1eee0 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52  (OPFLAG_LENGTHAR
1eef0 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41  G|OPFLAG_TYPEOFA
1ef00 52 47 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  RG);.          }
1ef10 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1ef20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1ef30 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
1ef40 3b 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20  ;     /* Ticket 
1ef50 32 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a  2ea2425d34be */.
1ef60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1ef70 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
1ef80 70 50 61 72 73 65 2c 20 70 46 61 72 67 2c 20 72  pParse, pFarg, r
1ef90 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  1, 0,.          
1efa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efb0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45        SQLITE_ECE
1efc0 4c 5f 44 55 50 7c 53 51 4c 49 54 45 5f 45 43 45  L_DUP|SQLITE_ECE
1efd0 4c 5f 46 41 43 54 4f 52 29 3b 0a 20 20 20 20 20  L_FACTOR);.     
1efe0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1eff0 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 20  chePop(pParse); 
1f000 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32       /* Ticket 2
1f010 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20  ea2425d34be */. 
1f020 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f030 20 20 20 20 72 31 20 3d 20 30 3b 0a 20 20 20 20      r1 = 0;.    
1f040 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1f050 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1f060 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f  ABLE.      /* Po
1f070 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20  ssibly overload 
1f080 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20  the function if 
1f090 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
1f0a0 6e 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  nt is.      ** a
1f0b0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63   virtual table c
1f0c0 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a  olumn..      **.
1f0d0 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66        ** For inf
1f0e0 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49  ix functions (LI
1f0f0 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50  KE, GLOB, REGEXP
1f100 2c 20 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65  , and MATCH) use
1f110 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65   the.      ** se
1f120 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e  cond argument, n
1f130 6f 74 20 74 68 65 20 66 69 72 73 74 2c 20 61 73  ot the first, as
1f140 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   the argument to
1f150 20 74 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a   test to.      *
1f160 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 61  * see if it is a
1f170 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72   column in a vir
1f180 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69  tual table.  Thi
1f190 73 20 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73  s is done becaus
1f1a0 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c  e.      ** the l
1f1b0 65 66 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69  eft operand of i
1f1c0 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28  nfix functions (
1f1d0 74 68 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77  the operand we w
1f1e0 61 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ant to.      ** 
1f1f0 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64  control overload
1f200 69 6e 67 29 20 65 6e 64 73 20 75 70 20 61 73 20  ing) ends up as 
1f210 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1f220 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20  ent to the.     
1f230 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54   ** function.  T
1f240 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41  he expression "A
1f250 20 67 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69   glob B" is equi
1f260 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20  valent to .     
1f270 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20   ** "glob(B,A). 
1f280 20 57 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20   We want to use 
1f290 74 68 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62  the A in "A glob
1f2a0 20 42 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20   B" to test.    
1f2b0 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f    ** for functio
1f2c0 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20  n overloading.  
1f2d0 42 75 74 20 77 65 20 75 73 65 20 74 68 65 20 42  But we use the B
1f2e0 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42   term in "glob(B
1f2f0 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ,A)"..      */. 
1f300 20 20 20 20 20 69 66 28 20 6e 46 61 72 67 3e 3d       if( nFarg>=
1f310 32 20 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61  2 && (pExpr->fla
1f320 67 73 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e  gs & EP_InfixFun
1f330 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  c) ){.        pD
1f340 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  ef = sqlite3Vtab
1f350 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e  OverloadFunction
1f360 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67  (db, pDef, nFarg
1f370 2c 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45  , pFarg->a[1].pE
1f380 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  xpr);.      }els
1f390 65 20 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b  e if( nFarg>0 ){
1f3a0 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
1f3b0 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c  sqlite3VtabOverl
1f3c0 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  oadFunction(db, 
1f3d0 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61  pDef, nFarg, pFa
1f3e0 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  rg->a[0].pExpr);
1f3f0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1f400 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
1f410 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
1f420 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
1f430 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1f440 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
1f450 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20   db->pDfltColl; 
1f460 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f470 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1f480 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20  _CollSeq, 0, 0, 
1f490 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c  0, (char *)pColl
1f4a0 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
1f4b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1f4c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1f4d0 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 2c 20  , OP_Function0, 
1f4e0 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74  constMask, r1, t
1f4f0 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20  arget,.         
1f500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1f510 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46  char*)pDef, P4_F
1f520 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73  UNCDEF);.      s
1f530 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1f540 50 35 28 76 2c 20 28 75 38 29 6e 46 61 72 67 29  P5(v, (u8)nFarg)
1f550 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72  ;.      if( nFar
1f560 67 20 26 26 20 63 6f 6e 73 74 4d 61 73 6b 3d 3d  g && constMask==
1f570 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
1f580 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1f590 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c  ange(pParse, r1,
1f5a0 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d   nFarg);.      }
1f5b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1f5c0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1f5d0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1f5e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
1f5f0 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  STS:.    case TK
1f600 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
1f610 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   int nCol;.     
1f620 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1f630 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20  K_EXISTS );.    
1f640 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1f650 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20  TK_SELECT );.   
1f660 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45     if( op==TK_SE
1f670 4c 45 43 54 20 26 26 20 28 6e 43 6f 6c 20 3d 20  LECT && (nCol = 
1f680 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
1f690 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
1f6a0 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
1f6b0 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45  qlite3SubselectE
1f6c0 72 72 6f 72 28 70 50 61 72 73 65 2c 20 6e 43 6f  rror(pParse, nCo
1f6d0 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  l, 1);.      }el
1f6e0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65  se{.        inRe
1f6f0 67 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53  g = sqlite3CodeS
1f700 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
1f710 20 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20   pExpr, 0, 0);. 
1f720 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
1f730 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1f740 73 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  se TK_SELECT_COL
1f750 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  UMN: {.      if(
1f760 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69   pExpr->pLeft->i
1f770 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Table==0 ){.    
1f780 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
1f790 2d 3e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74  ->iTable = sqlit
1f7a0 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
1f7b0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1f7c0 4c 65 66 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Left, 0, 0);.   
1f7d0 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67     }.      inReg
1f7e0 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d   = pExpr->pLeft-
1f7f0 3e 69 54 61 62 6c 65 20 2b 20 70 45 78 70 72 2d  >iTable + pExpr-
1f800 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
1f810 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1f820 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
1f830 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46       int destIfF
1f840 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  alse = sqlite3Vd
1f850 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1f860 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
1f870 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  Null = sqlite3Vd
1f880 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1f890 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f8a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
1f8b0 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
1f8c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1f8d0 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
1f8e0 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c  pExpr, destIfFal
1f8f0 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  se, destIfNull);
1f900 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1f910 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1f920 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65  nteger, 1, targe
1f930 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1f940 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1f950 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65  l(v, destIfFalse
1f960 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f970 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1f980 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c  _AddImm, target,
1f990 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
1f9a0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1f9b0 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c  el(v, destIfNull
1f9c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1f9d0 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
1f9e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1f9f0 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a  UERY */...    /*
1fa00 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54  .    **    x BET
1fa10 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20  WEEN y AND z.   
1fa20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
1fa30 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
1fa40 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1fa50 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a    x>=y AND x<=z.
1fa60 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20      **.    ** X 
1fa70 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
1fa80 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a  pr->pLeft..    *
1fa90 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Y is stored in
1faa0 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
1fab0 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [0].pExpr..    *
1fac0 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Z is stored in
1fad0 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
1fae0 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [1].pExpr..    *
1faf0 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  /.    case TK_BE
1fb00 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 65  TWEEN: {.      e
1fb10 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70  xprCodeBetween(p
1fb20 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
1fb30 72 67 65 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  rget, 0, 0);.   
1fb40 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1fb50 20 20 20 20 63 61 73 65 20 54 4b 5f 53 50 41 4e      case TK_SPAN
1fb60 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
1fb70 4c 4c 41 54 45 3a 20 0a 20 20 20 20 63 61 73 65  LLATE: .    case
1fb80 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20   TK_UPLUS: {.   
1fb90 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
1fba0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
1fbb0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1fbc0 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a  pLeft, target);.
1fbd0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1fbe0 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
1fbf0 54 52 49 47 47 45 52 3a 20 7b 0a 20 20 20 20 20  TRIGGER: {.     
1fc00 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 63 6f 64   /* If the opcod
1fc10 65 20 69 73 20 54 4b 5f 54 52 49 47 47 45 52 2c  e is TK_TRIGGER,
1fc20 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
1fc30 73 69 6f 6e 20 69 73 20 61 20 72 65 66 65 72 65  sion is a refere
1fc40 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  nce.      ** to 
1fc50 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  a column in the 
1fc60 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70  new.* or old.* p
1fc70 73 65 75 64 6f 2d 74 61 62 6c 65 73 20 61 76 61  seudo-tables ava
1fc80 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20  ilable to.      
1fc90 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  ** trigger progr
1fca0 61 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ams. In this cas
1fcb0 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20 69 73  e Expr.iTable is
1fcc0 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20 74 68   set to 1 for th
1fcd0 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a  e.      ** new.*
1fce0 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f   pseudo-table, o
1fcf0 72 20 30 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e  r 0 for the old.
1fd00 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20  * pseudo-table. 
1fd10 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20  Expr.iColumn.   
1fd20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20     ** is set to 
1fd30 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  the column of th
1fd40 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 74  e pseudo-table t
1fd50 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31  o read, or to -1
1fd60 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61   to.      ** rea
1fd70 64 20 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c  d the rowid fiel
1fd80 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
1fd90 20 20 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73    ** The express
1fda0 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
1fdb0 65 64 20 75 73 69 6e 67 20 61 6e 20 4f 50 5f 50  ed using an OP_P
1fdc0 61 72 61 6d 20 6f 70 63 6f 64 65 2e 20 54 68 65  aram opcode. The
1fdd0 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 70 61 72   p1.      ** par
1fde0 61 6d 65 74 65 72 20 69 73 20 73 65 74 20 74 6f  ameter is set to
1fdf0 20 30 20 66 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f   0 for an old.ro
1fe00 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 6f  wid reference, o
1fe10 72 20 74 6f 20 28 69 2b 31 29 0a 20 20 20 20 20  r to (i+1).     
1fe20 20 2a 2a 20 74 6f 20 72 65 66 65 72 65 6e 63 65   ** to reference
1fe30 20 61 6e 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20   another column 
1fe40 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65  of the old.* pse
1fe50 75 64 6f 2d 74 61 62 6c 65 2c 20 77 68 65 72 65  udo-table, where
1fe60 20 0a 20 20 20 20 20 20 2a 2a 20 69 20 69 73 20   .      ** i is 
1fe70 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
1fe80 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61 20 6e   column. For a n
1fe90 65 77 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e  ew.rowid referen
1fea0 63 65 2c 20 70 31 20 69 73 0a 20 20 20 20 20 20  ce, p1 is.      
1feb0 2a 2a 20 73 65 74 20 74 6f 20 28 6e 2b 31 29 2c  ** set to (n+1),
1fec0 20 77 68 65 72 65 20 6e 20 69 73 20 74 68 65 20   where n is the 
1fed0 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
1fee0 73 20 69 6e 20 65 61 63 68 20 70 73 65 75 64 6f  s in each pseudo
1fef0 2d 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a  -table..      **
1ff00 20 46 6f 72 20 61 20 72 65 66 65 72 65 6e 63 65   For a reference
1ff10 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 63 6f   to any other co
1ff20 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e  lumn in the new.
1ff30 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20  * pseudo-table, 
1ff40 70 31 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  p1.      ** is s
1ff50 65 74 20 74 6f 20 28 6e 2b 32 2b 69 29 2c 20 77  et to (n+2+i), w
1ff60 68 65 72 65 20 6e 20 61 6e 64 20 69 20 61 72 65  here n and i are
1ff70 20 61 73 20 64 65 66 69 6e 65 64 20 70 72 65 76   as defined prev
1ff80 69 6f 75 73 6c 79 2e 20 46 6f 72 0a 20 20 20 20  iously. For.    
1ff90 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66    ** example, if
1ffa0 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 77 68   the table on wh
1ffb0 69 63 68 20 74 72 69 67 67 65 72 73 20 61 72 65  ich triggers are
1ffc0 20 62 65 69 6e 67 20 66 69 72 65 64 20 69 73 0a   being fired is.
1ffd0 20 20 20 20 20 20 2a 2a 20 64 65 63 6c 61 72 65        ** declare
1ffe0 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  d as:.      **. 
1fff0 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45       **   CREATE
20000 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
20010 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
20020 2a 2a 20 54 68 65 6e 20 70 31 20 69 73 20 69 6e  ** Then p1 is in
20030 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c  terpreted as fol
20040 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  lows:.      **. 
20050 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 30 20       **   p1==0 
20060 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f 77 69    ->    old.rowi
20070 64 20 20 20 20 20 70 31 3d 3d 33 20 20 20 2d 3e  d     p1==3   ->
20080 20 20 20 20 6e 65 77 2e 72 6f 77 69 64 0a 20 20      new.rowid.  
20090 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 31 20 20      **   p1==1  
200a0 20 2d 3e 20 20 20 20 6f 6c 64 2e 61 20 20 20 20   ->    old.a    
200b0 20 20 20 20 20 70 31 3d 3d 34 20 20 20 2d 3e 20       p1==4   -> 
200c0 20 20 20 6e 65 77 2e 61 0a 20 20 20 20 20 20 2a     new.a.      *
200d0 2a 20 20 20 70 31 3d 3d 32 20 20 20 2d 3e 20 20  *   p1==2   ->  
200e0 20 20 6f 6c 64 2e 62 20 20 20 20 20 20 20 20 20    old.b         
200f0 70 31 3d 3d 35 20 20 20 2d 3e 20 20 20 20 6e 65  p1==5   ->    ne
20100 77 2e 62 20 20 20 20 20 20 20 0a 20 20 20 20 20  w.b       .     
20110 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20   */.      Table 
20120 2a 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70  *pTab = pExpr->p
20130 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 70  Tab;.      int p
20140 31 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  1 = pExpr->iTabl
20150 65 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b  e * (pTab->nCol+
20160 31 29 20 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e  1) + 1 + pExpr->
20170 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20  iColumn;..      
20180 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69  assert( pExpr->i
20190 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70  Table==0 || pExp
201a0 72 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a  r->iTable==1 );.
201b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
201c0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31  xpr->iColumn>=-1
201d0 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   && pExpr->iColu
201e0 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  mn<pTab->nCol );
201f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
20200 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20  Tab->iPKey<0 || 
20210 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  pExpr->iColumn!=
20220 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20  pTab->iPKey );. 
20230 20 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e       assert( p1>
20240 3d 30 20 26 26 20 70 31 3c 28 70 54 61 62 2d 3e  =0 && p1<(pTab->
20250 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20  nCol*2+2) );..  
20260 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20270 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72 61  ddOp2(v, OP_Para
20280 6d 2c 20 70 31 2c 20 74 61 72 67 65 74 29 3b 0a  m, p1, target);.
20290 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
202a0 74 28 28 76 2c 20 22 25 73 2e 25 73 20 2d 3e 20  t((v, "%s.%s -> 
202b0 24 25 64 22 2c 0a 20 20 20 20 20 20 20 20 28 70  $%d",.        (p
202c0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22  Expr->iTable ? "
202d0 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20  new" : "old"),. 
202e0 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69         (pExpr->i
202f0 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69  Column<0 ? "rowi
20300 64 22 20 3a 20 70 45 78 70 72 2d 3e 70 54 61 62  d" : pExpr->pTab
20310 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43  ->aCol[pExpr->iC
20320 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a 20  olumn].zName),. 
20330 20 20 20 20 20 20 20 74 61 72 67 65 74 0a 20 20         target.  
20340 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65 66      ));..#ifndef
20350 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
20360 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
20370 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
20380 6d 6e 20 68 61 73 20 52 45 41 4c 20 61 66 66 69  mn has REAL affi
20390 6e 69 74 79 2c 20 69 74 20 6d 61 79 20 63 75 72  nity, it may cur
203a0 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64  rently be stored
203b0 20 61 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20   as an.      ** 
203c0 69 6e 74 65 67 65 72 2e 20 55 73 65 20 4f 50 5f  integer. Use OP_
203d0 52 65 61 6c 41 66 66 69 6e 69 74 79 20 74 6f 20  RealAffinity to 
203e0 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20  make sure it is 
203f0 72 65 61 6c 6c 79 20 72 65 61 6c 2e 0a 20 20 20  really real..   
20400 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45     **.      ** E
20410 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 30  VIDENCE-OF: R-60
20420 39 38 35 2d 35 37 36 36 32 20 53 51 4c 69 74 65  985-57662 SQLite
20430 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74 68   will convert th
20440 65 20 76 61 6c 75 65 20 62 61 63 6b 20 74 6f 0a  e value back to.
20450 20 20 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e        ** floatin
20460 67 20 70 6f 69 6e 74 20 77 68 65 6e 20 65 78 74  g point when ext
20470 72 61 63 74 69 6e 67 20 69 74 20 66 72 6f 6d 20  racting it from 
20480 74 68 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f 0a  the record.  */.
20490 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
204a0 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20  >iColumn>=0 .   
204b0 20 20 20 20 26 26 20 70 54 61 62 2d 3e 61 43 6f      && pTab->aCo
204c0 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  l[pExpr->iColumn
204d0 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ].affinity==SQLI
204e0 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20 20  TE_AFF_REAL.    
204f0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c    ){.        sql
20500 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
20510 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74  , OP_RealAffinit
20520 79 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  y, target);.    
20530 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
20540 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
20550 20 20 20 63 61 73 65 20 54 4b 5f 56 45 43 54 4f     case TK_VECTO
20560 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
20570 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
20580 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69  e, "row value mi
20590 73 75 73 65 64 22 29 3b 0a 20 20 20 20 20 20 62  sused");.      b
205a0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
205b0 20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20   /*.    ** Form 
205c0 41 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45  A:.    **   CASE
205d0 20 78 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20   x WHEN e1 THEN 
205e0 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20  r1 WHEN e2 THEN 
205f0 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54  r2 ... WHEN eN T
20600 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
20610 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
20620 46 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20  Form B:.    **  
20630 20 43 41 53 45 20 57 48 45 4e 20 65 31 20 54 48   CASE WHEN e1 TH
20640 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48  EN r1 WHEN e2 TH
20650 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65  EN r2 ... WHEN e
20660 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
20670 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
20680 2a 2a 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e  ** Form A is can
20690 20 62 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20   be transformed 
206a0 69 6e 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c  into the equival
206b0 65 6e 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f  ent form B as fo
206c0 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20  llows:.    **   
206d0 43 41 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54  CASE WHEN x=e1 T
206e0 48 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32  HEN r1 WHEN x=e2
206f0 20 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20   THEN r2 ....   
20700 20 2a 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20   **        WHEN 
20710 78 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53  x=eN THEN rN ELS
20720 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20  E y END.    **. 
20730 20 20 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65     ** X (if it e
20740 78 69 73 74 73 29 20 69 73 20 69 6e 20 70 45 78  xists) is in pEx
20750 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a  pr->pLeft..    *
20760 2a 20 59 20 69 73 20 69 6e 20 74 68 65 20 6c 61  * Y is in the la
20770 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45  st element of pE
20780 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20  xpr->x.pList if 
20790 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
207a0 6e 45 78 70 72 20 69 73 0a 20 20 20 20 2a 2a 20  nExpr is.    ** 
207b0 6f 64 64 2e 20 20 54 68 65 20 59 20 69 73 20 61  odd.  The Y is a
207c0 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49  lso optional.  I
207d0 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
207e0 65 6c 65 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c  elements in x.pL
207f0 69 73 74 0a 20 20 20 20 2a 2a 20 69 73 20 65 76  ist.    ** is ev
20800 65 6e 2c 20 74 68 65 6e 20 59 20 69 73 20 6f 6d  en, then Y is om
20810 69 74 74 65 64 20 61 6e 64 20 74 68 65 20 22 6f  itted and the "o
20820 74 68 65 72 77 69 73 65 22 20 72 65 73 75 6c 74  therwise" result
20830 20 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a   is NULL..    **
20840 20 45 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d   Ei is in pExpr-
20850 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61  >pList->a[i*2] a
20860 6e 64 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e  nd Ri is pExpr->
20870 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e  pList->a[i*2+1].
20880 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
20890 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
208a0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
208b0 68 65 20 52 69 20 66 6f 72 20 74 68 65 20 66 69  he Ri for the fi
208c0 72 73 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c  rst matching Ei,
208d0 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68  .    ** or if th
208e0 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69  ere is no matchi
208f0 6e 67 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20  ng Ei, the ELSE 
20900 74 65 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68  term Y, or if th
20910 65 72 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f  ere is.    ** no
20920 20 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c   ELSE term, NULL
20930 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
20940 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70  ault: assert( op
20950 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20  ==TK_CASE ); {. 
20960 20 20 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65       int endLabe
20970 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
20980 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c         /* GOTO l
20990 61 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20  abel for end of 
209a0 43 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20  CASE stmt */.   
209b0 20 20 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b     int nextCase;
209c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209d0 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62       /* GOTO lab
209e0 65 6c 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e  el for next WHEN
209f0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
20a00 20 69 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20   int nExpr;     
20a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a20 20 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20     /* 2x number 
20a30 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f  of WHEN terms */
20a40 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
20a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a60 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
20a70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
20a80 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
20a90 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
20aa0 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57      /* List of W
20ab0 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
20ac0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
20ad0 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c  st_item *aListel
20ae0 65 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66  em;  /* Array of
20af0 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
20b00 20 20 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70       Expr opComp
20b10 61 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  are;            
20b20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d         /* The X=
20b30 3d 45 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  =Ei expression *
20b40 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  /.      Expr *pX
20b50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20b60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
20b70 20 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f   X expression */
20b80 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65  .      Expr *pTe
20b90 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
20ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45           /* X==E
20bb0 69 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75  i (form A) or ju
20bc0 73 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a  st Ei (form B) *
20bd0 2f 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59  /.      VVA_ONLY
20be0 28 20 69 6e 74 20 69 43 61 63 68 65 4c 65 76 65  ( int iCacheLeve
20bf0 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  l = pParse->iCac
20c00 68 65 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20  heLevel; )..    
20c10 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
20c20 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
20c30 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
20c40 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  && pExpr->x.pLis
20c50 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
20c60 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  t(pExpr->x.pList
20c70 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20  ->nExpr > 0);.  
20c80 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78      pEList = pEx
20c90 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
20ca0 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70     aListelem = p
20cb0 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  EList->a;.      
20cc0 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e  nExpr = pEList->
20cd0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64  nExpr;.      end
20ce0 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56  Label = sqlite3V
20cf0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
20d00 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 20 3d  .      if( (pX =
20d10 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d   pExpr->pLeft)!=
20d20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 6d  0 ){.        tem
20d30 70 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20  pX = *pX;.      
20d40 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
20d50 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
20d60 0a 20 20 20 20 20 20 20 20 65 78 70 72 54 6f 52  .        exprToR
20d70 65 67 69 73 74 65 72 28 26 74 65 6d 70 58 2c 20  egister(&tempX, 
20d80 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70  exprCodeVector(p
20d90 50 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26  Parse, &tempX, &
20da0 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20 20 20  regFree1));.    
20db0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
20dc0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
20dd0 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 70 43       memset(&opC
20de0 6f 6d 70 61 72 65 2c 20 30 2c 20 73 69 7a 65 6f  ompare, 0, sizeo
20df0 66 28 6f 70 43 6f 6d 70 61 72 65 29 29 3b 0a 20  f(opCompare));. 
20e00 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65         opCompare
20e10 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20  .op = TK_EQ;.   
20e20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70       opCompare.p
20e30 4c 65 66 74 20 3d 20 26 74 65 6d 70 58 3b 0a 20  Left = &tempX;. 
20e40 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 26         pTest = &
20e50 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20  opCompare;.     
20e60 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 62 33 35     /* Ticket b35
20e70 31 64 39 35 66 39 63 64 35 65 66 31 37 65 39 64  1d95f9cd5ef17e9d
20e80 39 64 62 61 65 31 38 66 35 63 61 38 36 31 31 31  9dbae18f5ca86111
20e90 39 30 30 30 31 3a 0a 20 20 20 20 20 20 20 20 2a  90001:.        *
20ea0 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 72  * The value in r
20eb0 65 67 46 72 65 65 31 20 6d 69 67 68 74 20 67 65  egFree1 might ge
20ec0 74 20 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20  t SCopy-ed into 
20ed0 74 68 65 20 66 69 6c 65 20 72 65 73 75 6c 74 2e  the file result.
20ee0 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d  .        ** So m
20ef0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
20f00 65 20 72 65 67 46 72 65 65 31 20 72 65 67 69 73  e regFree1 regis
20f10 74 65 72 20 69 73 20 6e 6f 74 20 72 65 75 73 65  ter is not reuse
20f20 64 20 66 6f 72 20 6f 74 68 65 72 0a 20 20 20 20  d for other.    
20f30 20 20 20 20 2a 2a 20 70 75 72 70 6f 73 65 73 20      ** purposes 
20f40 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 76 65  and possibly ove
20f50 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20  rwritten.  */.  
20f60 20 20 20 20 20 20 72 65 67 46 72 65 65 31 20 3d        regFree1 =
20f70 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
20f80 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
20f90 70 72 2d 31 3b 20 69 3d 69 2b 32 29 7b 0a 20 20  pr-1; i=i+2){.  
20fa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20fb0 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
20fc0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
20fd0 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pX ){.          
20fe0 61 73 73 65 72 74 28 20 70 54 65 73 74 21 3d 30  assert( pTest!=0
20ff0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70   );.          op
21000 43 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d  Compare.pRight =
21010 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45   aListelem[i].pE
21020 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  xpr;.        }el
21030 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54  se{.          pT
21040 65 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b  est = aListelem[
21050 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
21060 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74    }.        next
21070 43 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Case = sqlite3Vd
21080 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
21090 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
210a0 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pTest->op==TK_
210b0 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
210c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
210d0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65  alse(pParse, pTe
210e0 73 74 2c 20 6e 65 78 74 43 61 73 65 2c 20 53 51  st, nextCase, SQ
210f0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
21100 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
21110 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b  se( aListelem[i+
21120 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  1].pExpr->op==TK
21130 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
21140 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
21150 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74  de(pParse, aList
21160 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c  elem[i+1].pExpr,
21170 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
21180 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
21190 6f 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a  o(v, endLabel);.
211a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
211b0 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
211c0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
211d0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
211e0 61 62 65 6c 28 76 2c 20 6e 65 78 74 43 61 73 65  abel(v, nextCase
211f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
21200 20 69 66 28 20 28 6e 45 78 70 72 26 31 29 21 3d   if( (nExpr&1)!=
21210 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
21220 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
21230 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
21240 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
21250 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  de(pParse, pELis
21260 74 2d 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e 70 45  t->a[nExpr-1].pE
21270 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
21280 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
21290 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
212a0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
212b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
212c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
212d0 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
212e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
212f0 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
21300 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  ocFailed || pPar
21310 73 65 2d 3e 6e 45 72 72 3e 30 20 0a 20 20 20 20  se->nErr>0 .    
21320 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65         || pParse
21330 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 69  ->iCacheLevel==i
21340 43 61 63 68 65 4c 65 76 65 6c 20 29 3b 0a 20 20  CacheLevel );.  
21350 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
21360 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
21370 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  ndLabel);.      
21380 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
21390 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
213a0 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63 61 73  _TRIGGER.    cas
213b0 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20  e TK_RAISE: {.  
213c0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
213d0 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
213e0 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20 20  Rollback .      
213f0 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61       || pExpr->a
21400 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72  ffinity==OE_Abor
21410 74 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  t.           || 
21420 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
21430 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20 20 20  =OE_Fail.       
21440 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66      || pExpr->af
21450 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72  finity==OE_Ignor
21460 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  e.      );.     
21470 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 70 54   if( !pParse->pT
21480 72 69 67 67 65 72 54 61 62 20 29 7b 0a 20 20 20  riggerTab ){.   
21490 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
214a0 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
214b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214c0 20 20 20 20 22 52 41 49 53 45 28 29 20 6d 61 79      "RAISE() may
214d0 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69   only be used wi
214e0 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70  thin a trigger-p
214f0 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20  rogram");.      
21500 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
21510 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
21520 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
21530 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20  E_Abort ){.     
21540 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f     sqlite3MayAbo
21550 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  rt(pParse);.    
21560 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
21570 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
21580 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
21590 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
215a0 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  if( pExpr->affin
215b0 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29  ity==OE_Ignore )
215c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
215d0 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20  3VdbeAddOp4(.   
215e0 20 20 20 20 20 20 20 20 20 76 2c 20 4f 50 5f 48           v, OP_H
215f0 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  alt, SQLITE_OK, 
21600 4f 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20 70 45  OE_Ignore, 0, pE
21610 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29  xpr->u.zToken,0)
21620 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
21630 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
21640 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21650 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74  sqlite3HaltConst
21660 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 53 51  raint(pParse, SQ
21670 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
21680 54 52 49 47 47 45 52 2c 0a 20 20 20 20 20 20 20  TRIGGER,.       
21690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216a0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66         pExpr->af
216b0 66 69 6e 69 74 79 2c 20 70 45 78 70 72 2d 3e 75  finity, pExpr->u
216c0 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 30 29 3b 0a  .zToken, 0, 0);.
216d0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62        }..      b
216e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
216f0 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  if.  }.  sqlite3
21700 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
21710 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
21720 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
21730 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
21740 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 72  , regFree2);.  r
21750 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a  eturn inReg;.}..
21760 2f 2a 0a 2a 2a 20 46 61 63 74 6f 72 20 6f 75 74  /*.** Factor out
21770 20 74 68 65 20 63 6f 64 65 20 6f 66 20 74 68 65   the code of the
21780 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
21790 6e 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74  n to initializat
217a0 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69  ion time..*/.voi
217b0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
217c0 65 41 74 49 6e 69 74 28 0a 20 20 50 61 72 73 65  eAtInit(.  Parse
217d0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
217e0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
217f0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
21800 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78  ,      /* The ex
21810 70 72 65 73 73 69 6f 6e 20 74 6f 20 63 6f 64 65  pression to code
21820 20 77 68 65 6e 20 74 68 65 20 56 44 42 45 20 69   when the VDBE i
21830 6e 69 74 69 61 6c 69 7a 65 73 20 2a 2f 0a 20 20  nitializes */.  
21840 69 6e 74 20 72 65 67 44 65 73 74 2c 20 20 20 20  int regDest,    
21850 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 76    /* Store the v
21860 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65 67  alue in this reg
21870 69 73 74 65 72 20 2a 2f 0a 20 20 75 38 20 72 65  ister */.  u8 re
21880 75 73 61 62 6c 65 20 20 20 20 20 20 20 2f 2a 20  usable       /* 
21890 54 72 75 65 20 69 66 20 74 68 69 73 20 65 78 70  True if this exp
218a0 72 65 73 73 69 6f 6e 20 69 73 20 72 65 75 73 61  ression is reusa
218b0 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ble */.){.  Expr
218c0 4c 69 73 74 20 2a 70 3b 0a 20 20 61 73 73 65 72  List *p;.  asser
218d0 74 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b  t( ConstFactorOk
218e0 28 70 50 61 72 73 65 29 20 29 3b 0a 20 20 70 20  (pParse) );.  p 
218f0 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74  = pParse->pConst
21900 45 78 70 72 3b 0a 20 20 70 45 78 70 72 20 3d 20  Expr;.  pExpr = 
21910 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
21920 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72  Parse->db, pExpr
21930 2c 20 30 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69  , 0);.  p = sqli
21940 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
21950 64 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 78  d(pParse, p, pEx
21960 70 72 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  pr);.  if( p ){.
21970 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
21980 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
21990 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70   = &p->a[p->nExp
219a0 72 2d 31 5d 3b 0a 20 20 20 20 20 70 49 74 65 6d  r-1];.     pItem
219b0 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65  ->u.iConstExprRe
219c0 67 20 3d 20 72 65 67 44 65 73 74 3b 0a 20 20 20  g = regDest;.   
219d0 20 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c    pItem->reusabl
219e0 65 20 3d 20 72 65 75 73 61 62 6c 65 3b 0a 20 20  e = reusable;.  
219f0 7d 0a 20 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e  }.  pParse->pCon
21a00 73 74 45 78 70 72 20 3d 20 70 3b 0a 7d 0a 0a 2f  stExpr = p;.}../
21a10 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
21a20 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  de to evaluate a
21a30 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  n expression and
21a40 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
21a50 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67  ts.** into a reg
21a60 69 73 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74  ister.  Return t
21a70 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  he register numb
21a80 65 72 20 77 68 65 72 65 20 74 68 65 20 72 65 73  er where the res
21a90 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72  ults.** are stor
21aa0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
21ab0 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20 74   register is a t
21ac0 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
21ad0 72 20 74 68 61 74 20 63 61 6e 20 62 65 20 64 65  r that can be de
21ae0 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68  allocated,.** th
21af0 65 6e 20 77 72 69 74 65 20 69 74 73 20 6e 75 6d  en write its num
21b00 62 65 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20  ber into *pReg. 
21b10 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 72   If the result r
21b20 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a  egister is not.*
21b30 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 2c 20 74  * a temporary, t
21b40 68 65 6e 20 73 65 74 20 2a 70 52 65 67 20 74 6f  hen set *pReg to
21b50 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   zero..**.** If 
21b60 70 45 78 70 72 20 69 73 20 61 20 63 6f 6e 73 74  pExpr is a const
21b70 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ant, then this r
21b80 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 67 65 6e  outine might gen
21b90 65 72 61 74 65 20 74 68 69 73 0a 2a 2a 20 63 6f  erate this.** co
21ba0 64 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 72  de to fill the r
21bb0 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 69  egister in the i
21bc0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73 65  nitialization se
21bd0 63 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  ction of the.** 
21be0 56 44 42 45 20 70 72 6f 67 72 61 6d 2c 20 69 6e  VDBE program, in
21bf0 20 6f 72 64 65 72 20 74 6f 20 66 61 63 74 6f 72   order to factor
21c00 20 69 74 20 6f 75 74 20 6f 66 20 74 68 65 20 65   it out of the e
21c10 76 61 6c 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a  valuation loop..
21c20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
21c30 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72 73 65  prCodeTemp(Parse
21c40 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
21c50 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 65 67  pExpr, int *pReg
21c60 29 7b 0a 20 20 69 6e 74 20 72 32 3b 0a 20 20 70  ){.  int r2;.  p
21c70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
21c80 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
21c90 78 70 72 29 3b 0a 20 20 69 66 28 20 43 6f 6e 73  xpr);.  if( Cons
21ca0 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65  tFactorOk(pParse
21cb0 29 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 6f  ).   && pExpr->o
21cc0 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 0a 20  p!=TK_REGISTER. 
21cd0 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
21ce0 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
21cf0 6e 28 70 45 78 70 72 29 0a 20 20 29 7b 0a 20 20  n(pExpr).  ){.  
21d00 20 20 45 78 70 72 4c 69 73 74 20 2a 70 20 3d 20    ExprList *p = 
21d10 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78  pParse->pConstEx
21d20 70 72 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  pr;.    int i;. 
21d30 20 20 20 2a 70 52 65 67 20 20 3d 20 30 3b 0a 20     *pReg  = 0;. 
21d40 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
21d50 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
21d60 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
21d70 20 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70       for(pItem=p
21d80 2d 3e 61 2c 20 69 3d 70 2d 3e 6e 45 78 70 72 3b  ->a, i=p->nExpr;
21d90 20 69 3e 30 3b 20 70 49 74 65 6d 2b 2b 2c 20 69   i>0; pItem++, i
21da0 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  --){.        if(
21db0 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65   pItem->reusable
21dc0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
21dd0 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45  ompare(pItem->pE
21de0 78 70 72 2c 70 45 78 70 72 2c 2d 31 29 3d 3d 30  xpr,pExpr,-1)==0
21df0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
21e00 74 75 72 6e 20 70 49 74 65 6d 2d 3e 75 2e 69 43  turn pItem->u.iC
21e10 6f 6e 73 74 45 78 70 72 52 65 67 3b 0a 20 20 20  onstExprReg;.   
21e20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
21e30 20 20 20 7d 0a 20 20 20 20 72 32 20 3d 20 2b 2b     }.    r2 = ++
21e40 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
21e50 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
21e60 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20  eAtInit(pParse, 
21e70 70 45 78 70 72 2c 20 72 32 2c 20 31 29 3b 0a 20  pExpr, r2, 1);. 
21e80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
21e90 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
21ea0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
21eb0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
21ec0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
21ed0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31  Parse, pExpr, r1
21ee0 29 3b 0a 20 20 20 20 69 66 28 20 72 32 3d 3d 72  );.    if( r2==r
21ef0 31 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 67  1 ){.      *pReg
21f00 20 3d 20 72 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = r1;.    }else
21f10 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
21f20 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
21f30 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
21f40 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20   *pReg = 0;.    
21f50 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
21f60 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  2;.}../*.** Gene
21f70 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
21f80 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70  ill evaluate exp
21f90 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e  ression pExpr an
21fa0 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72  d store the.** r
21fb0 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74  esults in regist
21fc0 65 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20  er target.  The 
21fd0 72 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72  results are guar
21fe0 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72  anteed to appear
21ff0 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20  .** in register 
22000 74 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20  target..*/.void 
22010 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
22020 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
22030 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
22040 74 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69  target){.  int i
22050 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  nReg;..  assert(
22060 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72   target>0 && tar
22070 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65  get<=pParse->nMe
22080 6d 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72  m );.  if( pExpr
22090 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   && pExpr->op==T
220a0 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20  K_REGISTER ){.  
220b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
220c0 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op2(pParse->pVdb
220d0 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70  e, OP_Copy, pExp
220e0 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65  r->iTable, targe
220f0 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
22100 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
22110 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
22120 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
22130 72 67 65 74 29 3b 0a 20 20 20 20 61 73 73 65 72  rget);.    asser
22140 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  t( pParse->pVdbe
22150 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  !=0 || pParse->d
22160 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
22170 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67  );.    if( inReg
22180 21 3d 74 61 72 67 65 74 20 26 26 20 70 50 61 72  !=target && pPar
22190 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20  se->pVdbe ){.   
221a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
221b0 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp2(pParse->pVd
221c0 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e  be, OP_SCopy, in
221d0 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  Reg, target);.  
221e0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
221f0 20 4d 61 6b 65 20 61 20 74 72 61 6e 73 69 65 6e   Make a transien
22200 74 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73  t copy of expres
22210 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 74  sion pExpr and t
22220 68 65 6e 20 63 6f 64 65 20 69 74 20 75 73 69 6e  hen code it usin
22230 67 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72  g.** sqlite3Expr
22240 43 6f 64 65 28 29 2e 20 20 54 68 69 73 20 72 6f  Code().  This ro
22250 75 74 69 6e 65 20 77 6f 72 6b 73 20 6a 75 73 74  utine works just
22260 20 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70   like sqlite3Exp
22270 72 43 6f 64 65 28 29 0a 2a 2a 20 65 78 63 65 70  rCode().** excep
22280 74 20 74 68 61 74 20 74 68 65 20 69 6e 70 75 74  t that the input
22290 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 67   expression is g
222a0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
222b0 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f  unchanged..*/.vo
222c0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
222d0 64 65 43 6f 70 79 28 50 61 72 73 65 20 2a 70 50  deCopy(Parse *pP
222e0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
222f0 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
22300 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
22310 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 45  pParse->db;.  pE
22320 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
22330 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20  rDup(db, pExpr, 
22340 30 29 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  0);.  if( !db->m
22350 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 73 71  allocFailed ) sq
22360 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
22370 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
22380 67 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  get);.  sqlite3E
22390 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
223a0 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  xpr);.}../*.** G
223b0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
223c0 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20  t will evaluate 
223d0 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
223e0 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a   and store the.*
223f0 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67  * results in reg
22400 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54  ister target.  T
22410 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67  he results are g
22420 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70  uaranteed to app
22430 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  ear.** in regist
22440 65 72 20 74 61 72 67 65 74 2e 20 20 49 66 20 74  er target.  If t
22450 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
22460 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20   constant, then 
22470 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
22480 6d 69 67 68 74 20 63 68 6f 6f 73 65 20 74 6f 20  might choose to 
22490 63 6f 64 65 20 74 68 65 20 65 78 70 72 65 73 73  code the express
224a0 69 6f 6e 20 61 74 20 69 6e 69 74 69 61 6c 69 7a  ion at initializ
224b0 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76  ation time..*/.v
224c0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
224d0 6f 64 65 46 61 63 74 6f 72 61 62 6c 65 28 50 61  odeFactorable(Pa
224e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
224f0 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
22500 72 67 65 74 29 7b 0a 20 20 69 66 28 20 70 50 61  rget){.  if( pPa
22510 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74  rse->okConstFact
22520 6f 72 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  or && sqlite3Exp
22530 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70  rIsConstant(pExp
22540 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  r) ){.    sqlite
22550 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28  3ExprCodeAtInit(
22560 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
22570 61 72 67 65 74 2c 20 30 29 3b 0a 20 20 7d 65 6c  arget, 0);.  }el
22580 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
22590 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
225a0 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
225b0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
225c0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
225d0 65 76 61 6c 75 61 74 65 73 20 74 68 65 20 67 69  evaluates the gi
225e0 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61  ven expression a
225f0 6e 64 20 70 75 74 73 20 74 68 65 20 72 65 73 75  nd puts the resu
22600 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  lt.** in registe
22610 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20  r target..**.** 
22620 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79  Also make a copy
22630 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
22640 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20  on results into 
22650 61 6e 6f 74 68 65 72 20 22 63 61 63 68 65 22 20  another "cache" 
22660 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20  register.** and 
22670 6d 6f 64 69 66 79 20 74 68 65 20 65 78 70 72 65  modify the expre
22680 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68  ssion so that th
22690 65 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69  e next time it i
226a0 73 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20  s evaluated,.** 
226b0 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20  the result is a 
226c0 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 63 68  copy of the cach
226d0 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a  e register..**.*
226e0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
226f0 73 20 75 73 65 64 20 66 6f 72 20 65 78 70 72 65  s used for expre
22700 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ssions that are 
22710 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a  used multiple .*
22720 2a 20 74 69 6d 65 73 2e 20 20 54 68 65 79 20 61  * times.  They a
22730 72 65 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63  re evaluated onc
22740 65 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74  e and the result
22750 73 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  s of the express
22760 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73 65  ion.** are reuse
22770 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
22780 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63  e3ExprCodeAndCac
22790 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  he(Parse *pParse
227a0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
227b0 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64  nt target){.  Vd
227c0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
227d0 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65  pVdbe;.  int iMe
227e0 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61  m;..  assert( ta
227f0 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  rget>0 );.  asse
22800 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
22810 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20  K_REGISTER );.  
22820 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
22830 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
22840 61 72 67 65 74 29 3b 0a 20 20 69 4d 65 6d 20 3d  arget);.  iMem =
22850 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
22860 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
22870 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
22880 20 74 61 72 67 65 74 2c 20 69 4d 65 6d 29 3b 0a   target, iMem);.
22890 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72    exprToRegister
228a0 28 70 45 78 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d  (pExpr, iMem);.}
228b0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
228c0 20 63 6f 64 65 20 74 68 61 74 20 70 75 73 68 65   code that pushe
228d0 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65  s the value of e
228e0 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20  very element of 
228f0 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70  the given.** exp
22900 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74  ression list int
22910 6f 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  o a sequence of 
22920 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e  registers beginn
22930 69 6e 67 20 61 74 20 74 61 72 67 65 74 2e 0a 2a  ing at target..*
22940 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
22950 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
22960 74 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2a  ts evaluated..**
22970 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45  .** The SQLITE_E
22980 43 45 4c 5f 44 55 50 20 66 6c 61 67 20 70 72 65  CEL_DUP flag pre
22990 76 65 6e 74 73 20 74 68 65 20 61 72 67 75 6d 65  vents the argume
229a0 6e 74 73 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a  nts from being.*
229b0 2a 20 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 4f  * filled using O
229c0 50 5f 53 43 6f 70 79 2e 20 20 4f 50 5f 43 6f 70  P_SCopy.  OP_Cop
229d0 79 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 69  y must be used i
229e0 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  nstead..**.** Th
229f0 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41  e SQLITE_ECEL_FA
22a00 43 54 4f 52 20 61 72 67 75 6d 65 6e 74 20 61 6c  CTOR argument al
22a10 6c 6f 77 73 20 63 6f 6e 73 74 61 6e 74 20 61 72  lows constant ar
22a20 67 75 6d 65 6e 74 73 20 74 6f 20 62 65 0a 2a 2a  guments to be.**
22a30 20 66 61 63 74 6f 72 65 64 20 6f 75 74 20 69 6e   factored out in
22a40 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  to initializatio
22a50 6e 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  n code..**.** Th
22a60 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45  e SQLITE_ECEL_RE
22a70 46 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61  F flag means tha
22a80 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  t expressions in
22a90 20 74 68 65 20 6c 69 73 74 20 77 69 74 68 0a 2a   the list with.*
22aa0 2a 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 75  * ExprList.a[].u
22ab0 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30  .x.iOrderByCol>0
22ac0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
22ad0 65 6e 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  en evaluated and
22ae0 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 72 65   stored.** in re
22af0 67 69 73 74 65 72 73 20 61 74 20 73 72 63 52 65  gisters at srcRe
22b00 67 2c 20 61 6e 64 20 73 6f 20 74 68 65 20 76 61  g, and so the va
22b10 6c 75 65 20 63 61 6e 20 62 65 20 63 6f 70 69 65  lue can be copie
22b20 64 20 66 72 6f 6d 20 74 68 65 72 65 2e 0a 2a 2f  d from there..*/
22b30 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
22b40 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20  CodeExprList(.  
22b50 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
22b60 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
22b70 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
22b80 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a  ist *pList,   /*
22b90 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
22ba0 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64  list to be coded
22bb0 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74   */.  int target
22bc0 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72  ,        /* Wher
22bd0 65 20 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c  e to write resul
22be0 74 73 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 52  ts */.  int srcR
22bf0 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 6f  eg,        /* So
22c00 75 72 63 65 20 72 65 67 69 73 74 65 72 73 20 69  urce registers i
22c10 66 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45  f SQLITE_ECEL_RE
22c20 46 20 2a 2f 0a 20 20 75 38 20 66 6c 61 67 73 20  F */.  u8 flags 
22c30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
22c40 49 54 45 5f 45 43 45 4c 5f 2a 20 66 6c 61 67 73  ITE_ECEL_* flags
22c50 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
22c60 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
22c70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Item;.  int i, j
22c80 2c 20 6e 3b 0a 20 20 75 38 20 63 6f 70 79 4f 70  , n;.  u8 copyOp
22c90 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
22ca0 54 45 5f 45 43 45 4c 5f 44 55 50 29 20 3f 20 4f  TE_ECEL_DUP) ? O
22cb0 50 5f 43 6f 70 79 20 3a 20 4f 50 5f 53 43 6f 70  P_Copy : OP_SCop
22cc0 79 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  y;.  Vdbe *v = p
22cd0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
22ce0 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
22cf0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61   );.  assert( ta
22d00 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  rget>0 );.  asse
22d10 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62  rt( pParse->pVdb
22d20 65 21 3d 30 20 29 3b 20 20 2f 2a 20 4e 65 76 65  e!=0 );  /* Neve
22d30 72 20 67 65 74 73 20 74 68 69 73 20 66 61 72 20  r gets this far 
22d40 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 6e  otherwise */.  n
22d50 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
22d60 0a 20 20 69 66 28 20 21 43 6f 6e 73 74 46 61 63  .  if( !ConstFac
22d70 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29 20  torOk(pParse) ) 
22d80 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
22d90 5f 45 43 45 4c 5f 46 41 43 54 4f 52 3b 0a 20 20  _ECEL_FACTOR;.  
22da0 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
22db0 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  >a, i=0; i<n; i+
22dc0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
22dd0 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
22de0 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
22df0 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 53 51   if( (flags & SQ
22e00 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 29 21 3d  LITE_ECEL_REF)!=
22e10 30 20 26 26 20 28 6a 20 3d 20 70 4c 69 73 74 2d  0 && (j = pList-
22e20 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  >a[i].u.x.iOrder
22e30 42 79 43 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20  ByCol)>0 ){.    
22e40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22e50 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20 6a  Op2(v, copyOp, j
22e60 2b 73 72 63 52 65 67 2d 31 2c 20 74 61 72 67 65  +srcReg-1, targe
22e70 74 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  t+i);.    }else 
22e80 69 66 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c  if( (flags & SQL
22e90 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29  ITE_ECEL_FACTOR)
22ea0 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 45 78  !=0 && sqlite3Ex
22eb0 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78  prIsConstant(pEx
22ec0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  pr) ){.      sql
22ed0 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e  ite3ExprCodeAtIn
22ee0 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  it(pParse, pExpr
22ef0 2c 20 74 61 72 67 65 74 2b 69 2c 20 30 29 3b 0a  , target+i, 0);.
22f00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22f10 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 73 71 6c   int inReg = sql
22f20 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
22f30 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
22f40 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20  , target+i);.   
22f50 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61     if( inReg!=ta
22f60 72 67 65 74 2b 69 20 29 7b 0a 20 20 20 20 20 20  rget+i ){.      
22f70 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
22f80 20 20 20 20 20 20 20 69 66 28 20 63 6f 70 79 4f         if( copyO
22f90 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20  p==OP_Copy.     
22fa0 20 20 20 20 26 26 20 28 70 4f 70 3d 73 71 6c 69      && (pOp=sqli
22fb0 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
22fc0 2d 31 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50  -1))->opcode==OP
22fd0 5f 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26  _Copy.         &
22fe0 26 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70  & pOp->p1+pOp->p
22ff0 33 2b 31 3d 3d 69 6e 52 65 67 0a 20 20 20 20 20  3+1==inReg.     
23000 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70      && pOp->p2+p
23010 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61 72 67 65 74  Op->p3+1==target
23020 2b 69 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  +i.        ){.  
23030 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 2b          pOp->p3+
23040 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  +;.        }else
23050 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
23060 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
23070 20 63 6f 70 79 4f 70 2c 20 69 6e 52 65 67 2c 20   copyOp, inReg, 
23080 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20  target+i);.     
23090 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
230a0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
230b0 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  n;.}../*.** Gene
230c0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
230d0 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72  BETWEEN operator
230e0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20 42 45 54  ..**.**    x BET
230f0 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a  WEEN y AND z.**.
23100 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73 20  ** The above is 
23110 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 2a  equivalent to .*
23120 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44  *.**    x>=y AND
23130 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65   x<=z.**.** Code
23140 20 69 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b   it as such, tak
23150 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74  ing care to do t
23160 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70  he common subexp
23170 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c 69 6d 69  ression.** elimi
23180 6e 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2a 0a  nation of x..**.
23190 2a 2a 20 54 68 65 20 78 4a 75 6d 70 49 66 20 70  ** The xJumpIf p
231a0 61 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69  arameter determi
231b0 6e 65 73 20 64 65 74 61 69 6c 73 3a 0a 2a 2a 0a  nes details:.**.
231c0 2a 2a 20 20 20 20 4e 55 4c 4c 3a 20 20 20 20 20  **    NULL:     
231d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 74                St
231e0 6f 72 65 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20  ore the boolean 
231f0 72 65 73 75 6c 74 20 69 6e 20 72 65 67 5b 64 65  result in reg[de
23200 73 74 5d 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65  st].**    sqlite
23210 33 45 78 70 72 49 66 54 72 75 65 3a 20 20 20 20  3ExprIfTrue:    
23220 20 20 4a 75 6d 70 20 74 6f 20 64 65 73 74 20 69    Jump to dest i
23230 66 20 74 72 75 65 0a 2a 2a 20 20 20 20 73 71 6c  f true.**    sql
23240 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 3a  ite3ExprIfFalse:
23250 20 20 20 20 20 4a 75 6d 70 20 74 6f 20 64 65 73       Jump to des
23260 74 20 69 66 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a  t if false.**.**
23270 20 54 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   The jumpIfNull 
23280 70 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e  parameter is ign
23290 6f 72 65 64 20 69 66 20 78 4a 75 6d 70 49 66 20  ored if xJumpIf 
232a0 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  is NULL..*/.stat
232b0 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 64 65  ic void exprCode
232c0 42 65 74 77 65 65 6e 28 0a 20 20 50 61 72 73 65  Between(.  Parse
232d0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
232e0 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
232f0 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
23300 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
23310 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  Expr,      /* Th
23320 65 20 42 45 54 57 45 45 4e 20 65 78 70 72 65 73  e BETWEEN expres
23330 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65  sion */.  int de
23340 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  st,         /* J
23350 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ump destination 
23360 6f 72 20 73 74 6f 72 61 67 65 20 6c 6f 63 61 74  or storage locat
23370 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ion */.  void (*
23380 78 4a 75 6d 70 29 28 50 61 72 73 65 2a 2c 45 78  xJump)(Parse*,Ex
23390 70 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 20 2f 2a  pr*,int,int), /*
233a0 20 41 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20   Action to take 
233b0 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e  */.  int jumpIfN
233c0 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20 74  ull    /* Take t
233d0 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42  he jump if the B
233e0 45 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20 2a  ETWEEN is NULL *
233f0 2f 0a 29 7b 0a 20 45 78 70 72 20 65 78 70 72 41  /.){. Expr exprA
23400 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 41  nd;     /* The A
23410 4e 44 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 20  ND operator in  
23420 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20 20 2a  x>=y AND x<=z  *
23430 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66  /.  Expr compLef
23440 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 20 78 3e  t;    /* The  x>
23450 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78  =y  term */.  Ex
23460 70 72 20 63 6f 6d 70 52 69 67 68 74 3b 20 20 20  pr compRight;   
23470 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20 74 65  /* The  x<=z  te
23480 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 65 78 70  rm */.  Expr exp
23490 72 58 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  rX;       /* The
234a0 20 20 78 20 20 73 75 62 65 78 70 72 65 73 73 69    x  subexpressi
234b0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46  on */.  int regF
234c0 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54 65 6d  ree1 = 0; /* Tem
234d0 70 6f 72 61 72 79 20 75 73 65 20 72 65 67 69 73  porary use regis
234e0 74 65 72 20 2a 2f 0a 0a 0a 20 20 6d 65 6d 73 65  ter */...  memse
234f0 74 28 26 63 6f 6d 70 4c 65 66 74 2c 20 30 2c 20  t(&compLeft, 0, 
23500 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20  sizeof(Expr));. 
23510 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 52 69 67   memset(&compRig
23520 68 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78  ht, 0, sizeof(Ex
23530 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  pr));.  memset(&
23540 65 78 70 72 41 6e 64 2c 20 30 2c 20 73 69 7a 65  exprAnd, 0, size
23550 6f 66 28 45 78 70 72 29 29 3b 0a 0a 20 20 61 73  of(Expr));..  as
23560 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
23570 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
23580 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
23590 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d   exprX = *pExpr-
235a0 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e  >pLeft;.  exprAn
235b0 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20  d.op = TK_AND;. 
235c0 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d   exprAnd.pLeft =
235d0 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 65 78   &compLeft;.  ex
235e0 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26  prAnd.pRight = &
235f0 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63 6f 6d  compRight;.  com
23600 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45  pLeft.op = TK_GE
23610 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65  ;.  compLeft.pLe
23620 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63  ft = &exprX;.  c
23630 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20 3d  ompLeft.pRight =
23640 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
23650 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 63  >a[0].pExpr;.  c
23660 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b  ompRight.op = TK
23670 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74  _LE;.  compRight
23680 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b  .pLeft = &exprX;
23690 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69  .  compRight.pRi
236a0 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ght = pExpr->x.p
236b0 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
236c0 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69 73 74  ;.  exprToRegist
236d0 65 72 28 26 65 78 70 72 58 2c 20 65 78 70 72 43  er(&exprX, exprC
236e0 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72 73 65  odeVector(pParse
236f0 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67 46 72  , &exprX, &regFr
23700 65 65 31 29 29 3b 0a 20 20 69 66 28 20 78 4a 75  ee1));.  if( xJu
23710 6d 70 20 29 7b 0a 20 20 20 20 78 4a 75 6d 70 28  mp ){.    xJump(
23720 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64  pParse, &exprAnd
23730 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
23740 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ll);.  }else{.  
23750 20 20 65 78 70 72 58 2e 66 6c 61 67 73 20 7c 3d    exprX.flags |=
23760 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20   EP_FromJoin;.  
23770 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
23780 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
23790 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 29 3b  &exprAnd, dest);
237a0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
237b0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
237c0 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
237d0 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 61 64 65  .  /* Ensure ade
237e0 71 75 61 74 65 20 74 65 73 74 20 63 6f 76 65 72  quate test cover
237f0 61 67 65 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  age */.  testcas
23800 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
23810 33 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20  3ExprIfTrue  && 
23820 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26  jumpIfNull==0 &&
23830 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
23840 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
23850 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
23860 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e  True  && jumpIfN
23870 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
23880 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1!=0 );.  testc
23890 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
238a0 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20 26  te3ExprIfTrue  &
238b0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20  & jumpIfNull!=0 
238c0 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  && regFree1==0 )
238d0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
238e0 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ump==sqlite3Expr
238f0 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49  IfTrue  && jumpI
23900 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
23910 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73  ree1!=0 );.  tes
23920 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
23930 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
23940 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
23950 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
23960 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
23970 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78  xJump==sqlite3Ex
23980 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d  prIfFalse && jum
23990 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
239a0 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74  gFree1!=0 );.  t
239b0 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
239c0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
239d0 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  se && jumpIfNull
239e0 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  !=0 && regFree1=
239f0 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
23a00 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
23a10 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a  ExprIfFalse && j
23a20 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
23a30 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20  regFree1!=0 );. 
23a40 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
23a50 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ==0 );.}../*.** 
23a60 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
23a70 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72  r a boolean expr
23a80 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74  ession such that
23a90 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a   a jump is made.
23aa0 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20  ** to the label 
23ab0 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78  "dest" if the ex
23ac0 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65  pression is true
23ad0 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a   but execution.*
23ae0 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61  * continues stra
23af0 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65  ight thru if the
23b00 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
23b10 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  alse..**.** If t
23b20 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76  he expression ev
23b30 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20  aluates to NULL 
23b40 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f  (neither true no
23b50 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a  r false), then.*
23b60 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20  * take the jump 
23b70 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c  if the jumpIfNul
23b80 6c 20 66 6c 61 67 20 69 73 20 53 51 4c 49 54 45  l flag is SQLITE
23b90 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a  _JUMPIFNULL..**.
23ba0 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70  ** This code dep
23bb0 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74  ends on the fact
23bc0 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f   that certain to
23bd0 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ken values (ex: 
23be0 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68  TK_EQ).** are th
23bf0 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65  e same as opcode
23c00 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f   values (ex: OP_
23c10 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  Eq) that impleme
23c20 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  nt the correspon
23c30 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  ding.** operatio
23c40 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d  n.  Special comm
23c50 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61  ents in vdbe.c a
23c60 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68  nd the mkopcodeh
23c70 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a  .awk script in.*
23c80 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65  * the make proce
23c90 73 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76  ss cause these v
23ca0 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20  alues to align. 
23cb0 20 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68   Assert()s in th
23cc0 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20  e code.** below 
23cd0 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
23ce0 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67  numbers are alig
23cf0 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  ned correctly..*
23d00 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
23d10 70 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a  prIfTrue(Parse *
23d20 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
23d30 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
23d40 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
23d50 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
23d60 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
23d70 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72   op = 0;.  int r
23d80 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69  egFree1 = 0;.  i
23d90 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  nt regFree2 = 0;
23da0 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a  .  int r1, r2;..
23db0 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66    assert( jumpIf
23dc0 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d  Null==SQLITE_JUM
23dd0 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49  PIFNULL || jumpI
23de0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  fNull==0 );.  if
23df0 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
23e00 20 20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20      return;  /* 
23e10 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42  Existence of VDB
23e20 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c  E checked by cal
23e30 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ler */.  if( NEV
23e40 45 52 28 70 45 78 70 72 3d 3d 30 29 20 29 20 72  ER(pExpr==0) ) r
23e50 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61  eturn;  /* No wa
23e60 79 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65  y this can happe
23e70 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45 78 70  n */.  op = pExp
23e80 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28  r->op;.  switch(
23e90 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
23ea0 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20  TK_AND: {.      
23eb0 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
23ec0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
23ed0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
23ee0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
23ef0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
23f00 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
23f10 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
23f20 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e  , d2,jumpIfNull^
23f30 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
23f40 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
23f50 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
23f60 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
23f70 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
23f80 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
23f90 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
23fa0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
23fb0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
23fc0 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a  veLabel(v, d2);.
23fd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
23fe0 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
23ff0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
24000 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
24010 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 74 65  K_OR: {.      te
24020 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
24030 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
24040 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
24050 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
24060 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
24070 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
24080 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
24090 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
240a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
240b0 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
240c0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
240d0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
240e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
240f0 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
24100 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
24110 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
24120 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  K_NOT: {.      t
24130 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
24140 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
24150 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
24160 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
24170 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
24180 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
24190 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
241a0 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20     case TK_IS:. 
241b0 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54     case TK_ISNOT
241c0 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
241d0 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ( op==TK_IS );. 
241e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
241f0 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20  p==TK_ISNOT );. 
24200 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54       op = (op==T
24210 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20  K_IS) ? TK_EQ : 
24220 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 6a 75 6d  TK_NE;.      jum
24230 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45  pIfNull = SQLITE
24240 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f  _NULLEQ;.      /
24250 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20  * Fall thru */. 
24260 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
24270 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
24280 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
24290 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
242a0 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
242b0 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
242c0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
242d0 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
242e0 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 20 67  Expr->pLeft) ) g
242f0 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78 70 72  oto default_expr
24300 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
24310 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
24320 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
24330 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
24340 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
24350 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
24360 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
24370 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
24380 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
24390 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
243a0 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ee2);.      code
243b0 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
243c0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
243d0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
243e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
243f0 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c     r1, r2, dest,
24400 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
24410 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54      assert(TK_LT
24420 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61  ==OP_Lt); testca
24430 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56  se(op==OP_Lt); V
24440 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
24450 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20  op==OP_Lt);.    
24460 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d    assert(TK_LE==
24470 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Le); testcase
24480 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62  (op==OP_Le); Vdb
24490 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
244a0 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20  ==OP_Le);.      
244b0 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50  assert(TK_GT==OP
244c0 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Gt); testcase(o
244d0 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43  p==OP_Gt); VdbeC
244e0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
244f0 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73  OP_Gt);.      as
24500 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47  sert(TK_GE==OP_G
24510 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
24520 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ge); VdbeCov
24530 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
24540 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Ge);.      asse
24550 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29  rt(TK_EQ==OP_Eq)
24560 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
24570 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56 64 62  P_Eq);.      Vdb
24580 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
24590 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70  p==OP_Eq && jump
245a0 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e  IfNull==SQLITE_N
245b0 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64  ULLEQ);.      Vd
245c0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
245d0 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d  op==OP_Eq && jum
245e0 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f  pIfNull!=SQLITE_
245f0 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 61  NULLEQ);.      a
24600 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f  ssert(TK_NE==OP_
24610 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ne); testcase(op
24620 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ne);.      
24630 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
24640 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a  , op==OP_Ne && j
24650 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
24660 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
24670 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
24680 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20  v, op==OP_Ne && 
24690 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49  jumpIfNull!=SQLI
246a0 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
246b0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
246c0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
246d0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
246e0 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
246f0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
24700 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
24710 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
24720 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73  NULL: {.      as
24730 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d  sert( TK_ISNULL=
24740 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20  =OP_IsNull );   
24750 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
24760 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
24770 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e   assert( TK_NOTN
24780 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20  ULL==OP_NotNull 
24790 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d  ); testcase( op=
247a0 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20  =TK_NOTNULL );. 
247b0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
247c0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
247d0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
247e0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
247f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
24800 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72  eAddOp2(v, op, r
24810 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  1, dest);.      
24820 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
24830 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29  , op==TK_ISNULL)
24840 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
24850 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
24860 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  _NOTNULL);.     
24870 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
24880 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
24890 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
248a0 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
248b0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
248c0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
248d0 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43  0 );.      exprC
248e0 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73  odeBetween(pPars
248f0 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
24900 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
24910 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  e, jumpIfNull);.
24920 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
24930 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
24940 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
24950 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
24960 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  {.      int dest
24970 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65  IfFalse = sqlite
24980 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
24990 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73  );.      int des
249a0 74 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49 66  tIfNull = jumpIf
249b0 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64 65  Null ? dest : de
249c0 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 20 20 20  stIfFalse;.     
249d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
249e0 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
249f0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64  , destIfFalse, d
24a00 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
24a10 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
24a20 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  o(v, dest);.    
24a30 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
24a40 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
24a50 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20  tIfFalse);.     
24a60 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
24a70 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
24a80 3a 20 7b 0a 20 20 20 20 64 65 66 61 75 6c 74 5f  : {.    default_
24a90 65 78 70 72 3a 0a 20 20 20 20 20 20 69 66 28 20  expr:.      if( 
24aa0 65 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 70  exprAlwaysTrue(p
24ab0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
24ac0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
24ad0 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  (v, dest);.     
24ae0 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72 41   }else if( exprA
24af0 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78 70 72  lwaysFalse(pExpr
24b00 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
24b10 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d  No-op */.      }
24b20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31  else{.        r1
24b30 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
24b40 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
24b50 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29  Expr, &regFree1)
24b60 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
24b70 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
24b80 50 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c 20  P_If, r1, dest, 
24b90 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a  jumpIfNull!=0);.
24ba0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
24bb0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
24bc0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
24bd0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
24be0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
24bf0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
24c00 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
24c10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
24c20 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
24c30 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
24c40 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
24c50 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
24c60 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
24c70 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ;  .}../*.** Gen
24c80 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
24c90 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
24ca0 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
24cb0 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
24cc0 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
24cd0 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
24ce0 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62  ssion is false b
24cf0 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
24d00 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
24d10 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
24d20 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
24d30 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
24d40 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
24d50 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65  ates to NULL (ne
24d60 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66  ither true nor f
24d70 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75  alse) then.** ju
24d80 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c  mp if jumpIfNull
24d90 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49   is SQLITE_JUMPI
24da0 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68  FNULL or fall th
24db0 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e  rough if jumpIfN
24dc0 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a  ull.** is 0..*/.
24dd0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
24de0 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70  IfFalse(Parse *p
24df0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
24e00 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
24e10 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
24e20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
24e30 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
24e40 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  op = 0;.  int re
24e50 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e  gFree1 = 0;.  in
24e60 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a  t regFree2 = 0;.
24e70 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20    int r1, r2;.. 
24e80 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e   assert( jumpIfN
24e90 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50  ull==SQLITE_JUMP
24ea0 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66  IFNULL || jumpIf
24eb0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Null==0 );.  if(
24ec0 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72   NEVER(v==0) ) r
24ed0 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74 65  eturn; /* Existe
24ee0 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63  nce of VDBE chec
24ef0 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f  ked by caller */
24f00 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
24f10 29 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20  )    return;..  
24f20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  /* The value of 
24f30 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70  pExpr->op and op
24f40 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73 20   are related as 
24f50 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
24f60 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  **       pExpr->
24f70 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f 70  op            op
24f80 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d  .  **       ----
24f90 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d  -----          -
24fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20  ---------.  **  
24fb0 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20       TK_ISNULL  
24fc0 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75          OP_NotNu
24fd0 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  ll.  **       TK
24fe0 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20  _NOTNULL        
24ff0 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20   OP_IsNull.  ** 
25000 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20        TK_NE     
25010 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20           OP_Eq. 
25020 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20   **       TK_EQ 
25030 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
25040 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Ne.  **       TK
25050 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _GT             
25060 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Le.  **     
25070 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20    TK_LE         
25080 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20       OP_Gt.  ** 
25090 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20        TK_GE     
250a0 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20           OP_Lt. 
250b0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20   **       TK_LT 
250c0 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
250d0 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72  Ge.  **.  ** For
250e0 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66   other values of
250f0 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69   pExpr->op, op i
25100 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20  s undefined and 
25110 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65  unused..  ** The
25120 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e   value of TK_ an
25130 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20  d OP_ constants 
25140 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75 63  are arranged suc
25150 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63  h that we.  ** c
25160 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d  an compute the m
25170 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69  apping above usi
25180 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
25190 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a   expression..  *
251a0 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72 69  * Assert()s veri
251b0 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70  fy that the comp
251c0 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65  utation is corre
251d0 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20  ct..  */.  op = 
251e0 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f  ((pExpr->op+(TK_
251f0 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54  ISNULL&1))^1)-(T
25200 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20  K_ISNULL&1);..  
25210 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65 63  /* Verify correc
25220 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54  t alignment of T
25230 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
25240 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ants.  */.  asse
25250 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
25260 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d  K_ISNULL || op==
25270 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20  OP_NotNull );.  
25280 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
25290 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c  p!=TK_NOTNULL ||
252a0 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29   op==OP_IsNull )
252b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
252c0 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20  r->op!=TK_NE || 
252d0 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61  op==OP_Eq );.  a
252e0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
252f0 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_EQ || op==O
25300 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ne );.  assert
25310 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
25320 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20  LT || op==OP_Ge 
25330 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
25340 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c  pr->op!=TK_LE ||
25350 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20   op==OP_Gt );.  
25360 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
25370 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d  p!=TK_GT || op==
25380 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Le );.  asser
25390 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
253a0 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74  _GE || op==OP_Lt
253b0 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70   );..  switch( p
253c0 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
253d0 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
253e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
253f0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
25400 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
25410 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
25420 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
25430 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
25440 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
25450 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
25460 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
25470 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
25480 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
25490 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
254a0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
254b0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
254c0 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
254d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
254e0 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b     case TK_OR: {
254f0 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20  .      int d2 = 
25500 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
25510 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74  abel(v);.      t
25520 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
25530 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
25540 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
25550 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
25560 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70  >pLeft, d2, jump
25570 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55  IfNull^SQLITE_JU
25580 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
25590 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
255a0 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
255b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
255c0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
255d0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
255e0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
255f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
25600 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
25610 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71  v, d2);.      sq
25620 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
25630 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
25640 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
25650 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
25660 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
25670 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
25680 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
25690 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
256a0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
256b0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
256c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
256d0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
256e0 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IS:.    case T
256f0 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74  K_ISNOT:.      t
25700 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
25710 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
25720 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
25730 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
25740 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28   );.      op = (
25750 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
25760 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45  ) ? TK_NE : TK_E
25770 51 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49 66 4e  Q;.      jumpIfN
25780 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c  ull = SQLITE_NUL
25790 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61  LEQ;.      /* Fa
257a0 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63  ll thru */.    c
257b0 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
257c0 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
257d0 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
257e0 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
257f0 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
25800 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
25810 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
25820 70 72 49 73 56 65 63 74 6f 72 28 70 45 78 70 72  prIsVector(pExpr
25830 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f 74 6f 20  ->pLeft) ) goto 
25840 64 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20  default_expr;.  
25850 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
25860 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
25870 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
25880 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
25890 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
258a0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
258b0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
258c0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
258d0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
258e0 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
258f0 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
25900 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
25910 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
25920 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
25930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
25940 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d  1, r2, dest, jum
25950 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
25960 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50  assert(TK_LT==OP
25970 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Lt); testcase(o
25980 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43  p==OP_Lt); VdbeC
25990 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
259a0 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73  OP_Lt);.      as
259b0 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c  sert(TK_LE==OP_L
259c0 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
259d0 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Le); VdbeCov
259e0 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
259f0 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Le);.      asse
25a00 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29  rt(TK_GT==OP_Gt)
25a10 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
25a20 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Gt); VdbeCover
25a30 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
25a40 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
25a50 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20  (TK_GE==OP_Ge); 
25a60 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
25a70 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
25a80 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
25a90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
25aa0 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65  K_EQ==OP_Eq); te
25ab0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71  stcase(op==OP_Eq
25ac0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
25ad0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
25ae0 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Eq && jumpIfNu
25af0 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll!=SQLITE_NULLE
25b00 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
25b10 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
25b20 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Eq && jumpIfN
25b30 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull==SQLITE_NULL
25b40 45 51 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  EQ);.      asser
25b50 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b  t(TK_NE==OP_Ne);
25b60 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
25b70 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _Ne);.      Vdbe
25b80 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
25b90 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49  ==OP_Ne && jumpI
25ba0 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55  fNull!=SQLITE_NU
25bb0 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62  LLEQ);.      Vdb
25bc0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
25bd0 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70  p==OP_Ne && jump
25be0 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e  IfNull==SQLITE_N
25bf0 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65  ULLEQ);.      te
25c00 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
25c10 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
25c20 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
25c30 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
25c40 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
25c50 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
25c60 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
25c70 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  : {.      r1 = s
25c80 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
25c90 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
25ca0 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
25cb0 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e1);.      sqlit
25cc0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
25cd0 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20  op, r1, dest);. 
25ce0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
25cf0 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20  p==TK_ISNULL ); 
25d00 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
25d10 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  (v, op==TK_ISNUL
25d20 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  L);.      testca
25d30 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  se( op==TK_NOTNU
25d40 4c 4c 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72  LL );  VdbeCover
25d50 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
25d60 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  NOTNULL);.      
25d70 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
25d80 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e1==0 );.      b
25d90 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
25da0 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
25db0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
25dc0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
25dd0 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f   );.      exprCo
25de0 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65  deBetween(pParse
25df0 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 73  , pExpr, dest, s
25e00 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
25e10 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  e, jumpIfNull);.
25e20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25e30 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
25e40 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
25e50 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
25e60 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 75 6d 70  {.      if( jump
25e70 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  IfNull ){.      
25e80 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
25e90 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70  eIN(pParse, pExp
25ea0 72 2c 20 64 65 73 74 2c 20 64 65 73 74 29 3b 0a  r, dest, dest);.
25eb0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
25ec0 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
25ed0 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ull = sqlite3Vdb
25ee0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
25ef0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
25f00 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
25f10 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65   pExpr, dest, de
25f20 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
25f30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
25f40 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
25f50 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
25f60 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
25f70 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
25f80 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
25f90 64 65 66 61 75 6c 74 5f 65 78 70 72 3a 20 0a 20  default_expr: . 
25fa0 20 20 20 20 20 69 66 28 20 65 78 70 72 41 6c 77       if( exprAlw
25fb0 61 79 73 46 61 6c 73 65 28 70 45 78 70 72 29 20  aysFalse(pExpr) 
25fc0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
25fd0 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65  e3VdbeGoto(v, de
25fe0 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
25ff0 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 54   if( exprAlwaysT
26000 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  rue(pExpr) ){.  
26010 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a        /* no-op *
26020 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  /.      }else{. 
26030 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
26040 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
26050 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26  pParse, pExpr, &
26060 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
26070 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
26080 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp3(v, OP_IfNot
26090 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r1, dest, jump
260a0 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20  IfNull!=0);.    
260b0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
260c0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  (v);.        tes
260d0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
260e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
260f0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
26100 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  ll==0 );.      }
26110 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
26120 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
26130 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
26140 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
26150 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
26160 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
26170 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a  e, regFree2);.}.
26180 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69  ./*.** Like sqli
26190 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 29  te3ExprIfFalse()
261a0 20 65 78 63 65 70 74 20 74 68 61 74 20 61 20 63   except that a c
261b0 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 70  opy is made of p
261c0 45 78 70 72 20 62 65 66 6f 72 65 0a 2a 2a 20 63  Expr before.** c
261d0 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2c 20  ode generation, 
261e0 61 6e 64 20 74 68 61 74 20 63 6f 70 79 20 69 73  and that copy is
261f0 20 64 65 6c 65 74 65 64 20 61 66 74 65 72 20 63   deleted after c
26200 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20  ode generation. 
26210 54 68 69 73 0a 2a 2a 20 65 6e 73 75 72 65 73 20  This.** ensures 
26220 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
26230 6c 20 70 45 78 70 72 20 69 73 20 75 6e 63 68 61  l pExpr is uncha
26240 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  nged..*/.void sq
26250 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
26260 44 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  Dup(Parse *pPars
26270 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
26280 69 6e 74 20 64 65 73 74 2c 69 6e 74 20 6a 75 6d  int dest,int jum
26290 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 73 71 6c 69  pIfNull){.  sqli
262a0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
262b0 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 43  ->db;.  Expr *pC
262c0 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  opy = sqlite3Exp
262d0 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20  rDup(db, pExpr, 
262e0 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  0);.  if( db->ma
262f0 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b  llocFailed==0 ){
26300 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
26310 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
26320 70 43 6f 70 79 2c 20 64 65 73 74 2c 20 6a 75 6d  pCopy, dest, jum
26330 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20  pIfNull);.  }.  
26340 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
26350 65 28 64 62 2c 20 70 43 6f 70 79 29 3b 0a 7d 0a  e(db, pCopy);.}.
26360 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65  ../*.** Do a dee
26370 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20  p comparison of 
26380 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74  two expression t
26390 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 30 20  rees.  Return 0 
263a0 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78  if the two.** ex
263b0 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 63 6f  pressions are co
263c0 6d 70 6c 65 74 65 6c 79 20 69 64 65 6e 74 69 63  mpletely identic
263d0 61 6c 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  al.  Return 1 if
263e0 20 74 68 65 79 20 64 69 66 66 65 72 20 6f 6e 6c   they differ onl
263f0 79 0a 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41 54  y.** by a COLLAT
26400 45 20 6f 70 65 72 61 74 6f 72 20 61 74 20 74 68  E operator at th
26410 65 20 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52 65  e top level.  Re
26420 74 75 72 6e 20 32 20 69 66 20 74 68 65 72 65 20  turn 2 if there 
26430 61 72 65 20 64 69 66 66 65 72 65 6e 63 65 73 0a  are differences.
26440 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ** other than th
26450 65 20 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c  e top-level COLL
26460 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  ATE operator..**
26470 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c  .** If any subel
26480 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20  ement of pB has 
26490 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31  Expr.iTable==(-1
264a0 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c  ) then it is all
264b0 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61  owed.** to compa
264c0 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65  re equal to an e
264d0 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e  quivalent elemen
264e0 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70  t in pA with Exp
264f0 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a  r.iTable==iTab..
26500 2a 2a 0a 2a 2a 20 54 68 65 20 70 41 20 73 69 64  **.** The pA sid
26510 65 20 6d 69 67 68 74 20 62 65 20 75 73 69 6e 67  e might be using
26520 20 54 4b 5f 52 45 47 49 53 54 45 52 2e 20 20 49   TK_REGISTER.  I
26530 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61  f that is the ca
26540 73 65 20 61 6e 64 20 70 42 20 69 73 0a 2a 2a 20  se and pB is.** 
26550 6e 6f 74 20 75 73 69 6e 67 20 54 4b 5f 52 45 47  not using TK_REG
26560 49 53 54 45 52 20 62 75 74 20 69 73 20 6f 74 68  ISTER but is oth
26570 65 72 77 69 73 65 20 65 71 75 69 76 61 6c 65 6e  erwise equivalen
26580 74 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65  t, then still re
26590 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f  turn 0..**.** So
265a0 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75  metimes this rou
265b0 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
265c0 20 32 20 65 76 65 6e 20 69 66 20 74 68 65 20 74   2 even if the t
265d0 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  wo expressions.*
265e0 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75  * really are equ
265f0 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20  ivalent.  If we 
26600 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61  cannot prove tha
26610 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
26620 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63  s are.** identic
26630 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32 20  al, we return 2 
26640 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e  just to be safe.
26650 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75    So if this rou
26660 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
26670 32 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e  2, then you do n
26680 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66  ot really know f
26690 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20 74 68  or certain if th
266a0 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73  e two.** express
266b0 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d  ions are the sam
266c0 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20 67  e.  But if you g
266d0 65 74 20 61 20 30 20 6f 72 20 31 20 72 65 74 75  et a 0 or 1 retu
266e0 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20  rn, then you.** 
266f0 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 65 20  can be sure the 
26700 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
26710 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68  the same.  In th
26720 65 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a  e places where.*
26730 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
26740 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20  s used, it does 
26750 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74 20  not hurt to get 
26760 61 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68 61  an extra 2 - tha
26770 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20  t.** just might 
26780 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73  result in some s
26790 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63  lightly slower c
267a0 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e  ode.  But return
267b0 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72  ing.** an incorr
267c0 65 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c 64  ect 0 or 1 could
267d0 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75   lead to a malfu
267e0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
267f0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
26800 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72  e(Expr *pA, Expr
26810 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b   *pB, int iTab){
26820 0a 20 20 75 33 32 20 63 6f 6d 62 69 6e 65 64 46  .  u32 combinedF
26830 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 41 3d 3d  lags;.  if( pA==
26840 30 20 7c 7c 20 70 42 3d 3d 30 20 29 7b 0a 20 20  0 || pB==0 ){.  
26850 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 20    return pB==pA 
26860 3f 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20 63  ? 0 : 2;.  }.  c
26870 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 3d 20 70  ombinedFlags = p
26880 41 2d 3e 66 6c 61 67 73 20 7c 20 70 42 2d 3e 66  A->flags | pB->f
26890 6c 61 67 73 3b 0a 20 20 69 66 28 20 63 6f 6d 62  lags;.  if( comb
268a0 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 49  inedFlags & EP_I
268b0 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69  ntValue ){.    i
268c0 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 26 70 42  f( (pA->flags&pB
268d0 2d 3e 66 6c 61 67 73 26 45 50 5f 49 6e 74 56 61  ->flags&EP_IntVa
268e0 6c 75 65 29 21 3d 30 20 26 26 20 70 41 2d 3e 75  lue)!=0 && pA->u
268f0 2e 69 56 61 6c 75 65 3d 3d 70 42 2d 3e 75 2e 69  .iValue==pB->u.i
26900 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 72  Value ){.      r
26910 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
26920 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
26930 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70  .  if( pA->op!=p
26940 42 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 69 66 28  B->op ){.    if(
26950 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   pA->op==TK_COLL
26960 41 54 45 20 26 26 20 73 71 6c 69 74 65 33 45 78  ATE && sqlite3Ex
26970 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c  prCompare(pA->pL
26980 65 66 74 2c 20 70 42 2c 20 69 54 61 62 29 3c 32  eft, pB, iTab)<2
26990 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
269a0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
269b0 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pB->op==TK_COL
269c0 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33 45  LATE && sqlite3E
269d0 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2c 20 70  xprCompare(pA, p
269e0 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3c  B->pLeft, iTab)<
269f0 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  2 ){.      retur
26a00 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  n 1;.    }.    r
26a10 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69  eturn 2;.  }.  i
26a20 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  f( pA->op!=TK_CO
26a30 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 6f 70 21 3d  LUMN && pA->op!=
26a40 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 26 26  TK_AGG_COLUMN &&
26a50 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b   pA->u.zToken ){
26a60 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d  .    if( pA->op=
26a70 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a  =TK_FUNCTION ){.
26a80 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
26a90 33 53 74 72 49 43 6d 70 28 70 41 2d 3e 75 2e 7a  3StrICmp(pA->u.z
26aa0 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b  Token,pB->u.zTok
26ab0 65 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20  en)!=0 ) return 
26ac0 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  2;.    }else if(
26ad0 20 73 74 72 63 6d 70 28 70 41 2d 3e 75 2e 7a 54   strcmp(pA->u.zT
26ae0 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65  oken,pB->u.zToke
26af0 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  n)!=0 ){.      r
26b00 65 74 75 72 6e 20 70 41 2d 3e 6f 70 3d 3d 54 4b  eturn pA->op==TK
26b10 5f 43 4f 4c 4c 41 54 45 20 3f 20 31 20 3a 20 32  _COLLATE ? 1 : 2
26b20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
26b30 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45  ( (pA->flags & E
26b40 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42  P_Distinct)!=(pB
26b50 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
26b60 74 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20  tinct) ) return 
26b70 32 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  2;.  if( ALWAYS(
26b80 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26  (combinedFlags &
26b90 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d   EP_TokenOnly)==
26ba0 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20 63 6f  0) ){.    if( co
26bb0 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
26bc0 5f 78 49 73 53 65 6c 65 63 74 20 29 20 72 65 74  _xIsSelect ) ret
26bd0 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73  urn 2;.    if( s
26be0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
26bf0 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d  e(pA->pLeft, pB-
26c00 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 20 29 20  >pLeft, iTab) ) 
26c10 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
26c20 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
26c30 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c  pare(pA->pRight,
26c40 20 70 42 2d 3e 70 52 69 67 68 74 2c 20 69 54 61   pB->pRight, iTa
26c50 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  b) ) return 2;. 
26c60 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
26c70 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 41  prListCompare(pA
26c80 2d 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d 3e 78  ->x.pList, pB->x
26c90 2e 70 4c 69 73 74 2c 20 69 54 61 62 29 20 29 20  .pList, iTab) ) 
26ca0 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
26cb0 28 20 41 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e  ( ALWAYS((combin
26cc0 65 64 46 6c 61 67 73 20 26 20 45 50 5f 52 65 64  edFlags & EP_Red
26cd0 75 63 65 64 29 3d 3d 30 29 20 26 26 20 70 41 2d  uced)==0) && pA-
26ce0 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47 20 29  >op!=TK_STRING )
26cf0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e  {.      if( pA->
26d00 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f  iColumn!=pB->iCo
26d10 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 32 3b  lumn ) return 2;
26d20 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e 69  .      if( pA->i
26d30 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c  Table!=pB->iTabl
26d40 65 20 0a 20 20 20 20 20 20 20 26 26 20 28 70 41  e .       && (pA
26d50 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c  ->iTable!=iTab |
26d60 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69 54 61 62  | NEVER(pB->iTab
26d70 6c 65 3e 3d 30 29 29 20 29 20 72 65 74 75 72 6e  le>=0)) ) return
26d80 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   2;.    }.  }.  
26d90 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
26da0 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 45  ** Compare two E
26db0 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 2e  xprList objects.
26dc0 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68    Return 0 if th
26dd0 65 79 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  ey are identical
26de0 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72   and .** non-zer
26df0 6f 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72  o if they differ
26e00 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a   in any way..**.
26e10 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c 65  ** If any subele
26e20 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20 45  ment of pB has E
26e30 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29  xpr.iTable==(-1)
26e40 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f   then it is allo
26e50 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72  wed.** to compar
26e60 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65 71  e equal to an eq
26e70 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74  uivalent element
26e80 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70 72   in pA with Expr
26e90 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a  .iTable==iTab..*
26ea0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
26eb0 65 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 6e  e might return n
26ec0 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71 75 69  on-zero for equi
26ed0 76 61 6c 65 6e 74 20 45 78 70 72 4c 69 73 74 73  valent ExprLists
26ee0 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63  .  The.** only c
26ef0 6f 6e 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 20  onsequence will 
26f00 62 65 20 64 69 73 61 62 6c 65 64 20 6f 70 74 69  be disabled opti
26f10 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75 74 20  mizations.  But 
26f20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
26f30 6d 75 73 74 20 6e 65 76 65 72 20 72 65 74 75 72  must never retur
26f40 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 20 45  n 0 if the two E
26f50 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 20  xprList objects 
26f60 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20 6f  are different, o
26f70 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63 74 69  r.** a malfuncti
26f80 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 2e 0a  on will result..
26f90 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 70  **.** Two NULL p
26fa0 6f 69 6e 74 65 72 73 20 61 72 65 20 63 6f 6e 73  ointers are cons
26fb0 69 64 65 72 65 64 20 74 6f 20 62 65 20 74 68 65  idered to be the
26fc0 20 73 61 6d 65 2e 20 20 42 75 74 20 61 20 4e 55   same.  But a NU
26fd0 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 61 6c  LL pointer.** al
26fe0 77 61 79 73 20 64 69 66 66 65 72 73 20 66 72 6f  ways differs fro
26ff0 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69  m a non-NULL poi
27000 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nter..*/.int sql
27010 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
27020 61 72 65 28 45 78 70 72 4c 69 73 74 20 2a 70 41  are(ExprList *pA
27030 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 42 2c 20  , ExprList *pB, 
27040 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 6e 74  int iTab){.  int
27050 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20   i;.  if( pA==0 
27060 26 26 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72  && pB==0 ) retur
27070 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30  n 0;.  if( pA==0
27080 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72 65 74 75   || pB==0 ) retu
27090 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 41 2d 3e  rn 1;.  if( pA->
270a0 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45 78 70 72  nExpr!=pB->nExpr
270b0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66   ) return 1;.  f
270c0 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 6e 45  or(i=0; i<pA->nE
270d0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
270e0 78 70 72 20 2a 70 45 78 70 72 41 20 3d 20 70 41  xpr *pExprA = pA
270f0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
27100 20 20 45 78 70 72 20 2a 70 45 78 70 72 42 20 3d    Expr *pExprB =
27110 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b   pB->a[i].pExpr;
27120 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 61 5b 69  .    if( pA->a[i
27130 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d 70 42 2d  ].sortOrder!=pB-
27140 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[i].sortOrder 
27150 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
27160 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
27170 6f 6d 70 61 72 65 28 70 45 78 70 72 41 2c 20 70  ompare(pExprA, p
27180 45 78 70 72 42 2c 20 69 54 61 62 29 20 29 20 72  ExprB, iTab) ) r
27190 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
271a0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
271b0 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
271c0 20 77 65 20 63 61 6e 20 70 72 6f 76 65 20 74 68   we can prove th
271d0 65 20 70 45 32 20 77 69 6c 6c 20 61 6c 77 61 79  e pE2 will alway
271e0 73 20 62 65 20 74 72 75 65 20 69 66 20 70 45 31  s be true if pE1
271f0 20 69 73 0a 2a 2a 20 74 72 75 65 2e 20 20 52 65   is.** true.  Re
27200 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 77 65  turn false if we
27210 20 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   cannot complete
27220 20 74 68 65 20 70 72 6f 6f 66 20 6f 72 20 69 66   the proof or if
27230 20 70 45 32 20 6d 69 67 68 74 0a 2a 2a 20 62 65   pE2 might.** be
27240 20 66 61 6c 73 65 2e 20 20 45 78 61 6d 70 6c 65   false.  Example
27250 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 45 31  s:.**.**     pE1
27260 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 70 45 32  : x==5       pE2
27270 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20  : x==5          
27280 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a     Result: true.
27290 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3e 30 20  **     pE1: x>0 
272a0 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35         pE2: x==5
272b0 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65 73               Res
272c0 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20  ult: false.**   
272d0 20 20 70 45 31 3a 20 78 3d 32 31 20 20 20 20 20    pE1: x=21     
272e0 20 20 70 45 32 3a 20 78 3d 32 31 20 4f 52 20 79    pE2: x=21 OR y
272f0 3d 34 33 20 20 20 20 20 52 65 73 75 6c 74 3a 20  =43     Result: 
27300 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  true.**     pE1:
27310 20 78 21 3d 31 32 33 20 20 20 20 20 70 45 32 3a   x!=123     pE2:
27320 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20   x IS NOT NULL  
27330 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a    Result: true.*
27340 2a 20 20 20 20 20 70 45 31 3a 20 78 21 3d 3f 31  *     pE1: x!=?1
27350 20 20 20 20 20 20 70 45 32 3a 20 78 20 49 53 20        pE2: x IS 
27360 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75  NOT NULL    Resu
27370 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20  lt: true.**     
27380 70 45 31 3a 20 78 20 49 53 20 4e 55 4c 4c 20 20  pE1: x IS NULL  
27390 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55  pE2: x IS NOT NU
273a0 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61  LL    Result: fa
273b0 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  lse.**     pE1: 
273c0 78 20 49 53 20 3f 32 20 20 20 20 70 45 32 3a 20  x IS ?2    pE2: 
273d0 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  x IS NOT NULL   
273e0 20 52 65 75 73 6c 74 3a 20 66 61 6c 73 65 0a 2a   Reuslt: false.*
273f0 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 61 72  *.** When compar
27400 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f  ing TK_COLUMN no
27410 64 65 73 20 62 65 74 77 65 65 6e 20 70 45 31 20  des between pE1 
27420 61 6e 64 20 70 45 32 2c 20 69 66 20 70 45 32 20  and pE2, if pE2 
27430 68 61 73 0a 2a 2a 20 45 78 70 72 2e 69 54 61 62  has.** Expr.iTab
27440 6c 65 3c 30 20 74 68 65 6e 20 61 73 73 75 6d 65  le<0 then assume
27450 20 61 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20   a table number 
27460 67 69 76 65 6e 20 62 79 20 69 54 61 62 2e 0a 2a  given by iTab..*
27470 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e 20 64 6f 75  *.** When in dou
27480 62 74 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65  bt, return false
27490 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 74 72 75  .  Returning tru
274a0 65 20 6d 69 67 68 74 20 67 69 76 65 20 61 20 70  e might give a p
274b0 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d  erformance.** im
274c0 70 72 6f 76 65 6d 65 6e 74 2e 20 20 52 65 74 75  provement.  Retu
274d0 72 6e 69 6e 67 20 66 61 6c 73 65 20 6d 69 67 68  rning false migh
274e0 74 20 63 61 75 73 65 20 61 20 70 65 72 66 6f 72  t cause a perfor
274f0 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2c  mance reduction,
27500 20 62 75 74 0a 2a 2a 20 69 74 20 77 69 6c 6c 20   but.** it will 
27510 61 6c 77 61 79 73 20 67 69 76 65 20 74 68 65 20  always give the 
27520 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 61  correct answer a
27530 6e 64 20 69 73 20 68 65 6e 63 65 20 61 6c 77 61  nd is hence alwa
27540 79 73 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20  ys safe..*/.int 
27550 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69  sqlite3ExprImpli
27560 65 73 45 78 70 72 28 45 78 70 72 20 2a 70 45 31  esExpr(Expr *pE1
27570 2c 20 45 78 70 72 20 2a 70 45 32 2c 20 69 6e 74  , Expr *pE2, int
27580 20 69 54 61 62 29 7b 0a 20 20 69 66 28 20 73 71   iTab){.  if( sq
27590 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
275a0 28 70 45 31 2c 20 70 45 32 2c 20 69 54 61 62 29  (pE1, pE2, iTab)
275b0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
275c0 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 1;.  }.  if( p
275d0 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20 20  E2->op==TK_OR.  
275e0 20 26 26 20 28 73 71 6c 69 74 65 33 45 78 70 72   && (sqlite3Expr
275f0 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45 31 2c  ImpliesExpr(pE1,
27600 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61   pE2->pLeft, iTa
27610 62 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b).             
27620 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d  || sqlite3ExprIm
27630 70 6c 69 65 73 45 78 70 72 28 70 45 31 2c 20 70  pliesExpr(pE1, p
27640 45 32 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62  E2->pRight, iTab
27650 29 20 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ) ).  ){.    ret
27660 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
27670 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54   pE2->op==TK_NOT
27680 4e 55 4c 4c 0a 20 20 20 26 26 20 73 71 6c 69 74  NULL.   && sqlit
27690 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45  e3ExprCompare(pE
276a0 31 2d 3e 70 4c 65 66 74 2c 20 70 45 32 2d 3e 70  1->pLeft, pE2->p
276b0 4c 65 66 74 2c 20 69 54 61 62 29 3d 3d 30 0a 20  Left, iTab)==0. 
276c0 20 20 26 26 20 28 70 45 31 2d 3e 6f 70 21 3d 54    && (pE1->op!=T
276d0 4b 5f 49 53 4e 55 4c 4c 20 26 26 20 70 45 31 2d  K_ISNULL && pE1-
276e0 3e 6f 70 21 3d 54 4b 5f 49 53 29 0a 20 20 29 7b  >op!=TK_IS).  ){
276f0 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
27700 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
27710 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
27720 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
27730 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69  wing structure i
27740 73 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72  s used by the tr
27750 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20  ee walker.** to 
27760 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20  determine if an 
27770 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62  expression can b
27780 65 20 65 76 61 6c 75 61 74 65 64 20 62 79 20 72  e evaluated by r
27790 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a  eference to the.
277a0 2a 2a 20 69 6e 64 65 78 20 6f 6e 6c 79 2c 20 77  ** index only, w
277b0 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
277c0 20 64 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72   do a search for
277d0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
277e0 6e 67 0a 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72  ng.** table entr
277f0 79 2e 20 20 54 68 65 20 49 64 78 43 6f 76 65 72  y.  The IdxCover
27800 2e 70 49 64 78 20 66 69 65 6c 64 20 69 73 20 74  .pIdx field is t
27810 68 65 20 69 6e 64 65 78 2e 20 20 49 64 78 43 6f  he index.  IdxCo
27820 76 65 72 2e 69 43 75 72 0a 2a 2a 20 69 73 20 74  ver.iCur.** is t
27830 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  he cursor for th
27840 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75  e table..*/.stru
27850 63 74 20 49 64 78 43 6f 76 65 72 20 7b 0a 20 20  ct IdxCover {.  
27860 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
27870 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f   /* The index to
27880 20 62 65 20 74 65 73 74 65 64 20 66 6f 72 20 63   be tested for c
27890 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 69 6e 74  overage */.  int
278a0 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 2f 2a   iCur;        /*
278b0 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   Cursor number f
278c0 6f 72 20 74 68 65 20 74 61 62 6c 65 20 63 6f 72  or the table cor
278d0 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
278e0 65 20 69 6e 64 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f  e index */.};../
278f0 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
27900 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 72  e if there are r
27910 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
27920 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 0a 2a  umns in table .*
27930 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64  * pWalker->u.pId
27940 78 43 6f 76 65 72 2d 3e 69 43 75 72 20 63 61 6e  xCover->iCur can
27950 20 62 65 20 73 61 74 69 73 66 69 65 64 20 75 73   be satisfied us
27960 69 6e 67 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a  ing the index.**
27970 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78   pWalker->u.pIdx
27980 43 6f 76 65 72 2d 3e 70 49 64 78 2e 0a 2a 2f 0a  Cover->pIdx..*/.
27990 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 49  static int exprI
279a0 64 78 43 6f 76 65 72 28 57 61 6c 6b 65 72 20 2a  dxCover(Walker *
279b0 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
279c0 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78  Expr){.  if( pEx
279d0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
279e0 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69  N.   && pExpr->i
279f0 54 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e  Table==pWalker->
27a00 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75  u.pIdxCover->iCu
27a10 72 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 43  r.   && sqlite3C
27a20 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 57 61  olumnOfIndex(pWa
27a30 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65  lker->u.pIdxCove
27a40 72 2d 3e 70 49 64 78 2c 20 70 45 78 70 72 2d 3e  r->pIdx, pExpr->
27a50 69 43 6f 6c 75 6d 6e 29 3c 30 0a 20 20 29 7b 0a  iColumn)<0.  ){.
27a60 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
27a70 64 65 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  de = 1;.    retu
27a80 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
27a90 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
27aa0 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
27ab0 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61  * Determine if a
27ac0 6e 20 69 6e 64 65 78 20 70 49 64 78 20 6f 6e 20  n index pIdx on 
27ad0 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f  table with curso
27ae0 72 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20  r iCur contains 
27af0 77 69 6c 6c 0a 2a 2a 20 74 68 65 20 65 78 70 72  will.** the expr
27b00 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52  ession pExpr.  R
27b10 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
27b20 65 20 69 6e 64 65 78 20 64 6f 65 73 20 63 6f 76  e index does cov
27b30 65 72 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  er the.** expres
27b40 73 69 6f 6e 20 61 6e 64 20 66 61 6c 73 65 20 69  sion and false i
27b50 66 20 74 68 65 20 70 45 78 70 72 20 65 78 70 72  f the pExpr expr
27b60 65 73 73 69 6f 6e 20 72 65 66 65 72 65 6e 63 65  ession reference
27b70 73 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 0a  s table columns.
27b80 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  ** that are not 
27b90 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 69 6e 64  found in the ind
27ba0 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 41  ex pIdx..**.** A
27bb0 6e 20 69 6e 64 65 78 20 63 6f 76 65 72 69 6e 67  n index covering
27bc0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d   an expression m
27bd0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 65 78  eans that the ex
27be0 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 0a  pression can be.
27bf0 2a 2a 20 65 76 61 6c 75 61 74 65 64 20 75 73 69  ** evaluated usi
27c00 6e 67 20 6f 6e 6c 79 20 74 68 65 20 69 6e 64 65  ng only the inde
27c10 78 20 61 6e 64 20 77 69 74 68 6f 75 74 20 68 61  x and without ha
27c20 76 69 6e 67 20 74 6f 20 6c 6f 6f 6b 75 70 20 74  ving to lookup t
27c30 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  he.** correspond
27c40 69 6e 67 20 74 61 62 6c 65 20 65 6e 74 72 79 2e  ing table entry.
27c50 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
27c60 78 70 72 43 6f 76 65 72 65 64 42 79 49 6e 64 65  xprCoveredByInde
27c70 78 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  x(.  Expr *pExpr
27c80 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
27c90 69 6e 64 65 78 20 74 6f 20 62 65 20 74 65 73 74  index to be test
27ca0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  ed */.  int iCur
27cb0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
27cc0 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
27cd0 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70   for the corresp
27ce0 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a  onding table */.
27cf0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
27d00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
27d10 65 78 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  ex that might be
27d20 20 75 73 65 64 20 66 6f 72 20 63 6f 76 65 72 61   used for covera
27d30 67 65 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65  ge */.){.  Walke
27d40 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20 49 64  r w;.  struct Id
27d50 78 43 6f 76 65 72 20 78 63 6f 76 3b 0a 20 20 6d  xCover xcov;.  m
27d60 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
27d70 65 6f 66 28 77 29 29 3b 0a 20 20 78 63 6f 76 2e  eof(w));.  xcov.
27d80 69 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 78  iCur = iCur;.  x
27d90 63 6f 76 2e 70 49 64 78 20 3d 20 70 49 64 78 3b  cov.pIdx = pIdx;
27da0 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
27db0 63 6b 20 3d 20 65 78 70 72 49 64 78 43 6f 76 65  ck = exprIdxCove
27dc0 72 3b 0a 20 20 77 2e 75 2e 70 49 64 78 43 6f 76  r;.  w.u.pIdxCov
27dd0 65 72 20 3d 20 26 78 63 6f 76 3b 0a 20 20 73 71  er = &xcov;.  sq
27de0 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
27df0 2c 20 70 45 78 70 72 29 3b 0a 20 20 72 65 74 75  , pExpr);.  retu
27e00 72 6e 20 21 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a  rn !w.eCode;.}..
27e10 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
27e20 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
27e30 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
27e40 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72 65   used by the tre
27e50 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63  e walker.** to c
27e60 6f 75 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20  ount references 
27e70 74 6f 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  to table columns
27e80 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
27e90 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 61 67 67 72  s of an .** aggr
27ea0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20  egate function, 
27eb0 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c  in order to impl
27ec0 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 73 71 6c  ement the.** sql
27ed0 69 74 65 33 46 75 6e 63 74 69 6f 6e 54 68 69 73  ite3FunctionThis
27ee0 53 72 63 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a  Src() routine..*
27ef0 2f 0a 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e  /.struct SrcCoun
27f00 74 20 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  t {.  SrcList *p
27f10 53 72 63 3b 20 20 20 2f 2a 20 4f 6e 65 20 70 61  Src;   /* One pa
27f20 72 74 69 63 75 6c 61 72 20 46 52 4f 4d 20 63 6c  rticular FROM cl
27f30 61 75 73 65 20 69 6e 20 61 20 6e 65 73 74 65 64  ause in a nested
27f40 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
27f50 6e 54 68 69 73 3b 20 20 20 20 20 20 20 2f 2a 20  nThis;       /* 
27f60 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  Number of refere
27f70 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20  nces to columns 
27f80 69 6e 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20  in pSrcList */. 
27f90 20 69 6e 74 20 6e 4f 74 68 65 72 3b 20 20 20 20   int nOther;    
27fa0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
27fb0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
27fc0 75 6d 6e 73 20 69 6e 20 6f 74 68 65 72 20 46 52  umns in other FR
27fd0 4f 4d 20 63 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b  OM clauses */.};
27fe0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68  ../*.** Count th
27ff0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
28000 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e  rences to column
28010 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
28020 20 65 78 70 72 53 72 63 43 6f 75 6e 74 28 57 61   exprSrcCount(Wa
28030 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
28040 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 2f  xpr *pExpr){.  /
28050 2a 20 54 68 65 20 4e 45 56 45 52 28 29 20 6f 6e  * The NEVER() on
28060 20 74 68 65 20 73 65 63 6f 6e 64 20 74 65 72 6d   the second term
28070 20 69 73 20 62 65 63 61 75 73 65 20 73 71 6c 69   is because sqli
28080 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54  te3FunctionUsesT
28090 68 69 73 53 72 63 28 29 0a 20 20 2a 2a 20 69 73  hisSrc().  ** is
280a0 20 61 6c 77 61 79 73 20 63 61 6c 6c 65 64 20 62   always called b
280b0 65 66 6f 72 65 20 73 71 6c 69 74 65 33 45 78 70  efore sqlite3Exp
280c0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
280d0 65 73 28 29 20 61 6e 64 20 73 6f 20 74 68 65 0a  es() and so the.
280e0 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20    ** TK_COLUMNs 
280f0 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65  have not yet bee
28100 6e 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  n converted into
28110 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20   TK_AGG_COLUMN. 
28120 20 49 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   If.  ** sqlite3
28130 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73  FunctionUsesThis
28140 53 72 63 28 29 20 69 73 20 75 73 65 64 20 64 69  Src() is used di
28150 66 66 65 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  fferently in the
28160 20 66 75 74 75 72 65 2c 20 74 68 65 0a 20 20 2a   future, the.  *
28170 2a 20 4e 45 56 45 52 28 29 20 77 69 6c 6c 20 6e  * NEVER() will n
28180 65 65 64 20 74 6f 20 62 65 20 72 65 6d 6f 76 65  eed to be remove
28190 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  d. */.  if( pExp
281a0 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
281b0 20 7c 7c 20 4e 45 56 45 52 28 70 45 78 70 72 2d   || NEVER(pExpr-
281c0 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
281d0 4d 4e 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  MN) ){.    int i
281e0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  ;.    struct Src
281f0 43 6f 75 6e 74 20 2a 70 20 3d 20 70 57 61 6c 6b  Count *p = pWalk
28200 65 72 2d 3e 75 2e 70 53 72 63 43 6f 75 6e 74 3b  er->u.pSrcCount;
28210 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53  .    SrcList *pS
28220 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
28230 20 20 69 6e 74 20 6e 53 72 63 20 3d 20 70 53 72    int nSrc = pSr
28240 63 20 3f 20 70 53 72 63 2d 3e 6e 53 72 63 20 3a  c ? pSrc->nSrc :
28250 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
28260 20 69 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20   i<nSrc; i++){. 
28270 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
28280 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b  iTable==pSrc->a[
28290 69 5d 2e 69 43 75 72 73 6f 72 20 29 20 62 72 65  i].iCursor ) bre
282a0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
282b0 28 20 69 3c 6e 53 72 63 20 29 7b 0a 20 20 20 20  ( i<nSrc ){.    
282c0 20 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20    p->nThis++;.  
282d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
282e0 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20 20 20  ->nOther++;.    
282f0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  }.  }.  return W
28300 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
28310 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
28320 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 61 72  if any of the ar
28330 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 70  guments to the p
28340 45 78 70 72 20 46 75 6e 63 74 69 6f 6e 20 72 65  Expr Function re
28350 66 65 72 65 6e 63 65 0a 2a 2a 20 70 53 72 63 4c  ference.** pSrcL
28360 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75  ist.  Return tru
28370 65 20 69 66 20 74 68 65 79 20 64 6f 2e 20 20 41  e if they do.  A
28380 6c 73 6f 20 72 65 74 75 72 6e 20 74 72 75 65 20  lso return true 
28390 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a  if the function.
283a0 2a 2a 20 68 61 73 20 6e 6f 20 61 72 67 75 6d 65  ** has no argume
283b0 6e 74 73 20 6f 72 20 68 61 73 20 6f 6e 6c 79 20  nts or has only 
283c0 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e  constant argumen
283d0 74 73 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73  ts.  Return fals
283e0 65 20 69 66 20 70 45 78 70 72 0a 2a 2a 20 72 65  e if pExpr.** re
283f0 66 65 72 65 6e 63 65 73 20 63 6f 6c 75 6d 6e 73  ferences columns
28400 20 62 75 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73   but not columns
28410 20 6f 66 20 74 61 62 6c 65 73 20 66 6f 75 6e 64   of tables found
28420 20 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2f   in pSrcList..*/
28430 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 75 6e 63  .int sqlite3Func
28440 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28  tionUsesThisSrc(
28450 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53 72 63  Expr *pExpr, Src
28460 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 29 7b  List *pSrcList){
28470 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73  .  Walker w;.  s
28480 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 63  truct SrcCount c
28490 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  nt;.  assert( pE
284a0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
284b0 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 6d 65  FUNCTION );.  me
284c0 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
284d0 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70  of(w));.  w.xExp
284e0 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
284f0 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77 2e 75 2e  SrcCount;.  w.u.
28500 70 53 72 63 43 6f 75 6e 74 20 3d 20 26 63 6e 74  pSrcCount = &cnt
28510 3b 0a 20 20 63 6e 74 2e 70 53 72 63 20 3d 20 70  ;.  cnt.pSrc = p
28520 53 72 63 4c 69 73 74 3b 0a 20 20 63 6e 74 2e 6e  SrcList;.  cnt.n
28530 54 68 69 73 20 3d 20 30 3b 0a 20 20 63 6e 74 2e  This = 0;.  cnt.
28540 6e 4f 74 68 65 72 20 3d 20 30 3b 0a 20 20 73 71  nOther = 0;.  sq
28550 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73  lite3WalkExprLis
28560 74 28 26 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70  t(&w, pExpr->x.p
28570 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  List);.  return 
28580 63 6e 74 2e 6e 54 68 69 73 3e 30 20 7c 7c 20 63  cnt.nThis>0 || c
28590 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a  nt.nOther==0;.}.
285a0 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
285b0 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
285c0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
285d0 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
285e0 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20  the index of.** 
285f0 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e  the new element.
28600 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74    Return a negat
28610 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61  ive number if ma
28620 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  lloc fails..*/.s
28630 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67  tatic int addAgg
28640 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74  InfoColumn(sqlit
28650 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20  e3 *db, AggInfo 
28660 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69  *pInfo){.  int i
28670 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20  ;.  pInfo->aCol 
28680 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
28690 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64  locate(.       d
286a0 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d  b,.       pInfo-
286b0 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69  >aCol,.       si
286c0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c  zeof(pInfo->aCol
286d0 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49  [0]),.       &pI
286e0 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20  nfo->nColumn,.  
286f0 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72       &i.  );.  r
28700 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a  eturn i;.}    ..
28710 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
28720 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70  element to the p
28730 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
28740 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
28750 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20  the index of.** 
28760 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e  the new element.
28770 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74    Return a negat
28780 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61  ive number if ma
28790 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  lloc fails..*/.s
287a0 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67  tatic int addAgg
287b0 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74 65 33  InfoFunc(sqlite3
287c0 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70   *db, AggInfo *p
287d0 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Info){.  int i;.
287e0 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d    pInfo->aFunc =
287f0 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c   sqlite3ArrayAll
28800 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62  ocate(.       db
28810 2c 20 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d  , .       pInfo-
28820 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 73  >aFunc,.       s
28830 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75  izeof(pInfo->aFu
28840 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26  nc[0]),.       &
28850 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20  pInfo->nFunc,.  
28860 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72       &i.  );.  r
28870 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a  eturn i;.}    ..
28880 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
28890 65 20 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  e xExprCallback 
288a0 66 6f 72 20 61 20 74 72 65 65 20 77 61 6c 6b 65  for a tree walke
288b0 72 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 74  r.  It is used t
288c0 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73  o.** implement s
288d0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
288e0 65 41 67 67 72 65 67 61 74 65 73 28 29 2e 20 20  eAggregates().  
288f0 53 65 65 20 73 71 6c 69 74 65 33 45 78 70 72 41  See sqlite3ExprA
28900 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
28910 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .** for addition
28920 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
28930 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e  */.static int an
28940 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28 57  alyzeAggregate(W
28950 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
28960 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
28970 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
28980 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c  text *pNC = pWal
28990 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61  ker->u.pNC;.  Pa
289a0 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e  rse *pParse = pN
289b0 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72 63  C->pParse;.  Src
289c0 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d  List *pSrcList =
289d0 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a   pNC->pSrcList;.
289e0 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49    AggInfo *pAggI
289f0 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49  nfo = pNC->pAggI
28a00 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  nfo;..  switch( 
28a10 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
28a20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
28a30 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UMN:.    case TK
28a40 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
28a50 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
28a60 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
28a70 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  UMN );.      tes
28a80 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
28a90 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
28aa0 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
28ab0 20 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75   see if the colu
28ac0 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20  mn is in one of 
28ad0 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68  the tables in th
28ae0 65 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20  e FROM.      ** 
28af0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67  clause of the ag
28b00 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f  gregate query */
28b10 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
28b20 53 28 70 53 72 63 4c 69 73 74 21 3d 30 29 20 29  S(pSrcList!=0) )
28b30 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
28b40 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
28b50 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d  Item = pSrcList-
28b60 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  >a;.        for(
28b70 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d  i=0; i<pSrcList-
28b80 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
28b90 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
28ba0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
28bb0 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20  ol *pCol;.      
28bc0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
28bd0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
28be0 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
28bf0 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
28c00 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
28c10 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74  xpr->iTable==pIt
28c20 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20  em->iCursor ){. 
28c30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
28c40 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
28c50 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74  oint, it means t
28c60 68 61 74 20 70 45 78 70 72 20 72 65 66 65 72 73  hat pExpr refers
28c70 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20   to a table.    
28c80 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
28c90 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  is in the FROM c
28ca0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67  lause of the agg
28cb0 72 65 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a  regate query.  .
28cc0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20              **. 
28cd0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61             ** Ma
28ce0 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  ke an entry for 
28cf0 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41  the column in pA
28d00 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69  ggInfo->aCol[] i
28d10 66 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20  f there.        
28d20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e      ** is not an
28d30 20 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72   entry there alr
28d40 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20  eady..          
28d50 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
28d60 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20   int k;.        
28d70 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49      pCol = pAggI
28d80 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  nfo->aCol;.     
28d90 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20         for(k=0; 
28da0 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  k<pAggInfo->nCol
28db0 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b  umn; k++, pCol++
28dc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
28dd0 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c   if( pCol->iTabl
28de0 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e==pExpr->iTable
28df0 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
28e00 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c        pCol->iCol
28e10 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn==pExpr->iCol
28e20 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
28e30 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
28e40 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
28e50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
28e60 20 20 20 20 20 20 20 20 69 66 28 20 28 6b 3e 3d          if( (k>=
28e70 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
28e80 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n).             
28e90 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e  && (k = addAggIn
28ea0 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d  foColumn(pParse-
28eb0 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e  >db, pAggInfo))>
28ec0 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0 .            
28ed0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
28ee0 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66   pCol = &pAggInf
28ef0 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20  o->aCol[k];.    
28f00 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
28f10 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54  pTab = pExpr->pT
28f20 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab;.            
28f30 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d    pCol->iTable =
28f40 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
28f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
28f60 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45  ol->iColumn = pE
28f70 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
28f80 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
28f90 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  ->iMem = ++pPars
28fa0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
28fb0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
28fc0 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  rterColumn = -1;
28fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
28fe0 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  Col->pExpr = pEx
28ff0 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
29000 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e    if( pAggInfo->
29010 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
29020 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
29030 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  j, n;.          
29040 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
29050 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  pGB = pAggInfo->
29060 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  pGroupBy;.      
29070 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
29080 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
29090 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a  pTerm = pGB->a;.
290a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290b0 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a  n = pGB->nExpr;.
290c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290d0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b  for(j=0; j<n; j+
290e0 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
290f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
29100 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d  xpr *pE = pTerm-
29110 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
29120 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
29130 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
29140 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70  && pE->iTable==p
29150 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a  Expr->iTable &&.
29160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29170 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d        pE->iColum
29180 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n==pExpr->iColum
29190 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
291a0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
291b0 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a  SorterColumn = j
291c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
291d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
291e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
291f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29200 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
29210 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
29220 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74   if( pCol->iSort
29230 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  erColumn<0 ){.  
29240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
29250 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
29260 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53  n = pAggInfo->nS
29270 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a  ortingColumn++;.
29280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
29290 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
292a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
292b0 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74  re is now an ent
292c0 72 79 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20  ry for pExpr in 
292d0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
292e0 20 28 65 69 74 68 65 72 0a 20 20 20 20 20 20 20   (either.       
292f0 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20       ** because 
29300 69 74 20 77 61 73 20 74 68 65 72 65 20 62 65 66  it was there bef
29310 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65 20 77  ore or because w
29320 65 20 6a 75 73 74 20 63 72 65 61 74 65 64 20 69  e just created i
29330 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  t)..            
29340 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70  ** Convert the p
29350 45 78 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f  Expr to be a TK_
29360 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72  AGG_COLUMN refer
29370 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20  ring to that.   
29380 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67           ** pAgg
29390 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74  Info->aCol[] ent
293a0 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry..            
293b0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  */.            E
293c0 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74  xprSetVVAPropert
293d0 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65  y(pExpr, EP_NoRe
293e0 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20  duce);.         
293f0 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e     pExpr->pAggIn
29400 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20  fo = pAggInfo;. 
29410 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
29420 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f  ->op = TK_AGG_CO
29430 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20  LUMN;.          
29440 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
29450 28 69 31 36 29 6b 3b 0a 20 20 20 20 20 20 20 20  (i16)k;.        
29460 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
29470 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20       } /* endif 
29480 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
29490 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f  Item->iCursor */
294a0 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e  .        } /* en
294b0 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63  d loop over pSrc
294c0 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  List */.      }.
294d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
294e0 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  _Prune;.    }.  
294f0 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
29500 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
29510 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67  if( (pNC->ncFlag
29520 73 20 26 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63  s & NC_InAggFunc
29530 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70  )==0.       && p
29540 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65  Walker->walkerDe
29550 70 74 68 3d 3d 70 45 78 70 72 2d 3e 6f 70 32 0a  pth==pExpr->op2.
29560 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
29570 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
29580 20 69 66 20 70 45 78 70 72 20 69 73 20 61 20 64   if pExpr is a d
29590 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74  uplicate of anot
295a0 68 65 72 20 61 67 67 72 65 67 61 74 65 20 0a 20  her aggregate . 
295b0 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
295c0 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65 61  on that is alrea
295d0 64 79 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e  dy in the pAggIn
295e0 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 20  fo structure.   
295f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
29600 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
29610 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67  unc *pItem = pAg
29620 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20  gInfo->aFunc;.  
29630 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
29640 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
29650 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
29660 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
29670 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
29680 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20  e(pItem->pExpr, 
29690 70 45 78 70 72 2c 20 2d 31 29 3d 3d 30 20 29 7b  pExpr, -1)==0 ){
296a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
296b0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
296c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
296d0 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66    if( i>=pAggInf
296e0 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20  o->nFunc ){.    
296f0 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69        /* pExpr i
29700 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b  s original.  Mak
29710 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  e a new entry in
29720 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
29730 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  [].          */.
29740 20 20 20 20 20 20 20 20 20 20 75 38 20 65 6e 63            u8 enc
29750 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64   = ENC(pParse->d
29760 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  b);.          i 
29770 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63  = addAggInfoFunc
29780 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67  (pParse->db, pAg
29790 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  gInfo);.        
297a0 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20    if( i>=0 ){.  
297b0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
297c0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
297d0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
297e0 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
297f0 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26         pItem = &
29800 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
29810 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i];.            
29820 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pItem->pExpr = p
29830 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
29840 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20    pItem->iMem = 
29850 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
29860 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
29870 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
29880 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
29890 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
298a0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
298b0 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69  Func = sqlite3Fi
298c0 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  ndFunction(pPars
298d0 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20  e->db,.         
298e0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
298f0 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 0a 20 20 20 20  >u.zToken, .    
29900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
29910 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20  Expr->x.pList ? 
29920 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
29930 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20  nExpr : 0, enc, 
29940 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
29950 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
29960 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29   & EP_Distinct )
29970 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
29980 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74  pItem->iDistinct
29990 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
299a0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  +;.            }
299b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
299c0 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74      pItem->iDist
299d0 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  inct = -1;.     
299e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
299f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
29a00 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70         /* Make p
29a10 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68  Expr point to th
29a20 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 70 41  e appropriate pA
29a30 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20  ggInfo->aFunc[] 
29a40 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f  entry.        */
29a50 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
29a60 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
29a70 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
29a80 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
29a90 29 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70  ) );.        Exp
29aa0 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28  rSetVVAProperty(
29ab0 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75  pExpr, EP_NoRedu
29ac0 63 65 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78  ce);.        pEx
29ad0 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29  pr->iAgg = (i16)
29ae0 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  i;.        pExpr
29af0 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67  ->pAggInfo = pAg
29b00 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72  gInfo;.        r
29b10 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
29b20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
29b30 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
29b40 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20  _Continue;.     
29b50 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
29b60 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
29b70 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  ue;.}.static int
29b80 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
29b90 65 73 49 6e 53 65 6c 65 63 74 28 57 61 6c 6b 65  esInSelect(Walke
29ba0 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
29bb0 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
29bc0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
29bd0 28 70 57 61 6c 6b 65 72 29 3b 0a 20 20 55 4e 55  (pWalker);.  UNU
29be0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 53  SED_PARAMETER(pS
29bf0 65 6c 65 63 74 29 3b 0a 20 20 72 65 74 75 72 6e  elect);.  return
29c00 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
29c10 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  ../*.** Analyze 
29c20 74 68 65 20 70 45 78 70 72 20 65 78 70 72 65 73  the pExpr expres
29c30 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  sion looking for
29c40 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
29c50 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
29c60 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e  variables that n
29c70 65 65 64 20 74 6f 20 62 65 20 61 64 64 65 64 20  eed to be added 
29c80 74 6f 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63  to AggInfo objec
29c90 74 20 74 68 61 74 20 70 4e 43 2d 3e 70 41 67 67  t that pNC->pAgg
29ca0 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  Info.** points t
29cb0 6f 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65  o.  Additional e
29cc0 6e 74 72 69 65 73 20 61 72 65 20 6d 61 64 65 20  ntries are made 
29cd0 6f 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 6f  on the AggInfo o
29ce0 62 6a 65 63 74 20 61 73 0a 2a 2a 20 6e 65 63 65  bject as.** nece
29cf0 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ssary..**.** Thi
29d00 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
29d10 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
29d20 61 66 74 65 72 20 74 68 65 20 65 78 70 72 65 73  after the expres
29d30 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a  sion has been.**
29d40 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c   analyzed by sql
29d50 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
29d60 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  ames()..*/.void 
29d70 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
29d80 7a 65 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d  zeAggregates(Nam
29d90 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45  eContext *pNC, E
29da0 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57  xpr *pExpr){.  W
29db0 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65  alker w;.  memse
29dc0 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
29dd0 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  w));.  w.xExprCa
29de0 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65  llback = analyze
29df0 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78  Aggregate;.  w.x
29e00 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
29e10 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
29e20 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e  esInSelect;.  w.
29e30 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 61  u.pNC = pNC;.  a
29e40 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63  ssert( pNC->pSrc
29e50 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73 71 6c  List!=0 );.  sql
29e60 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
29e70 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pExpr);.}../*.*
29e80 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78  * Call sqlite3Ex
29e90 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
29ea0 74 65 73 28 29 20 66 6f 72 20 65 76 65 72 79 20  tes() for every 
29eb0 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e  expression in an
29ec0 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
29ed0 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ist.  Return the
29ee0 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
29ef0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  s..**.** If an e
29f00 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74  rror is found, t
29f10 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63  he analysis is c
29f20 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69  ut short..*/.voi
29f30 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  d sqlite3ExprAna
29f40 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65  lyzeAggList(Name
29f50 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78  Context *pNC, Ex
29f60 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
29f70 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
29f80 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
29f90 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
29fa0 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70  ist ){.    for(p
29fb0 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
29fc0 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
29fd0 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
29fe0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
29ff0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
2a000 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d  gates(pNC, pItem
2a010 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ->pExpr);.    }.
2a020 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
2a030 6f 63 61 74 65 20 61 20 73 69 6e 67 6c 65 20 6e  ocate a single n
2a040 65 77 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ew register for 
2a050 75 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d 65  use to hold some
2a060 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
2a070 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sult..*/.int sql
2a080 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 50  ite3GetTempReg(P
2a090 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
2a0a0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65   if( pParse->nTe
2a0b0 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20  mpReg==0 ){.    
2a0c0 72 65 74 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d  return ++pParse-
2a0d0 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74  >nMem;.  }.  ret
2a0e0 75 72 6e 20 70 50 61 72 73 65 2d 3e 61 54 65 6d  urn pParse->aTem
2a0f0 70 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e  pReg[--pParse->n
2a100 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a  TempReg];.}../*.
2a110 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20  ** Deallocate a 
2a120 72 65 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e 67  register, making
2a130 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72   available for r
2a140 65 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74  euse for some ot
2a150 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e 0a  her.** purpose..
2a160 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73  **.** If a regis
2a170 74 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ter is currently
2a180 20 62 65 69 6e 67 20 75 73 65 64 20 62 79 20 74   being used by t
2a190 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2c  he column cache,
2a1a0 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64 65 61   then.** the dea
2a1b0 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 64 65 66  llocation is def
2a1c0 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20  erred until the 
2a1d0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 6c 69 6e  column cache lin
2a1e0 65 20 74 68 61 74 20 75 73 65 73 0a 2a 2a 20 74  e that uses.** t
2a1f0 68 65 20 72 65 67 69 73 74 65 72 20 62 65 63 6f  he register beco
2a200 6d 65 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f  mes stale..*/.vo
2a210 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  id sqlite3Releas
2a220 65 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a  eTempReg(Parse *
2a230 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
2a240 29 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26 26  ){.  if( iReg &&
2a250 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
2a260 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72  g<ArraySize(pPar
2a270 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b  se->aTempReg) ){
2a280 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
2a290 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
2a2a0 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30   *p;.    for(i=0
2a2b0 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
2a2c0 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
2a2d0 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
2a2e0 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   p++){.      if(
2a2f0 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29   p->iReg==iReg )
2a300 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 74 65 6d  {.        p->tem
2a310 70 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  pReg = 1;.      
2a320 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
2a330 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  }.    }.    pPar
2a340 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61  se->aTempReg[pPa
2a350 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d  rse->nTempReg++]
2a360 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a   = iReg;.  }.}..
2a370 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f  /*.** Allocate o
2a380 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62  r deallocate a b
2a390 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e  lock of nReg con
2a3a0 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65  secutive registe
2a3b0 72 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  rs.*/.int sqlite
2a3c0 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61  3GetTempRange(Pa
2a3d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
2a3e0 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c   nReg){.  int i,
2a3f0 20 6e 3b 0a 20 20 69 20 3d 20 70 50 61 72 73 65   n;.  i = pParse
2a400 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e  ->iRangeReg;.  n
2a410 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67   = pParse->nRang
2a420 65 52 65 67 3b 0a 20 20 69 66 28 20 6e 52 65 67  eReg;.  if( nReg
2a430 3c 3d 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  <=n ){.    asser
2a440 74 28 20 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e  t( !usedAsColumn
2a450 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 2c  Cache(pParse, i,
2a460 20 69 2b 6e 2d 31 29 20 29 3b 0a 20 20 20 20 70   i+n-1) );.    p
2a470 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
2a480 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50   += nReg;.    pP
2a490 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
2a4a0 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65  -= nReg;.  }else
2a4b0 7b 0a 20 20 20 20 69 20 3d 20 70 50 61 72 73 65  {.    i = pParse
2a4c0 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50  ->nMem+1;.    pP
2a4d0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
2a4e0 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  eg;.  }.  return
2a4f0 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74   i;.}.void sqlit
2a500 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
2a510 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
2a520 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20  , int iReg, int 
2a530 6e 52 65 67 29 7b 0a 20 20 73 71 6c 69 74 65 33  nReg){.  sqlite3
2a540 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
2a550 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 52  pParse, iReg, nR
2a560 65 67 29 3b 0a 20 20 69 66 28 20 6e 52 65 67 3e  eg);.  if( nReg>
2a570 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
2a580 67 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  g ){.    pParse-
2a590 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65  >nRangeReg = nRe
2a5a0 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69  g;.    pParse->i
2a5b0 52 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b  RangeReg = iReg;
2a5c0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
2a5d0 72 6b 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79  rk all temporary
2a5e0 20 72 65 67 69 73 74 65 72 73 20 61 73 20 62 65   registers as be
2a5f0 69 6e 67 20 75 6e 61 76 61 69 6c 61 62 6c 65 20  ing unavailable 
2a600 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f 0a 76 6f  for reuse..*/.vo
2a610 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54  id sqlite3ClearT
2a620 65 6d 70 52 65 67 43 61 63 68 65 28 50 61 72 73  empRegCache(Pars
2a630 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50  e *pParse){.  pP
2a640 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d  arse->nTempReg =
2a650 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 52   0;.  pParse->nR
2a660 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d 0a 0a  angeReg = 0;.}..
2a670 2f 2a 0a 2a 2a 20 56 61 6c 69 64 61 74 65 20 74  /*.** Validate t
2a680 68 61 74 20 6e 6f 20 74 65 6d 70 6f 72 61 72 79  hat no temporary
2a690 20 72 65 67 69 73 74 65 72 20 66 61 6c 6c 73 20   register falls 
2a6a0 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65  within the range
2a6b0 20 6f 66 0a 2a 2a 20 69 46 69 72 73 74 2e 2e 69   of.** iFirst..i
2a6c0 4c 61 73 74 2c 20 69 6e 63 6c 75 73 69 76 65 2e  Last, inclusive.
2a6d0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
2a6e0 73 20 6f 6e 6c 79 20 63 61 6c 6c 20 66 72 6f 6d  s only call from
2a6f0 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29   within assert()
2a700 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  .** statements..
2a710 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2a720 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74  _DEBUG.int sqlit
2a730 65 33 4e 6f 54 65 6d 70 73 49 6e 52 61 6e 67 65  e3NoTempsInRange
2a740 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2a750 69 6e 74 20 69 46 69 72 73 74 2c 20 69 6e 74 20  int iFirst, int 
2a760 69 4c 61 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  iLast){.  int i;
2a770 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
2a780 52 61 6e 67 65 52 65 67 3e 30 0a 20 20 20 26 26  RangeReg>0.   &&
2a790 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
2a7a0 65 67 2b 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67  eg+pParse->nRang
2a7b0 65 52 65 67 3c 69 4c 61 73 74 0a 20 20 20 26 26  eReg<iLast.   &&
2a7c0 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
2a7d0 65 67 3e 3d 69 46 69 72 73 74 0a 20 20 29 7b 0a  eg>=iFirst.  ){.
2a7e0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
2a7f0 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
2a800 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
2a810 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
2a820 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
2a830 5b 69 5d 3e 3d 69 46 69 72 73 74 20 26 26 20 70  [i]>=iFirst && p
2a840 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
2a850 69 5d 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20  i]<=iLast ){.   
2a860 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
2a870 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2a880 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1;.}.#endif /* S
2a890 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a     QLITE_DEBUG */.