/ Hex Artifact Content
Login

Artifact f433feeeaa43d52a4e029066a1af02bac9ed5f1a:


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 21 61  ;.  }else if( !a
1cf0: 66 66 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20  ff ){.    aff = 
1d00: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b  SQLITE_AFF_BLOB;
1d10: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66  .  }.  return af
1d20: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70  f;.}../*.** pExp
1d30: 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f  r is a compariso
1d40: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 65 67  n expression, eg
1d50: 2e 20 27 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e  . '=', '<', IN(.
1d60: 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f  ..) etc..** idx_
1d70: 61 66 66 69 6e 69 74 79 20 69 73 20 74 68 65 20  affinity is the 
1d80: 61 66 66 69 6e 69 74 79 20 6f 66 20 61 6e 20 69  affinity of an i
1d90: 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52  ndexed column. R
1da0: 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66  eturn true.** if
1db0: 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20   the index with 
1dc0: 61 66 66 69 6e 69 74 79 20 69 64 78 5f 61 66 66  affinity idx_aff
1dd0: 69 6e 69 74 79 20 6d 61 79 20 62 65 20 75 73 65  inity may be use
1de0: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a  d to implement.*
1df0: 2a 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * the comparison
1e00: 20 69 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e   in pExpr..*/.in
1e10: 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66  t sqlite3IndexAf
1e20: 66 69 6e 69 74 79 4f 6b 28 45 78 70 72 20 2a 70  finityOk(Expr *p
1e30: 45 78 70 72 2c 20 63 68 61 72 20 69 64 78 5f 61  Expr, char idx_a
1e40: 66 66 69 6e 69 74 79 29 7b 0a 20 20 63 68 61 72  ffinity){.  char
1e50: 20 61 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f   aff = compariso
1e60: 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  nAffinity(pExpr)
1e70: 3b 0a 20 20 73 77 69 74 63 68 28 20 61 66 66 20  ;.  switch( aff 
1e80: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
1e90: 54 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a 20 20 20  TE_AFF_BLOB:.   
1ea0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1eb0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46   case SQLITE_AFF
1ec0: 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 72 65 74  _TEXT:.      ret
1ed0: 75 72 6e 20 69 64 78 5f 61 66 66 69 6e 69 74 79  urn idx_affinity
1ee0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ==SQLITE_AFF_TEX
1ef0: 54 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  T;.    default:.
1f00: 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
1f10: 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66  ite3IsNumericAff
1f20: 69 6e 69 74 79 28 69 64 78 5f 61 66 66 69 6e 69  inity(idx_affini
1f30: 74 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ty);.  }.}../*.*
1f40: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 35 20  * Return the P5 
1f50: 76 61 6c 75 65 20 74 68 61 74 20 73 68 6f 75 6c  value that shoul
1f60: 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 61 20  d be used for a 
1f70: 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f  binary compariso
1f80: 6e 0a 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f  n.** opcode (OP_
1f90: 45 71 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29 20  Eq, OP_Ge etc.) 
1fa0: 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20  used to compare 
1fb0: 70 45 78 70 72 31 20 61 6e 64 20 70 45 78 70 72  pExpr1 and pExpr
1fc0: 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  2..*/.static u8 
1fd0: 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28  binaryCompareP5(
1fe0: 45 78 70 72 20 2a 70 45 78 70 72 31 2c 20 45 78  Expr *pExpr1, Ex
1ff0: 70 72 20 2a 70 45 78 70 72 32 2c 20 69 6e 74 20  pr *pExpr2, int 
2000: 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75  jumpIfNull){.  u
2010: 38 20 61 66 66 20 3d 20 28 63 68 61 72 29 73 71  8 aff = (char)sq
2020: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
2030: 79 28 70 45 78 70 72 32 29 3b 0a 20 20 61 66 66  y(pExpr2);.  aff
2040: 20 3d 20 28 75 38 29 73 71 6c 69 74 65 33 43 6f   = (u8)sqlite3Co
2050: 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45  mpareAffinity(pE
2060: 78 70 72 31 2c 20 61 66 66 29 20 7c 20 28 75 38  xpr1, aff) | (u8
2070: 29 6a 75 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72  )jumpIfNull;.  r
2080: 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a  eturn aff;.}../*
2090: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
20a0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c  nter to the coll
20b0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74  ation sequence t
20c0: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
20d0: 65 64 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72  ed by.** a binar
20e0: 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  y comparison ope
20f0: 72 61 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20  rator comparing 
2100: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
2110: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
2120: 65 66 74 20 68 61 6e 64 20 65 78 70 72 65 73 73  eft hand express
2130: 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74  ion has a collat
2140: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 79 70  ing sequence typ
2150: 65 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a  e, then it is.**
2160: 20 75 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65   used. Otherwise
2170: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
2180: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
2190: 72 69 67 68 74 20 68 61 6e 64 20 65 78 70 72 65  right hand expre
21a0: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64  ssion.** is used
21b0: 2c 20 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74  , or the default
21c0: 20 28 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69   (BINARY) if nei
21d0: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ther expression 
21e0: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a  has a collating.
21f0: 2a 2a 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41  ** type..**.** A
2200: 72 67 75 6d 65 6e 74 20 70 52 69 67 68 74 20 28  rgument pRight (
2210: 62 75 74 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d  but not pLeft) m
2220: 61 79 20 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69  ay be a null poi
2230: 6e 74 65 72 2e 20 49 6e 20 74 68 69 73 20 63 61  nter. In this ca
2240: 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  se,.** it is not
2250: 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a   considered..*/.
2260: 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33  CollSeq *sqlite3
2270: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
2280: 6c 53 65 71 28 0a 20 20 50 61 72 73 65 20 2a 70  lSeq(.  Parse *p
2290: 50 61 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a  Parse, .  Expr *
22a0: 70 4c 65 66 74 2c 20 0a 20 20 45 78 70 72 20 2a  pLeft, .  Expr *
22b0: 70 52 69 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c  pRight.){.  Coll
22c0: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73  Seq *pColl;.  as
22d0: 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20  sert( pLeft );. 
22e0: 20 69 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67   if( pLeft->flag
22f0: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29  s & EP_Collate )
2300: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
2310: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2320: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b  (pParse, pLeft);
2330: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69  .  }else if( pRi
2340: 67 68 74 20 26 26 20 28 70 52 69 67 68 74 2d 3e  ght && (pRight->
2350: 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61  flags & EP_Colla
2360: 74 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 43  te)!=0 ){.    pC
2370: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
2380: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
2390: 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73   pRight);.  }els
23a0: 65 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  e{.    pColl = s
23b0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
23c0: 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29  q(pParse, pLeft)
23d0: 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c  ;.    if( !pColl
23e0: 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20   ){.      pColl 
23f0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
2400: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69  lSeq(pParse, pRi
2410: 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ght);.    }.  }.
2420: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
2430: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
2440: 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d  e code for a com
2450: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
2460: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2470: 63 6f 64 65 43 6f 6d 70 61 72 65 28 0a 20 20 50  codeCompare(.  P
2480: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
2490: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
24a0: 28 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61  (and code genera
24b0: 74 69 6e 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f  ting) context */
24c0: 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20  .  Expr *pLeft, 
24d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74       /* The left
24e0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78   operand */.  Ex
24f0: 70 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20  pr *pRight,     
2500: 2f 2a 20 54 68 65 20 72 69 67 68 74 20 6f 70 65  /* The right ope
2510: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  rand */.  int op
2520: 63 6f 64 65 2c 20 20 20 20 20 20 20 2f 2a 20 54  code,       /* T
2530: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  he comparison op
2540: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  code */.  int in
2550: 31 2c 20 69 6e 74 20 69 6e 32 2c 20 2f 2a 20 52  1, int in2, /* R
2560: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
2570: 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 20 20 69 6e  operands */.  in
2580: 74 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20  t dest,         
2590: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
25a0: 74 72 75 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20  true.  */.  int 
25b0: 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a  jumpIfNull    /*
25c0: 20 49 66 20 74 72 75 65 2c 20 6a 75 6d 70 20 69   If true, jump i
25d0: 66 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64  f either operand
25e0: 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   is NULL */.){. 
25f0: 20 69 6e 74 20 70 35 3b 0a 20 20 69 6e 74 20 61   int p5;.  int a
2600: 64 64 72 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ddr;.  CollSeq *
2610: 70 34 3b 0a 0a 20 20 70 34 20 3d 20 73 71 6c 69  p4;..  p4 = sqli
2620: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
2630: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
2640: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a  pLeft, pRight);.
2650: 20 20 70 35 20 3d 20 62 69 6e 61 72 79 43 6f 6d    p5 = binaryCom
2660: 70 61 72 65 50 35 28 70 4c 65 66 74 2c 20 70 52  pareP5(pLeft, pR
2670: 69 67 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  ight, jumpIfNull
2680: 29 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69  );.  addr = sqli
2690: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 50  te3VdbeAddOp4(pP
26a0: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63  arse->pVdbe, opc
26b0: 6f 64 65 2c 20 69 6e 32 2c 20 64 65 73 74 2c 20  ode, in2, dest, 
26c0: 69 6e 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  in1,.           
26d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e0: 28 76 6f 69 64 2a 29 70 34 2c 20 50 34 5f 43 4f  (void*)p4, P4_CO
26f0: 4c 4c 53 45 51 29 3b 0a 20 20 73 71 6c 69 74 65  LLSEQ);.  sqlite
2700: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 70 50  3VdbeChangeP5(pP
2710: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 28 75 38  arse->pVdbe, (u8
2720: 29 70 35 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  )p5);.  return a
2730: 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ddr;.}../*.** Re
2740: 74 75 72 6e 20 74 72 75 65 20 69 66 20 65 78 70  turn true if exp
2750: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73  ression pExpr is
2760: 20 61 20 76 65 63 74 6f 72 2c 20 6f 72 20 66 61   a vector, or fa
2770: 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  lse otherwise..*
2780: 2a 0a 2a 2a 20 41 20 76 65 63 74 6f 72 20 69 73  *.** A vector is
2790: 20 64 65 66 69 6e 65 64 20 61 73 20 61 6e 79 20   defined as any 
27a0: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
27b0: 72 65 73 75 6c 74 73 20 69 6e 20 74 77 6f 20 6f  results in two o
27c0: 72 20 6d 6f 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e  r more.** column
27d0: 73 20 6f 66 20 72 65 73 75 6c 74 2e 20 20 45 76  s of result.  Ev
27e0: 65 72 79 20 54 4b 5f 56 45 43 54 4f 52 20 6e 6f  ery TK_VECTOR no
27f0: 64 65 20 69 73 20 61 6e 20 76 65 63 74 6f 72 20  de is an vector 
2800: 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 70  because the.** p
2810: 61 72 73 65 72 20 77 69 6c 6c 20 6e 6f 74 20 67  arser will not g
2820: 65 6e 65 72 61 74 65 20 61 20 54 4b 5f 56 45 43  enerate a TK_VEC
2830: 54 4f 52 20 77 69 74 68 20 66 65 77 65 72 20 74  TOR with fewer t
2840: 68 61 6e 20 74 77 6f 20 65 6e 74 72 69 65 73 2e  han two entries.
2850: 0a 2a 2a 20 42 75 74 20 61 20 54 4b 5f 53 45 4c  .** But a TK_SEL
2860: 45 43 54 20 6d 69 67 68 74 20 62 65 20 65 69 74  ECT might be eit
2870: 68 65 72 20 61 20 76 65 63 74 6f 72 20 6f 72 20  her a vector or 
2880: 61 20 73 63 61 6c 61 72 2e 20 49 74 20 69 73 20  a scalar. It is 
2890: 6f 6e 6c 79 0a 2a 2a 20 63 6f 6e 73 69 64 65 72  only.** consider
28a0: 65 64 20 61 20 76 65 63 74 6f 72 20 69 66 20 69  ed a vector if i
28b0: 74 20 68 61 73 20 74 77 6f 20 6f 72 20 6d 6f 72  t has two or mor
28c0: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  e result columns
28d0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
28e0: 45 78 70 72 49 73 56 65 63 74 6f 72 28 45 78 70  ExprIsVector(Exp
28f0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 72 65 74  r *pExpr){.  ret
2900: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 56  urn sqlite3ExprV
2910: 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 29  ectorSize(pExpr)
2920: 3e 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  >1;.}../*.** If 
2930: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
2940: 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
2950: 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6f 66  y argument is of
2960: 20 74 79 70 65 20 54 4b 5f 56 45 43 54 4f 52 20   type TK_VECTOR 
2970: 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e  .** return the n
2980: 75 6d 62 65 72 20 6f 66 20 65 78 70 72 65 73 73  umber of express
2990: 69 6f 6e 73 20 69 6e 20 74 68 65 20 76 65 63 74  ions in the vect
29a0: 6f 72 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 65  or. Or, if the e
29b0: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20  xpression.** is 
29c0: 61 20 73 75 62 2d 73 65 6c 65 63 74 2c 20 72 65  a sub-select, re
29d0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
29e0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
29f0: 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 46 6f  e sub-select. Fo
2a00: 72 0a 2a 2a 20 61 6e 79 20 6f 74 68 65 72 20 74  r.** any other t
2a10: 79 70 65 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ype of expressio
2a20: 6e 2c 20 72 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a  n, return 1..*/.
2a30: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 56  int sqlite3ExprV
2a40: 65 63 74 6f 72 53 69 7a 65 28 45 78 70 72 20 2a  ectorSize(Expr *
2a50: 70 45 78 70 72 29 7b 0a 20 20 75 38 20 6f 70 20  pExpr){.  u8 op 
2a60: 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69  = pExpr->op;.  i
2a70: 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  f( op==TK_REGIST
2a80: 45 52 20 29 20 6f 70 20 3d 20 70 45 78 70 72 2d  ER ) op = pExpr-
2a90: 3e 6f 70 32 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  >op2;.  if( op==
2aa0: 54 4b 5f 56 45 43 54 4f 52 20 29 7b 0a 20 20 20  TK_VECTOR ){.   
2ab0: 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 78   return pExpr->x
2ac0: 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  .pList->nExpr;. 
2ad0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54   }else if( op==T
2ae0: 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20  K_SELECT ){.    
2af0: 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e  return pExpr->x.
2b00: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
2b10: 3e 6e 45 78 70 72 3b 0a 20 20 7d 65 6c 73 65 7b  >nExpr;.  }else{
2b20: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
2b30: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
2b40: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
2b50: 52 59 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  RY./*.** Return 
2b60: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
2b70: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  ubexpression of 
2b80: 70 56 65 63 74 6f 72 20 74 68 61 74 20 69 73 20  pVector that is 
2b90: 74 68 65 20 69 2d 74 68 0a 2a 2a 20 63 6f 6c 75  the i-th.** colu
2ba0: 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72  mn of the vector
2bb0: 20 28 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74   (numbered start
2bc0: 69 6e 67 20 77 69 74 68 20 30 29 2e 20 20 54 68  ing with 0).  Th
2bd0: 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a  e caller must.**
2be0: 20 65 6e 73 75 72 65 20 74 68 61 74 20 69 20 69   ensure that i i
2bf0: 73 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 0a  s within range..
2c00: 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72  **.** If pVector
2c10: 20 69 73 20 72 65 61 6c 6c 79 20 61 20 73 63 61   is really a sca
2c20: 6c 61 72 20 28 61 6e 64 20 22 73 63 61 6c 61 72  lar (and "scalar
2c30: 22 20 68 65 72 65 20 69 6e 63 6c 75 64 65 73 20  " here includes 
2c40: 73 75 62 71 75 65 72 69 65 73 0a 2a 2a 20 74 68  subqueries.** th
2c50: 61 74 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67  at return a sing
2c60: 6c 65 20 63 6f 6c 75 6d 6e 21 29 20 74 68 65 6e  le column!) then
2c70: 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 20   return pVector 
2c80: 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  unmodified..**.*
2c90: 2a 20 70 56 65 63 74 6f 72 20 72 65 74 61 69 6e  * pVector retain
2ca0: 73 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74  s ownership of t
2cb0: 68 65 20 72 65 74 75 72 6e 65 64 20 73 75 62 65  he returned sube
2cc0: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
2cd0: 20 49 66 20 74 68 65 20 76 65 63 74 6f 72 20 69   If the vector i
2ce0: 73 20 61 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29  s a (SELECT ...)
2cf0: 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
2d00: 73 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 69 73  sion returned is
2d10: 0a 2a 2a 20 6a 75 73 74 20 74 68 65 20 65 78 70  .** just the exp
2d20: 72 65 73 73 69 6f 6e 20 66 6f 72 20 74 68 65 20  ression for the 
2d30: 69 2d 74 68 20 74 65 72 6d 20 6f 66 20 74 68 65  i-th term of the
2d40: 20 72 65 73 75 6c 74 20 73 65 74 2c 20 61 6e 64   result set, and
2d50: 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 62 65 20 72   may.** not be r
2d60: 65 61 64 79 20 66 6f 72 20 65 76 61 6c 75 61 74  eady for evaluat
2d70: 69 6f 6e 20 62 65 63 61 75 73 65 20 74 68 65 20  ion because the 
2d80: 74 61 62 6c 65 20 63 75 72 73 6f 72 20 68 61 73  table cursor has
2d90: 20 6e 6f 74 20 79 65 74 0a 2a 2a 20 62 65 65 6e   not yet.** been
2da0: 20 70 6f 73 69 74 69 6f 6e 65 64 2e 0a 2a 2f 0a   positioned..*/.
2db0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 56 65 63  Expr *sqlite3Vec
2dc0: 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
2dd0: 45 78 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 69  Expr *pVector, i
2de0: 6e 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28  nt i){.  assert(
2df0: 20 69 3c 73 71 6c 69 74 65 33 45 78 70 72 56 65   i<sqlite3ExprVe
2e00: 63 74 6f 72 53 69 7a 65 28 70 56 65 63 74 6f 72  ctorSize(pVector
2e10: 29 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ) );.  if( sqlit
2e20: 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
2e30: 56 65 63 74 6f 72 29 20 29 7b 0a 20 20 20 20 69  Vector) ){.    i
2e40: 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d  f( pVector->op==
2e50: 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20 20 7c  TK_SELECT.     |
2e60: 7c 20 28 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d  | (pVector->op==
2e70: 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70  TK_REGISTER && p
2e80: 56 65 63 74 6f 72 2d 3e 6f 70 32 3d 3d 54 4b 5f  Vector->op2==TK_
2e90: 53 45 4c 45 43 54 29 0a 20 20 20 20 29 7b 0a 20  SELECT).    ){. 
2ea0: 20 20 20 20 20 72 65 74 75 72 6e 20 70 56 65 63       return pVec
2eb0: 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  tor->x.pSelect->
2ec0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
2ed0: 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  pr;.    }else{. 
2ee0: 20 20 20 20 20 72 65 74 75 72 6e 20 70 56 65 63       return pVec
2ef0: 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  tor->x.pList->a[
2f00: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 0a  i].pExpr;.    }.
2f10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 56 65    }.  return pVe
2f20: 63 74 6f 72 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ctor;.}.#endif /
2f30: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
2f40: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
2f50: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
2f60: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
2f70: 59 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  Y./*.** Compute 
2f80: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 6e 65 77  and return a new
2f90: 20 45 78 70 72 20 6f 62 6a 65 63 74 20 77 68 69   Expr object whi
2fa0: 63 68 20 77 68 65 6e 20 70 61 73 73 65 64 20 74  ch when passed t
2fb0: 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72  o.** sqlite3Expr
2fc0: 43 6f 64 65 28 29 20 77 69 6c 6c 20 67 65 6e 65  Code() will gene
2fd0: 72 61 74 65 20 61 6c 6c 20 6e 65 63 65 73 73 61  rate all necessa
2fe0: 72 79 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75  ry code to compu
2ff0: 74 65 0a 2a 2a 20 74 68 65 20 69 46 69 65 6c 64  te.** the iField
3000: 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  -th column of th
3010: 65 20 76 65 63 74 6f 72 20 65 78 70 72 65 73 73  e vector express
3020: 69 6f 6e 20 70 56 65 63 74 6f 72 2e 0a 2a 2a 0a  ion pVector..**.
3030: 2a 2a 20 49 74 20 69 73 20 6f 6b 20 66 6f 72 20  ** It is ok for 
3040: 70 56 65 63 74 6f 72 20 74 6f 20 62 65 20 61 20  pVector to be a 
3050: 73 63 61 6c 61 72 20 28 61 73 20 6c 6f 6e 67 20  scalar (as long 
3060: 61 73 20 69 46 69 65 6c 64 3d 3d 30 29 2e 20 20  as iField==0).  
3070: 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63 61 73 65  .** In that case
3080: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  , this routine w
3090: 6f 72 6b 73 20 6c 69 6b 65 20 73 71 6c 69 74 65  orks like sqlite
30a0: 33 45 78 70 72 44 75 70 28 29 2e 0a 2a 2a 0a 2a  3ExprDup()..**.*
30b0: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6f 77 6e  * The caller own
30c0: 73 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 45  s the returned E
30d0: 78 70 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 69  xpr object and i
30e0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
30f0: 72 0a 2a 2a 20 65 6e 73 75 72 69 6e 67 20 74 68  r.** ensuring th
3100: 61 74 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  at the returned 
3110: 76 61 6c 75 65 20 65 76 65 6e 74 75 61 6c 6c 79  value eventually
3120: 20 67 65 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a   gets freed..**.
3130: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 72 65  ** The caller re
3140: 74 61 69 6e 73 20 6f 77 6e 65 72 73 68 69 70 20  tains ownership 
3150: 6f 66 20 70 56 65 63 74 6f 72 2e 20 20 49 66 20  of pVector.  If 
3160: 70 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b 5f  pVector is a TK_
3170: 53 45 4c 45 43 54 2c 0a 2a 2a 20 74 68 65 6e 20  SELECT,.** then 
3180: 74 68 65 20 72 65 74 75 72 6e 65 20 6f 62 6a 65  the returne obje
3190: 63 74 20 77 69 6c 6c 20 72 65 66 65 72 65 6e 63  ct will referenc
31a0: 65 20 70 56 65 63 74 6f 72 20 61 6e 64 20 73 6f  e pVector and so
31b0: 20 70 56 65 63 74 6f 72 20 6d 75 73 74 20 72 65   pVector must re
31c0: 6d 61 69 6e 0a 2a 2a 20 76 61 6c 69 64 20 66 6f  main.** valid fo
31d0: 72 20 74 68 65 20 6c 69 66 65 20 6f 66 20 74 68  r the life of th
31e0: 65 20 72 65 74 75 72 6e 65 64 20 6f 62 6a 65 63  e returned objec
31f0: 74 2e 20 20 49 66 20 70 56 65 63 74 6f 72 20 69  t.  If pVector i
3200: 73 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a  s a TK_VECTOR.**
3210: 20 6f 72 20 61 20 73 63 61 6c 61 72 20 65 78 70   or a scalar exp
3220: 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20 69 74  ression, then it
3230: 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 20   can be deleted 
3240: 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 69 73 20  as soon as this 
3250: 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
3260: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 69 63  ns..**.** A tric
3270: 6b 20 74 6f 20 63 61 75 73 65 20 61 20 54 4b 5f  k to cause a TK_
3280: 53 45 4c 45 43 54 20 70 56 65 63 74 6f 72 20 74  SELECT pVector t
3290: 6f 20 62 65 20 64 65 6c 65 74 65 64 20 74 6f 67  o be deleted tog
32a0: 65 74 68 65 72 20 77 69 74 68 0a 2a 2a 20 74 68  ether with.** th
32b0: 65 20 72 65 74 75 72 6e 65 64 20 45 78 70 72 20  e returned Expr 
32c0: 6f 62 6a 65 63 74 20 69 73 20 74 6f 20 61 74 74  object is to att
32d0: 61 63 68 20 74 68 65 20 70 56 65 63 74 6f 72 20  ach the pVector 
32e0: 74 6f 20 74 68 65 20 70 52 69 67 68 74 20 66 69  to the pRight fi
32f0: 65 6c 64 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65  eld.** of the re
3300: 74 75 72 6e 65 64 20 54 4b 5f 53 45 4c 45 43 54  turned TK_SELECT
3310: 5f 43 4f 4c 55 4d 4e 20 45 78 70 72 20 6f 62 6a  _COLUMN Expr obj
3320: 65 63 74 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ect..*/.Expr *sq
3330: 6c 69 74 65 33 45 78 70 72 46 6f 72 56 65 63 74  lite3ExprForVect
3340: 6f 72 46 69 65 6c 64 28 0a 20 20 50 61 72 73 65  orField(.  Parse
3350: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
3360: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
3370: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 56  xt */.  Expr *pV
3380: 65 63 74 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20  ector,       /* 
3390: 54 68 65 20 76 65 63 74 6f 72 2e 20 20 4c 69 73  The vector.  Lis
33a0: 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
33b0: 20 6f 72 20 61 20 73 75 62 2d 53 45 4c 45 43 54   or a sub-SELECT
33c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 65 6c 64   */.  int iField
33d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
33e0: 69 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ich column of th
33f0: 65 20 76 65 63 74 6f 72 20 74 6f 20 72 65 74 75  e vector to retu
3400: 72 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  rn */.){.  Expr 
3410: 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 56 65  *pRet;.  if( pVe
3420: 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  ctor->op==TK_SEL
3430: 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ECT ){.    asser
3440: 74 28 20 70 56 65 63 74 6f 72 2d 3e 66 6c 61 67  t( pVector->flag
3450: 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
3460: 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 54   );.    /* The T
3470: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
3480: 45 78 70 72 20 6e 6f 64 65 3a 0a 20 20 20 20 2a  Expr node:.    *
3490: 2a 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 3a 20  *.    ** pLeft: 
34a0: 20 20 20 20 20 20 20 20 20 20 70 56 65 63 74 6f            pVecto
34b0: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 54 4b 5f  r containing TK_
34c0: 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 70 52  SELECT.    ** pR
34d0: 69 67 68 74 3a 20 20 20 20 20 20 20 20 20 20 6e  ight:          n
34e0: 6f 74 20 75 73 65 64 2e 20 20 42 75 74 20 72 65  ot used.  But re
34f0: 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65  cursively delete
3500: 64 2e 0a 20 20 20 20 2a 2a 20 69 43 6f 6c 75 6d  d..    ** iColum
3510: 6e 3a 20 20 20 20 20 20 20 20 20 49 6e 64 65 78  n:         Index
3520: 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   of a column in 
3530: 70 56 65 63 74 6f 72 0a 20 20 20 20 2a 2a 20 70  pVector.    ** p
3540: 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3a 20 20 20  Left->iTable:   
3550: 46 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61  First in an arra
3560: 79 20 6f 66 20 72 65 67 69 73 74 65 72 20 68 6f  y of register ho
3570: 6c 64 69 6e 67 20 72 65 73 75 6c 74 2c 20 6f 72  lding result, or
3580: 20 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20   0.    **       
3590: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 74 68             if th
35a0: 65 20 72 65 73 75 6c 74 20 69 73 20 6e 6f 74 20  e result is not 
35b0: 79 65 74 20 63 6f 6d 70 75 74 65 64 2e 0a 20 20  yet computed..  
35c0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 71 6c 69    **.    ** sqli
35d0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 29 20  te3ExprDelete() 
35e0: 73 70 65 63 69 66 69 63 61 6c 6c 79 20 73 6b 69  specifically ski
35f0: 70 73 20 74 68 65 20 72 65 63 75 72 73 69 76 65  ps the recursive
3600: 20 64 65 6c 65 74 65 20 6f 66 0a 20 20 20 20 2a   delete of.    *
3610: 2a 20 70 4c 65 66 74 20 6f 6e 20 54 4b 5f 53 45  * pLeft on TK_SE
3620: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  LECT_COLUMN node
3630: 73 2e 20 20 42 75 74 20 70 52 69 67 68 74 20 69  s.  But pRight i
3640: 73 20 66 6f 6c 6c 6f 77 65 64 2c 20 73 6f 20 70  s followed, so p
3650: 56 65 63 74 6f 72 0a 20 20 20 20 2a 2a 20 63 61  Vector.    ** ca
3660: 6e 20 62 65 20 61 74 74 61 63 68 65 64 20 74 6f  n be attached to
3670: 20 70 52 69 67 68 74 20 74 6f 20 63 61 75 73 65   pRight to cause
3680: 20 74 68 69 73 20 6e 6f 64 65 20 74 6f 20 74 61   this node to ta
3690: 6b 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 0a  ke ownership of.
36a0: 20 20 20 20 2a 2a 20 70 56 65 63 74 6f 72 2e 20      ** pVector. 
36b0: 20 54 79 70 69 63 61 6c 6c 79 20 74 68 65 72 65   Typically there
36c0: 20 77 69 6c 6c 20 62 65 20 6d 75 6c 74 69 70 6c   will be multipl
36d0: 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  e TK_SELECT_COLU
36e0: 4d 4e 20 6e 6f 64 65 73 0a 20 20 20 20 2a 2a 20  MN nodes.    ** 
36f0: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 70 4c  with the same pL
3700: 65 66 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  eft pointer to t
3710: 68 65 20 70 56 65 63 74 6f 72 2c 20 62 75 74 20  he pVector, but 
3720: 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 6d  only one of them
3730: 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 6f 77 6e  .    ** will own
3740: 20 74 68 65 20 70 56 65 63 74 6f 72 2e 0a 20 20   the pVector..  
3750: 20 20 2a 2f 0a 20 20 20 20 70 52 65 74 20 3d 20    */.    pRet = 
3760: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
3770: 72 73 65 2c 20 54 4b 5f 53 45 4c 45 43 54 5f 43  rse, TK_SELECT_C
3780: 4f 4c 55 4d 4e 2c 20 30 2c 20 30 2c 20 30 29 3b  OLUMN, 0, 0, 0);
3790: 0a 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b  .    if( pRet ){
37a0: 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 69 43 6f  .      pRet->iCo
37b0: 6c 75 6d 6e 20 3d 20 69 46 69 65 6c 64 3b 0a 20  lumn = iField;. 
37c0: 20 20 20 20 20 70 52 65 74 2d 3e 70 4c 65 66 74       pRet->pLeft
37d0: 20 3d 20 70 56 65 63 74 6f 72 3b 0a 20 20 20 20   = pVector;.    
37e0: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  }.    assert( pR
37f0: 65 74 3d 3d 30 20 7c 7c 20 70 52 65 74 2d 3e 69  et==0 || pRet->i
3800: 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 7d 65  Table==0 );.  }e
3810: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 56 65  lse{.    if( pVe
3820: 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 45 43  ctor->op==TK_VEC
3830: 54 4f 52 20 29 20 70 56 65 63 74 6f 72 20 3d 20  TOR ) pVector = 
3840: 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74  pVector->x.pList
3850: 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70  ->a[iField].pExp
3860: 72 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71  r;.    pRet = sq
3870: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61  lite3ExprDup(pPa
3880: 72 73 65 2d 3e 64 62 2c 20 70 56 65 63 74 6f 72  rse->db, pVector
3890: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
38a0: 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69  rn pRet;.}.#endi
38b0: 66 20 2f 2a 20 21 64 65 66 69 6e 65 28 53 51 4c  f /* !define(SQL
38c0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
38d0: 59 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  Y) */../*.** If 
38e0: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
38f0: 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f 53   is of type TK_S
3900: 45 4c 45 43 54 2c 20 67 65 6e 65 72 61 74 65 20  ELECT, generate 
3910: 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
3920: 0a 2a 2a 20 69 74 2e 20 52 65 74 75 72 6e 20 74  .** it. Return t
3930: 68 65 20 72 65 67 69 73 74 65 72 20 69 6e 20 77  he register in w
3940: 68 69 63 68 20 74 68 65 20 72 65 73 75 6c 74 20  hich the result 
3950: 69 73 20 73 74 6f 72 65 64 20 28 6f 72 2c 20 69  is stored (or, i
3960: 66 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d 73 65  f the .** sub-se
3970: 6c 65 63 74 20 72 65 74 75 72 6e 73 20 6d 6f 72  lect returns mor
3980: 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d  e than one colum
3990: 6e 2c 20 74 68 65 20 66 69 72 73 74 20 69 6e 20  n, the first in 
39a0: 61 6e 20 61 72 72 61 79 0a 2a 2a 20 6f 66 20 72  an array.** of r
39b0: 65 67 69 73 74 65 72 73 20 69 6e 20 77 68 69 63  egisters in whic
39c0: 68 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  h the result is 
39d0: 73 74 6f 72 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 49  stored)..**.** I
39e0: 66 20 70 45 78 70 72 20 69 73 20 6e 6f 74 20 61  f pExpr is not a
39f0: 20 54 4b 5f 53 45 4c 45 43 54 20 65 78 70 72 65   TK_SELECT expre
3a00: 73 73 69 6f 6e 2c 20 72 65 74 75 72 6e 20 30 2e  ssion, return 0.
3a10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
3a20: 78 70 72 43 6f 64 65 53 75 62 73 65 6c 65 63 74  xprCodeSubselect
3a30: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
3a40: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
3a50: 69 6e 74 20 72 65 67 20 3d 20 30 3b 0a 23 69 66  int reg = 0;.#if
3a60: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3a70: 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20  _SUBQUERY.  if( 
3a80: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
3a90: 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65 67 20  LECT ){.    reg 
3aa0: 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62  = sqlite3CodeSub
3ab0: 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
3ac0: 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  Expr, 0, 0);.  }
3ad0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
3ae0: 20 72 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41   reg;.}../*.** A
3af0: 72 67 75 6d 65 6e 74 20 70 56 65 63 74 6f 72 20  rgument pVector 
3b00: 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 65 63 74  points to a vect
3b10: 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 2d 20  or expression - 
3b20: 65 69 74 68 65 72 20 61 20 54 4b 5f 56 45 43 54  either a TK_VECT
3b30: 4f 52 0a 2a 2a 20 6f 72 20 54 4b 5f 53 45 4c 45  OR.** or TK_SELE
3b40: 43 54 20 74 68 61 74 20 72 65 74 75 72 6e 73 20  CT that returns 
3b50: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f  more than one co
3b60: 6c 75 6d 6e 2e 20 54 68 69 73 20 66 75 6e 63 74  lumn. This funct
3b70: 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74  ion returns.** t
3b80: 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  he register numb
3b90: 65 72 20 6f 66 20 61 20 72 65 67 69 73 74 65 72  er of a register
3ba0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
3bb0: 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65  he value of.** e
3bc0: 6c 65 6d 65 6e 74 20 69 46 69 65 6c 64 20 6f 66  lement iField of
3bd0: 20 74 68 65 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a   the vector..**.
3be0: 2a 2a 20 49 66 20 70 56 65 63 74 6f 72 20 69 73  ** If pVector is
3bf0: 20 61 20 54 4b 5f 53 45 4c 45 43 54 20 65 78 70   a TK_SELECT exp
3c00: 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20 63 6f  ression, then co
3c10: 64 65 20 66 6f 72 20 69 74 20 6d 75 73 74 20 68  de for it must h
3c20: 61 76 65 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20  ave .** already 
3c30: 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 20 75  been generated u
3c40: 73 69 6e 67 20 74 68 65 20 65 78 70 72 43 6f 64  sing the exprCod
3c50: 65 53 75 62 73 65 6c 65 63 74 28 29 20 72 6f 75  eSubselect() rou
3c60: 74 69 6e 65 2e 20 49 6e 20 74 68 69 73 0a 2a 2a  tine. In this.**
3c70: 20 63 61 73 65 20 70 61 72 61 6d 65 74 65 72 20   case parameter 
3c80: 72 65 67 53 65 6c 65 63 74 20 73 68 6f 75 6c 64  regSelect should
3c90: 20 62 65 20 74 68 65 20 66 69 72 73 74 20 69 6e   be the first in
3ca0: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   an array of reg
3cb0: 69 73 74 65 72 73 0a 2a 2a 20 63 6f 6e 74 61 69  isters.** contai
3cc0: 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73  ning the results
3cd0: 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65   of the sub-sele
3ce0: 63 74 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56  ct. .**.** If pV
3cf0: 65 63 74 6f 72 20 69 73 20 6f 66 20 74 79 70 65  ector is of type
3d00: 20 54 4b 5f 56 45 43 54 4f 52 2c 20 74 68 65 6e   TK_VECTOR, then
3d10: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 72 65   code for the re
3d20: 71 75 65 73 74 65 64 20 66 69 65 6c 64 0a 2a 2a  quested field.**
3d30: 20 69 73 20 67 65 6e 65 72 61 74 65 64 2e 20 49   is generated. I
3d40: 6e 20 74 68 69 73 20 63 61 73 65 20 28 2a 70 52  n this case (*pR
3d50: 65 67 46 72 65 65 29 20 6d 61 79 20 62 65 20 73  egFree) may be s
3d60: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
3d70: 20 6f 66 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61   of.** a tempora
3d80: 72 79 20 72 65 67 69 73 74 65 72 20 74 6f 20 62  ry register to b
3d90: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
3da0: 61 6c 6c 65 72 20 62 65 66 6f 72 65 20 72 65 74  aller before ret
3db0: 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 42 65  urning..**.** Be
3dc0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
3dd0: 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  output parameter
3de0: 20 28 2a 70 70 45 78 70 72 29 20 69 73 20 73 65   (*ppExpr) is se
3df0: 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
3e00: 65 0a 2a 2a 20 45 78 70 72 20 6f 62 6a 65 63 74  e.** Expr object
3e10: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
3e20: 6f 20 65 6c 65 6d 65 6e 74 20 69 45 6c 65 6d 20  o element iElem 
3e30: 6f 66 20 74 68 65 20 76 65 63 74 6f 72 2e 0a 2a  of the vector..*
3e40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
3e50: 72 56 65 63 74 6f 72 52 65 67 69 73 74 65 72 28  rVectorRegister(
3e60: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
3e70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3e80: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
3e90: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
3ea0: 56 65 63 74 6f 72 2c 20 20 20 20 20 20 20 20 20  Vector,         
3eb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65 63 74           /* Vect
3ec0: 6f 72 20 74 6f 20 65 78 74 72 61 63 74 20 65 6c  or to extract el
3ed0: 65 6d 65 6e 74 20 66 72 6f 6d 20 2a 2f 0a 20 20  ement from */.  
3ee0: 69 6e 74 20 69 46 69 65 6c 64 2c 20 20 20 20 20  int iField,     
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f00: 2f 2a 20 46 69 65 6c 64 20 74 6f 20 65 78 74 72  /* Field to extr
3f10: 61 63 74 20 66 72 6f 6d 20 70 56 65 63 74 6f 72  act from pVector
3f20: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 53 65 6c   */.  int regSel
3f30: 65 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ect,            
3f40: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 69        /* First i
3f50: 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73  n array of regis
3f60: 74 65 72 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ters */.  Expr *
3f70: 2a 70 70 45 78 70 72 2c 20 20 20 20 20 20 20 20  *ppExpr,        
3f80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
3f90: 3a 20 45 78 70 72 65 73 73 69 6f 6e 20 65 6c 65  : Expression ele
3fa0: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ment */.  int *p
3fb0: 52 65 67 46 72 65 65 20 20 20 20 20 20 20 20 20  RegFree         
3fc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
3fd0: 3a 20 54 65 6d 70 20 72 65 67 69 73 74 65 72 20  : Temp register 
3fe0: 74 6f 20 66 72 65 65 20 2a 2f 0a 29 7b 0a 20 20  to free */.){.  
3ff0: 75 38 20 6f 70 20 3d 20 70 56 65 63 74 6f 72 2d  u8 op = pVector-
4000: 3e 6f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  >op;.  assert( o
4010: 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 7c 7c 20  p==TK_VECTOR || 
4020: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 7c 7c  op==TK_SELECT ||
4030: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
4040: 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   );.  if( op==TK
4050: 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20  _REGISTER ){.   
4060: 20 2a 70 70 45 78 70 72 20 3d 20 73 71 6c 69 74   *ppExpr = sqlit
4070: 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62  e3VectorFieldSub
4080: 65 78 70 72 28 70 56 65 63 74 6f 72 2c 20 69 46  expr(pVector, iF
4090: 69 65 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72  ield);.    retur
40a0: 6e 20 70 56 65 63 74 6f 72 2d 3e 69 54 61 62 6c  n pVector->iTabl
40b0: 65 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20  e+iField;.  }.  
40c0: 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  if( op==TK_SELEC
40d0: 54 20 29 7b 0a 20 20 20 20 2a 70 70 45 78 70 72  T ){.    *ppExpr
40e0: 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 53   = pVector->x.pS
40f0: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  elect->pEList->a
4100: 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70 72 3b 0a  [iField].pExpr;.
4110: 20 20 20 20 20 72 65 74 75 72 6e 20 72 65 67 53       return regS
4120: 65 6c 65 63 74 2b 69 46 69 65 6c 64 3b 0a 20 20  elect+iField;.  
4130: 7d 0a 20 20 2a 70 70 45 78 70 72 20 3d 20 70 56  }.  *ppExpr = pV
4140: 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  ector->x.pList->
4150: 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70 72 3b  a[iField].pExpr;
4160: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
4170: 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
4180: 61 72 73 65 2c 20 2a 70 70 45 78 70 72 2c 20 70  arse, *ppExpr, p
4190: 52 65 67 46 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a  RegFree);.}../*.
41a0: 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70 45  ** Expression pE
41b0: 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69  xpr is a compari
41c0: 73 6f 6e 20 62 65 74 77 65 65 6e 20 74 77 6f 20  son between two 
41d0: 76 65 63 74 6f 72 20 76 61 6c 75 65 73 2e 20 43  vector values. C
41e0: 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 72 65  ompute.** the re
41f0: 73 75 6c 74 20 6f 66 20 74 68 65 20 63 6f 6d 70  sult of the comp
4200: 61 72 69 73 6f 6e 20 28 31 2c 20 30 2c 20 6f 72  arison (1, 0, or
4210: 20 4e 55 4c 4c 29 20 61 6e 64 20 77 72 69 74 65   NULL) and write
4220: 20 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c 74 20   that.** result 
4230: 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 64 65  into register de
4240: 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  st..**.** The ca
4250: 6c 6c 65 72 20 6d 75 73 74 20 73 61 74 69 73 66  ller must satisf
4260: 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
4270: 70 72 65 63 6f 6e 64 69 74 69 6f 6e 73 3a 0a 2a  preconditions:.*
4280: 2a 0a 2a 2a 20 20 20 20 69 66 20 70 45 78 70 72  *.**    if pExpr
4290: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 3a 20 20 20 20  ->op==TK_IS:    
42a0: 20 20 6f 70 3d 3d 54 4b 5f 45 51 20 61 6e 64 20    op==TK_EQ and 
42b0: 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  p5==SQLITE_NULLE
42c0: 51 0a 2a 2a 20 20 20 20 69 66 20 70 45 78 70 72  Q.**    if pExpr
42d0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 3a 20  ->op==TK_ISNOT: 
42e0: 20 20 6f 70 3d 3d 54 4b 5f 4e 45 20 61 6e 64 20    op==TK_NE and 
42f0: 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  p5==SQLITE_NULLE
4300: 51 0a 2a 2a 20 20 20 20 6f 74 68 65 72 77 69 73  Q.**    otherwis
4310: 65 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e:              
4320: 20 20 6f 70 3d 3d 70 45 78 70 72 2d 3e 6f 70 20    op==pExpr->op 
4330: 61 6e 64 20 70 35 3d 3d 30 0a 2a 2f 0a 73 74 61  and p5==0.*/.sta
4340: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 56 65 63  tic void codeVec
4350: 74 6f 72 43 6f 6d 70 61 72 65 28 0a 20 20 50 61  torCompare(.  Pa
4360: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4370: 20 20 20 20 2f 2a 20 43 6f 64 65 20 67 65 6e 65      /* Code gene
4380: 72 61 74 6f 72 20 63 6f 6e 74 65 78 74 20 2a 2f  rator context */
4390: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
43a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
43b0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
43c0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65  tion */.  int de
43d0: 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
43e0: 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74 73  /* Write results
43f0: 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73   into this regis
4400: 74 65 72 20 2a 2f 0a 20 20 75 38 20 6f 70 2c 20  ter */.  u8 op, 
4410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4420: 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  * Comparison ope
4430: 72 61 74 6f 72 20 2a 2f 0a 20 20 75 38 20 70 35  rator */.  u8 p5
4440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4450: 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45   /* SQLITE_NULLE
4460: 51 20 6f 72 20 7a 65 72 6f 20 2a 2f 0a 29 7b 0a  Q or zero */.){.
4470: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
4480: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 45 78 70  se->pVdbe;.  Exp
4490: 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
44a0: 2d 3e 70 4c 65 66 74 3b 0a 20 20 45 78 70 72 20  ->pLeft;.  Expr 
44b0: 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  *pRight = pExpr-
44c0: 3e 70 52 69 67 68 74 3b 0a 20 20 69 6e 74 20 6e  >pRight;.  int n
44d0: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
44e0: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65  prVectorSize(pLe
44f0: 66 74 29 3b 0a 20 20 69 6e 74 20 6e 52 69 67 68  ft);.  int nRigh
4500: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  t = sqlite3ExprV
4510: 65 63 74 6f 72 53 69 7a 65 28 70 52 69 67 68 74  ectorSize(pRight
4520: 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
4530: 68 61 74 20 62 6f 74 68 20 73 69 64 65 73 20 6f  hat both sides o
4540: 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
4550: 20 61 72 65 20 76 65 63 74 6f 72 73 2c 20 61 6e   are vectors, an
4560: 64 20 74 68 61 74 0a 20 20 2a 2a 20 62 6f 74 68  d that.  ** both
4570: 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 6c 65   are the same le
4580: 6e 67 74 68 2e 20 20 2a 2f 0a 20 20 69 66 28 20  ngth.  */.  if( 
4590: 6e 4c 65 66 74 21 3d 6e 52 69 67 68 74 20 29 7b  nLeft!=nRight ){
45a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
45b0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72 6f  rMsg(pParse, "ro
45c0: 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22  w value misused"
45d0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
45e0: 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 72  int i;.    int r
45f0: 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20  egLeft = 0;.    
4600: 69 6e 74 20 72 65 67 52 69 67 68 74 20 3d 20 30  int regRight = 0
4610: 3b 0a 20 20 20 20 75 38 20 6f 70 78 20 3d 20 6f  ;.    u8 opx = o
4620: 70 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 44  p;.    int addrD
4630: 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  one = sqlite3Vdb
4640: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
4650: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
4660: 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20  r->op==TK_EQ || 
4670: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45  pExpr->op==TK_NE
4680: 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45   .         || pE
4690: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c  xpr->op==TK_IS |
46a0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
46b0: 49 53 4e 4f 54 20 0a 20 20 20 20 20 20 20 20 20  ISNOT .         
46c0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
46d0: 5f 4c 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _LT || pExpr->op
46e0: 3d 3d 54 4b 5f 47 54 20 0a 20 20 20 20 20 20 20  ==TK_GT .       
46f0: 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d    || pExpr->op==
4700: 54 4b 5f 4c 45 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_LE || pExpr->
4710: 6f 70 3d 3d 54 4b 5f 47 45 20 0a 20 20 20 20 29  op==TK_GE .    )
4720: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
4730: 78 70 72 2d 3e 6f 70 3d 3d 6f 70 20 7c 7c 20 28  xpr->op==op || (
4740: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
4750: 20 26 26 20 6f 70 3d 3d 54 4b 5f 45 51 29 0a 20   && op==TK_EQ). 
4760: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
4770: 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  (pExpr->op==TK_I
4780: 53 4e 4f 54 20 26 26 20 6f 70 3d 3d 54 4b 5f 4e  SNOT && op==TK_N
4790: 45 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  E) );.    assert
47a0: 28 20 70 35 3d 3d 30 20 7c 7c 20 70 45 78 70 72  ( p5==0 || pExpr
47b0: 2d 3e 6f 70 21 3d 6f 70 20 29 3b 0a 20 20 20 20  ->op!=op );.    
47c0: 61 73 73 65 72 74 28 20 70 35 3d 3d 53 51 4c 49  assert( p5==SQLI
47d0: 54 45 5f 4e 55 4c 4c 45 51 20 7c 7c 20 70 45 78  TE_NULLEQ || pEx
47e0: 70 72 2d 3e 6f 70 3d 3d 6f 70 20 29 3b 0a 0a 20  pr->op==op );.. 
47f0: 20 20 20 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f     p5 |= SQLITE_
4800: 53 54 4f 52 45 50 32 3b 0a 20 20 20 20 69 66 28  STOREP2;.    if(
4810: 20 6f 70 78 3d 3d 54 4b 5f 4c 45 20 29 20 6f 70   opx==TK_LE ) op
4820: 78 20 3d 20 54 4b 5f 4c 54 3b 0a 20 20 20 20 69  x = TK_LT;.    i
4830: 66 28 20 6f 70 78 3d 3d 54 4b 5f 47 45 20 29 20  f( opx==TK_GE ) 
4840: 6f 70 78 20 3d 20 54 4b 5f 47 54 3b 0a 0a 20 20  opx = TK_GT;..  
4850: 20 20 72 65 67 4c 65 66 74 20 3d 20 65 78 70 72    regLeft = expr
4860: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
4870: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
4880: 20 20 72 65 67 52 69 67 68 74 20 3d 20 65 78 70    regRight = exp
4890: 72 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  rCodeSubselect(p
48a0: 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a  Parse, pRight);.
48b0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
48c0: 6e 4c 65 66 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  nLeft; i++){.   
48d0: 20 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20     int regFree1 
48e0: 3d 20 30 2c 20 72 65 67 46 72 65 65 32 20 3d 20  = 0, regFree2 = 
48f0: 30 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  0;.      Expr *p
4900: 4c 2c 20 2a 70 52 3b 20 0a 20 20 20 20 20 20 69  L, *pR; .      i
4910: 6e 74 20 72 31 2c 20 72 32 3b 0a 20 20 20 20 20  nt r1, r2;.     
4920: 20 69 66 28 20 69 3e 30 20 29 20 73 71 6c 69 74   if( i>0 ) sqlit
4930: 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
4940: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72  pParse);.      r
4950: 31 20 3d 20 65 78 70 72 56 65 63 74 6f 72 52 65  1 = exprVectorRe
4960: 67 69 73 74 65 72 28 70 50 61 72 73 65 2c 20 70  gister(pParse, p
4970: 4c 65 66 74 2c 20 69 2c 20 72 65 67 4c 65 66 74  Left, i, regLeft
4980: 2c 20 26 70 4c 2c 20 26 72 65 67 46 72 65 65 31  , &pL, &regFree1
4990: 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 65 78  );.      r2 = ex
49a0: 70 72 56 65 63 74 6f 72 52 65 67 69 73 74 65 72  prVectorRegister
49b0: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
49c0: 20 69 2c 20 72 65 67 52 69 67 68 74 2c 20 26 70   i, regRight, &p
49d0: 52 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  R, &regFree2);. 
49e0: 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
49f0: 28 70 50 61 72 73 65 2c 20 70 4c 2c 20 70 52 2c  (pParse, pL, pR,
4a00: 20 6f 70 78 2c 20 72 31 2c 20 72 32 2c 20 64 65   opx, r1, r2, de
4a10: 73 74 2c 20 70 35 29 3b 0a 20 20 20 20 20 20 74  st, p5);.      t
4a20: 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
4a30: 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
4a40: 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  If(v,op==OP_Lt);
4a50: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
4a60: 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65  op==OP_Le); Vdbe
4a70: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
4a80: 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 74  =OP_Le);.      t
4a90: 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
4aa0: 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
4ab0: 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b  If(v,op==OP_Gt);
4ac0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
4ad0: 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65  op==OP_Ge); Vdbe
4ae0: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
4af0: 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 74  =OP_Ge);.      t
4b00: 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45  estcase(op==OP_E
4b10: 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  q); VdbeCoverage
4b20: 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b  If(v,op==OP_Eq);
4b30: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
4b40: 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65  op==OP_Ne); Vdbe
4b50: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
4b60: 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 73  =OP_Ne);.      s
4b70: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
4b80: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
4b90: 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71  Free1);.      sq
4ba0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
4bb0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
4bc0: 72 65 65 32 29 3b 0a 20 20 20 20 20 20 69 66 28  ree2);.      if(
4bd0: 20 69 3e 30 20 29 20 73 71 6c 69 74 65 33 45 78   i>0 ) sqlite3Ex
4be0: 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
4bf0: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d  e);.      if( i=
4c00: 3d 6e 4c 65 66 74 2d 31 20 29 7b 0a 20 20 20 20  =nLeft-1 ){.    
4c10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4c20: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6f 70 78   }.      if( opx
4c30: 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20 20  ==TK_EQ ){.     
4c40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4c50: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp2(v, OP_IfNot
4c60: 2c 20 64 65 73 74 2c 20 61 64 64 72 44 6f 6e 65  , dest, addrDone
4c70: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
4c80: 76 29 3b 0a 20 20 20 20 20 20 20 20 70 35 20 7c  v);.        p5 |
4c90: 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c  = SQLITE_KEEPNUL
4ca0: 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  L;.      }else i
4cb0: 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20 29 7b  f( opx==TK_NE ){
4cc0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4cd0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4ce0: 5f 49 66 2c 20 64 65 73 74 2c 20 61 64 64 72 44  _If, dest, addrD
4cf0: 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  one); VdbeCovera
4d00: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 70  ge(v);.        p
4d10: 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50  5 |= SQLITE_KEEP
4d20: 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73  NULL;.      }els
4d30: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
4d40: 74 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20  t( op==TK_LT || 
4d50: 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d  op==TK_GT || op=
4d60: 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 54 4b  =TK_LE || op==TK
4d70: 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 20 20 73  _GE );.        s
4d80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
4d90: 28 76 2c 20 4f 50 5f 45 6c 73 65 4e 6f 74 45 71  (v, OP_ElseNotEq
4da0: 2c 20 30 2c 20 61 64 64 72 44 6f 6e 65 29 3b 0a  , 0, addrDone);.
4db0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
4dc0: 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
4dd0: 5f 4c 54 29 3b 0a 20 20 20 20 20 20 20 20 56 64  _LT);.        Vd
4de0: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
4df0: 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a 20 20 20 20  op==TK_GT);.    
4e00: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
4e10: 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 45 29  If(v, op==TK_LE)
4e20: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
4e30: 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
4e40: 54 4b 5f 47 45 29 3b 0a 20 20 20 20 20 20 20 20  TK_GE);.        
4e50: 69 66 28 20 69 3d 3d 6e 4c 65 66 74 2d 32 20 29  if( i==nLeft-2 )
4e60: 20 6f 70 78 20 3d 20 6f 70 3b 0a 20 20 20 20 20   opx = op;.     
4e70: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
4e80: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
4e90: 61 62 65 6c 28 76 2c 20 61 64 64 72 44 6f 6e 65  abel(v, addrDone
4ea0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 53 51  );.  }.}..#if SQ
4eb0: 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
4ec0: 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 65 63  PTH>0./*.** Chec
4ed0: 6b 20 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20  k that argument 
4ee0: 6e 48 65 69 67 68 74 20 69 73 20 6c 65 73 73 20  nHeight is less 
4ef0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
4f00: 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20   the maximum.** 
4f10: 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68  expression depth
4f20: 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20 69 74 20   allowed. If it 
4f30: 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65 20 61 6e  is not, leave an
4f40: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
4f50: 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  n.** pParse..*/.
4f60: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
4f70: 68 65 63 6b 48 65 69 67 68 74 28 50 61 72 73 65  heckHeight(Parse
4f80: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 48   *pParse, int nH
4f90: 65 69 67 68 74 29 7b 0a 20 20 69 6e 74 20 72 63  eight){.  int rc
4fa0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
4fb0: 69 6e 74 20 6d 78 48 65 69 67 68 74 20 3d 20 70  int mxHeight = p
4fc0: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69  Parse->db->aLimi
4fd0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45  t[SQLITE_LIMIT_E
4fe0: 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20 20 69 66  XPR_DEPTH];.  if
4ff0: 28 20 6e 48 65 69 67 68 74 3e 6d 78 48 65 69 67  ( nHeight>mxHeig
5000: 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ht ){.    sqlite
5010: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
5020: 2c 20 0a 20 20 20 20 20 20 20 22 45 78 70 72 65  , .       "Expre
5030: 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20 74 6f  ssion tree is to
5040: 6f 20 6c 61 72 67 65 20 28 6d 61 78 69 6d 75 6d  o large (maximum
5050: 20 64 65 70 74 68 20 25 64 29 22 2c 20 6d 78 48   depth %d)", mxH
5060: 65 69 67 68 74 0a 20 20 20 20 29 3b 0a 20 20 20  eight.    );.   
5070: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
5080: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
5090: 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 66   rc;.}../* The f
50a0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 66  ollowing three f
50b0: 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69 67 68 74  unctions, height
50c0: 4f 66 45 78 70 72 28 29 2c 20 68 65 69 67 68 74  OfExpr(), height
50d0: 4f 66 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a 20  OfExprList().** 
50e0: 61 6e 64 20 68 65 69 67 68 74 4f 66 53 65 6c 65  and heightOfSele
50f0: 63 74 28 29 2c 20 61 72 65 20 75 73 65 64 20 74  ct(), are used t
5100: 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
5110: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 0a 2a  maximum height.*
5120: 2a 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73  * of any express
5130: 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e  ion tree referen
5140: 63 65 64 20 62 79 20 74 68 65 20 73 74 72 75 63  ced by the struc
5150: 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20 74  ture passed as t
5160: 68 65 0a 2a 2a 20 66 69 72 73 74 20 61 72 67 75  he.** first argu
5170: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ment..**.** If t
5180: 68 69 73 20 6d 61 78 69 6d 75 6d 20 68 65 69 67  his maximum heig
5190: 68 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ht is greater th
51a0: 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  an the current v
51b0: 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a 2a 2a 20  alue pointed.** 
51c0: 74 6f 20 62 79 20 70 6e 48 65 69 67 68 74 2c 20  to by pnHeight, 
51d0: 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
51e0: 65 74 65 72 2c 20 74 68 65 6e 20 73 65 74 20 2a  eter, then set *
51f0: 70 6e 48 65 69 67 68 74 20 74 6f 20 74 68 61 74  pnHeight to that
5200: 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  .** value..*/.st
5210: 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74  atic void height
5220: 4f 66 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20  OfExpr(Expr *p, 
5230: 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a  int *pnHeight){.
5240: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
5250: 66 28 20 70 2d 3e 6e 48 65 69 67 68 74 3e 2a 70  f( p->nHeight>*p
5260: 6e 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20 20  nHeight ){.     
5270: 20 2a 70 6e 48 65 69 67 68 74 20 3d 20 70 2d 3e   *pnHeight = p->
5280: 6e 48 65 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20  nHeight;.    }. 
5290: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
52a0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
52b0: 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69  t(ExprList *p, i
52c0: 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20  nt *pnHeight){. 
52d0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e   if( p ){.    in
52e0: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
52f0: 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b  ; i<p->nExpr; i+
5300: 2b 29 7b 0a 20 20 20 20 20 20 68 65 69 67 68 74  +){.      height
5310: 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69 5d 2e 70  OfExpr(p->a[i].p
5320: 45 78 70 72 2c 20 70 6e 48 65 69 67 68 74 29 3b  Expr, pnHeight);
5330: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61  .    }.  }.}.sta
5340: 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f  tic void heightO
5350: 66 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a  fSelect(Select *
5360: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
5370: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
5380: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
5390: 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48 65 69 67  ->pWhere, pnHeig
53a0: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
53b0: 66 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67  fExpr(p->pHaving
53c0: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
53d0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
53e0: 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65 69 67 68  >pLimit, pnHeigh
53f0: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
5400: 45 78 70 72 28 70 2d 3e 70 4f 66 66 73 65 74 2c  Expr(p->pOffset,
5410: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
5420: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
5430: 28 70 2d 3e 70 45 4c 69 73 74 2c 20 70 6e 48 65  (p->pEList, pnHe
5440: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
5450: 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  tOfExprList(p->p
5460: 47 72 6f 75 70 42 79 2c 20 70 6e 48 65 69 67 68  GroupBy, pnHeigh
5470: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
5480: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64  ExprList(p->pOrd
5490: 65 72 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b  erBy, pnHeight);
54a0: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c  .    heightOfSel
54b0: 65 63 74 28 70 2d 3e 70 50 72 69 6f 72 2c 20 70  ect(p->pPrior, p
54c0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a  nHeight);.  }.}.
54d0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45  ./*.** Set the E
54e0: 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72 69  xpr.nHeight vari
54f0: 61 62 6c 65 20 69 6e 20 74 68 65 20 73 74 72 75  able in the stru
5500: 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20  cture passed as 
5510: 61 6e 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  an .** argument.
5520: 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 77   An expression w
5530: 69 74 68 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2c  ith no children,
5540: 20 45 78 70 72 2e 70 4c 69 73 74 20 6f 72 20 0a   Expr.pList or .
5550: 2a 2a 20 45 78 70 72 2e 70 53 65 6c 65 63 74 20  ** Expr.pSelect 
5560: 6d 65 6d 62 65 72 20 68 61 73 20 61 20 68 65 69  member has a hei
5570: 67 68 74 20 6f 66 20 31 2e 20 41 6e 79 20 6f 74  ght of 1. Any ot
5580: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  her expression.*
5590: 2a 20 68 61 73 20 61 20 68 65 69 67 68 74 20 65  * has a height e
55a0: 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78 69  qual to the maxi
55b0: 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e  mum height of an
55c0: 79 20 6f 74 68 65 72 20 0a 2a 2a 20 72 65 66 65  y other .** refe
55d0: 72 65 6e 63 65 64 20 45 78 70 72 20 70 6c 75 73  renced Expr plus
55e0: 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f   one..**.** Also
55f0: 20 70 72 6f 70 61 67 61 74 65 20 45 50 5f 50 72   propagate EP_Pr
5600: 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20 75 70  opagate flags up
5610: 20 66 72 6f 6d 20 45 78 70 72 2e 78 2e 70 4c 69   from Expr.x.pLi
5620: 73 74 20 74 6f 20 45 78 70 72 2e 66 6c 61 67 73  st to Expr.flags
5630: 2c 0a 2a 2a 20 69 66 20 61 70 70 72 6f 70 72 69  ,.** if appropri
5640: 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ate..*/.static v
5650: 6f 69 64 20 65 78 70 72 53 65 74 48 65 69 67 68  oid exprSetHeigh
5660: 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e  t(Expr *p){.  in
5670: 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20  t nHeight = 0;. 
5680: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
5690: 3e 70 4c 65 66 74 2c 20 26 6e 48 65 69 67 68 74  >pLeft, &nHeight
56a0: 29 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70  );.  heightOfExp
56b0: 72 28 70 2d 3e 70 52 69 67 68 74 2c 20 26 6e 48  r(p->pRight, &nH
56c0: 65 69 67 68 74 29 3b 0a 20 20 69 66 28 20 45 78  eight);.  if( Ex
56d0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
56e0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
56f0: 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53 65  {.    heightOfSe
5700: 6c 65 63 74 28 70 2d 3e 78 2e 70 53 65 6c 65 63  lect(p->x.pSelec
5710: 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, &nHeight);.  
5720: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 78 2e 70  }else if( p->x.p
5730: 4c 69 73 74 20 29 7b 0a 20 20 20 20 68 65 69 67  List ){.    heig
5740: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
5750: 78 2e 70 4c 69 73 74 2c 20 26 6e 48 65 69 67 68  x.pList, &nHeigh
5760: 74 29 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73  t);.    p->flags
5770: 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65   |= EP_Propagate
5780: 20 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   & sqlite3ExprLi
5790: 73 74 46 6c 61 67 73 28 70 2d 3e 78 2e 70 4c 69  stFlags(p->x.pLi
57a0: 73 74 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48  st);.  }.  p->nH
57b0: 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68 74 20  eight = nHeight 
57c0: 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  + 1;.}../*.** Se
57d0: 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67  t the Expr.nHeig
57e0: 68 74 20 76 61 72 69 61 62 6c 65 20 75 73 69 6e  ht variable usin
57f0: 67 20 74 68 65 20 65 78 70 72 53 65 74 48 65 69  g the exprSetHei
5800: 67 68 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20  ght() function. 
5810: 49 66 0a 2a 2a 20 74 68 65 20 68 65 69 67 68 74  If.** the height
5820: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
5830: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c   the maximum all
5840: 6f 77 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20  owed expression 
5850: 64 65 70 74 68 2c 0a 2a 2a 20 6c 65 61 76 65 20  depth,.** leave 
5860: 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72  an error in pPar
5870: 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70  se..**.** Also p
5880: 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45 50 5f  ropagate all EP_
5890: 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20  Propagate flags 
58a0: 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e  from the Expr.x.
58b0: 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45 78  pList into.** Ex
58c0: 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f  pr.flags. .*/.vo
58d0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53 65  id sqlite3ExprSe
58e0: 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28  tHeightAndFlags(
58f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
5900: 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  xpr *p){.  if( p
5910: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
5920: 74 75 72 6e 3b 0a 20 20 65 78 70 72 53 65 74 48  turn;.  exprSetH
5930: 65 69 67 68 74 28 70 29 3b 0a 20 20 73 71 6c 69  eight(p);.  sqli
5940: 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67  te3ExprCheckHeig
5950: 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48  ht(pParse, p->nH
5960: 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eight);.}../*.**
5970: 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69   Return the maxi
5980: 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e  mum height of an
5990: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  y expression tre
59a0: 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20  e referenced.** 
59b0: 62 79 20 74 68 65 20 73 65 6c 65 63 74 20 73 74  by the select st
59c0: 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
59d0: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  s an argument..*
59e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c  /.int sqlite3Sel
59f0: 65 63 74 45 78 70 72 48 65 69 67 68 74 28 53 65  ectExprHeight(Se
5a00: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20  lect *p){.  int 
5a10: 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68  nHeight = 0;.  h
5a20: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2c  eightOfSelect(p,
5a30: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 72 65   &nHeight);.  re
5a40: 74 75 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d 0a  turn nHeight;.}.
5a50: 23 65 6c 73 65 20 2f 2a 20 41 42 4f 56 45 3a 20  #else /* ABOVE: 
5a60: 20 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65 6d   Height enforcem
5a70: 65 6e 74 20 65 6e 61 62 6c 65 64 2e 20 20 42 45  ent enabled.  BE
5a80: 4c 4f 57 3a 20 48 65 69 67 68 74 20 65 6e 66 6f  LOW: Height enfo
5a90: 72 63 65 6d 65 6e 74 20 6f 66 66 20 2a 2f 0a 2f  rcement off */./
5aa0: 2a 0a 2a 2a 20 50 72 6f 70 61 67 61 74 65 20 61  *.** Propagate a
5ab0: 6c 6c 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20  ll EP_Propagate 
5ac0: 66 6c 61 67 73 20 66 72 6f 6d 20 74 68 65 20 45  flags from the E
5ad0: 78 70 72 2e 78 2e 70 4c 69 73 74 20 69 6e 74 6f  xpr.x.pList into
5ae0: 0a 2a 2a 20 45 78 70 72 2e 66 6c 61 67 73 2e 20  .** Expr.flags. 
5af0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5b00: 45 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64  ExprSetHeightAnd
5b10: 46 6c 61 67 73 28 50 61 72 73 65 20 2a 70 50 61  Flags(Parse *pPa
5b20: 72 73 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20  rse, Expr *p){. 
5b30: 20 69 66 28 20 70 20 26 26 20 70 2d 3e 78 2e 70   if( p && p->x.p
5b40: 4c 69 73 74 20 26 26 20 21 45 78 70 72 48 61 73  List && !ExprHas
5b50: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
5b60: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
5b70: 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f   p->flags |= EP_
5b80: 50 72 6f 70 61 67 61 74 65 20 26 20 73 71 6c 69  Propagate & sqli
5b90: 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73  te3ExprListFlags
5ba0: 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  (p->x.pList);.  
5bb0: 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 65 78 70 72  }.}.#define expr
5bc0: 53 65 74 48 65 69 67 68 74 28 79 29 0a 23 65 6e  SetHeight(y).#en
5bd0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41  dif /* SQLITE_MA
5be0: 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 20 2a  X_EXPR_DEPTH>0 *
5bf0: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  /../*.** This ro
5c00: 75 74 69 6e 65 20 69 73 20 74 68 65 20 63 6f 72  utine is the cor
5c10: 65 20 61 6c 6c 6f 63 61 74 6f 72 20 66 6f 72 20  e allocator for 
5c20: 45 78 70 72 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a  Expr nodes..**.*
5c30: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65  * Construct a ne
5c40: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  w expression nod
5c50: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  e and return a p
5c60: 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 4d  ointer to it.  M
5c70: 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69  emory.** for thi
5c80: 73 20 6e 6f 64 65 20 61 6e 64 20 66 6f 72 20 74  s node and for t
5c90: 68 65 20 70 54 6f 6b 65 6e 20 61 72 67 75 6d 65  he pToken argume
5ca0: 6e 74 20 69 73 20 61 20 73 69 6e 67 6c 65 20 61  nt is a single a
5cb0: 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 6f 62 74  llocation.** obt
5cc0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
5cd0: 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 20 54  e3DbMalloc().  T
5ce0: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
5cf0: 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e  ion.** is respon
5d00: 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67  sible for making
5d10: 20 73 75 72 65 20 74 68 65 20 6e 6f 64 65 20 65   sure the node e
5d20: 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66  ventually gets f
5d30: 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64  reed..**.** If d
5d40: 65 71 75 6f 74 65 20 69 73 20 74 72 75 65 2c 20  equote is true, 
5d50: 74 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20 28  then the token (
5d60: 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73  if it exists) is
5d70: 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66   dequoted..** If
5d80: 20 64 65 71 75 6f 74 65 20 69 73 20 66 61 6c 73   dequote is fals
5d90: 65 2c 20 6e 6f 20 64 65 71 75 6f 74 69 6e 67 20  e, no dequoting 
5da0: 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 20 54  is performed.  T
5db0: 68 65 20 64 65 51 75 6f 74 65 0a 2a 2a 20 70 61  he deQuote.** pa
5dc0: 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72  rameter is ignor
5dd0: 65 64 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20  ed if pToken is 
5de0: 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 74  NULL or if the t
5df0: 6f 6b 65 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  oken does not.**
5e00: 20 61 70 70 65 61 72 20 74 6f 20 62 65 20 71 75   appear to be qu
5e10: 6f 74 65 64 2e 20 20 49 66 20 74 68 65 20 71 75  oted.  If the qu
5e20: 6f 74 65 73 20 77 65 72 65 20 6f 66 20 74 68 65  otes were of the
5e30: 20 66 6f 72 6d 20 22 2e 2e 2e 22 20 28 64 6f 75   form "..." (dou
5e40: 62 6c 65 2d 71 75 6f 74 65 73 29 0a 2a 2a 20 74  ble-quotes).** t
5e50: 68 65 6e 20 74 68 65 20 45 50 5f 44 62 6c 51 75  hen the EP_DblQu
5e60: 6f 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74  oted flag is set
5e70: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
5e80: 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53  on node..**.** S
5e90: 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20 49 66  pecial case:  If
5ea0: 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20   op==TK_INTEGER 
5eb0: 61 6e 64 20 70 54 6f 6b 65 6e 20 70 6f 69 6e 74  and pToken point
5ec0: 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74 68  s to a string th
5ed0: 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 74 72 61  at.** can be tra
5ee0: 6e 73 6c 61 74 65 64 20 69 6e 74 6f 20 61 20 33  nslated into a 3
5ef0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 74  2-bit integer, t
5f00: 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20 69 73  hen the token is
5f10: 20 6e 6f 74 0a 2a 2a 20 73 74 6f 72 65 64 20 69   not.** stored i
5f20: 6e 20 75 2e 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73  n u.zToken.  Ins
5f30: 74 65 61 64 2c 20 74 68 65 20 69 6e 74 65 67 65  tead, the intege
5f40: 72 20 76 61 6c 75 65 73 20 69 73 20 77 72 69 74  r values is writ
5f50: 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 75 2e 69 56  ten.** into u.iV
5f60: 61 6c 75 65 20 61 6e 64 20 74 68 65 20 45 50 5f  alue and the EP_
5f70: 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 69 73  IntValue flag is
5f80: 20 73 65 74 2e 20 20 4e 6f 20 65 78 74 72 61 20   set.  No extra 
5f90: 73 74 6f 72 61 67 65 0a 2a 2a 20 69 73 20 61 6c  storage.** is al
5fa0: 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20  located to hold 
5fb0: 74 68 65 20 69 6e 74 65 67 65 72 20 74 65 78 74  the integer text
5fc0: 20 61 6e 64 20 74 68 65 20 64 65 71 75 6f 74 65   and the dequote
5fd0: 20 66 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64   flag is ignored
5fe0: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
5ff0: 65 33 45 78 70 72 41 6c 6c 6f 63 28 0a 20 20 73  e3ExprAlloc(.  s
6000: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
6010: 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
6020: 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61   for sqlite3DbMa
6030: 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20  llocZero() (may 
6040: 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e  be null) */.  in
6050: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
6060: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
6070: 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ion opcode */.  
6080: 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f  const Token *pTo
6090: 6b 65 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e  ken,    /* Token
60a0: 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68   argument.  Migh
60b0: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  t be NULL */.  i
60c0: 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20  nt dequote      
60d0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
60e0: 6f 20 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a  o dequote */.){.
60f0: 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
6100: 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a  int nExtra = 0;.
6110: 20 20 69 6e 74 20 69 56 61 6c 75 65 20 3d 20 30    int iValue = 0
6120: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  ;..  assert( db!
6130: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b  =0 );.  if( pTok
6140: 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 70  en ){.    if( op
6150: 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20  !=TK_INTEGER || 
6160: 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20  pToken->z==0.   
6170: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
6180: 33 47 65 74 49 6e 74 33 32 28 70 54 6f 6b 65 6e  3GetInt32(pToken
6190: 2d 3e 7a 2c 20 26 69 56 61 6c 75 65 29 3d 3d 30  ->z, &iValue)==0
61a0: 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61   ){.      nExtra
61b0: 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a   = pToken->n+1;.
61c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 56        assert( iV
61d0: 61 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 20 20 7d  alue>=0 );.    }
61e0: 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71  .  }.  pNew = sq
61f0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
6200: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78  NN(db, sizeof(Ex
6210: 70 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69  pr)+nExtra);.  i
6220: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 6d  f( pNew ){.    m
6230: 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73  emset(pNew, 0, s
6240: 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20  izeof(Expr));.  
6250: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38    pNew->op = (u8
6260: 29 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  )op;.    pNew->i
6270: 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66  Agg = -1;.    if
6280: 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  ( pToken ){.    
6290: 20 20 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20    if( nExtra==0 
62a0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
62b0: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74  >flags |= EP_Int
62c0: 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70  Value;.        p
62d0: 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20  New->u.iValue = 
62e0: 69 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65  iValue;.      }e
62f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  lse{.        pNe
6300: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63  w->u.zToken = (c
6310: 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  har*)&pNew[1];. 
6320: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
6330: 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 7c 7c 20 70  Token->z!=0 || p
6340: 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a 20  Token->n==0 );. 
6350: 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 6b 65         if( pToke
6360: 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70 79 28 70 4e  n->n ) memcpy(pN
6370: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54  ew->u.zToken, pT
6380: 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d  oken->z, pToken-
6390: 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  >n);.        pNe
63a0: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b  w->u.zToken[pTok
63b0: 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  en->n] = 0;.    
63c0: 20 20 20 20 69 66 28 20 64 65 71 75 6f 74 65 20      if( dequote 
63d0: 26 26 20 73 71 6c 69 74 65 33 49 73 71 75 6f 74  && sqlite3Isquot
63e0: 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  e(pNew->u.zToken
63f0: 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
6400: 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 7a 54    if( pNew->u.zT
6410: 6f 6b 65 6e 5b 30 5d 3d 3d 27 22 27 20 29 20 70  oken[0]=='"' ) p
6420: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
6430: 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20  _DblQuoted;.    
6440: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71        sqlite3Deq
6450: 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f  uote(pNew->u.zTo
6460: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ken);.        }.
6470: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
6480: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  f SQLITE_MAX_EXP
6490: 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 70 4e  R_DEPTH>0.    pN
64a0: 65 77 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b  ew->nHeight = 1;
64b0: 0a 23 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20  .#endif  .  }.  
64c0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
64d0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
64e0: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
64f0: 6e 6f 64 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f  node from a zero
6500: 2d 74 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65  -terminated toke
6510: 6e 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c  n that has.** al
6520: 72 65 61 64 79 20 62 65 65 6e 20 64 65 71 75 6f  ready been dequo
6530: 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ted..*/.Expr *sq
6540: 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c  lite3Expr(.  sql
6550: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
6560: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
6570: 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  or sqlite3DbMall
6580: 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65  ocZero() (may be
6590: 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20   null) */.  int 
65a0: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
65b0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
65c0: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  n opcode */.  co
65d0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e  nst char *zToken
65e0: 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61        /* Token a
65f0: 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20  rgument.  Might 
6600: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
6610: 54 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d  Token x;.  x.z =
6620: 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d   zToken;.  x.n =
6630: 20 7a 54 6f 6b 65 6e 20 3f 20 73 71 6c 69 74 65   zToken ? sqlite
6640: 33 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e  3Strlen30(zToken
6650: 29 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ) : 0;.  return 
6660: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
6670: 28 64 62 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b  (db, op, &x, 0);
6680: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68  .}../*.** Attach
6690: 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20   subtrees pLeft 
66a0: 61 6e 64 20 70 52 69 67 68 74 20 74 6f 20 74 68  and pRight to th
66b0: 65 20 45 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f  e Expr node pRoo
66c0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f  t..**.** If pRoo
66d0: 74 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61  t==NULL that mea
66e0: 6e 73 20 74 68 61 74 20 61 20 6d 65 6d 6f 72 79  ns that a memory
66f0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
6700: 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a  r has occurred..
6710: 2a 2a 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  ** In that case,
6720: 20 64 65 6c 65 74 65 20 74 68 65 20 73 75 62 74   delete the subt
6730: 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70  rees pLeft and p
6740: 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Right..*/.void s
6750: 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68  qlite3ExprAttach
6760: 53 75 62 74 72 65 65 73 28 0a 20 20 73 71 6c 69  Subtrees(.  sqli
6770: 74 65 33 20 2a 64 62 2c 0a 20 20 45 78 70 72 20  te3 *db,.  Expr 
6780: 2a 70 52 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a  *pRoot,.  Expr *
6790: 70 4c 65 66 74 2c 0a 20 20 45 78 70 72 20 2a 70  pLeft,.  Expr *p
67a0: 52 69 67 68 74 0a 29 7b 0a 20 20 69 66 28 20 70  Right.){.  if( p
67b0: 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61  Root==0 ){.    a
67c0: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
67d0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73  cFailed );.    s
67e0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
67f0: 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20  (db, pLeft);.   
6800: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
6810: 74 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a  te(db, pRight);.
6820: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
6830: 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   pRight ){.     
6840: 20 70 52 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d   pRoot->pRight =
6850: 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70   pRight;.      p
6860: 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Root->flags |= E
6870: 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 70 52  P_Propagate & pR
6880: 69 67 68 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  ight->flags;.   
6890: 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74   }.    if( pLeft
68a0: 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d   ){.      pRoot-
68b0: 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a  >pLeft = pLeft;.
68c0: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61        pRoot->fla
68d0: 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61  gs |= EP_Propaga
68e0: 74 65 20 26 20 70 4c 65 66 74 2d 3e 66 6c 61 67  te & pLeft->flag
68f0: 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 70  s;.    }.    exp
6900: 72 53 65 74 48 65 69 67 68 74 28 70 52 6f 6f 74  rSetHeight(pRoot
6910: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6920: 41 6c 6c 6f 63 61 74 65 20 61 6e 20 45 78 70 72  Allocate an Expr
6930: 20 6e 6f 64 65 20 77 68 69 63 68 20 6a 6f 69 6e   node which join
6940: 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74 77 6f  s as many as two
6950: 20 73 75 62 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a   subtrees..**.**
6960: 20 4f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20   One or both of 
6970: 74 68 65 20 73 75 62 74 72 65 65 73 20 63 61 6e  the subtrees can
6980: 20 62 65 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72   be NULL.  Retur
6990: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
69a0: 68 65 20 6e 65 77 0a 2a 2a 20 45 78 70 72 20 6e  he new.** Expr n
69b0: 6f 64 65 2e 20 20 4f 72 2c 20 69 66 20 61 6e 20  ode.  Or, if an 
69c0: 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73  OOM error occurs
69d0: 2c 20 73 65 74 20 70 50 61 72 73 65 2d 3e 64 62  , set pParse->db
69e0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a  ->mallocFailed,.
69f0: 2a 2a 20 66 72 65 65 20 74 68 65 20 73 75 62 74  ** free the subt
6a00: 72 65 65 73 20 61 6e 64 20 72 65 74 75 72 6e 20  rees and return 
6a10: 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  NULL..*/.Expr *s
6a20: 71 6c 69 74 65 33 50 45 78 70 72 28 0a 20 20 50  qlite3PExpr(.  P
6a30: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
6a40: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
6a50: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
6a60: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
6a70: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
6a80: 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  sion opcode */. 
6a90: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20   Expr *pLeft,   
6aa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74           /* Left
6ab0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78   operand */.  Ex
6ac0: 70 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20  pr *pRight,     
6ad0: 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f        /* Right o
6ae0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73  perand */.  cons
6af0: 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20  t Token *pToken 
6b00: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
6b10: 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78  token */.){.  Ex
6b20: 70 72 20 2a 70 3b 0a 20 20 69 66 28 20 6f 70 3d  pr *p;.  if( op=
6b30: 3d 54 4b 5f 41 4e 44 20 26 26 20 70 50 61 72 73  =TK_AND && pPars
6b40: 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20  e->nErr==0 ){.  
6b50: 20 20 2f 2a 20 54 61 6b 65 20 61 64 76 61 6e 74    /* Take advant
6b60: 61 67 65 20 6f 66 20 73 68 6f 72 74 2d 63 69 72  age of short-cir
6b70: 63 75 69 74 20 66 61 6c 73 65 20 6f 70 74 69 6d  cuit false optim
6b80: 69 7a 61 74 69 6f 6e 20 66 6f 72 20 41 4e 44 20  ization for AND 
6b90: 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  */.    p = sqlit
6ba0: 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65  e3ExprAnd(pParse
6bb0: 2d 3e 64 62 2c 20 70 4c 65 66 74 2c 20 70 52 69  ->db, pLeft, pRi
6bc0: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ght);.  }else{. 
6bd0: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78     p = sqlite3Ex
6be0: 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  prAlloc(pParse->
6bf0: 64 62 2c 20 6f 70 20 26 20 54 4b 46 4c 47 5f 4d  db, op & TKFLG_M
6c00: 41 53 4b 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b  ASK, pToken, 1);
6c10: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
6c20: 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28 70  AttachSubtrees(p
6c30: 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c  Parse->db, p, pL
6c40: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
6c50: 7d 0a 20 20 69 66 28 20 70 20 29 20 7b 0a 20 20  }.  if( p ) {.  
6c60: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65    sqlite3ExprChe
6c70: 63 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c  ckHeight(pParse,
6c80: 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20   p->nHeight);.  
6c90: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
6ca0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 70 53 65 6c 65  ./*.** Add pSele
6cb0: 63 74 20 74 6f 20 74 68 65 20 45 78 70 72 2e 78  ct to the Expr.x
6cc0: 2e 70 53 65 6c 65 63 74 20 66 69 65 6c 64 2e 20  .pSelect field. 
6cd0: 20 4f 72 2c 20 69 66 20 70 45 78 70 72 20 69 73   Or, if pExpr is
6ce0: 20 4e 55 4c 4c 20 28 64 75 65 0a 2a 2a 20 64 6f   NULL (due.** do
6cf0: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
6d00: 74 69 6f 6e 20 66 61 69 6c 75 72 65 29 20 74 68  tion failure) th
6d10: 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 70 53  en delete the pS
6d20: 65 6c 65 63 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f  elect object..*/
6d30: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 45 78  .void sqlite3PEx
6d40: 70 72 41 64 64 53 65 6c 65 63 74 28 50 61 72 73  prAddSelect(Pars
6d50: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
6d60: 2a 70 45 78 70 72 2c 20 53 65 6c 65 63 74 20 2a  *pExpr, Select *
6d70: 70 53 65 6c 65 63 74 29 7b 0a 20 20 69 66 28 20  pSelect){.  if( 
6d80: 70 45 78 70 72 20 29 7b 0a 20 20 20 20 70 45 78  pExpr ){.    pEx
6d90: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20  pr->x.pSelect = 
6da0: 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 45 78 70  pSelect;.    Exp
6db0: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78  rSetProperty(pEx
6dc0: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
6dd0: 7c 45 50 5f 53 75 62 71 75 65 72 79 29 3b 0a 20  |EP_Subquery);. 
6de0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 65     sqlite3ExprSe
6df0: 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28  tHeightAndFlags(
6e00: 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a  pParse, pExpr);.
6e10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
6e20: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
6e30: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
6e40: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
6e50: 63 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  ctDelete(pParse-
6e60: 3e 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  >db, pSelect);. 
6e70: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20   }.}.../*.** If 
6e80: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
6e90: 73 20 61 6c 77 61 79 73 20 65 69 74 68 65 72 20  s always either 
6ea0: 54 52 55 45 20 6f 72 20 46 41 4c 53 45 20 28 72  TRUE or FALSE (r
6eb0: 65 73 70 65 63 74 69 76 65 6c 79 29 2c 0a 2a 2a  espectively),.**
6ec0: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 31 2e 20   then return 1. 
6ed0: 20 49 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 64   If one cannot d
6ee0: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 74 72 75  etermine the tru
6ef0: 74 68 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a  th value of the.
6f00: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74  ** expression at
6f10: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 72 65   compile-time re
6f20: 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68  turn 0..**.** Th
6f30: 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
6f40: 61 74 69 6f 6e 2e 20 20 49 66 20 69 73 20 4f 4b  ation.  If is OK
6f50: 20 74 6f 20 72 65 74 75 72 6e 20 30 20 68 65 72   to return 0 her
6f60: 65 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68 65  e even if.** the
6f70: 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 61 6c   expression real
6f80: 6c 79 20 69 73 20 61 6c 77 61 79 73 20 66 61 6c  ly is always fal
6f90: 73 65 20 6f 72 20 66 61 6c 73 65 20 28 61 20 66  se or false (a f
6fa0: 61 6c 73 65 20 6e 65 67 61 74 69 76 65 29 2e 0a  alse negative)..
6fb0: 2a 2a 20 42 75 74 20 69 74 20 69 73 20 61 20 62  ** But it is a b
6fc0: 75 67 20 74 6f 20 72 65 74 75 72 6e 20 31 20 69  ug to return 1 i
6fd0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
6fe0: 20 6d 69 67 68 74 20 68 61 76 65 20 64 69 66 66   might have diff
6ff0: 65 72 65 6e 74 0a 2a 2a 20 62 6f 6f 6c 65 61 6e  erent.** boolean
7000: 20 76 61 6c 75 65 73 20 69 6e 20 64 69 66 66 65   values in diffe
7010: 72 65 6e 74 20 63 69 72 63 75 6d 73 74 61 6e 63  rent circumstanc
7020: 65 73 20 28 61 20 66 61 6c 73 65 20 70 6f 73 69  es (a false posi
7030: 74 69 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74  tive.).**.** Not
7040: 65 20 74 68 61 74 20 69 66 20 74 68 65 20 65 78  e that if the ex
7050: 70 72 65 73 73 69 6f 6e 20 69 73 20 70 61 72 74  pression is part
7060: 20 6f 66 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20   of conditional 
7070: 66 6f 72 20 61 0a 2a 2a 20 4c 45 46 54 20 4a 4f  for a.** LEFT JO
7080: 49 4e 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 6e  IN, then we cann
7090: 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 61 74 20  ot determine at 
70a0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65  compile-time whe
70b0: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 69  ther or not.** i
70c0: 73 20 69 74 20 74 72 75 65 20 6f 72 20 66 61 6c  s it true or fal
70d0: 73 65 2c 20 73 6f 20 61 6c 77 61 79 73 20 72 65  se, so always re
70e0: 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  turn 0..*/.stati
70f0: 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61 79 73  c int exprAlways
7100: 54 72 75 65 28 45 78 70 72 20 2a 70 29 7b 0a 20  True(Expr *p){. 
7110: 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69 66   int v = 0;.  if
7120: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
7130: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
7140: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
7150: 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72  if( !sqlite3Expr
7160: 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26 76 29  IsInteger(p, &v)
7170: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
7180: 65 74 75 72 6e 20 76 21 3d 30 3b 0a 7d 0a 73 74  eturn v!=0;.}.st
7190: 61 74 69 63 20 69 6e 74 20 65 78 70 72 41 6c 77  atic int exprAlw
71a0: 61 79 73 46 61 6c 73 65 28 45 78 70 72 20 2a 70  aysFalse(Expr *p
71b0: 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a  ){.  int v = 0;.
71c0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
71d0: 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d  perty(p, EP_From
71e0: 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30  Join) ) return 0
71f0: 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
7200: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2c  ExprIsInteger(p,
7210: 20 26 76 29 20 29 20 72 65 74 75 72 6e 20 30 3b   &v) ) return 0;
7220: 0a 20 20 72 65 74 75 72 6e 20 76 3d 3d 30 3b 0a  .  return v==0;.
7230: 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77  }../*.** Join tw
7240: 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73  o expressions us
7250: 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61  ing an AND opera
7260: 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72 20  tor.  If either 
7270: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a  expression is.**
7280: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74   NULL, then just
7290: 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65   return the othe
72a0: 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  r expression..**
72b0: 0a 2a 2a 20 49 66 20 6f 6e 65 20 73 69 64 65 20  .** If one side 
72c0: 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
72d0: 74 68 65 20 41 4e 44 20 69 73 20 6b 6e 6f 77 6e  the AND is known
72e0: 20 74 6f 20 62 65 20 66 61 6c 73 65 2c 20 74 68   to be false, th
72f0: 65 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66  en instead.** of
7300: 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 41 4e   returning an AN
7310: 44 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 6a 75  D expression, ju
7320: 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f 6e 73  st return a cons
7330: 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  tant expression 
7340: 77 69 74 68 0a 2a 2a 20 61 20 76 61 6c 75 65 20  with.** a value 
7350: 6f 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45 78 70  of false..*/.Exp
7360: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6e  r *sqlite3ExprAn
7370: 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  d(sqlite3 *db, E
7380: 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72  xpr *pLeft, Expr
7390: 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 66 28   *pRight){.  if(
73a0: 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20   pLeft==0 ){.   
73b0: 20 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a   return pRight;.
73c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67    }else if( pRig
73d0: 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ht==0 ){.    ret
73e0: 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c  urn pLeft;.  }el
73f0: 73 65 20 69 66 28 20 65 78 70 72 41 6c 77 61 79  se if( exprAlway
7400: 73 46 61 6c 73 65 28 70 4c 65 66 74 29 20 7c 7c  sFalse(pLeft) ||
7410: 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65   exprAlwaysFalse
7420: 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20  (pRight) ){.    
7430: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
7440: 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20  e(db, pLeft);.  
7450: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
7460: 65 74 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b  ete(db, pRight);
7470: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
7480: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
7490: 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71   TK_INTEGER, &sq
74a0: 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30  lite3IntTokens[0
74b0: 5d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ], 0);.  }else{.
74c0: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
74d0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
74e0: 63 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c  c(db, TK_AND, 0,
74f0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
7500: 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65  ExprAttachSubtre
7510: 65 73 28 64 62 2c 20 70 4e 65 77 2c 20 70 4c 65  es(db, pNew, pLe
7520: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  ft, pRight);.   
7530: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 20 20   return pNew;.  
7540: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  }.}../*.** Const
7550: 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65  ruct a new expre
7560: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61  ssion node for a
7570: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d   function with m
7580: 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d  ultiple.** argum
7590: 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ents..*/.Expr *s
75a0: 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69  qlite3ExprFuncti
75b0: 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
75c0: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
75d0: 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
75e0: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
75f0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
7600: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
7610: 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b  ssert( pToken );
7620: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
7630: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
7640: 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b  K_FUNCTION, pTok
7650: 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 4e  en, 1);.  if( pN
7660: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ew==0 ){.    sql
7670: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
7680: 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 20 2f  te(db, pList); /
7690: 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72 79 20 6c  * Avoid memory l
76a0: 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20  eak when malloc 
76b0: 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74  fails */.    ret
76c0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65  urn 0;.  }.  pNe
76d0: 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69  w->x.pList = pLi
76e0: 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45  st;.  assert( !E
76f0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
7700: 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  New, EP_xIsSelec
7710: 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  t) );.  sqlite3E
7720: 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46  xprSetHeightAndF
7730: 6c 61 67 73 28 70 50 61 72 73 65 2c 20 70 4e 65  lags(pParse, pNe
7740: 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  w);.  return pNe
7750: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  w;.}../*.** Assi
7760: 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75  gn a variable nu
7770: 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65  mber to an expre
7780: 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64  ssion that encod
7790: 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a  es a wildcard.**
77a0: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
77b0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
77c0: 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64   .**.** Wildcard
77d0: 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  s consisting of 
77e0: 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65  a single "?" are
77f0: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65   assigned the ne
7800: 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a  xt sequential.**
7810: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
7820: 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64  ..**.** Wildcard
7830: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  s of the form "?
7840: 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65  nnn" are assigne
7850: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e  d the number "nn
7860: 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20  n".  We make.** 
7870: 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f  sure "nnn" is no
7880: 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69  t too be to avoi
7890: 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65  d a denial of se
78a0: 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68 65  rvice attack whe
78b0: 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61  n.** the SQL sta
78c0: 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f  tement comes fro
78d0: 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f  m an external so
78e0: 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64  urce..**.** Wild
78f0: 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72  cards of the for
7900: 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22  m ":aaa", "@aaa"
7910: 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20  , or "$aaa" are 
7920: 61 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d  assigned the sam
7930: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74  e number.** as t
7940: 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74  he previous inst
7950: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
7960: 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69   wildcard.  Or i
7970: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
7980: 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20  rst.** instance 
7990: 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c  of the wildcard,
79a0: 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e   the next sequen
79b0: 74 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75  tial variable nu
79c0: 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67  mber is.** assig
79d0: 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ned..*/.void sql
79e0: 69 74 65 33 45 78 70 72 41 73 73 69 67 6e 56 61  ite3ExprAssignVa
79f0: 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70  rNumber(Parse *p
7a00: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
7a10: 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pr){.  sqlite3 *
7a20: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
7a30: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7a40: 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ;..  if( pExpr==
7a50: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
7a60: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
7a70: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
7a80: 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65 64  _IntValue|EP_Red
7a90: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
7aa0: 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78 70  y) );.  z = pExp
7ab0: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 61  r->u.zToken;.  a
7ac0: 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20  ssert( z!=0 );. 
7ad0: 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d 30   assert( z[0]!=0
7ae0: 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d 3d   );.  if( z[1]==
7af0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64  0 ){.    /* Wild
7b00: 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d  card of the form
7b10: 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74 68   "?".  Assign th
7b20: 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65 20  e next variable 
7b30: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 61 73  number */.    as
7b40: 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20  sert( z[0]=='?' 
7b50: 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 43  );.    pExpr->iC
7b60: 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28  olumn = (ynVar)(
7b70: 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b  ++pParse->nVar);
7b80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 79 6e  .  }else{.    yn
7b90: 56 61 72 20 78 20 3d 20 30 3b 0a 20 20 20 20 75  Var x = 0;.    u
7ba0: 33 32 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  32 n = sqlite3St
7bb0: 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69  rlen30(z);.    i
7bc0: 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a  f( z[0]=='?' ){.
7bd0: 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72        /* Wildcar
7be0: 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  d of the form "?
7bf0: 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22  nnn".  Convert "
7c00: 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67  nnn" to an integ
7c10: 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  er and.      ** 
7c20: 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76 61  use it as the va
7c30: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f  riable number */
7c40: 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a 20 20  .      i64 i;.  
7c50: 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3d      int bOk = 0=
7c60: 3d 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 26  =sqlite3Atoi64(&
7c70: 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53  z[1], &i, n-1, S
7c80: 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20  QLITE_UTF8);.   
7c90: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
7ca0: 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72 29 69  n = x = (ynVar)i
7cb0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
7cc0: 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( i==0 );.      
7cd0: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31 20 29  testcase( i==1 )
7ce0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
7cf0: 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  ( i==db->aLimit[
7d00: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
7d10: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20  IABLE_NUMBER]-1 
7d20: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
7d30: 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74  e( i==db->aLimit
7d40: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
7d50: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29  RIABLE_NUMBER] )
7d60: 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f 6b 3d  ;.      if( bOk=
7d70: 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e 64  =0 || i<1 || i>d
7d80: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
7d90: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
7da0: 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 20  NUMBER] ){.     
7db0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
7dc0: 73 67 28 70 50 61 72 73 65 2c 20 22 76 61 72 69  sg(pParse, "vari
7dd0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  able number must
7de0: 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61   be between ?1 a
7df0: 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20  nd ?%d",.       
7e00: 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b       db->aLimit[
7e10: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
7e20: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a  IABLE_NUMBER]);.
7e30: 20 20 20 20 20 20 20 20 78 20 3d 20 30 3b 0a 20          x = 0;. 
7e40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
7e50: 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72 20   i>pParse->nVar 
7e60: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  ){.        pPars
7e70: 65 2d 3e 6e 56 61 72 20 3d 20 28 69 6e 74 29 69  e->nVar = (int)i
7e80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
7e90: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69  lse{.      /* Wi
7ea0: 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22 3a 61  ldcards like ":a
7eb0: 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72 20 22  aa", "$aaa" or "
7ec0: 40 61 61 61 22 2e 20 20 52 65 75 73 65 20 74 68  @aaa".  Reuse th
7ed0: 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a  e same variable.
7ee0: 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
7ef0: 61 73 20 74 68 65 20 70 72 69 6f 72 20 61 70 70  as the prior app
7f00: 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20 73  earance of the s
7f10: 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20  ame name, or if 
7f20: 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 20 20 2a  the name.      *
7f30: 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70 70 65  * has never appe
7f40: 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65 75  ared before, reu
7f50: 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69  se the same vari
7f60: 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20 20  able number.    
7f70: 20 20 2a 2f 0a 20 20 20 20 20 20 79 6e 56 61 72    */.      ynVar
7f80: 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
7f90: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 7a 56  0; i<pParse->nzV
7fa0: 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ar; i++){.      
7fb0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 7a    if( pParse->az
7fc0: 56 61 72 5b 69 5d 20 26 26 20 73 74 72 63 6d 70  Var[i] && strcmp
7fd0: 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 69  (pParse->azVar[i
7fe0: 5d 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ],z)==0 ){.     
7ff0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
8000: 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72  umn = x = (ynVar
8010: 29 69 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  )i+1;.          
8020: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
8030: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
8040: 66 28 20 78 3d 3d 30 20 29 20 78 20 3d 20 70 45  f( x==0 ) x = pE
8050: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28  xpr->iColumn = (
8060: 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d  ynVar)(++pParse-
8070: 3e 6e 56 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20  >nVar);.    }.  
8080: 20 20 69 66 28 20 78 3e 30 20 29 7b 0a 20 20 20    if( x>0 ){.   
8090: 20 20 20 69 66 28 20 78 3e 70 50 61 72 73 65 2d     if( x>pParse-
80a0: 3e 6e 7a 56 61 72 20 29 7b 0a 20 20 20 20 20 20  >nzVar ){.      
80b0: 20 20 63 68 61 72 20 2a 2a 61 3b 0a 20 20 20 20    char **a;.    
80c0: 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44      a = sqlite3D
80d0: 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 50 61  bRealloc(db, pPa
80e0: 72 73 65 2d 3e 61 7a 56 61 72 2c 20 78 2a 73 69  rse->azVar, x*si
80f0: 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20  zeof(a[0]));.   
8100: 20 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b       if( a==0 ){
8110: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
8120: 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
8130: 6c 65 64 20 29 3b 20 2f 2a 20 45 72 72 6f 72 20  led ); /* Error 
8140: 72 65 70 6f 72 74 65 64 20 74 68 72 6f 75 67 68  reported through
8150: 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 2a 2f   mallocFailed */
8160: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
8170: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
8180: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 7a 56       pParse->azV
8190: 61 72 20 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  ar = a;.        
81a0: 6d 65 6d 73 65 74 28 26 61 5b 70 50 61 72 73 65  memset(&a[pParse
81b0: 2d 3e 6e 7a 56 61 72 5d 2c 20 30 2c 20 28 78 2d  ->nzVar], 0, (x-
81c0: 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 29 2a 73  pParse->nzVar)*s
81d0: 69 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20  izeof(a[0]));.  
81e0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 7a        pParse->nz
81f0: 56 61 72 20 3d 20 78 3b 0a 20 20 20 20 20 20 7d  Var = x;.      }
8200: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 21  .      if( z[0]!
8210: 3d 27 3f 27 20 7c 7c 20 70 50 61 72 73 65 2d 3e  ='?' || pParse->
8220: 61 7a 56 61 72 5b 78 2d 31 5d 3d 3d 30 20 29 7b  azVar[x-1]==0 ){
8230: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8240: 44 62 46 72 65 65 28 64 62 2c 20 70 50 61 72 73  DbFree(db, pPars
8250: 65 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 29 3b 0a  e->azVar[x-1]);.
8260: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
8270: 61 7a 56 61 72 5b 78 2d 31 5d 20 3d 20 73 71 6c  azVar[x-1] = sql
8280: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
8290: 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  , z, n);.      }
82a0: 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66  .    }.  } .  if
82b0: 28 20 21 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  ( !pParse->nErr 
82c0: 26 26 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e  && pParse->nVar>
82d0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
82e0: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
82f0: 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20  _NUMBER] ){.    
8300: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
8310: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
8320: 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 22  y SQL variables"
8330: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
8340: 52 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65  Recursively dele
8350: 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  te an expression
8360: 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   tree..*/.static
8370: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
8380: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70   void sqlite3Exp
8390: 72 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69 74 65  rDeleteNN(sqlite
83a0: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b  3 *db, Expr *p){
83b0: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
83c0: 29 3b 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  );.  /* Sanity c
83d0: 68 65 63 6b 3a 20 41 73 73 65 72 74 20 74 68 61  heck: Assert tha
83e0: 74 20 74 68 65 20 49 6e 74 56 61 6c 75 65 20 69  t the IntValue i
83f0: 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69  s non-negative i
8400: 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f 0a 20  f it exists */. 
8410: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
8420: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
8430: 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70 2d 3e  IntValue) || p->
8440: 75 2e 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20  u.iValue>=0 );. 
8450: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
8460: 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65  perty(p, EP_Toke
8470: 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 2f 2a  nOnly) ){.    /*
8480: 20 54 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f   The Expr.x unio
8490: 6e 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20  n is never used 
84a0: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
84b0: 20 61 73 20 45 78 70 72 2e 70 52 69 67 68 74 20   as Expr.pRight 
84c0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
84d0: 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  ->x.pList==0 || 
84e0: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  p->pRight==0 );.
84f0: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 21 3d 54      if( p->op!=T
8500: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
8510: 29 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  ) sqlite3ExprDel
8520: 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74  ete(db, p->pLeft
8530: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
8540: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
8550: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28  pRight);.    if(
8560: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
8570: 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29  (p, EP_MemToken)
8580: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
8590: 28 64 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  (db, p->u.zToken
85a0: 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  );.    if( ExprH
85b0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
85c0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
85d0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
85e0: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  ctDelete(db, p->
85f0: 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  x.pSelect);.    
8600: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
8610: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
8620: 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73  te(db, p->x.pLis
8630: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
8640: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
8650: 65 72 74 79 28 70 2c 20 45 50 5f 53 74 61 74 69  erty(p, EP_Stati
8660: 63 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  c) ){.    sqlite
8670: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
8680: 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74    }.}.void sqlit
8690: 65 33 45 78 70 72 44 65 6c 65 74 65 28 73 71 6c  e3ExprDelete(sql
86a0: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
86b0: 70 29 7b 0a 20 20 69 66 28 20 70 20 29 20 73 71  p){.  if( p ) sq
86c0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e  lite3ExprDeleteN
86d0: 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  N(db, p);.}../*.
86e0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
86f0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c  mber of bytes al
8700: 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
8710: 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63  expression struc
8720: 74 75 72 65 20 0a 2a 2a 20 70 61 73 73 65 64 20  ture .** passed 
8730: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
8740: 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61  ument. This is a
8750: 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20 45 58 50  lways one of EXP
8760: 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45  R_FULLSIZE,.** E
8770: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
8780: 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c  or EXPR_TOKENONL
8790: 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  YSIZE..*/.static
87a0: 20 69 6e 74 20 65 78 70 72 53 74 72 75 63 74 53   int exprStructS
87b0: 69 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ize(Expr *p){.  
87c0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
87d0: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
87e0: 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20 45 58  nly) ) return EX
87f0: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
8800: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
8810: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65  roperty(p, EP_Re
8820: 64 75 63 65 64 29 20 29 20 72 65 74 75 72 6e 20  duced) ) return 
8830: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
8840: 3b 0a 20 20 72 65 74 75 72 6e 20 45 58 50 52 5f  ;.  return EXPR_
8850: 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a  FULLSIZE;.}../*.
8860: 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72  ** The dupedExpr
8870: 2a 53 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 73  *Size() routines
8880: 20 65 61 63 68 20 72 65 74 75 72 6e 20 74 68 65   each return the
8890: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
88a0: 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20   required.** to 
88b0: 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20  store a copy of 
88c0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72  an expression or
88d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
88e0: 2e 20 20 54 68 65 79 20 64 69 66 66 65 72 20 69  .  They differ i
88f0: 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66  n.** how much of
8900: 20 74 68 65 20 74 72 65 65 20 69 73 20 6d 65 61   the tree is mea
8910: 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  sured..**.**    
8920: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
8930: 53 69 7a 65 28 29 20 20 20 20 20 53 69 7a 65 20  Size()     Size 
8940: 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45 78 70 72  of only the Expr
8950: 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 20   structure .**  
8960: 20 20 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65     dupedExprNode
8970: 53 69 7a 65 28 29 20 20 20 20 20 20 20 53 69 7a  Size()       Siz
8980: 65 20 6f 66 20 45 78 70 72 20 2b 20 73 70 61 63  e of Expr + spac
8990: 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20  e for token.**  
89a0: 20 20 20 64 75 70 65 64 45 78 70 72 53 69 7a 65     dupedExprSize
89b0: 28 29 20 20 20 20 20 20 20 20 20 20 20 45 78 70  ()           Exp
89c0: 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74  r + token + subt
89d0: 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a  ree components.*
89e0: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
89f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
8a30: 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70  .** The dupedExp
8a40: 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 66 75  rStructSize() fu
8a50: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
8a60: 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65 64 20  wo values OR-ed 
8a70: 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28  together:  .** (
8a80: 31 29 20 74 68 65 20 73 70 61 63 65 20 72 65 71  1) the space req
8a90: 75 69 72 65 64 20 66 6f 72 20 61 20 63 6f 70 79  uired for a copy
8aa0: 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72   of the Expr str
8ab0: 75 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20  ucture only and 
8ac0: 0a 2a 2a 20 28 32 29 20 74 68 65 20 45 50 5f 78  .** (2) the EP_x
8ad0: 78 78 20 66 6c 61 67 73 20 74 68 61 74 20 69 6e  xx flags that in
8ae0: 64 69 63 61 74 65 20 77 68 61 74 20 74 68 65 20  dicate what the 
8af0: 73 74 72 75 63 74 75 72 65 20 73 69 7a 65 20 73  structure size s
8b00: 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65  hould be..** The
8b10: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 69   return values i
8b20: 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a  s always one of:
8b30: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50 52  .**.**      EXPR
8b40: 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20  _FULLSIZE.**    
8b50: 20 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49    EXPR_REDUCEDSI
8b60: 5a 45 20 20 20 7c 20 45 50 5f 52 65 64 75 63 65  ZE   | EP_Reduce
8b70: 64 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 54  d.**      EXPR_T
8b80: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45  OKENONLYSIZE | E
8b90: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a  P_TokenOnly.**.*
8ba0: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
8bb0: 65 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20  e structure can 
8bc0: 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b  be found by mask
8bd0: 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20 76  ing the return v
8be0: 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20  alue.** of this 
8bf0: 72 6f 75 74 69 6e 65 20 77 69 74 68 20 30 78 66  routine with 0xf
8c00: 66 66 2e 20 20 54 68 65 20 66 6c 61 67 73 20 63  ff.  The flags c
8c10: 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d  an be found by m
8c20: 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65  asking the.** re
8c30: 74 75 72 6e 20 76 61 6c 75 65 20 77 69 74 68 20  turn value with 
8c40: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
8c50: 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e  kenOnly..**.** N
8c60: 6f 74 65 20 74 68 61 74 20 77 69 74 68 20 66 6c  ote that with fl
8c70: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
8c80: 55 43 45 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  UCE, this routin
8c90: 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c  es works on full
8ca0: 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75  -size.** (unredu
8cb0: 63 65 64 29 20 45 78 70 72 20 6f 62 6a 65 63 74  ced) Expr object
8cc0: 73 20 61 73 20 74 68 65 79 20 6f 72 20 6f 72 69  s as they or ori
8cd0: 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63  ginally construc
8ce0: 74 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  ted by the parse
8cf0: 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78 70  r..** During exp
8d00: 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73  ression analysis
8d10: 2c 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  , extra informat
8d20: 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65 64 20  ion is computed 
8d30: 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a  and moved into.*
8d40: 2a 20 6c 61 74 65 72 20 70 61 72 74 73 20 6f 66  * later parts of
8d50: 20 74 65 68 20 45 78 70 72 20 6f 62 6a 65 63 74   teh Expr object
8d60: 20 61 6e 64 20 74 68 61 74 20 65 78 74 72 61 20   and that extra 
8d70: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68  information migh
8d80: 74 20 67 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a  t get chopped.**
8d90: 20 6f 66 66 20 69 66 20 74 68 65 20 65 78 70 72   off if the expr
8da0: 65 73 73 69 6f 6e 20 69 73 20 72 65 64 75 63 65  ession is reduce
8db0: 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68  d.  Note also th
8dc0: 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 77  at it does not w
8dd0: 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61  ork to.** make a
8de0: 6e 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  n EXPRDUP_REDUCE
8df0: 20 63 6f 70 79 20 6f 66 20 61 20 72 65 64 75 63   copy of a reduc
8e00: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ed expression.  
8e10: 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c  It is only legal
8e20: 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65 20 61 20  .** to reduce a 
8e30: 70 72 69 73 74 69 6e 65 20 65 78 70 72 65 73 73  pristine express
8e40: 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20 74 68  ion tree from th
8e50: 65 20 70 61 72 73 65 72 2e 20 20 54 68 65 20 69  e parser.  The i
8e60: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a  mplementation.**
8e70: 20 6f 66 20 64 75 70 65 64 45 78 70 72 53 74 72   of dupedExprStr
8e80: 75 63 74 53 69 7a 65 28 29 20 63 6f 6e 74 61 69  uctSize() contai
8e90: 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73 73 65 72  n multiple asser
8ea0: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
8eb0: 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  hat attempt.** t
8ec0: 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 63  o enforce this c
8ed0: 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74  onstraint..*/.st
8ee0: 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78  atic int dupedEx
8ef0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70  prStructSize(Exp
8f00: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
8f10: 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20  {.  int nSize;. 
8f20: 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
8f30: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 7c  EXPRDUP_REDUCE |
8f40: 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a  | flags==0 ); /*
8f50: 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76   Only one flag v
8f60: 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a  alue allowed */.
8f70: 20 20 61 73 73 65 72 74 28 20 45 58 50 52 5f 46    assert( EXPR_F
8f80: 55 4c 4c 53 49 5a 45 3c 3d 30 78 66 66 66 20 29  ULLSIZE<=0xfff )
8f90: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 30 78 66  ;.  assert( (0xf
8fa0: 66 66 20 26 20 28 45 50 5f 52 65 64 75 63 65 64  ff & (EP_Reduced
8fb0: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d  |EP_TokenOnly))=
8fc0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d 66  =0 );.  if( 0==f
8fd0: 6c 61 67 73 20 29 7b 0a 20 20 20 20 6e 53 69 7a  lags ){.    nSiz
8fe0: 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a  e = EXPR_FULLSIZ
8ff0: 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
9000: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
9010: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
9020: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
9030: 63 65 64 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ced) );.    asse
9040: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
9050: 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a  erty(p, EP_FromJ
9060: 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20 61 73 73  oin) ); .    ass
9070: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
9080: 70 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54  perty(p, EP_MemT
9090: 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20 61 73 73  oken) );.    ass
90a0: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
90b0: 70 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65  perty(p, EP_NoRe
90c0: 64 75 63 65 29 20 29 3b 0a 20 20 20 20 69 66 28  duce) );.    if(
90d0: 20 70 2d 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e   p->pLeft || p->
90e0: 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  x.pList ){.     
90f0: 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 52 45   nSize = EXPR_RE
9100: 44 55 43 45 44 53 49 5a 45 20 7c 20 45 50 5f 52  DUCEDSIZE | EP_R
9110: 65 64 75 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73  educed;.    }els
9120: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
9130: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b   p->pRight==0 );
9140: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45  .      nSize = E
9150: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
9160: 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  E | EP_TokenOnly
9170: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
9180: 74 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f  turn nSize;.}../
9190: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
91a0: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  on returns the s
91b0: 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 72 65  pace in bytes re
91c0: 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20  quired to store 
91d0: 74 68 65 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20  the copy .** of 
91e0: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75  the Expr structu
91f0: 72 65 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66  re and a copy of
9200: 20 74 68 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b   the Expr.u.zTok
9210: 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20 74 68  en string (if th
9220: 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20  at.** string is 
9230: 64 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61  defined.).*/.sta
9240: 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70  tic int dupedExp
9250: 72 4e 6f 64 65 53 69 7a 65 28 45 78 70 72 20 2a  rNodeSize(Expr *
9260: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
9270: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 64 75 70   int nByte = dup
9280: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
9290: 28 70 2c 20 66 6c 61 67 73 29 20 26 20 30 78 66  (p, flags) & 0xf
92a0: 66 66 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48  ff;.  if( !ExprH
92b0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
92c0: 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d  _IntValue) && p-
92d0: 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  >u.zToken ){.   
92e0: 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65   nByte += sqlite
92f0: 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a  3Strlen30(p->u.z
9300: 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20  Token)+1;.  }.  
9310: 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42  return ROUND8(nB
9320: 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  yte);.}../*.** R
9330: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
9340: 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72   of bytes requir
9350: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 64  ed to create a d
9360: 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20  uplicate of the 
9370: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
9380: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
9390: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  st argument. The
93a0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
93b0: 20 69 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f   is a.** mask co
93c0: 6e 74 61 69 6e 69 6e 67 20 45 58 50 52 44 55 50  ntaining EXPRDUP
93d0: 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a  _XXX flags..**.*
93e0: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
93f0: 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 73 70  rned includes sp
9400: 61 63 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  ace to create a 
9410: 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72  copy of the Expr
9420: 20 73 74 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c   struct.** itsel
9430: 66 20 61 6e 64 20 74 68 65 20 62 75 66 66 65 72  f and the buffer
9440: 20 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20   referred to by 
9450: 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69  Expr.u.zToken, i
9460: 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f any..**.** If 
9470: 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44 55  the EXPRDUP_REDU
9480: 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  CE flag is set, 
9490: 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20  then the return 
94a0: 76 61 6c 75 65 20 69 6e 63 6c 75 64 65 73 20 0a  value includes .
94b0: 2a 2a 20 73 70 61 63 65 20 74 6f 20 64 75 70 6c  ** space to dupl
94c0: 69 63 61 74 65 20 61 6c 6c 20 45 78 70 72 20 6e  icate all Expr n
94d0: 6f 64 65 73 20 69 6e 20 74 68 65 20 74 72 65 65  odes in the tree
94e0: 20 66 6f 72 6d 65 64 20 62 79 20 45 78 70 72 2e   formed by Expr.
94f0: 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78  pLeft .** and Ex
9500: 70 72 2e 70 52 69 67 68 74 20 76 61 72 69 61 62  pr.pRight variab
9510: 6c 65 73 20 28 62 75 74 20 6e 6f 74 20 66 6f 72  les (but not for
9520: 20 61 6e 79 20 73 74 72 75 63 74 75 72 65 73 20   any structures 
9530: 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a  pointed to or .*
9540: 2a 20 64 65 73 63 65 6e 64 65 64 20 66 72 6f 6d  * descended from
9550: 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73   the Expr.x.pLis
9560: 74 20 6f 72 20 45 78 70 72 2e 78 2e 70 53 65 6c  t or Expr.x.pSel
9570: 65 63 74 20 76 61 72 69 61 62 6c 65 73 29 2e 0a  ect variables)..
9580: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
9590: 70 65 64 45 78 70 72 53 69 7a 65 28 45 78 70 72  pedExprSize(Expr
95a0: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
95b0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 30  .  int nByte = 0
95c0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
95d0: 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45 78   nByte = dupedEx
95e0: 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c  prNodeSize(p, fl
95f0: 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 66 6c  ags);.    if( fl
9600: 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55  ags&EXPRDUP_REDU
9610: 43 45 20 29 7b 0a 20 20 20 20 20 20 6e 42 79 74  CE ){.      nByt
9620: 65 20 2b 3d 20 64 75 70 65 64 45 78 70 72 53 69  e += dupedExprSi
9630: 7a 65 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61  ze(p->pLeft, fla
9640: 67 73 29 20 2b 20 64 75 70 65 64 45 78 70 72 53  gs) + dupedExprS
9650: 69 7a 65 28 70 2d 3e 70 52 69 67 68 74 2c 20 66  ize(p->pRight, f
9660: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  lags);.    }.  }
9670: 0a 20 20 72 65 74 75 72 6e 20 6e 42 79 74 65 3b  .  return nByte;
9680: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
9690: 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c  unction is simil
96a0: 61 72 20 74 6f 20 73 71 6c 69 74 65 33 45 78 70  ar to sqlite3Exp
96b0: 72 44 75 70 28 29 2c 20 65 78 63 65 70 74 20 74  rDup(), except t
96c0: 68 61 74 20 69 66 20 70 7a 42 75 66 66 65 72 20  hat if pzBuffer 
96d0: 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  .** is not NULL 
96e0: 74 68 65 6e 20 2a 70 7a 42 75 66 66 65 72 20 69  then *pzBuffer i
96f0: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69  s assumed to poi
9700: 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6c  nt to a buffer l
9710: 61 72 67 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20  arge enough .** 
9720: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70  to store the cop
9730: 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20  y of expression 
9740: 70 2c 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66  p, the copies of
9750: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20   p->u.zToken.** 
9760: 28 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c  (if applicable),
9770: 20 61 6e 64 20 74 68 65 20 63 6f 70 69 65 73 20   and the copies 
9780: 6f 66 20 74 68 65 20 70 2d 3e 70 4c 65 66 74 20  of the p->pLeft 
9790: 61 6e 64 20 70 2d 3e 70 52 69 67 68 74 20 65 78  and p->pRight ex
97a0: 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66  pressions,.** if
97b0: 20 61 6e 79 2e 20 42 65 66 6f 72 65 20 72 65 74   any. Before ret
97c0: 75 72 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65  urning, *pzBuffe
97d0: 72 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  r is set to the 
97e0: 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  first byte past 
97f0: 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f  the.** portion o
9800: 66 20 74 68 65 20 62 75 66 66 65 72 20 63 6f 70  f the buffer cop
9810: 69 65 64 20 69 6e 74 6f 20 62 79 20 74 68 69 73  ied into by this
9820: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
9830: 61 74 69 63 20 45 78 70 72 20 2a 65 78 70 72 44  atic Expr *exprD
9840: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
9850: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 64 75 70  Expr *p, int dup
9860: 46 6c 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75  Flags, u8 **pzBu
9870: 66 66 65 72 29 7b 0a 20 20 45 78 70 72 20 2a 70  ffer){.  Expr *p
9880: 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f  New;           /
9890: 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
98a0: 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a 41 6c 6c 6f  n */.  u8 *zAllo
98b0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  c;           /* 
98c0: 4d 65 6d 6f 72 79 20 73 70 61 63 65 20 66 72 6f  Memory space fro
98d0: 6d 20 77 68 69 63 68 20 74 6f 20 62 75 69 6c 64  m which to build
98e0: 20 45 78 70 72 20 6f 62 6a 65 63 74 20 2a 2f 0a   Expr object */.
98f0: 20 20 75 33 32 20 73 74 61 74 69 63 46 6c 61 67    u32 staticFlag
9900: 3b 20 20 20 20 20 20 20 2f 2a 20 45 50 5f 53 74  ;       /* EP_St
9910: 61 74 69 63 20 69 66 20 73 70 61 63 65 20 6e 6f  atic if space no
9920: 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  t obtained from 
9930: 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20 20 61 73 73  malloc */..  ass
9940: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
9950: 61 73 73 65 72 74 28 20 70 20 29 3b 0a 20 20 61  assert( p );.  a
9960: 73 73 65 72 74 28 20 64 75 70 46 6c 61 67 73 3d  ssert( dupFlags=
9970: 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67 73 3d 3d  =0 || dupFlags==
9980: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29  EXPRDUP_REDUCE )
9990: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 7a 42 75  ;.  assert( pzBu
99a0: 66 66 65 72 3d 3d 30 20 7c 7c 20 64 75 70 46 6c  ffer==0 || dupFl
99b0: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
99c0: 55 43 45 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67  UCE );..  /* Fig
99d0: 75 72 65 20 6f 75 74 20 77 68 65 72 65 20 74 6f  ure out where to
99e0: 20 77 72 69 74 65 20 74 68 65 20 6e 65 77 20 45   write the new E
99f0: 78 70 72 20 73 74 72 75 63 74 75 72 65 2e 20 2a  xpr structure. *
9a00: 2f 0a 20 20 69 66 28 20 70 7a 42 75 66 66 65 72  /.  if( pzBuffer
9a10: 20 29 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63 20 3d   ){.    zAlloc =
9a20: 20 2a 70 7a 42 75 66 66 65 72 3b 0a 20 20 20 20   *pzBuffer;.    
9a30: 73 74 61 74 69 63 46 6c 61 67 20 3d 20 45 50 5f  staticFlag = EP_
9a40: 53 74 61 74 69 63 3b 0a 20 20 7d 65 6c 73 65 7b  Static;.  }else{
9a50: 0a 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 73 71  .    zAlloc = sq
9a60: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
9a70: 4e 4e 28 64 62 2c 20 64 75 70 65 64 45 78 70 72  NN(db, dupedExpr
9a80: 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61 67 73  Size(p, dupFlags
9a90: 29 29 3b 0a 20 20 20 20 73 74 61 74 69 63 46 6c  ));.    staticFl
9aa0: 61 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e  ag = 0;.  }.  pN
9ab0: 65 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c  ew = (Expr *)zAl
9ac0: 6c 6f 63 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77  loc;..  if( pNew
9ad0: 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 74 20 6e   ){.    /* Set n
9ae0: 4e 65 77 53 69 7a 65 20 74 6f 20 74 68 65 20 73  NewSize to the s
9af0: 69 7a 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ize allocated fo
9b00: 72 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  r the structure 
9b10: 70 6f 69 6e 74 65 64 20 74 6f 0a 20 20 20 20 2a  pointed to.    *
9b20: 2a 20 62 79 20 70 4e 65 77 2e 20 54 68 69 73 20  * by pNew. This 
9b30: 69 73 20 65 69 74 68 65 72 20 45 58 50 52 5f 46  is either EXPR_F
9b40: 55 4c 4c 53 49 5a 45 2c 20 45 58 50 52 5f 52 45  ULLSIZE, EXPR_RE
9b50: 44 55 43 45 44 53 49 5a 45 20 6f 72 0a 20 20 20  DUCEDSIZE or.   
9b60: 20 2a 2a 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e   ** EXPR_TOKENON
9b70: 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69  LYSIZE. nToken i
9b80: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
9b90: 62 65 72 20 6f 66 20 62 79 74 65 73 20 63 6f 6e  ber of bytes con
9ba0: 73 75 6d 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  sumed.    ** by 
9bb0: 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20  the copy of the 
9bc0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69  p->u.zToken stri
9bd0: 6e 67 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20  ng (if any)..   
9be0: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e   */.    const un
9bf0: 73 69 67 6e 65 64 20 6e 53 74 72 75 63 74 53 69  signed nStructSi
9c00: 7a 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74  ze = dupedExprSt
9c10: 72 75 63 74 53 69 7a 65 28 70 2c 20 64 75 70 46  ructSize(p, dupF
9c20: 6c 61 67 73 29 3b 0a 20 20 20 20 63 6f 6e 73 74  lags);.    const
9c30: 20 69 6e 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20   int nNewSize = 
9c40: 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20 30 78  nStructSize & 0x
9c50: 66 66 66 3b 0a 20 20 20 20 69 6e 74 20 6e 54 6f  fff;.    int nTo
9c60: 6b 65 6e 3b 0a 20 20 20 20 69 66 28 20 21 45 78  ken;.    if( !Ex
9c70: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
9c80: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26   EP_IntValue) &&
9c90: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a   p->u.zToken ){.
9ca0: 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 73        nToken = s
9cb0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
9cc0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b 20 31 3b  ->u.zToken) + 1;
9cd0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9ce0: 20 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20    nToken = 0;.  
9cf0: 20 20 7d 0a 20 20 20 20 69 66 28 20 64 75 70 46    }.    if( dupF
9d00: 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 61 73  lags ){.      as
9d10: 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f  sert( ExprHasPro
9d20: 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75  perty(p, EP_Redu
9d30: 63 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ced)==0 );.     
9d40: 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20   memcpy(zAlloc, 
9d50: 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20  p, nNewSize);.  
9d60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
9d70: 33 32 20 6e 53 69 7a 65 20 3d 20 28 75 33 32 29  32 nSize = (u32)
9d80: 65 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  exprStructSize(p
9d90: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
9da0: 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a 65  zAlloc, p, nSize
9db0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 53 69  );.      if( nSi
9dc0: 7a 65 3c 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  ze<EXPR_FULLSIZE
9dd0: 20 29 7b 20 0a 20 20 20 20 20 20 20 20 6d 65 6d   ){ .        mem
9de0: 73 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a  set(&zAlloc[nSiz
9df0: 65 5d 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c  e], 0, EXPR_FULL
9e00: 53 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20  SIZE-nSize);.   
9e10: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
9e20: 2f 2a 20 53 65 74 20 74 68 65 20 45 50 5f 52 65  /* Set the EP_Re
9e30: 64 75 63 65 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f  duced, EP_TokenO
9e40: 6e 6c 79 2c 20 61 6e 64 20 45 50 5f 53 74 61 74  nly, and EP_Stat
9e50: 69 63 20 66 6c 61 67 73 20 61 70 70 72 6f 70 72  ic flags appropr
9e60: 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 70  iately. */.    p
9e70: 4e 65 77 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28  New->flags &= ~(
9e80: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
9e90: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61 74 69  kenOnly|EP_Stati
9ea0: 63 7c 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 3b 0a  c|EP_MemToken);.
9eb0: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
9ec0: 7c 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26  |= nStructSize &
9ed0: 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f   (EP_Reduced|EP_
9ee0: 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20  TokenOnly);.    
9ef0: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 73  pNew->flags |= s
9f00: 74 61 74 69 63 46 6c 61 67 3b 0a 0a 20 20 20 20  taticFlag;..    
9f10: 2f 2a 20 43 6f 70 79 20 74 68 65 20 70 2d 3e 75  /* Copy the p->u
9f20: 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 2c 20  .zToken string, 
9f30: 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69  if any. */.    i
9f40: 66 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  f( nToken ){.   
9f50: 20 20 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20     char *zToken 
9f60: 3d 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  = pNew->u.zToken
9f70: 20 3d 20 28 63 68 61 72 2a 29 26 7a 41 6c 6c 6f   = (char*)&zAllo
9f80: 63 5b 6e 4e 65 77 53 69 7a 65 5d 3b 0a 20 20 20  c[nNewSize];.   
9f90: 20 20 20 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e     memcpy(zToken
9fa0: 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e  , p->u.zToken, n
9fb0: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20  Token);.    }.. 
9fc0: 20 20 20 69 66 28 20 30 3d 3d 28 28 70 2d 3e 66     if( 0==((p->f
9fd0: 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61 67 73  lags|pNew->flags
9fe0: 29 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ) & EP_TokenOnly
9ff0: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69  ) ){.      /* Fi
a000: 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e  ll in the pNew->
a010: 78 2e 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65  x.pSelect or pNe
a020: 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65  w->x.pList membe
a030: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  r. */.      if( 
a040: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a050: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
a060: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
a070: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71  ->x.pSelect = sq
a080: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
a090: 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  b, p->x.pSelect,
a0a0: 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20   dupFlags);.    
a0b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a0c0: 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d   pNew->x.pList =
a0d0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
a0e0: 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69  Dup(db, p->x.pLi
a0f0: 73 74 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20  st, dupFlags);. 
a100: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
a110: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65    /* Fill in pNe
a120: 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65  w->pLeft and pNe
a130: 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20  w->pRight. */.  
a140: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
a150: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52  perty(pNew, EP_R
a160: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
a170: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 7a 41  nly) ){.      zA
a180: 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78 70  lloc += dupedExp
a190: 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 64 75 70  rNodeSize(p, dup
a1a0: 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66  Flags);.      if
a1b0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
a1c0: 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75 63  y(pNew, EP_Reduc
a1d0: 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ed) ){.        p
a1e0: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d 3e  New->pLeft = p->
a1f0: 70 4c 65 66 74 20 3f 0a 20 20 20 20 20 20 20 20  pLeft ?.        
a200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
a210: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65  prDup(db, p->pLe
a220: 66 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55  ft, EXPRDUP_REDU
a230: 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a 20 30  CE, &zAlloc) : 0
a240: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
a250: 70 52 69 67 68 74 20 3d 20 70 2d 3e 70 52 69 67  pRight = p->pRig
a260: 68 74 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  ht ?.           
a270: 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70 72              expr
a280: 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68  Dup(db, p->pRigh
a290: 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  t, EXPRDUP_REDUC
a2a0: 45 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b  E, &zAlloc) : 0;
a2b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
a2c0: 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20  f( pzBuffer ){. 
a2d0: 20 20 20 20 20 20 20 2a 70 7a 42 75 66 66 65 72         *pzBuffer
a2e0: 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20   = zAlloc;.     
a2f0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
a300: 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
a310: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
a320: 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  okenOnly) ){.   
a330: 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6f       if( pNew->o
a340: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  p==TK_SELECT_COL
a350: 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UMN ){.         
a360: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70   pNew->pLeft = p
a370: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20  ->pLeft;.       
a380: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a390: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
a3a0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
a3b0: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b  b, p->pLeft, 0);
a3c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a3d0: 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20     pNew->pRight 
a3e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
a3f0: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20  (db, p->pRight, 
a400: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
a410: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
a420: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  New;.}../*.** Cr
a430: 65 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  eate and return 
a440: 61 20 64 65 65 70 20 63 6f 70 79 20 6f 66 20 74  a deep copy of t
a450: 68 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  he object passed
a460: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a   as the second .
a470: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  ** argument. If 
a480: 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e  an OOM condition
a490: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
a4a0: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
a4b0: 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 62 2d  d.** and the db-
a4c0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
a4d0: 61 67 20 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64  ag set..*/.#ifnd
a4e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
a4f0: 54 45 0a 73 74 61 74 69 63 20 57 69 74 68 20 2a  TE.static With *
a500: 77 69 74 68 44 75 70 28 73 71 6c 69 74 65 33 20  withDup(sqlite3 
a510: 2a 64 62 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20  *db, With *p){. 
a520: 20 57 69 74 68 20 2a 70 52 65 74 20 3d 20 30 3b   With *pRet = 0;
a530: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
a540: 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  int nByte = size
a550: 6f 66 28 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28  of(*p) + sizeof(
a560: 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e  p->a[0]) * (p->n
a570: 43 74 65 2d 31 29 3b 0a 20 20 20 20 70 52 65 74  Cte-1);.    pRet
a580: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
a590: 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
a5a0: 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74 20  );.    if( pRet 
a5b0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
a5c0: 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 43 74 65        pRet->nCte
a5d0: 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20   = p->nCte;.    
a5e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
a5f0: 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCte; i++){.    
a600: 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70      pRet->a[i].p
a610: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
a620: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d  SelectDup(db, p-
a630: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30  >a[i].pSelect, 0
a640: 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d  );.        pRet-
a650: 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71  >a[i].pCols = sq
a660: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
a670: 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f  (db, p->a[i].pCo
a680: 6c 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ls, 0);.        
a690: 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  pRet->a[i].zName
a6a0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
a6b0: 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a  up(db, p->a[i].z
a6c0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
a6d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
a6e0: 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a  n pRet;.}.#else.
a6f0: 23 20 64 65 66 69 6e 65 20 77 69 74 68 44 75 70  # define withDup
a700: 28 78 2c 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a  (x,y) 0.#endif..
a710: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
a720: 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75  ing group of rou
a730: 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20  tines make deep 
a740: 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65 73  copies of expres
a750: 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73  sions,.** expres
a760: 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c  sion lists, ID l
a770: 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74  ists, and select
a780: 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68   statements.  Th
a790: 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20  e copies can.** 
a7a0: 62 65 20 64 65 6c 65 74 65 64 20 28 62 79 20 62  be deleted (by b
a7b0: 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74  eing passed to t
a7c0: 68 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20  heir respective 
a7d0: 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74  ...Delete() rout
a7e0: 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74  ines).** without
a7f0: 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f   effecting the o
a800: 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20  riginals..**.** 
a810: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  The expression l
a820: 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75  ist, ID, and sou
a830: 72 63 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e  rce lists return
a840: 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c   by sqlite3ExprL
a850: 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c  istDup(),.** sql
a860: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c  ite3IdListDup(),
a870: 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c   and sqlite3SrcL
a880: 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74  istDup() can not
a890: 20 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61   be further expa
a8a0: 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73  nded .** by subs
a8b0: 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
a8c0: 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e  sqlite*ListAppen
a8d0: 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a  d() routines..**
a8e0: 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74  .** Any tables t
a8f0: 68 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20  hat the SrcList 
a900: 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
a910: 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65  re not duplicate
a920: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61  d..**.** The fla
a930: 67 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e  gs parameter con
a940: 74 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74  tains a combinat
a950: 69 6f 6e 20 6f 66 20 74 68 65 20 45 58 50 52 44  ion of the EXPRD
a960: 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a  UP_XXX flags..**
a970: 20 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f   If the EXPRDUP_
a980: 52 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73  REDUCE flag is s
a990: 65 74 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72  et, then the str
a9a0: 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20  ucture returned 
a9b0: 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65  is a.** truncate
a9c0: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  d version of the
a9d0: 20 75 73 75 61 6c 20 45 78 70 72 20 73 74 72 75   usual Expr stru
a9e0: 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20  cture that will 
a9f0: 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20  be stored as.** 
aa00: 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d  part of the in-m
aa10: 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
aa20: 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
aa30: 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a  base schema..*/.
aa40: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
aa50: 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  rDup(sqlite3 *db
aa60: 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  , Expr *p, int f
aa70: 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28  lags){.  assert(
aa80: 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61   flags==0 || fla
aa90: 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55  gs==EXPRDUP_REDU
aaa0: 43 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  CE );.  return p
aab0: 20 3f 20 65 78 70 72 44 75 70 28 64 62 2c 20 70   ? exprDup(db, p
aac0: 2c 20 66 6c 61 67 73 2c 20 30 29 20 3a 20 30 3b  , flags, 0) : 0;
aad0: 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c  .}.ExprList *sql
aae0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
aaf0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
ab00: 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c  rList *p, int fl
ab10: 61 67 73 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  ags){.  ExprList
ab20: 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74   *pNew;.  struct
ab30: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
ab40: 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d  pItem, *pOldItem
ab50: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  ;.  int i;.  ass
ab60: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
ab70: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
ab80: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
ab90: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
aba0: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  NN(db, sizeof(*p
abb0: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
abc0: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
abd0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20  ;.  pNew->nExpr 
abe0: 3d 20 69 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a  = i = p->nExpr;.
abf0: 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 45    if( (flags & E
ac00: 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3d 3d  XPRDUP_REDUCE)==
ac10: 30 20 29 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70  0 ) for(i=1; i<p
ac20: 2d 3e 6e 45 78 70 72 3b 20 69 2b 3d 69 29 7b 7d  ->nExpr; i+=i){}
ac30: 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74  .  pNew->a = pIt
ac40: 65 6d 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  em = sqlite3DbMa
ac50: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 20 69  llocRawNN(db,  i
ac60: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29  *sizeof(p->a[0])
ac70: 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 3d   );.  if( pItem=
ac80: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
ac90: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77  3DbFree(db, pNew
aca0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
acb0: 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65 6d  .  } .  pOldItem
acc0: 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69   = p->a;.  for(i
acd0: 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20  =0; i<p->nExpr; 
ace0: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f  i++, pItem++, pO
acf0: 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45  ldItem++){.    E
ad00: 78 70 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d 20  xpr *pOldExpr = 
ad10: 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 3b  pOldItem->pExpr;
ad20: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70  .    pItem->pExp
ad30: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
ad40: 75 70 28 64 62 2c 20 70 4f 6c 64 45 78 70 72 2c  up(db, pOldExpr,
ad50: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 49 74   flags);.    pIt
ad60: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
ad70: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
ad80: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  pOldItem->zName)
ad90: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70  ;.    pItem->zSp
ada0: 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  an = sqlite3DbSt
adb0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
adc0: 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70  m->zSpan);.    p
add0: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20  Item->sortOrder 
ade0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74  = pOldItem->sort
adf0: 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65 6d  Order;.    pItem
ae00: 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20  ->done = 0;.    
ae10: 70 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61  pItem->bSpanIsTa
ae20: 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53  b = pOldItem->bS
ae30: 70 61 6e 49 73 54 61 62 3b 0a 20 20 20 20 70 49  panIsTab;.    pI
ae40: 74 65 6d 2d 3e 75 20 3d 20 70 4f 6c 64 49 74 65  tem->u = pOldIte
ae50: 6d 2d 3e 75 3b 0a 20 20 7d 0a 20 20 72 65 74 75  m->u;.  }.  retu
ae60: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
ae70: 2a 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72  * If cursors, tr
ae80: 69 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e  iggers, views an
ae90: 64 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65  d subqueries are
aea0: 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f   all omitted fro
aeb0: 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20  m.** the build, 
aec0: 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65  then none of the
aed0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
aee0: 6e 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20  nes, except for 
aef0: 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63  .** sqlite3Selec
af00: 74 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63  tDup(), can be c
af10: 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65  alled. sqlite3Se
af20: 6c 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d  lectDup() is som
af30: 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64  etimes.** called
af40: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67   with a NULL arg
af50: 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64  ument..*/.#if !d
af60: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
af70: 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
af80: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
af90: 5f 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20  _TRIGGER) \. || 
afa0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
afb0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53  OMIT_SUBQUERY).S
afc0: 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
afd0: 72 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65  rcListDup(sqlite
afe0: 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a  3 *db, SrcList *
aff0: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
b000: 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a   SrcList *pNew;.
b010: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
b020: 42 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Byte;.  assert( 
b030: 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  db!=0 );.  if( p
b040: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
b050: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
b060: 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e  (*p) + (p->nSrc>
b070: 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  0 ? sizeof(p->a[
b080: 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31  0]) * (p->nSrc-1
b090: 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d  ) : 0);.  pNew =
b0a0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
b0b0: 52 61 77 4e 4e 28 64 62 2c 20 6e 42 79 74 65 20  RawNN(db, nByte 
b0c0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
b0d0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
b0e0: 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77  New->nSrc = pNew
b0f0: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53  ->nAlloc = p->nS
b100: 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rc;.  for(i=0; i
b110: 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  <p->nSrc; i++){.
b120: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
b130: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
b140: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
b150: 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
b160: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
b170: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
b180: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
b190: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53      pNewItem->pS
b1a0: 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d  chema = pOldItem
b1b0: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70  ->pSchema;.    p
b1c0: 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  NewItem->zDataba
b1d0: 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  se = sqlite3DbSt
b1e0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
b1f0: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
b200: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
b210: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
b220: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
b230: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
b240: 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  NewItem->zAlias 
b250: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
b260: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
b270: 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65  zAlias);.    pNe
b280: 77 49 74 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64  wItem->fg = pOld
b290: 49 74 65 6d 2d 3e 66 67 3b 0a 20 20 20 20 70 4e  Item->fg;.    pN
b2a0: 65 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  ewItem->iCursor 
b2b0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72  = pOldItem->iCur
b2c0: 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  sor;.    pNewIte
b2d0: 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d  m->addrFillSub =
b2e0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46   pOldItem->addrF
b2f0: 69 6c 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65 77  illSub;.    pNew
b300: 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20  Item->regReturn 
b310: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52  = pOldItem->regR
b320: 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70  eturn;.    if( p
b330: 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e  NewItem->fg.isIn
b340: 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20 20  dexedBy ){.     
b350: 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 7a 49   pNewItem->u1.zI
b360: 6e 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74  ndexedBy = sqlit
b370: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
b380: 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64  OldItem->u1.zInd
b390: 65 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20  exedBy);.    }. 
b3a0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 42     pNewItem->pIB
b3b0: 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d  Index = pOldItem
b3c0: 2d 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 20 20  ->pIBIndex;.    
b3d0: 69 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67  if( pNewItem->fg
b3e0: 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20  .isTabFunc ){.  
b3f0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31      pNewItem->u1
b400: 2e 70 46 75 6e 63 41 72 67 20 3d 20 0a 20 20 20  .pFuncArg = .   
b410: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
b420: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f  prListDup(db, pO
b430: 6c 64 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63  ldItem->u1.pFunc
b440: 41 72 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  Arg, flags);.   
b450: 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e   }.    pTab = pN
b460: 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70  ewItem->pTab = p
b470: 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  OldItem->pTab;. 
b480: 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20     if( pTab ){. 
b490: 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b       pTab->nRef+
b4a0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  +;.    }.    pNe
b4b0: 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  wItem->pSelect =
b4c0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
b4d0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
b4e0: 70 53 65 6c 65 63 74 2c 20 66 6c 61 67 73 29 3b  pSelect, flags);
b4f0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
b500: 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  On = sqlite3Expr
b510: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
b520: 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a 20  ->pOn, flags);. 
b530: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73     pNewItem->pUs
b540: 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c  ing = sqlite3IdL
b550: 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  istDup(db, pOldI
b560: 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
b570: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55    pNewItem->colU
b580: 73 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  sed = pOldItem->
b590: 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72  colUsed;.  }.  r
b5a0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64  eturn pNew;.}.Id
b5b0: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c  List *sqlite3IdL
b5c0: 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  istDup(sqlite3 *
b5d0: 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a  db, IdList *p){.
b5e0: 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a    IdList *pNew;.
b5f0: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
b600: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  t( db!=0 );.  if
b610: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
b620: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
b630: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
b640: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
b650: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
b660: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
b670: 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d    pNew->nId = p-
b680: 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20  >nId;.  pNew->a 
b690: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
b6a0: 63 52 61 77 4e 4e 28 64 62 2c 20 70 2d 3e 6e 49  cRawNN(db, p->nI
b6b0: 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  d*sizeof(p->a[0]
b6c0: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  ) );.  if( pNew-
b6d0: 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  >a==0 ){.    sql
b6e0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
b6f0: 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  New);.    return
b700: 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74   0;.  }.  /* Not
b710: 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20 74  e that because t
b720: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
b730: 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d  llocation for p-
b740: 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  >a[] is not.  **
b750: 20 6e 65 63 65 73 73 61 72 69 6c 79 20 61 20 70   necessarily a p
b760: 6f 77 65 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c  ower of two, sql
b770: 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64  ite3IdListAppend
b780: 28 29 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61  () may not be ca
b790: 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  lled.  ** on the
b7a0: 20 64 75 70 6c 69 63 61 74 65 20 63 72 65 61 74   duplicate creat
b7b0: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
b7c0: 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ion. */.  for(i=
b7d0: 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b  0; i<p->nId; i++
b7e0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ){.    struct Id
b7f0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49  List_item *pNewI
b800: 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69  tem = &pNew->a[i
b810: 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ];.    struct Id
b820: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49  List_item *pOldI
b830: 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a  tem = &p->a[i];.
b840: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e      pNewItem->zN
b850: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
b860: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
b870: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
b880: 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20  pNewItem->idx = 
b890: 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20  pOldItem->idx;. 
b8a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
b8b0: 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  ;.}.Select *sqli
b8c0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c  te3SelectDup(sql
b8d0: 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74  ite3 *db, Select
b8e0: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
b8f0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 2c  .  Select *pNew,
b900: 20 2a 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65   *pPrior;.  asse
b910: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
b920: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
b930: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
b940: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
b950: 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29  N(db, sizeof(*p)
b960: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
b970: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
b980: 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73  pNew->pEList = s
b990: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
b9a0: 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  p(db, p->pEList,
b9b0: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
b9c0: 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53  >pSrc = sqlite3S
b9d0: 72 63 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  rcListDup(db, p-
b9e0: 3e 70 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a 20  >pSrc, flags);. 
b9f0: 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20   pNew->pWhere = 
ba00: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
ba10: 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c  b, p->pWhere, fl
ba20: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47  ags);.  pNew->pG
ba30: 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
ba40: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
ba50: 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c 61  p->pGroupBy, fla
ba60: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61  gs);.  pNew->pHa
ba70: 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78  ving = sqlite3Ex
ba80: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48 61  prDup(db, p->pHa
ba90: 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ving, flags);.  
baa0: 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
bab0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
bac0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  Dup(db, p->pOrde
bad0: 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  rBy, flags);.  p
bae0: 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b  New->op = p->op;
baf0: 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20  .  pNew->pPrior 
bb00: 3d 20 70 50 72 69 6f 72 20 3d 20 73 71 6c 69 74  = pPrior = sqlit
bb10: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
bb20: 70 2d 3e 70 50 72 69 6f 72 2c 20 66 6c 61 67 73  p->pPrior, flags
bb30: 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 20  );.  if( pPrior 
bb40: 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20  ) pPrior->pNext 
bb50: 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e  = pNew;.  pNew->
bb60: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65  pNext = 0;.  pNe
bb70: 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69  w->pLimit = sqli
bb80: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
bb90: 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29  ->pLimit, flags)
bba0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65  ;.  pNew->pOffse
bbb0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
bbc0: 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65  up(db, p->pOffse
bbd0: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  t, flags);.  pNe
bbe0: 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  w->iLimit = 0;. 
bbf0: 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d   pNew->iOffset =
bc00: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46   0;.  pNew->selF
bc10: 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61  lags = p->selFla
bc20: 67 73 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68  gs & ~SF_UsesEph
bc30: 65 6d 65 72 61 6c 3b 0a 20 20 70 4e 65 77 2d 3e  emeral;.  pNew->
bc40: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
bc50: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  = -1;.  pNew->ad
bc60: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20  drOpenEphm[1] = 
bc70: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 65 6c  -1;.  pNew->nSel
bc80: 65 63 74 52 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c  ectRow = p->nSel
bc90: 65 63 74 52 6f 77 3b 0a 20 20 70 4e 65 77 2d 3e  ectRow;.  pNew->
bca0: 70 57 69 74 68 20 3d 20 77 69 74 68 44 75 70 28  pWith = withDup(
bcb0: 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a 20  db, p->pWith);. 
bcc0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65   sqlite3SelectSe
bcd0: 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70 2d 3e 7a  tName(pNew, p->z
bce0: 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  SelName);.  retu
bcf0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65  rn pNew;.}.#else
bd00: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
bd10: 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65  SelectDup(sqlite
bd20: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
bd30: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
bd40: 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a  assert( p==0 );.
bd50: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
bd60: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  ndif.../*.** Add
bd70: 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
bd80: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20  o the end of an 
bd90: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
bda0: 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a    If pList is.**
bdb0: 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c   initially NULL,
bdc0: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e   then create a n
bdd0: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ew expression li
bde0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  st..**.** If a m
bdf0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
be00: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
be10: 68 65 20 65 6e 74 69 72 65 20 6c 69 73 74 20 69  he entire list i
be20: 73 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e  s freed and.** N
be30: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
be40: 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73    If non-NULL is
be50: 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
be60: 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
be70: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77  .** that the new
be80: 20 65 6e 74 72 79 20 77 61 73 20 73 75 63 63 65   entry was succe
be90: 73 73 66 75 6c 6c 79 20 61 70 70 65 6e 64 65 64  ssfully appended
bea0: 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73  ..*/.ExprList *s
beb0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
bec0: 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70  pend(.  Parse *p
bed0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
bee0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
bef0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
bf00: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
bf10: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
bf20: 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68   to append. Migh
bf30: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  t be NULL */.  E
bf40: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
bf50: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
bf60: 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e  sion to be appen
bf70: 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  ded. Might be NU
bf80: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  LL */.){.  sqlit
bf90: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
bfa0: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64  >db;.  assert( d
bfb0: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c  b!=0 );.  if( pL
bfc0: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
bfd0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ist = sqlite3DbM
bfe0: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
bff0: 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20  izeof(ExprList) 
c000: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
c010: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
c020: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a  o no_mem;.    }.
c030: 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72      pList->nExpr
c040: 20 3d 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d   = 0;.    pList-
c050: 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  >a = sqlite3DbMa
c060: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
c070: 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
c080: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  ));.    if( pLis
c090: 74 2d 3e 61 3d 3d 30 20 29 20 67 6f 74 6f 20 6e  t->a==0 ) goto n
c0a0: 6f 5f 6d 65 6d 3b 0a 20 20 7d 65 6c 73 65 20 69  o_mem;.  }else i
c0b0: 66 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72  f( (pList->nExpr
c0c0: 20 26 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72   & (pList->nExpr
c0d0: 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  -1))==0 ){.    s
c0e0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
c0f0: 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61 73 73 65  tem *a;.    asse
c100: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
c110: 3e 30 20 29 3b 0a 20 20 20 20 61 20 3d 20 73 71  >0 );.    a = sq
c120: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
c130: 62 2c 20 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69  b, pList->a, pLi
c140: 73 74 2d 3e 6e 45 78 70 72 2a 32 2a 73 69 7a 65  st->nExpr*2*size
c150: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
c160: 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29  ;.    if( a==0 )
c170: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
c180: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  mem;.    }.    p
c190: 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d  List->a = a;.  }
c1a0: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
c1b0: 2d 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ->a!=0 );.  if( 
c1c0: 31 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  1 ){.    struct 
c1d0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
c1e0: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
c1f0: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d  [pList->nExpr++]
c200: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74  ;.    memset(pIt
c210: 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  em, 0, sizeof(*p
c220: 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49 74 65  Item));.    pIte
c230: 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  m->pExpr = pExpr
c240: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
c250: 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20  List;..no_mem:  
c260: 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c     .  /* Avoid l
c270: 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66  eaking memory if
c280: 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c   malloc has fail
c290: 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ed. */.  sqlite3
c2a0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
c2b0: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
c2c0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
c2d0: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  b, pList);.  ret
c2e0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
c2f0: 70 43 6f 6c 75 6d 6e 73 20 61 6e 64 20 70 45 78  pColumns and pEx
c300: 70 72 20 66 6f 72 6d 20 61 20 76 65 63 74 6f 72  pr form a vector
c310: 20 61 73 73 69 67 6e 6d 65 6e 74 20 77 68 69 63   assignment whic
c320: 68 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  h is part of the
c330: 20 53 45 54 0a 2a 2a 20 63 6c 61 75 73 65 20 6f   SET.** clause o
c340: 66 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74  f an UPDATE stat
c350: 65 6d 65 6e 74 2e 20 20 4c 69 6b 65 20 74 68 69  ement.  Like thi
c360: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
c370: 28 61 2c 62 2c 63 29 20 3d 20 28 65 78 70 72 31  (a,b,c) = (expr1
c380: 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a  ,expr2,expr3).**
c390: 20 4f 72 3a 20 20 20 20 28 61 2c 62 2c 63 29 20   Or:    (a,b,c) 
c3a0: 3d 20 28 53 45 4c 45 43 54 20 78 2c 79 2c 7a 20  = (SELECT x,y,z 
c3b0: 46 52 4f 4d 20 2e 2e 2e 2e 29 0a 2a 2a 0a 2a 2a  FROM ....).**.**
c3c0: 20 46 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6f   For each term o
c3d0: 66 20 74 68 65 20 76 65 63 74 6f 72 20 61 73 73  f the vector ass
c3e0: 69 67 6e 6d 65 6e 74 2c 20 61 70 70 65 6e 64 20  ignment, append 
c3f0: 6e 65 77 20 65 6e 74 72 69 65 73 20 74 6f 20 74  new entries to t
c400: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
c410: 20 6c 69 73 74 20 70 4c 69 73 74 2e 20 20 49 6e   list pList.  In
c420: 20 74 68 65 20 63 61 73 65 20 6f 66 20 61 20 73   the case of a s
c430: 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 4c  ubquery on the L
c440: 48 53 2c 20 61 70 70 65 6e 64 0a 2a 2a 20 54 4b  HS, append.** TK
c450: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 65  _SELECT_COLUMN e
c460: 78 70 72 65 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 45  xpressions..*/.E
c470: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
c480: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 56 65  ExprListAppendVe
c490: 63 74 6f 72 28 0a 20 20 50 61 72 73 65 20 2a 70  ctor(.  Parse *p
c4a0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
c4b0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
c4c0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
c4d0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  *pList,       /*
c4e0: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
c4f0: 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20  o append. Might 
c500: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 49 64 4c  be NULL */.  IdL
c510: 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 73 2c 20 20  ist *pColumns,  
c520: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6e      /* List of n
c530: 61 6d 65 73 20 6f 66 20 4c 48 53 20 6f 66 20 74  ames of LHS of t
c540: 68 65 20 61 73 73 69 67 6e 6d 65 6e 74 20 2a 2f  he assignment */
c550: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
c560: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65 63            /* Vec
c570: 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74  tor expression t
c580: 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d  o be appended. M
c590: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
c5a0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
c5b0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
c5c0: 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69 3b   int n;.  int i;
c5d0: 0a 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20  .  int iFirst = 
c5e0: 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e  pList ? pList->n
c5f0: 45 78 70 72 20 3a 20 30 3b 0a 20 20 69 66 28 20  Expr : 0;.  if( 
c600: 70 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29 20 67 6f  pColumns==0 ) go
c610: 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64  to vector_append
c620: 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 70 45  _error;.  if( pE
c630: 78 70 72 3d 3d 30 20 29 20 67 6f 74 6f 20 76 65  xpr==0 ) goto ve
c640: 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f  ctor_append_erro
c650: 72 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  r;.  n = sqlite3
c660: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
c670: 45 78 70 72 29 3b 0a 20 20 69 66 28 20 70 43 6f  Expr);.  if( pCo
c680: 6c 75 6d 6e 73 2d 3e 6e 49 64 21 3d 6e 20 29 7b  lumns->nId!=n ){
c690: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
c6a0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 64  rMsg(pParse, "%d
c6b0: 20 63 6f 6c 75 6d 6e 73 20 61 73 73 69 67 6e 65   columns assigne
c6c0: 64 20 25 64 20 76 61 6c 75 65 73 22 2c 0a 20 20  d %d values",.  
c6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6e0: 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 2c    pColumns->nId,
c6f0: 20 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 76 65   n);.    goto ve
c700: 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f  ctor_append_erro
c710: 72 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  r;.  }.  for(i=0
c720: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
c730: 20 45 78 70 72 20 2a 70 53 75 62 45 78 70 72 20   Expr *pSubExpr 
c740: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 46 6f 72  = sqlite3ExprFor
c750: 56 65 63 74 6f 72 46 69 65 6c 64 28 70 50 61 72  VectorField(pPar
c760: 73 65 2c 20 70 45 78 70 72 2c 20 69 29 3b 0a 20  se, pExpr, i);. 
c770: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
c780: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
c790: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  (pParse, pList, 
c7a0: 70 53 75 62 45 78 70 72 29 3b 0a 20 20 20 20 69  pSubExpr);.    i
c7b0: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
c7c0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
c7d0: 3e 6e 45 78 70 72 3d 3d 69 46 69 72 73 74 2b 69  >nExpr==iFirst+i
c7e0: 2b 31 20 29 3b 0a 20 20 20 20 20 20 70 4c 69 73  +1 );.      pLis
c7f0: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  t->a[pList->nExp
c800: 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 70 43 6f  r-1].zName = pCo
c810: 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  lumns->a[i].zNam
c820: 65 3b 0a 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e  e;.      pColumn
c830: 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  s->a[i].zName = 
c840: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  0;.    }.  }.  i
c850: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
c860: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 69  _SELECT ){.    i
c870: 66 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73  f( pList && pLis
c880: 74 2d 3e 61 5b 69 46 69 72 73 74 5d 2e 70 45 78  t->a[iFirst].pEx
c890: 70 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  pr ){.      asse
c8a0: 72 74 28 20 70 4c 69 73 74 2d 3e 61 5b 69 46 69  rt( pList->a[iFi
c8b0: 72 73 74 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d  rst].pExpr->op==
c8c0: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
c8d0: 20 29 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d   );.      pList-
c8e0: 3e 61 5b 69 46 69 72 73 74 5d 2e 70 45 78 70 72  >a[iFirst].pExpr
c8f0: 2d 3e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72  ->pRight = pExpr
c900: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20  ;.      pExpr = 
c910: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 76 65  0;.    }.  }..ve
c920: 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f  ctor_append_erro
c930: 72 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  r:.  sqlite3Expr
c940: 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
c950: 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69  );.  sqlite3IdLi
c960: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f  stDelete(db, pCo
c970: 6c 75 6d 6e 73 29 3b 0a 20 20 72 65 74 75 72 6e  lumns);.  return
c980: 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
c990: 20 53 65 74 20 74 68 65 20 73 6f 72 74 20 6f 72   Set the sort or
c9a0: 64 65 72 20 66 6f 72 20 74 68 65 20 6c 61 73 74  der for the last
c9b0: 20 65 6c 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20   element on the 
c9c0: 67 69 76 65 6e 20 45 78 70 72 4c 69 73 74 2e 0a  given ExprList..
c9d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
c9e0: 78 70 72 4c 69 73 74 53 65 74 53 6f 72 74 4f 72  xprListSetSortOr
c9f0: 64 65 72 28 45 78 70 72 4c 69 73 74 20 2a 70 2c  der(ExprList *p,
ca00: 20 69 6e 74 20 69 53 6f 72 74 4f 72 64 65 72 29   int iSortOrder)
ca10: 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  {.  if( p==0 ) r
ca20: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
ca30: 20 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 44 45 46   SQLITE_SO_UNDEF
ca40: 49 4e 45 44 3c 30 20 26 26 20 53 51 4c 49 54 45  INED<0 && SQLITE
ca50: 5f 53 4f 5f 41 53 43 3e 3d 30 20 26 26 20 53 51  _SO_ASC>=0 && SQ
ca60: 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3e 30 20 29  LITE_SO_DESC>0 )
ca70: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
ca80: 45 78 70 72 3e 30 20 29 3b 0a 20 20 69 66 28 20  Expr>0 );.  if( 
ca90: 69 53 6f 72 74 4f 72 64 65 72 3c 30 20 29 7b 0a  iSortOrder<0 ){.
caa0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
cab0: 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72  [p->nExpr-1].sor
cac0: 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53  tOrder==SQLITE_S
cad0: 4f 5f 41 53 43 20 29 3b 0a 20 20 20 20 72 65 74  O_ASC );.    ret
cae0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61 5b  urn;.  }.  p->a[
caf0: 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74  p->nExpr-1].sort
cb00: 4f 72 64 65 72 20 3d 20 28 75 38 29 69 53 6f 72  Order = (u8)iSor
cb10: 74 4f 72 64 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tOrder;.}../*.**
cb20: 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73   Set the ExprLis
cb30: 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d  t.a[].zName elem
cb40: 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ent of the most 
cb50: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69  recently added i
cb60: 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78  tem.** on the ex
cb70: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
cb80: 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74  *.** pList might
cb90: 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69   be NULL followi
cba0: 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  ng an OOM error.
cbb0: 20 20 42 75 74 20 70 4e 61 6d 65 20 73 68 6f 75    But pName shou
cbc0: 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e  ld never be.** N
cbd0: 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72  ULL.  If a memor
cbe0: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
cbf0: 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e  ls, the pParse->
cc00: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
cc10: 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e   flag.** is set.
cc20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
cc30: 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28  ExprListSetName(
cc40: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
cc50: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
cc60: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
cc70: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
cc80: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
cc90: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
cca0: 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a  dd the span. */.
ccb0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20    Token *pName, 
ccc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
ccd0: 65 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f  e to be added */
cce0: 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20  .  int dequote  
ccf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
cd00: 75 65 20 74 6f 20 63 61 75 73 65 20 74 68 65 20  ue to cause the 
cd10: 6e 61 6d 65 20 74 6f 20 62 65 20 64 65 71 75 6f  name to be dequo
cd20: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  ted */.){.  asse
cd30: 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20  rt( pList!=0 || 
cd40: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
cd50: 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20  ocFailed!=0 );. 
cd60: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
cd70: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
cd80: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
cd90: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
cda0: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
cdb0: 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d   pItem = &pList-
cdc0: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  >a[pList->nExpr-
cdd0: 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
cde0: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20  pItem->zName==0 
cdf0: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e  );.    pItem->zN
ce00: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
ce10: 74 72 4e 44 75 70 28 70 50 61 72 73 65 2d 3e 64  trNDup(pParse->d
ce20: 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  b, pName->z, pNa
ce30: 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20  me->n);.    if( 
ce40: 64 65 71 75 6f 74 65 20 29 20 73 71 6c 69 74 65  dequote ) sqlite
ce50: 33 44 65 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e  3Dequote(pItem->
ce60: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  zName);.  }.}../
ce70: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
ce80: 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20  rList.a[].zSpan 
ce90: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d  element of the m
cea0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
ceb0: 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68  ed item.** on th
cec0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
ced0: 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d  t..**.** pList m
cee0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c  ight be NULL fol
cef0: 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72  lowing an OOM er
cf00: 72 6f 72 2e 20 20 42 75 74 20 70 53 70 61 6e 20  ror.  But pSpan 
cf10: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a  should never be.
cf20: 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d  ** NULL.  If a m
cf30: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
cf40: 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72   fails, the pPar
cf50: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
cf60: 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20  iled flag.** is 
cf70: 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
cf80: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53  ite3ExprListSetS
cf90: 70 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  pan(.  Parse *pP
cfa0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
cfb0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
cfc0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
cfd0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  *pList,        /
cfe0: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
cff0: 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e  to add the span.
d000: 20 2a 2f 0a 20 20 45 78 70 72 53 70 61 6e 20 2a   */.  ExprSpan *
d010: 70 53 70 61 6e 20 20 20 20 20 20 20 20 20 2f 2a  pSpan         /*
d020: 20 54 68 65 20 73 70 61 6e 20 74 6f 20 62 65 20   The span to be 
d030: 61 64 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71  added */.){.  sq
d040: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
d050: 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
d060: 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62  ( pList!=0 || db
d070: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d  ->mallocFailed!=
d080: 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  0 );.  if( pList
d090: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
d0a0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
d0b0: 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
d0c0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b  pList->nExpr-1];
d0d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
d0e0: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
d0f0: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
d100: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
d110: 49 74 65 6d 2d 3e 70 45 78 70 72 3d 3d 70 53 70  Item->pExpr==pSp
d120: 61 6e 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20  an->pExpr );.   
d130: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
d140: 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29  b, pItem->zSpan)
d150: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70  ;.    pItem->zSp
d160: 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  an = sqlite3DbSt
d170: 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a  rNDup(db, (char*
d180: 29 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a  )pSpan->zStart,.
d190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1b0: 20 20 20 20 28 69 6e 74 29 28 70 53 70 61 6e 2d      (int)(pSpan-
d1c0: 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a  >zEnd - pSpan->z
d1d0: 53 74 61 72 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  Start));.  }.}..
d1e0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
d1f0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c  ression list pEL
d200: 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72  ist contains mor
d210: 65 20 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c  e than iLimit el
d220: 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65  ements,.** leave
d230: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
d240: 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  e in pParse..*/.
d250: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
d260: 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28  ListCheckLength(
d270: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
d280: 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ,.  ExprList *pE
d290: 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68  List,.  const ch
d2a0: 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20  ar *zObject.){. 
d2b0: 20 69 6e 74 20 6d 78 20 3d 20 70 50 61 72 73 65   int mx = pParse
d2c0: 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ->db->aLimit[SQL
d2d0: 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
d2e0: 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  ];.  testcase( p
d2f0: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
d300: 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20  >nExpr==mx );.  
d310: 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74  testcase( pEList
d320: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
d330: 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28  r==mx+1 );.  if(
d340: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
d350: 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20  t->nExpr>mx ){. 
d360: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
d370: 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
d380: 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  many columns in 
d390: 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20  %s", zObject);. 
d3a0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
d3b0: 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70  te an entire exp
d3c0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f  ression list..*/
d3d0: 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
d3e0: 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 65 78 70  OINLINE void exp
d3f0: 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28 73 71  rListDeleteNN(sq
d400: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c  lite3 *db, ExprL
d410: 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
d420: 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45  nt i;.  struct E
d430: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
d440: 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  tem;.  assert( p
d450: 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 70 4c  List->a!=0 || pL
d460: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 29 3b  ist->nExpr==0 );
d470: 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
d480: 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c  st->a, i=0; i<pL
d490: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  ist->nExpr; i++,
d4a0: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73   pItem++){.    s
d4b0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
d4c0: 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  (db, pItem->pExp
d4d0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  r);.    sqlite3D
d4e0: 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
d4f0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
d500: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
d510: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
d520: 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
d530: 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b  e(db, pList->a);
d540: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
d550: 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 76  (db, pList);.}.v
d560: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
d570: 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  istDelete(sqlite
d580: 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20  3 *db, ExprList 
d590: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 70  *pList){.  if( p
d5a0: 4c 69 73 74 20 29 20 65 78 70 72 4c 69 73 74 44  List ) exprListD
d5b0: 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 4c 69 73  eleteNN(db, pLis
d5c0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
d5d0: 75 72 6e 20 74 68 65 20 62 69 74 77 69 73 65 2d  urn the bitwise-
d5e0: 4f 52 20 6f 66 20 61 6c 6c 20 45 78 70 72 2e 66  OR of all Expr.f
d5f0: 6c 61 67 73 20 66 69 65 6c 64 73 20 69 6e 20 74  lags fields in t
d600: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 45 78 70 72  he given.** Expr
d610: 4c 69 73 74 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  List..*/.u32 sql
d620: 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67  ite3ExprListFlag
d630: 73 28 63 6f 6e 73 74 20 45 78 70 72 4c 69 73 74  s(const ExprList
d640: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
d650: 69 3b 0a 20 20 75 33 32 20 6d 20 3d 20 30 3b 0a  i;.  u32 m = 0;.
d660: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
d670: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
d680: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
d690: 7b 0a 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  {.       Expr *p
d6a0: 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Expr = pList->a[
d6b0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
d6c0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 21 3d   assert( pExpr!=
d6d0: 30 20 29 3b 0a 20 20 20 20 20 20 20 6d 20 7c 3d  0 );.       m |=
d6e0: 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 3b 0a 20   pExpr->flags;. 
d6f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
d700: 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n m;.}../*.** Th
d710: 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
d720: 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b   Walker callback
d730: 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
d740: 65 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a  expressions to.*
d750: 2a 20 73 65 65 20 69 66 20 74 68 65 79 20 61 72  * see if they ar
d760: 65 20 22 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72  e "constant" for
d770: 20 73 6f 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e   some definition
d780: 20 6f 66 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54   of constant.  T
d790: 68 65 0a 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f  he.** Walker.eCo
d7a0: 64 65 20 76 61 6c 75 65 20 64 65 74 65 72 6d 69  de value determi
d7b0: 6e 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20  nes the type of 
d7c0: 22 63 6f 6e 73 74 61 6e 74 22 20 77 65 20 61 72  "constant" we ar
d7d0: 65 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72  e looking.** for
d7e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61  ..**.** These ca
d7f0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20  llback routines 
d800: 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  are used to impl
d810: 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77  ement the follow
d820: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  ing:.**.**     s
d830: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
d840: 74 61 6e 74 28 29 20 20 20 20 20 20 20 20 20 20  tant()          
d850: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
d860: 3e 65 43 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20  >eCode==1.**    
d870: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
d880: 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20  nstantNotJoin() 
d890: 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65            pWalke
d8a0: 72 2d 3e 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20  r->eCode==2.**  
d8b0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73     sqlite3ExprIs
d8c0: 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20  TableConstant() 
d8d0: 20 20 20 20 20 20 20 20 20 20 20 20 70 57 61 6c              pWal
d8e0: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a  ker->eCode==3.**
d8f0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
d900: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
d910: 74 69 6f 6e 28 29 20 20 20 20 20 20 20 20 70 57  tion()        pW
d920: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20  alker->eCode==4 
d930: 6f 72 20 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c  or 5.**.** In al
d940: 6c 20 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c  l cases, the cal
d950: 6c 62 61 63 6b 73 20 73 65 74 20 57 61 6c 6b 65  lbacks set Walke
d960: 72 2e 65 43 6f 64 65 3d 30 20 61 6e 64 20 61 62  r.eCode=0 and ab
d970: 6f 72 74 20 69 66 20 74 68 65 20 65 78 70 72 65  ort if the expre
d980: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e  ssion.** is foun
d990: 64 20 74 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f  d to not be a co
d9a0: 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  nstant..**.** Th
d9b0: 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  e sqlite3ExprIsC
d9c0: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
d9d0: 6e 28 29 20 69 73 20 75 73 65 64 20 66 6f 72 20  n() is used for 
d9e0: 65 76 61 6c 75 61 74 69 6e 67 20 65 78 70 72 65  evaluating expre
d9f0: 73 73 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43  ssions.** in a C
da00: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
da10: 65 6d 65 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b  ement.  The Walk
da20: 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 69  er.eCode value i
da30: 73 20 35 20 77 68 65 6e 20 70 61 72 73 69 6e 67  s 5 when parsing
da40: 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20  .** an existing 
da50: 73 63 68 65 6d 61 20 61 6e 64 20 34 20 77 68 65  schema and 4 whe
da60: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20 6e  n processing a n
da70: 65 77 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41  ew statement.  A
da80: 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65   bound.** parame
da90: 74 65 72 20 72 61 69 73 65 73 20 61 6e 20 65 72  ter raises an er
daa0: 72 6f 72 20 66 6f 72 20 6e 65 77 20 73 74 61 74  ror for new stat
dab0: 65 6d 65 6e 74 73 2c 20 62 75 74 20 69 73 20 73  ements, but is s
dac0: 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65  ilently converte
dad0: 64 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72  d.** to NULL for
dae0: 20 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61   existing schema
daf0: 73 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  s.  This allows 
db00: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
db10: 62 6c 65 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f  bles that .** co
db20: 6e 74 61 69 6e 20 61 20 62 6f 75 6e 64 20 70 61  ntain a bound pa
db30: 72 61 6d 65 74 65 72 20 62 65 63 61 75 73 65 20  rameter because 
db40: 74 68 65 79 20 77 65 72 65 20 67 65 6e 65 72 61  they were genera
db50: 74 65 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72  ted by older ver
db60: 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69  sions.** of SQLi
db70: 74 65 20 74 6f 20 62 65 20 70 61 72 73 65 64 20  te to be parsed 
db80: 62 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  by newer version
db90: 73 20 6f 66 20 53 51 4c 69 74 65 20 77 69 74 68  s of SQLite with
dba0: 6f 75 74 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a  out raising a.**
dbb0: 20 6d 61 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d   malformed schem
dbc0: 61 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  a error..*/.stat
dbd0: 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49  ic int exprNodeI
dbe0: 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72  sConstant(Walker
dbf0: 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
dc00: 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49  *pExpr){..  /* I
dc10: 66 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  f pWalker->eCode
dc20: 20 69 73 20 32 20 74 68 65 6e 20 61 6e 79 20 74   is 2 then any t
dc30: 65 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65  erm of the expre
dc40: 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73  ssion that comes
dc50: 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f   from.  ** the O
dc60: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
dc70: 65 73 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69  es of a left joi
dc80: 6e 20 64 69 73 71 75 61 6c 69 66 69 65 73 20 74  n disqualifies t
dc90: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  he expression.  
dca0: 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f  ** from being co
dcb0: 6e 73 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e  nsidered constan
dcc0: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c  t. */.  if( pWal
dcd0: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26  ker->eCode==2 &&
dce0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
dcf0: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
dd00: 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70 57 61 6c  oin) ){.    pWal
dd10: 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a  ker->eCode = 0;.
dd20: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
dd30: 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69  bort;.  }..  swi
dd40: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
dd50: 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65  {.    /* Conside
dd60: 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62  r functions to b
dd70: 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c  e constant if al
dd80: 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74  l their argument
dd90: 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20  s are constant. 
dda0: 20 20 20 2a 2a 20 61 6e 64 20 65 69 74 68 65 72     ** and either
ddb0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
ddc0: 3d 34 20 6f 72 20 35 20 6f 72 20 74 68 65 20 66  =4 or 5 or the f
ddd0: 75 6e 63 74 69 6f 6e 20 68 61 73 20 74 68 65 0a  unction has the.
dde0: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55      ** SQLITE_FU
ddf0: 4e 43 5f 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a  NC_CONST flag. *
de00: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  /.    case TK_FU
de10: 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66  NCTION:.      if
de20: 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  ( pWalker->eCode
de30: 3e 3d 34 20 7c 7c 20 45 78 70 72 48 61 73 50 72  >=4 || ExprHasPr
de40: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f  operty(pExpr,EP_
de50: 43 6f 6e 73 74 46 75 6e 63 29 20 29 7b 0a 20 20  ConstFunc) ){.  
de60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
de70: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20  _Continue;.     
de80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
de90: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
dea0: 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
deb0: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
dec0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
ded0: 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54  K_ID:.    case T
dee0: 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  K_COLUMN:.    ca
def0: 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
df00: 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ON:.    case TK_
df10: 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20  AGG_COLUMN:.    
df20: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
df30: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a  r->op==TK_ID );.
df40: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
df50: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
df60: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  LUMN );.      te
df70: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
df80: 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
df90: 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ON );.      test
dfa0: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
dfb0: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
dfc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c  ;.      if( pWal
dfd0: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 20 26 26  ker->eCode==3 &&
dfe0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
dff0: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 20  pWalker->u.iCur 
e000: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
e010: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
e020: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e030: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
e040: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
e050: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
e060: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63  t;.      }.    c
e070: 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a  ase TK_VARIABLE:
e080: 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b  .      if( pWalk
e090: 65 72 2d 3e 65 43 6f 64 65 3d 3d 35 20 29 7b 0a  er->eCode==5 ){.
e0a0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6c 65 6e          /* Silen
e0b0: 74 6c 79 20 63 6f 6e 76 65 72 74 20 62 6f 75 6e  tly convert boun
e0c0: 64 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 61  d parameters tha
e0d0: 74 20 61 70 70 65 61 72 20 69 6e 73 69 64 65 20  t appear inside 
e0e0: 6f 66 20 43 52 45 41 54 45 0a 20 20 20 20 20 20  of CREATE.      
e0f0: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20    ** statements 
e100: 69 6e 74 6f 20 61 20 4e 55 4c 4c 20 77 68 65 6e  into a NULL when
e110: 20 70 61 72 73 69 6e 67 20 74 68 65 20 43 52 45   parsing the CRE
e120: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 65  ATE statement te
e130: 78 74 20 6f 75 74 0a 20 20 20 20 20 20 20 20 2a  xt out.        *
e140: 2a 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  * of the sqlite_
e150: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a  master table */.
e160: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
e170: 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20  p = TK_NULL;.   
e180: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57 61     }else if( pWa
e190: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 29  lker->eCode==4 )
e1a0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62  {.        /* A b
e1b0: 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  ound parameter i
e1c0: 6e 20 61 20 43 52 45 41 54 45 20 73 74 61 74 65  n a CREATE state
e1d0: 6d 65 6e 74 20 74 68 61 74 20 6f 72 69 67 69 6e  ment that origin
e1e0: 61 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 20 20  ates from.      
e1f0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72 65    ** sqlite3_pre
e200: 70 61 72 65 28 29 20 63 61 75 73 65 73 20 61 6e  pare() causes an
e210: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
e220: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
e230: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
e240: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
e250: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
e260: 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f   Fall through */
e270: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
e280: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
e290: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
e2a0: 43 54 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e  CT ); /* selectN
e2b0: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69  odeIsConstant wi
e2c0: 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20  ll disallow */. 
e2d0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
e2e0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49  Expr->op==TK_EXI
e2f0: 53 54 53 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74  STS ); /* select
e300: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77  NodeIsConstant w
e310: 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a  ill disallow */.
e320: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
e330: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d  _Continue;.  }.}
e340: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65  .static int sele
e350: 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  ctNodeIsConstant
e360: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
e370: 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65  , Select *NotUse
e380: 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d){.  UNUSED_PAR
e390: 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
e3a0: 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  .  pWalker->eCod
e3b0: 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  e = 0;.  return 
e3c0: 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74 61  WRC_Abort;.}.sta
e3d0: 74 69 63 20 69 6e 74 20 65 78 70 72 49 73 43 6f  tic int exprIsCo
e3e0: 6e 73 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  nst(Expr *p, int
e3f0: 20 69 6e 69 74 46 6c 61 67 2c 20 69 6e 74 20 69   initFlag, int i
e400: 43 75 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  Cur){.  Walker w
e410: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30  ;.  memset(&w, 0
e420: 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
e430: 77 2e 65 43 6f 64 65 20 3d 20 69 6e 69 74 46 6c  w.eCode = initFl
e440: 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  ag;.  w.xExprCal
e450: 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65  lback = exprNode
e460: 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e  IsConstant;.  w.
e470: 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
e480: 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f  = selectNodeIsCo
e490: 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 75 2e 69 43  nstant;.  w.u.iC
e4a0: 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 73 71 6c  ur = iCur;.  sql
e4b0: 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
e4c0: 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e   p);.  return w.
e4d0: 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eCode;.}../*.** 
e4e0: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
e4f0: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
e500: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
e510: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
e520: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30  onstant.** and 0
e530: 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20   if it involves 
e540: 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e  variables or fun
e550: 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a  ction calls..**.
e560: 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
e570: 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ses of this func
e580: 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71  tion, a double-q
e590: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
e5a0: 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63  : "abc").** is c
e5b0: 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69  onsidered a vari
e5c0: 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c  able but a singl
e5d0: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
e5e0: 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a  (ex: 'abc') is.*
e5f0: 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f  * a constant..*/
e600: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
e610: 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20  IsConstant(Expr 
e620: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  *p){.  return ex
e630: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 2c 20  prIsConst(p, 1, 
e640: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  0);.}../*.** Wal
e650: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
e660: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f  tree.  Return no
e670: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78  n-zero if the ex
e680: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
e690: 74 61 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65  tant.** that doe
e6a0: 73 20 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20 66  s no originate f
e6b0: 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53  rom the ON or US
e6c0: 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61  ING clauses of a
e6d0: 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e   join..** Return
e6e0: 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65   0 if it involve
e6f0: 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66  s variables or f
e700: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72  unction calls or
e710: 20 74 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61   terms from.** a
e720: 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  n ON or USING cl
e730: 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ause..*/.int sql
e740: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
e750: 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a  ntNotJoin(Expr *
e760: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70  p){.  return exp
e770: 72 49 73 43 6f 6e 73 74 28 70 2c 20 32 2c 20 30  rIsConst(p, 2, 0
e780: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  );.}../*.** Walk
e790: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
e7a0: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  ree.  Return non
e7b0: 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70  -zero if the exp
e7c0: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
e7d0: 61 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 79 20 73  ant.** for any s
e7e0: 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
e7f0: 20 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73   table with curs
e800: 6f 72 20 69 43 75 72 2e 20 20 49 6e 20 6f 74 68  or iCur.  In oth
e810: 65 72 20 77 6f 72 64 73 2c 20 74 68 65 0a 2a 2a  er words, the.**
e820: 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74   expression must
e830: 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 61 6e   not refer to an
e840: 79 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73  y non-determinis
e850: 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72  tic function nor
e860: 20 61 6e 79 0a 2a 2a 20 74 61 62 6c 65 20 6f 74   any.** table ot
e870: 68 65 72 20 74 68 61 6e 20 69 43 75 72 2e 0a 2a  her than iCur..*
e880: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
e890: 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74  rIsTableConstant
e8a0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 43  (Expr *p, int iC
e8b0: 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  ur){.  return ex
e8c0: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 33 2c 20  prIsConst(p, 3, 
e8d0: 69 43 75 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  iCur);.}../*.** 
e8e0: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
e8f0: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
e900: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
e910: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
e920: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20  onstant.** or a 
e930: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69  function call wi
e940: 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75  th constant argu
e950: 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61  ments.  Return a
e960: 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a  nd 0 if there.**
e970: 20 61 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c   are any variabl
e980: 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  es..**.** For th
e990: 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
e9a0: 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64  is function, a d
e9b0: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
e9c0: 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a  ing (ex: "abc").
e9d0: 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
e9e0: 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20   a variable but 
e9f0: 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20  a single-quoted 
ea00: 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63  string (ex: 'abc
ea10: 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74  ') is.** a const
ea20: 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ant..*/.int sqli
ea30: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
ea40: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72  tOrFunction(Expr
ea50: 20 2a 70 2c 20 75 38 20 69 73 49 6e 69 74 29 7b   *p, u8 isInit){
ea60: 0a 20 20 61 73 73 65 72 74 28 20 69 73 49 6e 69  .  assert( isIni
ea70: 74 3d 3d 30 20 7c 7c 20 69 73 49 6e 69 74 3d 3d  t==0 || isInit==
ea80: 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 78  1 );.  return ex
ea90: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 34 2b 69  prIsConst(p, 4+i
eaa0: 73 49 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a 23 69  sInit, 0);.}..#i
eab0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
eac0: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
ead0: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
eae0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
eaf0: 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
eb00: 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61  expression conta
eb10: 69 6e 73 20 61 0a 2a 2a 20 73 75 62 71 75 65 72  ins a.** subquer
eb20: 79 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20  y of some kind. 
eb30: 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   Return 0 if the
eb40: 72 65 20 61 72 65 20 6e 6f 20 73 75 62 71 75 65  re are no subque
eb50: 72 69 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ries..*/.int sql
eb60: 69 74 65 33 45 78 70 72 43 6f 6e 74 61 69 6e 73  ite3ExprContains
eb70: 53 75 62 71 75 65 72 79 28 45 78 70 72 20 2a 70  Subquery(Expr *p
eb80: 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
eb90: 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
eba0: 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 65  izeof(w));.  w.e
ebb0: 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45  Code = 1;.  w.xE
ebc0: 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71  xprCallback = sq
ebd0: 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f  lite3ExprWalkNoo
ebe0: 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  p;.  w.xSelectCa
ebf0: 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e  llback = selectN
ec00: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20  odeIsConstant;. 
ec10: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
ec20: 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72  (&w, p);.  retur
ec30: 6e 20 77 2e 65 43 6f 64 65 3d 3d 30 3b 0a 7d 0a  n w.eCode==0;.}.
ec40: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
ec50: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
ec60: 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73 74 61  p codes a consta
ec70: 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61 74 20  nt integer that 
ec80: 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a  is small enough.
ec90: 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 33  ** to fit in a 3
eca0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72  2-bit integer, r
ecb0: 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75 74 20  eturn 1 and put 
ecc0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
ecd0: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a   integer.** in *
ece0: 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20  pValue.  If the 
ecf0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f  expression is no
ed00: 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20  t an integer or 
ed10: 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62 69 67  if it is too big
ed20: 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20  .** to fit in a 
ed30: 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e  signed 32-bit in
ed40: 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 30 20  teger, return 0 
ed50: 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61 6c 75  and leave *pValu
ed60: 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  e unchanged..*/.
ed70: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
ed80: 73 49 6e 74 65 67 65 72 28 45 78 70 72 20 2a 70  sInteger(Expr *p
ed90: 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a  , int *pValue){.
eda0: 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 0a 20    int rc = 0;.. 
edb0: 20 2f 2a 20 49 66 20 61 6e 20 65 78 70 72 65 73   /* If an expres
edc0: 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65 67  sion is an integ
edd0: 65 72 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20  er literal that 
ede0: 66 69 74 73 20 69 6e 20 61 20 73 69 67 6e 65 64  fits in a signed
edf0: 20 33 32 2d 62 69 74 0a 20 20 2a 2a 20 69 6e 74   32-bit.  ** int
ee00: 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20 45  eger, then the E
ee10: 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20  P_IntValue flag 
ee20: 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64  will have alread
ee30: 79 20 62 65 65 6e 20 73 65 74 20 2a 2f 0a 20 20  y been set */.  
ee40: 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54  assert( p->op!=T
ee50: 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 28 70 2d  K_INTEGER || (p-
ee60: 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  >flags & EP_IntV
ee70: 61 6c 75 65 29 21 3d 30 0a 20 20 20 20 20 20 20  alue)!=0.       
ee80: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 65      || sqlite3Ge
ee90: 74 49 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b  tInt32(p->u.zTok
eea0: 65 6e 2c 20 26 72 63 29 3d 3d 30 20 29 3b 0a 0a  en, &rc)==0 );..
eeb0: 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26    if( p->flags &
eec0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a   EP_IntValue ){.
eed0: 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 70 2d      *pValue = p-
eee0: 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 72  >u.iValue;.    r
eef0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73  eturn 1;.  }.  s
ef00: 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
ef10: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55      case TK_UPLU
ef20: 53 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  S: {.      rc = 
ef30: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
ef40: 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70  eger(p->pLeft, p
ef50: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72  Value);.      br
ef60: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
ef70: 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b  ase TK_UMINUS: {
ef80: 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a 20 20  .      int v;.  
ef90: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
efa0: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e  xprIsInteger(p->
efb0: 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a 20 20  pLeft, &v) ){.  
efc0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 76 21        assert( v!
efd0: 3d 28 2d 32 31 34 37 34 38 33 36 34 37 2d 31 29  =(-2147483647-1)
efe0: 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 56 61   );.        *pVa
eff0: 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20  lue = -v;.      
f000: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
f010: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
f020: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
f030: 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  : break;.  }.  r
f040: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
f050: 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20  ** Return FALSE 
f060: 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63  if there is no c
f070: 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 65  hance that the e
f080: 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65  xpression can be
f090: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
f0a0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  the expression m
f0b0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72 20  ight be NULL or 
f0c0: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
f0d0: 6e 20 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65 78  n is too complex
f0e0: 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74 75  .** to tell retu
f0f0: 72 6e 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a  rn TRUE.  .**.**
f100: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
f110: 20 75 73 65 64 20 61 73 20 61 6e 20 6f 70 74 69   used as an opti
f120: 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b 69  mization, to ski
f130: 70 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f  p OP_IsNull opco
f140: 64 65 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20 6b  des.** when we k
f150: 6e 6f 77 20 74 68 61 74 20 61 20 76 61 6c 75 65  now that a value
f160: 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e   cannot be NULL.
f170: 20 20 48 65 6e 63 65 2c 20 61 20 66 61 6c 73 65    Hence, a false
f180: 20 70 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72 65   positive.** (re
f190: 74 75 72 6e 69 6e 67 20 54 52 55 45 20 77 68 65  turning TRUE whe
f1a0: 6e 20 69 6e 20 66 61 63 74 20 74 68 65 20 65 78  n in fact the ex
f1b0: 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65 76  pression can nev
f1c0: 65 72 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67 68  er be NULL) migh
f1d0: 74 0a 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c 20  t.** be a small 
f1e0: 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 20  performance hit 
f1f0: 62 75 74 20 69 73 20 6f 74 68 65 72 77 69 73 65  but is otherwise
f200: 20 68 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20 74   harmless.  On t
f210: 68 65 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e 64  he other.** hand
f220: 2c 20 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69  , a false negati
f230: 76 65 20 28 72 65 74 75 72 6e 69 6e 67 20 46 41  ve (returning FA
f240: 4c 53 45 20 77 68 65 6e 20 74 68 65 20 72 65 73  LSE when the res
f250: 75 6c 74 20 63 6f 75 6c 64 20 62 65 20 4e 55 4c  ult could be NUL
f260: 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c  L).** will likel
f270: 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69  y result in an i
f280: 6e 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 2e  ncorrect answer.
f290: 20 20 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f 75    So when in dou
f2a0: 62 74 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54 52  bt, return.** TR
f2b0: 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  UE..*/.int sqlit
f2c0: 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28  e3ExprCanBeNull(
f2d0: 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 29 7b 0a  const Expr *p){.
f2e0: 20 20 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c 65    u8 op;.  while
f2f0: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55  ( p->op==TK_UPLU
f300: 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  S || p->op==TK_U
f310: 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e  MINUS ){ p = p->
f320: 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20  pLeft; }.  op = 
f330: 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  p->op;.  if( op=
f340: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f  =TK_REGISTER ) o
f350: 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77  p = p->op2;.  sw
f360: 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
f370: 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
f380: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
f390: 49 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ING:.    case TK
f3a0: 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65  _FLOAT:.    case
f3b0: 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20   TK_BLOB:.      
f3c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63 61  return 0;.    ca
f3d0: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  se TK_COLUMN:.  
f3e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
f3f0: 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab!=0 );.      
f400: 72 65 74 75 72 6e 20 45 78 70 72 48 61 73 50 72  return ExprHasPr
f410: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 43 61 6e  operty(p, EP_Can
f420: 42 65 4e 75 6c 6c 29 20 7c 7c 0a 20 20 20 20 20  BeNull) ||.     
f430: 20 20 20 20 20 20 20 20 28 70 2d 3e 69 43 6f 6c          (p->iCol
f440: 75 6d 6e 3e 3d 30 20 26 26 20 70 2d 3e 70 54 61  umn>=0 && p->pTa
f450: 62 2d 3e 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75  b->aCol[p->iColu
f460: 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 3b  mn].notNull==0);
f470: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
f480: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
f490: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
f4a0: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
f4b0: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ven expression i
f4c0: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 77 68 69  s a constant whi
f4d0: 63 68 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75  ch would be.** u
f4e0: 6e 63 68 61 6e 67 65 64 20 62 79 20 4f 50 5f 41  nchanged by OP_A
f4f0: 66 66 69 6e 69 74 79 20 77 69 74 68 20 74 68 65  ffinity with the
f500: 20 61 66 66 69 6e 69 74 79 20 67 69 76 65 6e 20   affinity given 
f510: 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  in the second.**
f520: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
f530: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
f540: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
f550: 6e 65 20 69 66 20 74 68 65 20 4f 50 5f 41 66 66  ne if the OP_Aff
f560: 69 6e 69 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a  inity operation.
f570: 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65  ** can be omitte
f580: 64 2e 20 20 57 68 65 6e 20 69 6e 20 64 6f 75 62  d.  When in doub
f590: 74 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 20  t return FALSE. 
f5a0: 20 41 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76   A false negativ
f5b0: 65 0a 2a 2a 20 69 73 20 68 61 72 6d 6c 65 73 73  e.** is harmless
f5c0: 2e 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69 74  .  A false posit
f5d0: 69 76 65 2c 20 68 6f 77 65 76 65 72 2c 20 63 61  ive, however, ca
f5e0: 6e 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20  n result in the 
f5f0: 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e  wrong.** answer.
f600: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
f610: 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69  xprNeedsNoAffini
f620: 74 79 43 68 61 6e 67 65 28 63 6f 6e 73 74 20 45  tyChange(const E
f630: 78 70 72 20 2a 70 2c 20 63 68 61 72 20 61 66 66  xpr *p, char aff
f640: 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 69 66  ){.  u8 op;.  if
f650: 28 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  ( aff==SQLITE_AF
f660: 46 5f 42 4c 4f 42 20 29 20 72 65 74 75 72 6e 20  F_BLOB ) return 
f670: 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f  1;.  while( p->o
f680: 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70  p==TK_UPLUS || p
f690: 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20  ->op==TK_UMINUS 
f6a0: 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b  ){ p = p->pLeft;
f6b0: 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b   }.  op = p->op;
f6c0: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45  .  if( op==TK_RE
f6d0: 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d  GISTER ) op = p-
f6e0: 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20  >op2;.  switch( 
f6f0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
f700: 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  K_INTEGER: {.   
f710: 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53     return aff==S
f720: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
f730: 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  R || aff==SQLITE
f740: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
f750: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
f760: 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 72  FLOAT: {.      r
f770: 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54  eturn aff==SQLIT
f780: 45 5f 41 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66  E_AFF_REAL || af
f790: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
f7a0: 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20  MERIC;.    }.   
f7b0: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
f7c0: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
f7d0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
f7e0: 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  TEXT;.    }.    
f7f0: 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a  case TK_BLOB: {.
f800: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
f810: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
f820: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
f830: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 54 61    assert( p->iTa
f840: 62 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 70 20  ble>=0 );  /* p 
f850: 63 61 6e 6e 6f 74 20 62 65 20 70 61 72 74 20 6f  cannot be part o
f860: 66 20 61 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  f a CHECK constr
f870: 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  aint */.      re
f880: 74 75 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c  turn p->iColumn<
f890: 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28  0.          && (
f8a0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
f8b0: 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d  INTEGER || aff==
f8c0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
f8d0: 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  IC);.    }.    d
f8e0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
f8f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
f900: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
f910: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
f920: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20  given string is 
f930: 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20  a row-id column 
f940: 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  name..*/.int sql
f950: 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73  ite3IsRowid(cons
f960: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66  t char *z){.  if
f970: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
f980: 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d  (z, "_ROWID_")==
f990: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
f9a0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
f9b0: 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d  mp(z, "ROWID")==
f9c0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
f9d0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
f9e0: 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20  mp(z, "OID")==0 
f9f0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
fa00: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
fa10: 20 70 58 20 69 73 20 74 68 65 20 52 48 53 20 6f   pX is the RHS o
fa20: 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  f an IN operator
fa30: 2e 20 20 49 66 20 70 58 20 69 73 20 61 20 53 45  .  If pX is a SE
fa40: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 0a  LECT statement .
fa50: 2a 2a 20 74 68 61 74 20 63 61 6e 20 62 65 20 73  ** that can be s
fa60: 69 6d 70 6c 69 66 69 65 64 20 74 6f 20 61 20 64  implified to a d
fa70: 69 72 65 63 74 20 74 61 62 6c 65 20 61 63 63 65  irect table acce
fa80: 73 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 0a  ss, then return.
fa90: 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
faa0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
fab0: 6d 65 6e 74 2e 20 20 49 66 20 70 58 20 69 73 20  ment.  If pX is 
fac0: 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 73 74 61  not a SELECT sta
fad0: 74 65 6d 65 6e 74 2c 0a 2a 2a 20 6f 72 20 69 66  tement,.** or if
fae0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
faf0: 65 6d 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 62  ement needs to b
fb00: 65 20 6d 61 6e 69 66 65 73 74 65 64 20 69 6e 74  e manifested int
fb10: 6f 20 61 20 74 72 61 6e 73 69 65 6e 74 0a 2a 2a  o a transient.**
fb20: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 72 65 74   table, then ret
fb30: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66  urn NULL..*/.#if
fb40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
fb50: 5f 53 55 42 51 55 45 52 59 0a 73 74 61 74 69 63  _SUBQUERY.static
fb60: 20 53 65 6c 65 63 74 20 2a 69 73 43 61 6e 64 69   Select *isCandi
fb70: 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 45 78 70  dateForInOpt(Exp
fb80: 72 20 2a 70 58 29 7b 0a 20 20 53 65 6c 65 63 74  r *pX){.  Select
fb90: 20 2a 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a   *p;.  SrcList *
fba0: 70 53 72 63 3b 0a 20 20 45 78 70 72 4c 69 73 74  pSrc;.  ExprList
fbb0: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c   *pEList;.  Tabl
fbc0: 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69  e *pTab;.  int i
fbd0: 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  ;.  if( !ExprHas
fbe0: 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f  Property(pX, EP_
fbf0: 78 49 73 53 65 6c 65 63 74 29 20 29 20 72 65 74  xIsSelect) ) ret
fc00: 75 72 6e 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 61  urn 0;  /* Not a
fc10: 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69   subquery */.  i
fc20: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
fc30: 74 79 28 70 58 2c 20 45 50 5f 56 61 72 53 65 6c  ty(pX, EP_VarSel
fc40: 65 63 74 29 20 20 29 20 72 65 74 75 72 6e 20 30  ect)  ) return 0
fc50: 3b 20 20 2f 2a 20 43 6f 72 72 65 6c 61 74 65 64  ;  /* Correlated
fc60: 20 73 75 62 71 20 2a 2f 0a 20 20 70 20 3d 20 70   subq */.  p = p
fc70: 58 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20  X->x.pSelect;.  
fc80: 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20  if( p->pPrior ) 
fc90: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
fca0: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20         /* Not a 
fcb0: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
fcc0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
fcd0: 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
fce0: 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
fcf0: 29 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73  ) ){.    testcas
fd00: 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  e( (p->selFlags 
fd10: 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
fd20: 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
fd30: 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20  F_Distinct );.  
fd40: 20 20 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e    testcase( (p->
fd50: 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
fd60: 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
fd70: 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65  gate))==SF_Aggre
fd80: 67 61 74 65 20 29 3b 0a 20 20 20 20 72 65 74 75  gate );.    retu
fd90: 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54  rn 0; /* No DIST
fda0: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 61 6e 64  INCT keyword and
fdb0: 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75   no aggregate fu
fdc0: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20  nctions */.  }. 
fdd0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f   assert( p->pGro
fde0: 75 70 42 79 3d 3d 30 20 29 3b 20 20 20 20 20 20  upBy==0 );      
fdf0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e          /* Has n
fe00: 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  o GROUP BY claus
fe10: 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c  e */.  if( p->pL
fe20: 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b  imit ) return 0;
fe30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fe40: 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c   Has no LIMIT cl
fe50: 61 75 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  ause */.  assert
fe60: 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20  ( p->pOffset==0 
fe70: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
fe80: 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54 20 6d 65 61   /* No LIMIT mea
fe90: 6e 73 20 6e 6f 20 4f 46 46 53 45 54 20 2a 2f 0a  ns no OFFSET */.
fea0: 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20    if( p->pWhere 
feb0: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
fec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20           /* Has 
fed0: 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  no WHERE clause 
fee0: 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  */.  pSrc = p->p
fef0: 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
ff00: 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Src!=0 );.  if( 
ff10: 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20  pSrc->nSrc!=1 ) 
ff20: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
ff30: 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72     /* Single ter
ff40: 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65  m in FROM clause
ff50: 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e   */.  if( pSrc->
ff60: 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29 20 72  a[0].pSelect ) r
ff70: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20  eturn 0;     /* 
ff80: 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61 20 73 75  FROM is not a su
ff90: 62 71 75 65 72 79 20 6f 72 20 76 69 65 77 20 2a  bquery or view *
ffa0: 2f 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d  /.  pTab = pSrc-
ffb0: 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 61 73  >a[0].pTab;.  as
ffc0: 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
ffd0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
ffe0: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20  >pSelect==0 );  
fff0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f            /* FRO
10000 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20  M clause is not 
10010 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20  a view */.  if( 
10020 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
10030 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
10040 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
10050 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20  e not a virtual 
10060 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73  table */.  pELis
10070 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
10080 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
10090 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 20  =0 );..  /* All 
100a0 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20 6d  SELECT results m
100b0 75 73 74 20 62 65 20 63 6f 6c 75 6d 6e 73 2e 20  ust be columns. 
100c0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
100d0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
100e0 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
100f0 52 65 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  Res = pEList->a[
10100 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
10110 28 20 70 52 65 73 2d 3e 6f 70 21 3d 54 4b 5f 43  ( pRes->op!=TK_C
10120 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30  OLUMN ) return 0
10130 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  ;.    assert( pR
10140 65 73 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63  es->iTable==pSrc
10150 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 29  ->a[0].iCursor )
10160 3b 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72  ;  /* Not a corr
10170 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 20  elated subquery 
10180 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
10190 70 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  p;.}.#endif /* S
101a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
101b0 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ERY */../*.** Co
101c0 64 65 20 61 6e 20 4f 50 5f 4f 6e 63 65 20 69 6e  de an OP_Once in
101d0 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 20 61 6c  struction and al
101e0 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
101f0 20 69 74 73 20 66 6c 61 67 2e 20 52 65 74 75 72   its flag. Retur
10200 6e 20 74 68 65 20 0a 2a 2a 20 61 64 64 72 65 73  n the .** addres
10210 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73  s of the new ins
10220 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  truction..*/.int
10230 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65   sqlite3CodeOnce
10240 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
10250 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
10260 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
10270 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 56 69 72  se);      /* Vir
10280 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69  tual machine bei
10290 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 72 65  ng coded */.  re
102a0 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
102b0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4f 6e 63  AddOp1(v, OP_Onc
102c0 65 2c 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65  e, pParse->nOnce
102d0 2b 2b 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  ++);.}..#ifndef 
102e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
102f0 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  UERY./*.** Gener
10300 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 63 68  ate code that ch
10310 65 63 6b 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  ecks the left-mo
10320 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64  st column of ind
10330 65 78 20 74 61 62 6c 65 20 69 43 75 72 20 74 6f  ex table iCur to
10340 20 73 65 65 20 69 66 0a 2a 2a 20 69 74 20 63 6f   see if.** it co
10350 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20  ntains any NULL 
10360 65 6e 74 72 69 65 73 2e 20 20 43 61 75 73 65 20  entries.  Cause 
10370 74 68 65 20 72 65 67 69 73 74 65 72 20 61 74 20  the register at 
10380 72 65 67 48 61 73 4e 75 6c 6c 20 74 6f 20 62 65  regHasNull to be
10390 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e   set.** to a non
103a0 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66 20 69  -NULL value if i
103b0 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  Cur contains no 
103c0 4e 55 4c 4c 73 2e 20 20 43 61 75 73 65 20 72 65  NULLs.  Cause re
103d0 67 69 73 74 65 72 20 72 65 67 48 61 73 4e 75 6c  gister regHasNul
103e0 6c 0a 2a 2a 20 74 6f 20 62 65 20 73 65 74 20 74  l.** to be set t
103f0 6f 20 4e 55 4c 4c 20 69 66 20 69 43 75 72 20 63  o NULL if iCur c
10400 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
10410 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e  ore NULL values.
10420 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10430 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c  sqlite3SetHasNul
10440 6c 46 6c 61 67 28 56 64 62 65 20 2a 76 2c 20 69  lFlag(Vdbe *v, i
10450 6e 74 20 69 43 75 72 2c 20 69 6e 74 20 72 65 67  nt iCur, int reg
10460 48 61 73 4e 75 6c 6c 29 7b 0a 20 20 69 6e 74 20  HasNull){.  int 
10470 61 64 64 72 31 3b 0a 20 20 73 71 6c 69 74 65 33  addr1;.  sqlite3
10480 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10490 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
104a0 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72  HasNull);.  addr
104b0 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
104c0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp1(v, OP_Rewi
104d0 6e 64 2c 20 69 43 75 72 29 3b 20 56 64 62 65 43  nd, iCur); VdbeC
104e0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
104f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
10500 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43  v, OP_Column, iC
10510 75 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c  ur, 0, regHasNul
10520 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  l);.  sqlite3Vdb
10530 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
10540 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a  LAG_TYPEOFARG);.
10550 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
10560 2c 20 22 66 69 72 73 74 5f 65 6e 74 72 79 5f 69  , "first_entry_i
10570 6e 28 25 64 29 22 2c 20 69 43 75 72 29 29 3b 0a  n(%d)", iCur));.
10580 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
10590 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
105a0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e  .}.#endif...#ifn
105b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
105c0 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54  SUBQUERY./*.** T
105d0 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  he argument is a
105e0 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  n IN operator wi
105f0 74 68 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61  th a list (not a
10600 20 73 75 62 71 75 65 72 79 29 20 6f 6e 20 74 68   subquery) on th
10610 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64  e .** right-hand
10620 20 73 69 64 65 2e 20 20 52 65 74 75 72 6e 20 54   side.  Return T
10630 52 55 45 20 69 66 20 74 68 61 74 20 6c 69 73 74  RUE if that list
10640 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f   is constant..*/
10650 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
10660 74 65 33 49 6e 52 68 73 49 73 43 6f 6e 73 74 61  te3InRhsIsConsta
10670 6e 74 28 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20  nt(Expr *pIn){. 
10680 20 45 78 70 72 20 2a 70 4c 48 53 3b 0a 20 20 69   Expr *pLHS;.  i
10690 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74  nt res;.  assert
106a0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
106b0 74 79 28 70 49 6e 2c 20 45 50 5f 78 49 73 53 65  ty(pIn, EP_xIsSe
106c0 6c 65 63 74 29 20 29 3b 0a 20 20 70 4c 48 53 20  lect) );.  pLHS 
106d0 3d 20 70 49 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20  = pIn->pLeft;.  
106e0 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a  pIn->pLeft = 0;.
106f0 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 45    res = sqlite3E
10700 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 49  xprIsConstant(pI
10710 6e 29 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74  n);.  pIn->pLeft
10720 20 3d 20 70 4c 48 53 3b 0a 20 20 72 65 74 75 72   = pLHS;.  retur
10730 6e 20 72 65 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a  n res;.}.#endif.
10740 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
10750 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20  tion is used by 
10760 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
10770 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e  on of the IN (..
10780 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20  .) operator..** 
10790 54 68 65 20 70 58 20 70 61 72 61 6d 65 74 65 72  The pX parameter
107a0 20 69 73 20 74 68 65 20 65 78 70 72 65 73 73 69   is the expressi
107b0 6f 6e 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66  on on the RHS of
107c0 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
107d0 2c 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74  , which.** might
107e0 20 62 65 20 65 69 74 68 65 72 20 61 20 6c 69 73   be either a lis
107f0 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
10800 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a   or a subquery..
10810 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66  **.** The job of
10820 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
10830 20 74 6f 20 66 69 6e 64 20 6f 72 20 63 72 65 61   to find or crea
10840 74 65 20 61 20 62 2d 74 72 65 65 20 6f 62 6a 65  te a b-tree obje
10850 63 74 20 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62  ct that can.** b
10860 65 20 75 73 65 64 20 65 69 74 68 65 72 20 74 6f  e used either to
10870 20 74 65 73 74 20 66 6f 72 20 6d 65 6d 62 65 72   test for member
10880 73 68 69 70 20 69 6e 20 74 68 65 20 52 48 53 20  ship in the RHS 
10890 73 65 74 20 6f 72 20 74 6f 20 69 74 65 72 61 74  set or to iterat
108a0 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c  e through.** all
108b0 20 6d 65 6d 62 65 72 73 20 6f 66 20 74 68 65 20   members of the 
108c0 52 48 53 20 73 65 74 2c 20 73 6b 69 70 70 69 6e  RHS set, skippin
108d0 67 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a  g duplicates..**
108e0 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20 69 73 20  .** A cursor is 
108f0 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d  opened on the b-
10900 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74  tree object that
10910 20 69 73 20 74 68 65 20 52 48 53 20 6f 66 20 74   is the RHS of t
10920 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a  he IN operator.*
10930 2a 20 61 6e 64 20 70 58 2d 3e 69 54 61 62 6c 65  * and pX->iTable
10940 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 69   is set to the i
10950 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63 75 72  ndex of that cur
10960 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  sor..**.** The r
10970 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6f 66  eturned value of
10980 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
10990 6e 64 69 63 61 74 65 73 20 74 68 65 20 62 2d 74  ndicates the b-t
109a0 72 65 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c  ree type, as fol
109b0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e  lows:.**.**   IN
109c0 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 20 20 20  _INDEX_ROWID    
109d0 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77    - The cursor w
109e0 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64  as opened on a d
109f0 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a  atabase table..*
10a00 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  *   IN_INDEX_IND
10a10 45 58 5f 41 53 43 20 20 2d 20 54 68 65 20 63 75  EX_ASC  - The cu
10a20 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
10a30 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20  on an ascending 
10a40 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49  index..**   IN_I
10a50 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
10a60 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
10a70 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 65 73   opened on a des
10a80 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a  cending index..*
10a90 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48  *   IN_INDEX_EPH
10aa0 20 20 20 20 20 20 20 20 2d 20 54 68 65 20 63 75          - The cu
10ab0 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
10ac0 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63  on a specially c
10ad0 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20  reated and.**   
10ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10af0 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20        populated 
10b00 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e  epheremal table.
10b10 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4e  .**   IN_INDEX_N
10b20 4f 4f 50 20 20 20 20 20 20 20 2d 20 4e 6f 20 63  OOP       - No c
10b30 75 72 73 6f 72 20 77 61 73 20 61 6c 6c 6f 63 61  ursor was alloca
10b40 74 65 64 2e 20 20 54 68 65 20 49 4e 20 6f 70 65  ted.  The IN ope
10b50 72 61 74 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a  rator must be.**
10b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b70 20 20 20 20 20 20 20 20 20 69 6d 70 6c 65 6d 65           impleme
10b80 6e 74 65 64 20 61 73 20 61 20 73 65 71 75 65 6e  nted as a sequen
10b90 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  ce of comparison
10ba0 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73  s..**.** An exis
10bb0 74 69 6e 67 20 62 2d 74 72 65 65 20 6d 69 67 68  ting b-tree migh
10bc0 74 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65  t be used if the
10bd0 20 52 48 53 20 65 78 70 72 65 73 73 69 6f 6e 20   RHS expression 
10be0 70 58 20 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a  pX is a simple.*
10bf0 2a 20 73 75 62 71 75 65 72 79 20 73 75 63 68 20  * subquery such 
10c00 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  as:.**.**     SE
10c10 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 31 3e 2c 20  LECT <column1>, 
10c20 3c 63 6f 6c 75 6d 6e 32 3e 2e 2e 2e 20 46 52 4f  <column2>... FRO
10c30 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20  M <table>.**.** 
10c40 49 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  If the RHS of th
10c50 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73  e IN operator is
10c60 20 61 20 6c 69 73 74 20 6f 72 20 61 20 6d 6f 72   a list or a mor
10c70 65 20 63 6f 6d 70 6c 65 78 20 73 75 62 71 75 65  e complex subque
10c80 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 65  ry, then.** an e
10c90 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6d  phemeral table m
10ca0 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20  ight need to be 
10cb0 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74  generated from t
10cc0 68 65 20 52 48 53 20 61 6e 64 20 74 68 65 6e 0a  he RHS and then.
10cd0 2a 2a 20 70 58 2d 3e 69 54 61 62 6c 65 20 6d 61  ** pX->iTable ma
10ce0 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  de to point to t
10cf0 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
10d00 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6e  le instead of an
10d10 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 74 61 62  .** existing tab
10d20 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  le..**.** The in
10d30 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  Flags parameter 
10d40 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 65 78 61  must contain exa
10d50 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  ctly one of the 
10d60 62 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58  bits.** IN_INDEX
10d70 5f 4d 45 4d 42 45 52 53 48 49 50 20 6f 72 20 49  _MEMBERSHIP or I
10d80 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2e 20 20 49  N_INDEX_LOOP.  I
10d90 66 20 69 6e 46 6c 61 67 73 20 63 6f 6e 74 61 69  f inFlags contai
10da0 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d  ns.** IN_INDEX_M
10db0 45 4d 42 45 52 53 48 49 50 2c 20 74 68 65 6e 20  EMBERSHIP, then 
10dc0 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 74 61  the generated ta
10dd0 62 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ble will be used
10de0 20 66 6f 72 20 61 0a 2a 2a 20 66 61 73 74 20 6d   for a.** fast m
10df0 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 2e 20  embership test. 
10e00 20 57 68 65 6e 20 74 68 65 20 49 4e 5f 49 4e 44   When the IN_IND
10e10 45 58 5f 4c 4f 4f 50 20 62 69 74 20 69 73 20 73  EX_LOOP bit is s
10e20 65 74 2c 20 74 68 65 0a 2a 2a 20 49 4e 20 69 6e  et, the.** IN in
10e30 64 65 78 20 77 69 6c 6c 20 62 65 20 75 73 65 64  dex will be used
10e40 20 74 6f 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c   to loop over al
10e50 6c 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20  l values of the 
10e60 52 48 53 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e  RHS of the.** IN
10e70 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a   operator..**.**
10e80 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4c   When IN_INDEX_L
10e90 4f 4f 50 20 69 73 20 75 73 65 64 20 28 61 6e 64  OOP is used (and
10ea0 20 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c   the b-tree will
10eb0 20 62 65 20 75 73 65 64 20 74 6f 20 69 74 65 72   be used to iter
10ec0 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74  ate.** through t
10ed0 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73 29 20  he set members) 
10ee0 74 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20  then the b-tree 
10ef0 6d 75 73 74 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  must not contain
10f00 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 20   duplicates..** 
10f10 41 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  An epheremal tab
10f20 6c 65 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  le must be used 
10f30 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63  unless the selec
10f40 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  ted columns are 
10f50 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f  guaranteed.** to
10f60 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74   be unique - eit
10f70 68 65 72 20 62 65 63 61 75 73 65 20 69 74 20 69  her because it i
10f80 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  s an INTEGER PRI
10f90 4d 41 52 59 20 4b 45 59 20 6f 72 20 64 75 65 20  MARY KEY or due 
10fa0 74 6f 0a 2a 2a 20 61 20 55 4e 49 51 55 45 20 63  to.** a UNIQUE c
10fb0 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20 69 6e 64  onstraint or ind
10fc0 65 78 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49  ex..**.** When I
10fd0 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48  N_INDEX_MEMBERSH
10fe0 49 50 20 69 73 20 75 73 65 64 20 28 61 6e 64 20  IP is used (and 
10ff0 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20  the b-tree will 
11000 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20  be used .** for 
11010 66 61 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73  fast set members
11020 68 69 70 20 74 65 73 74 73 29 20 74 68 65 6e 20  hip tests) then 
11030 61 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  an epheremal tab
11040 6c 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75  le must .** be u
11050 73 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75  sed unless <colu
11060 6d 6e 73 3e 20 69 73 20 61 20 73 69 6e 67 6c 65  mns> is a single
11070 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
11080 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f 72 20 61   KEY column or a
11090 6e 20 0a 2a 2a 20 69 6e 64 65 78 20 63 61 6e 20  n .** index can 
110a0 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20 74 68  be found with th
110b0 65 20 73 70 65 63 69 66 69 65 64 20 3c 63 6f 6c  e specified <col
110c0 75 6d 6e 73 3e 20 61 73 20 69 74 73 20 6c 65 66  umns> as its lef
110d0 74 2d 6d 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  t-most..**.** If
110e0 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f   the IN_INDEX_NO
110f0 4f 50 5f 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e 44  OP_OK and IN_IND
11100 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 61 72  EX_MEMBERSHIP ar
11110 65 20 62 6f 74 68 20 73 65 74 20 61 6e 64 0a 2a  e both set and.*
11120 2a 20 69 66 20 74 68 65 20 52 48 53 20 6f 66 20  * if the RHS of 
11130 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
11140 69 73 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61  is a list (not a
11150 20 73 75 62 71 75 65 72 79 29 20 74 68 65 6e 20   subquery) then 
11160 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
11170 6d 69 67 68 74 20 64 65 63 69 64 65 20 74 68 61  might decide tha
11180 74 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70  t creating an ep
11190 68 65 6d 65 72 61 6c 20 62 2d 74 72 65 65 20 66  hemeral b-tree f
111a0 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 0a 2a 2a  or membership.**
111b0 20 74 65 73 74 69 6e 67 20 69 73 20 74 6f 6f 20   testing is too 
111c0 65 78 70 65 6e 73 69 76 65 20 61 6e 64 20 72 65  expensive and re
111d0 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  turn IN_INDEX_NO
111e0 4f 50 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  OP.  In that cas
111f0 65 2c 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  e, the.** callin
11200 67 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  g routine should
11210 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49   implement the I
11220 4e 20 6f 70 65 72 61 74 6f 72 20 75 73 69 6e 67  N operator using
11230 20 61 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 6f   a sequence.** o
11240 66 20 45 71 20 6f 72 20 4e 65 20 63 6f 6d 70 61  f Eq or Ne compa
11250 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73  rison operations
11260 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ..**.** When the
11270 20 62 2d 74 72 65 65 20 69 73 20 62 65 69 6e 67   b-tree is being
11280 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 62 65 72   used for member
11290 73 68 69 70 20 74 65 73 74 73 2c 20 74 68 65 20  ship tests, the 
112a0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
112b0 0a 2a 2a 20 6d 69 67 68 74 20 6e 65 65 64 20 74  .** might need t
112c0 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f  o know whether o
112d0 72 20 6e 6f 74 20 74 68 65 20 52 48 53 20 73 69  r not the RHS si
112e0 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  de of the IN ope
112f0 72 61 74 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e  rator.** contain
11300 73 20 61 20 4e 55 4c 4c 2e 20 20 49 66 20 70 72  s a NULL.  If pr
11310 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6e 6f  RhsHasNull is no
11320 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  t a NULL pointer
11330 20 61 6e 64 20 0a 2a 2a 20 69 66 20 74 68 65 72   and .** if ther
11340 65 20 69 73 20 61 6e 79 20 63 68 61 6e 63 65 20  e is any chance 
11350 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d  that the (...) m
11360 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e  ight contain a N
11370 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20  ULL value at.** 
11380 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61 20  runtime, then a 
11390 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f  register is allo
113a0 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 72 65  cated and the re
113b0 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 72  gister number wr
113c0 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52  itten.** to *prR
113d0 68 73 48 61 73 4e 75 6c 6c 2e 20 49 66 20 74 68  hsHasNull. If th
113e0 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
113f0 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20   that the (...) 
11400 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55  contains a.** NU
11410 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a  LL value, then *
11420 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20  prRhsHasNull is 
11430 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a  left unchanged..
11440 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73  **.** If a regis
11450 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ter is allocated
11460 20 61 6e 64 20 69 74 73 20 6c 6f 63 61 74 69 6f   and its locatio
11470 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 72 52  n stored in *prR
11480 68 73 48 61 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a  hsHasNull, then.
11490 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ** the value in 
114a0 74 68 61 74 20 72 65 67 69 73 74 65 72 20 77 69  that register wi
114b0 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68  ll be NULL if th
114c0 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e  e b-tree contain
114d0 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a  s one or more.**
114e0 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 61 6e   NULL values, an
114f0 64 20 69 74 20 77 69 6c 6c 20 62 65 20 73 6f 6d  d it will be som
11500 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65  e non-NULL value
11510 20 69 66 20 74 68 65 20 62 2d 74 72 65 65 20 63   if the b-tree c
11520 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55  ontains no.** NU
11530 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a  LL values..**.**
11540 20 49 66 20 74 68 65 20 61 69 4d 61 70 20 70 61   If the aiMap pa
11550 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 4e  rameter is not N
11560 55 4c 4c 2c 20 69 74 20 6d 75 73 74 20 70 6f 69  ULL, it must poi
11570 6e 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20 63  nt to an array c
11580 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65  ontaining.** one
11590 20 65 6c 65 6d 65 6e 74 20 66 6f 72 20 65 61 63   element for eac
115a0 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65  h column returne
115b0 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20  d by the SELECT 
115c0 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 74 68 65  statement on the
115d0 20 52 48 53 0a 2a 2a 20 6f 66 20 74 68 65 20 49   RHS.** of the I
115e0 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e  N(...) operator.
115f0 20 54 68 65 20 69 27 74 68 20 65 6e 74 72 79 20   The i'th entry 
11600 6f 66 20 74 68 65 20 61 72 72 61 79 20 69 73 20  of the array is 
11610 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
11620 68 65 0a 2a 2a 20 6f 66 66 73 65 74 20 6f 66 20  he.** offset of 
11630 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  the index column
11640 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68   that matches th
11650 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 72 65  e i'th column re
11660 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a  turned by the.**
11670 20 53 45 4c 45 43 54 2e 20 46 6f 72 20 65 78 61   SELECT. For exa
11680 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 65 78 70  mple, if the exp
11690 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 65 6c 65  ression and sele
116a0 63 74 65 64 20 69 6e 64 65 78 20 61 72 65 3a 0a  cted index are:.
116b0 2a 2a 0a 2a 2a 20 20 20 28 3f 2c 3f 2c 3f 29 20  **.**   (?,?,?) 
116c0 49 4e 20 28 53 45 4c 45 43 54 20 61 2c 20 62 2c  IN (SELECT a, b,
116d0 20 63 20 46 52 4f 4d 20 74 31 29 0a 2a 2a 20 20   c FROM t1).**  
116e0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
116f0 20 4f 4e 20 74 31 28 62 2c 20 63 2c 20 61 29 3b   ON t1(b, c, a);
11700 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 61 69 4d 61  .**.** then aiMa
11710 70 5b 5d 20 69 73 20 70 6f 70 75 6c 61 74 65 64  p[] is populated
11720 20 77 69 74 68 20 7b 32 2c 20 30 2c 20 31 7d 2e   with {2, 0, 1}.
11730 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
11740 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
11750 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64  .int sqlite3Find
11760 49 6e 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  InIndex(.  Parse
11770 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45 78 70   *pParse, .  Exp
11780 72 20 2a 70 58 2c 20 0a 20 20 75 33 32 20 69 6e  r *pX, .  u32 in
11790 46 6c 61 67 73 2c 20 0a 20 20 69 6e 74 20 2a 70  Flags, .  int *p
117a0 72 52 68 73 48 61 73 4e 75 6c 6c 2c 0a 20 20 69  rRhsHasNull,.  i
117b0 6e 74 20 2a 61 69 4d 61 70 0a 29 7b 0a 20 20 53  nt *aiMap.){.  S
117c0 65 6c 65 63 74 20 2a 70 3b 20 20 20 20 20 20 20  elect *p;       
117d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117e0 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 74       /* SELECT t
117f0 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 49  o the right of I
11800 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
11810 69 6e 74 20 65 54 79 70 65 20 3d 20 30 3b 20 20  int eType = 0;  
11820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11830 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
11840 20 52 48 53 20 74 61 62 6c 65 2e 20 49 4e 5f 49   RHS table. IN_I
11850 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20  NDEX_* */.  int 
11860 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iTab = pParse->n
11870 54 61 62 2b 2b 3b 20 20 20 20 20 20 20 20 20 20  Tab++;          
11880 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 74    /* Cursor of t
11890 68 65 20 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a  he RHS table */.
118a0 20 20 69 6e 74 20 6d 75 73 74 42 65 55 6e 69 71    int mustBeUniq
118b0 75 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ue;             
118c0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
118d0 69 66 20 52 48 53 20 6d 75 73 74 20 62 65 20 75  if RHS must be u
118e0 6e 69 71 75 65 20 2a 2f 0a 20 20 56 64 62 65 20  nique */.  Vdbe 
118f0 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
11900 64 62 65 28 70 50 61 72 73 65 29 3b 20 20 20 20  dbe(pParse);    
11910 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63 68   /* Virtual mach
11920 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ine being coded 
11930 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 58  */..  assert( pX
11940 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op==TK_IN );. 
11950 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20 3d 20   mustBeUnique = 
11960 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e  (inFlags & IN_IN
11970 44 45 58 5f 4c 4f 4f 50 29 21 3d 30 3b 0a 0a 20  DEX_LOOP)!=0;.. 
11980 20 2f 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f   /* If the RHS o
11990 66 20 74 68 69 73 20 49 4e 28 2e 2e 2e 29 20 6f  f this IN(...) o
119a0 70 65 72 61 74 6f 72 20 69 73 20 61 20 53 45 4c  perator is a SEL
119b0 45 43 54 2c 20 61 6e 64 20 69 66 20 69 74 20 6d  ECT, and if it m
119c0 61 74 74 65 72 73 20 0a 20 20 2a 2a 20 77 68 65  atters .  ** whe
119d0 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
119e0 53 45 4c 45 43 54 20 72 65 73 75 6c 74 20 63 6f  SELECT result co
119f0 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75  ntains NULL valu
11a00 65 73 2c 20 63 68 65 63 6b 20 77 68 65 74 68 65  es, check whethe
11a10 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 4e 55  r.  ** or not NU
11a20 4c 4c 20 69 73 20 61 63 74 75 61 6c 6c 79 20 70  LL is actually p
11a30 6f 73 73 69 62 6c 65 20 28 69 74 20 6d 61 79 20  ossible (it may 
11a40 6e 6f 74 20 62 65 2c 20 66 6f 72 20 65 78 61 6d  not be, for exam
11a50 70 6c 65 2c 20 64 75 65 20 0a 20 20 2a 2a 20 74  ple, due .  ** t
11a60 6f 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74  o NOT NULL const
11a70 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 73 63  raints in the sc
11a80 68 65 6d 61 29 2e 20 49 66 20 6e 6f 20 4e 55 4c  hema). If no NUL
11a90 4c 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f 73  L values are pos
11aa0 73 69 62 6c 65 2c 0a 20 20 2a 2a 20 73 65 74 20  sible,.  ** set 
11ab0 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 74 6f 20  prRhsHasNull to 
11ac0 30 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75  0 before continu
11ad0 69 6e 67 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ing.  */.  if( p
11ae0 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26 20 28  rRhsHasNull && (
11af0 70 58 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78  pX->flags & EP_x
11b00 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
11b10 20 69 6e 74 20 69 3b 0a 20 20 20 20 45 78 70 72   int i;.    Expr
11b20 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70  List *pEList = p
11b30 58 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  X->x.pSelect->pE
11b40 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d  List;.    for(i=
11b50 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
11b60 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
11b70 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
11b80 61 6e 42 65 4e 75 6c 6c 28 70 45 4c 69 73 74 2d  anBeNull(pEList-
11b90 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 20 62  >a[i].pExpr) ) b
11ba0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
11bb0 69 66 28 20 69 3d 3d 70 45 4c 69 73 74 2d 3e 6e  if( i==pEList->n
11bc0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 72  Expr ){.      pr
11bd0 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 0a  RhsHasNull = 0;.
11be0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
11bf0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
11c00 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c  an existing tabl
11c10 65 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 62  e or index can b
11c20 65 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 73  e used to.  ** s
11c30 61 74 69 73 66 79 20 74 68 65 20 71 75 65 72 79  atisfy the query
11c40 2e 20 20 54 68 69 73 20 69 73 20 70 72 65 66 65  .  This is prefe
11c50 72 61 62 6c 65 20 74 6f 20 67 65 6e 65 72 61 74  rable to generat
11c60 69 6e 67 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20  ing a new .  ** 
11c70 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e  ephemeral table.
11c80 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
11c90 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 28 70  e->nErr==0 && (p
11ca0 20 3d 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f   = isCandidateFo
11cb0 72 49 6e 4f 70 74 28 70 58 29 29 21 3d 30 20 29  rInOpt(pX))!=0 )
11cc0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
11cd0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
11ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11cf0 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
11d00 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65  ion */.    Table
11d10 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
11d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d30 20 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c    /* Table <tabl
11d40 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 31 36 20 69  e>. */.    i16 i
11d50 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
11d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d70 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 64    /* Database id
11d80 78 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20  x for pTab */.  
11d90 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
11da0 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
11db0 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20      int nExpr = 
11dc0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a  pEList->nExpr;..
11dd0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
11de0 45 4c 69 73 74 21 3d 30 20 29 3b 20 20 20 20 20  EList!=0 );     
11df0 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75          /* Becau
11e00 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
11e10 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
11e20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
11e30 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
11e40 72 21 3d 30 20 29 3b 20 2f 2a 20 42 65 63 61 75  r!=0 ); /* Becau
11e50 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
11e60 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
11e70 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
11e80 53 72 63 21 3d 30 20 29 3b 20 20 20 20 20 20 20  Src!=0 );       
11e90 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75          /* Becau
11ea0 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
11eb0 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
11ec0 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53      pTab = p->pS
11ed0 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a  rc->a[0].pTab;..
11ee0 20 20 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f      /* Code an O
11ef0 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  P_Transaction an
11f00 64 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66  d OP_TableLock f
11f10 6f 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20  or <table>. */. 
11f20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
11f30 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
11f40 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
11f50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  ;.    sqlite3Cod
11f60 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
11f70 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
11f80 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
11f90 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
11fa0 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61  ab->tnum, 0, pTa
11fb0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20  b->zName);..    
11fc0 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
11fd0 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
11fe0 66 72 6f 6d 20 74 77 6f 20 70 6c 61 63 65 73 2e  from two places.
11ff0 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73 20 74   In both cases t
12000 68 65 20 76 64 62 65 0a 20 20 20 20 2a 2a 20 68  he vdbe.    ** h
12010 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
12020 61 6c 6c 6f 63 61 74 65 64 2e 20 53 6f 20 61 73  allocated. So as
12030 73 75 6d 65 20 73 71 6c 69 74 65 33 47 65 74 56  sume sqlite3GetV
12040 64 62 65 28 29 20 69 73 20 61 6c 77 61 79 73 0a  dbe() is always.
12050 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75      ** successfu
12060 6c 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  l here..    */. 
12070 20 20 20 61 73 73 65 72 74 28 76 29 3b 0a 20 20     assert(v);.  
12080 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 26    if( nExpr==1 &
12090 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  & pEList->a[0].p
120a0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Expr->iColumn<0 
120b0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 41 64  ){.      int iAd
120c0 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  dr = sqlite3Code
120d0 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Once(pParse);.  
120e0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
120f0 28 76 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  (v);..      sqli
12100 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
12110 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20  rse, iTab, iDb, 
12120 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
12130 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20  d);.      eType 
12140 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  = IN_INDEX_ROWID
12150 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
12160 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
12170 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73  iAddr);.    }els
12180 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  e{.      Index *
12190 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
121a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
121b0 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
121c0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  le */.      int 
121d0 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 31 3b  affinity_ok = 1;
121e0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20  .      int i;.. 
121f0 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68       /* Check th
12200 61 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  at the affinity 
12210 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65  that will be use
12220 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 65 61 63  d to perform eac
12230 68 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70  h .      ** comp
12240 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61  arison is the sa
12250 6d 65 20 61 73 20 74 68 65 20 61 66 66 69 6e 69  me as the affini
12260 74 79 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d  ty of each colum
12270 6e 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 69  n. If.      ** i
12280 74 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74  t not, it is not
12290 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
122a0 20 61 6e 79 20 69 6e 64 65 78 2e 20 20 2a 2f 0a   any index.  */.
122b0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
122c0 3c 6e 45 78 70 72 20 26 26 20 61 66 66 69 6e 69  <nExpr && affini
122d0 74 79 5f 6f 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ty_ok; i++){.   
122e0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20       Expr *pLhs 
122f0 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46  = sqlite3VectorF
12300 69 65 6c 64 53 75 62 65 78 70 72 28 70 58 2d 3e  ieldSubexpr(pX->
12310 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20  pLeft, i);.     
12320 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45     int iCol = pE
12330 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
12340 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
12350 20 20 20 63 68 61 72 20 69 64 78 61 66 66 20 3d     char idxaff =
12360 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
12370 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  ].affinity;.    
12380 20 20 20 20 63 68 61 72 20 63 6d 70 61 66 66 20      char cmpaff 
12390 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
123a0 41 66 66 69 6e 69 74 79 28 70 4c 68 73 2c 20 69  Affinity(pLhs, i
123b0 64 78 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20  dxaff);.        
123c0 73 77 69 74 63 68 28 20 63 6d 70 61 66 66 20 29  switch( cmpaff )
123d0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  {.          case
123e0 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
123f0 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  :.            br
12400 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 63  eak;.          c
12410 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  ase SQLITE_AFF_T
12420 45 58 54 3a 0a 20 20 20 20 20 20 20 20 20 20 20  EXT:.           
12430 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 28   affinity_ok = (
12440 69 64 78 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  idxaff==SQLITE_A
12450 46 46 5f 54 45 58 54 29 3b 0a 20 20 20 20 20 20  FF_TEXT);.      
12460 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12470 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a         default:.
12480 20 20 20 20 20 20 20 20 20 20 20 20 61 66 66 69              affi
12490 6e 69 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65  nity_ok = sqlite
124a0 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
124b0 74 79 28 69 64 78 61 66 66 29 3b 0a 20 20 20 20  ty(idxaff);.    
124c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
124d0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c       /* The coll
124e0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75  ation sequence u
124f0 73 65 64 20 62 79 20 74 68 65 20 63 6f 6d 70 61  sed by the compa
12500 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20 69 6e 64  rison. If an ind
12510 65 78 20 69 73 20 74 6f 0a 20 20 20 20 20 20 2a  ex is to.      *
12520 2a 20 62 65 20 75 73 65 64 20 69 6e 20 70 6c 61  * be used in pla
12530 63 65 20 6f 66 20 61 20 74 65 6d 70 2d 74 61 62  ce of a temp-tab
12540 6c 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20 6f  le, it must be o
12550 72 64 65 72 65 64 20 61 63 63 6f 72 64 69 6e 67  rdered according
12560 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 69  .      ** to thi
12570 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  s collation sequ
12580 65 6e 63 65 2e 20 20 2a 2f 0a 0a 20 20 20 20 20  ence.  */..     
12590 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
125a0 70 49 6e 64 65 78 3b 20 70 49 64 78 20 26 26 20  pIndex; pIdx && 
125b0 65 54 79 70 65 3d 3d 30 20 26 26 20 61 66 66 69  eType==0 && affi
125c0 6e 69 74 79 5f 6f 6b 3b 20 70 49 64 78 3d 70 49  nity_ok; pIdx=pI
125d0 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
125e0 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b      if( pIdx->nK
125f0 65 79 43 6f 6c 3c 6e 45 78 70 72 20 29 20 63 6f  eyCol<nExpr ) co
12600 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
12610 69 66 28 20 6d 75 73 74 42 65 55 6e 69 71 75 65  if( mustBeUnique
12620 20 26 26 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43   && (pIdx->nKeyC
12630 6f 6c 21 3d 6e 45 78 70 72 20 7c 7c 20 21 49 73  ol!=nExpr || !Is
12640 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78  UniqueIndex(pIdx
12650 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  )) ){.          
12660 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
12670 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 66 6f 72    }..        for
12680 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
12690 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  ++){.          E
126a0 78 70 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69  xpr *pLhs = sqli
126b0 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
126c0 62 65 78 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c  bexpr(pX->pLeft,
126d0 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 45   i);.          E
126e0 78 70 72 20 2a 70 52 68 73 20 3d 20 70 45 4c 69  xpr *pRhs = pELi
126f0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
12700 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65            CollSe
12710 71 20 2a 70 52 65 71 20 3d 20 73 71 6c 69 74 65  q *pReq = sqlite
12720 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
12730 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
12740 68 73 2c 20 70 52 68 73 29 3b 0a 20 20 20 20 20  hs, pRhs);.     
12750 20 20 20 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 20       int j;..   
12760 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
12770 52 65 71 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  Req || pParse->n
12780 45 72 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Err );.         
12790 20 69 66 28 20 70 52 65 71 3d 3d 30 20 29 20 62   if( pReq==0 ) b
127a0 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 20  reak;..         
127b0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 78 70   for(j=0; j<nExp
127c0 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; j++){.       
127d0 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
127e0 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70 52 68 73  iColumn[j]!=pRhs
127f0 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74  ->iColumn ) cont
12800 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
12810 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
12820 61 7a 43 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20 20 20  azColl[j] );.   
12830 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
12840 69 74 65 33 53 74 72 49 43 6d 70 28 70 52 65 71  ite3StrICmp(pReq
12850 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61  ->zName, pIdx->a
12860 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63  zColl[j])!=0 ) c
12870 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
12880 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
12890 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
128a0 20 20 69 66 28 20 6a 3d 3d 6e 45 78 70 72 20 29    if( j==nExpr )
128b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
128c0 20 20 69 66 28 20 61 69 4d 61 70 20 29 20 61 69    if( aiMap ) ai
128d0 4d 61 70 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20  Map[i] = j;.    
128e0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
128f0 66 28 20 69 3d 3d 6e 45 78 70 72 20 29 7b 0a 20  f( i==nExpr ){. 
12900 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64           int iAd
12910 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  dr = sqlite3Code
12920 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56 64  Once(pParse); Vd
12930 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
12940 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
12950 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
12960 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54 61 62 2c  _OpenRead, iTab,
12970 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62   pIdx->tnum, iDb
12980 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
12990 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
129a0 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  Info(pParse, pId
129b0 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64  x);.          Vd
129c0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
129d0 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  s", pIdx->zName)
129e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
129f0 65 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  ert( IN_INDEX_IN
12a00 44 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e 5f 49  DEX_DESC == IN_I
12a10 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 2b 31  NDEX_INDEX_ASC+1
12a20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 54   );.          eT
12a30 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49  ype = IN_INDEX_I
12a40 4e 44 45 58 5f 41 53 43 20 2b 20 70 49 64 78 2d  NDEX_ASC + pIdx-
12a50 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 3b 0a  >aSortOrder[0];.
12a60 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
12a70 72 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 20  rRhsHasNull ){. 
12a80 20 20 20 20 20 20 20 20 20 20 20 2a 70 72 52 68             *prRh
12a90 73 48 61 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61  sHasNull = ++pPa
12aa0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 23 69 66 64 65  rse->nMem;.#ifde
12ab0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
12ac0 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b  COLUMN_USED_MASK
12ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 36 34  .            i64
12ae0 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 6e 45 78 70   mask = (1<<nExp
12af0 72 29 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  r)-1;.          
12b00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12b10 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f  Op4Dup8(v, OP_Co
12b20 6c 75 6d 6e 73 55 73 65 64 2c 20 0a 20 20 20 20  lumnsUsed, .    
12b30 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62              iTab
12b40 2c 20 30 2c 20 30 2c 20 28 75 38 2a 29 26 6d 61  , 0, 0, (u8*)&ma
12b50 73 6b 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23  sk, P4_INT64);.#
12b60 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
12b70 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 29    if( nExpr==1 )
12b80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
12b90 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c  sqlite3SetHasNul
12ba0 6c 46 6c 61 67 28 76 2c 20 69 54 61 62 2c 20 2a  lFlag(v, iTab, *
12bb0 70 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20  prRhsHasNull);. 
12bc0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
12bd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12be0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
12bf0 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29  mpHere(v, iAddr)
12c00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12c10 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
12c20 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65 65 78 69   /* If no preexi
12c30 73 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 61  sting index is a
12c40 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65  vailable for the
12c50 20 49 4e 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20   IN clause.  ** 
12c60 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  and IN_INDEX_NOO
12c70 50 20 69 73 20 61 6e 20 61 6c 6c 6f 77 65 64 20  P is an allowed 
12c80 72 65 70 6c 79 0a 20 20 2a 2a 20 61 6e 64 20 74  reply.  ** and t
12c90 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
12ca0 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c   operator is a l
12cb0 69 73 74 2c 20 6e 6f 74 20 61 20 73 75 62 71 75  ist, not a subqu
12cc0 65 72 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ery.  ** and the
12cd0 20 52 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 73   RHS is not cons
12ce0 74 61 6e 74 20 6f 72 20 68 61 73 20 74 77 6f 20  tant or has two 
12cf0 6f 72 20 66 65 77 65 72 20 74 65 72 6d 73 2c 0a  or fewer terms,.
12d00 20 20 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20    ** then it is 
12d10 6e 6f 74 20 77 6f 72 74 68 20 63 72 65 61 74 69  not worth creati
12d20 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  ng an ephemeral 
12d30 74 61 62 6c 65 20 74 6f 20 65 76 61 6c 75 61 74  table to evaluat
12d40 65 0a 20 20 2a 2a 20 74 68 65 20 49 4e 20 6f 70  e.  ** the IN op
12d50 65 72 61 74 6f 72 20 73 6f 20 72 65 74 75 72 6e  erator so return
12d60 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a   IN_INDEX_NOOP..
12d70 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
12d80 3d 3d 30 0a 20 20 20 26 26 20 28 69 6e 46 6c 61  ==0.   && (inFla
12d90 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  gs & IN_INDEX_NO
12da0 4f 50 5f 4f 4b 29 0a 20 20 20 26 26 20 21 45 78  OP_OK).   && !Ex
12db0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
12dc0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 0a  , EP_xIsSelect).
12dd0 20 20 20 26 26 20 28 21 73 71 6c 69 74 65 33 49     && (!sqlite3I
12de0 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 70  nRhsIsConstant(p
12df0 58 29 20 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69 73  X) || pX->x.pLis
12e00 74 2d 3e 6e 45 78 70 72 3c 3d 32 29 0a 20 20 29  t->nExpr<=2).  )
12e10 7b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e  {.    eType = IN
12e20 5f 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d  _INDEX_NOOP;.  }
12e30 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30  ..  if( eType==0
12e40 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64   ){.    /* Could
12e50 20 6e 6f 74 20 66 69 6e 64 20 61 6e 20 65 78 69   not find an exi
12e60 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69  sting table or i
12e70 6e 64 65 78 20 74 6f 20 75 73 65 20 61 73 20 74  ndex to use as t
12e80 68 65 20 52 48 53 20 62 2d 74 72 65 65 2e 0a 20  he RHS b-tree.. 
12e90 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61     ** We will ha
12ea0 76 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ve to generate a
12eb0 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
12ec0 65 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e  e to do the job.
12ed0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 33 32 20  .    */.    u32 
12ee0 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20  savedNQueryLoop 
12ef0 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79  = pParse->nQuery
12f00 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 72 4d  Loop;.    int rM
12f10 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a  ayHaveNull = 0;.
12f20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
12f30 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20 20 69 66  NDEX_EPH;.    if
12f40 28 20 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49  ( inFlags & IN_I
12f50 4e 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20  NDEX_LOOP ){.   
12f60 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
12f70 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20  yLoop = 0;.     
12f80 20 69 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e   if( pX->pLeft->
12f90 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78  iColumn<0 && !Ex
12fa0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
12fb0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
12fc0 29 7b 0a 20 20 20 20 20 20 20 20 65 54 79 70 65  ){.        eType
12fd0 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49   = IN_INDEX_ROWI
12fe0 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  D;.      }.    }
12ff0 65 6c 73 65 20 69 66 28 20 70 72 52 68 73 48 61  else if( prRhsHa
13000 73 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2a  sNull ){.      *
13010 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 72  prRhsHasNull = r
13020 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b  MayHaveNull = ++
13030 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
13040 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43    }.    sqlite3C
13050 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
13060 72 73 65 2c 20 70 58 2c 20 72 4d 61 79 48 61 76  rse, pX, rMayHav
13070 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e  eNull, eType==IN
13080 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20  _INDEX_ROWID);. 
13090 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
130a0 79 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e 51 75  yLoop = savedNQu
130b0 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65  eryLoop;.  }else
130c0 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61 62 6c 65  {.    pX->iTable
130d0 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 0a 20 20   = iTab;.  }..  
130e0 69 66 28 20 61 69 4d 61 70 20 26 26 20 65 54 79  if( aiMap && eTy
130f0 70 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  pe!=IN_INDEX_IND
13100 45 58 5f 41 53 43 20 26 26 20 65 54 79 70 65 21  EX_ASC && eType!
13110 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f  =IN_INDEX_INDEX_
13120 44 45 53 43 20 29 7b 0a 20 20 20 20 69 6e 74 20  DESC ){.    int 
13130 69 2c 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 73 71  i, n;.    n = sq
13140 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
13150 69 7a 65 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a  ize(pX->pLeft);.
13160 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
13170 3b 20 69 2b 2b 29 20 61 69 4d 61 70 5b 69 5d 20  ; i++) aiMap[i] 
13180 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = i;.  }.  retur
13190 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69  n eType;.}.#endi
131a0 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
131b0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
131c0 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  /*.** Argument p
131d0 45 78 70 72 20 69 73 20 61 6e 20 28 3f 2c 20 3f  Expr is an (?, ?
131e0 2e 2e 2e 29 20 49 4e 28 2e 2e 2e 29 20 65 78 70  ...) IN(...) exp
131f0 72 65 73 73 69 6f 6e 2e 20 54 68 69 73 20 0a 2a  ression. This .*
13200 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  * function alloc
13210 61 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73  ates and returns
13220 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
13230 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  d string contain
13240 69 6e 67 20 0a 2a 2a 20 74 68 65 20 61 66 66 69  ing .** the affi
13250 6e 69 74 69 65 73 20 74 6f 20 62 65 20 75 73 65  nities to be use
13260 64 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  d for each colum
13270 6e 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  n of the compari
13280 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  son..**.** It is
13290 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
132a0 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
132b0 72 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  r to ensure that
132c0 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a   the returned.**
132d0 20 73 74 72 69 6e 67 20 69 73 20 65 76 65 6e 74   string is event
132e0 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e  ually freed usin
132f0 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  g sqlite3DbFree(
13300 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  )..*/.static cha
13310 72 20 2a 65 78 70 72 49 4e 41 66 66 69 6e 69 74  r *exprINAffinit
13320 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
13330 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
13340 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
13350 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69  Expr->pLeft;.  i
13360 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65  nt nVal = sqlite
13370 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
13380 70 4c 65 66 74 29 3b 0a 20 20 53 65 6c 65 63 74  pLeft);.  Select
13390 20 2a 70 53 65 6c 65 63 74 20 3d 20 28 70 45 78   *pSelect = (pEx
133a0 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78  pr->flags & EP_x
133b0 49 73 53 65 6c 65 63 74 29 20 3f 20 70 45 78 70  IsSelect) ? pExp
133c0 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3a 20 30  r->x.pSelect : 0
133d0 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a  ;.  char *zRet;.
133e0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
133f0 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op==TK_IN );. 
13400 20 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44   zRet = sqlite3D
13410 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
13420 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2b 31 29 3b  se->db, nVal+1);
13430 0a 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0a 20  .  if( zRet ){. 
13440 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
13450 72 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69  r(i=0; i<nVal; i
13460 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
13470 2a 70 41 20 3d 20 73 71 6c 69 74 65 33 56 65 63  *pA = sqlite3Vec
13480 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
13490 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20  pLeft, i);.     
134a0 20 63 68 61 72 20 61 20 3d 20 73 71 6c 69 74 65   char a = sqlite
134b0 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 41  3ExprAffinity(pA
134c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  );.      if( pSe
134d0 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
134e0 7a 52 65 74 5b 69 5d 20 3d 20 73 71 6c 69 74 65  zRet[i] = sqlite
134f0 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
13500 28 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  (pSelect->pEList
13510 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 61 29  ->a[i].pExpr, a)
13520 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13530 20 20 20 20 20 20 20 7a 52 65 74 5b 69 5d 20 3d         zRet[i] =
13540 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   a;.      }.    
13550 7d 0a 20 20 20 20 7a 52 65 74 5b 6e 56 61 6c 5d  }.    zRet[nVal]
13560 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 72   = '\0';.  }.  r
13570 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65  eturn zRet;.}.#e
13580 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
13590 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
135a0 52 59 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68  RY./*.** Load th
135b0 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 70  e Parse object p
135c0 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
135d0 73 74 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68  st argument with
135e0 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65   an error .** me
135f0 73 73 61 67 65 20 6f 66 20 74 68 65 20 66 6f 72  ssage of the for
13600 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d  m:.**.**   "sub-
13610 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20 4e  select returns N
13620 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63   columns - expec
13630 74 65 64 20 4d 22 0a 2a 2f 20 20 20 0a 76 6f 69  ted M".*/   .voi
13640 64 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65  d sqlite3Subsele
13650 63 74 45 72 72 6f 72 28 50 61 72 73 65 20 2a 70  ctError(Parse *p
13660 50 61 72 73 65 2c 20 69 6e 74 20 6e 41 63 74 75  Parse, int nActu
13670 61 6c 2c 20 69 6e 74 20 6e 45 78 70 65 63 74 29  al, int nExpect)
13680 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
13690 7a 46 6d 74 20 3d 20 22 73 75 62 2d 73 65 6c 65  zFmt = "sub-sele
136a0 63 74 20 72 65 74 75 72 6e 73 20 25 64 20 63 6f  ct returns %d co
136b0 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64  lumns - expected
136c0 20 25 64 22 3b 0a 20 20 73 71 6c 69 74 65 33 45   %d";.  sqlite3E
136d0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
136e0 7a 46 6d 74 2c 20 6e 41 63 74 75 61 6c 2c 20 6e  zFmt, nActual, n
136f0 45 78 70 65 63 74 29 3b 0a 7d 0a 23 65 6e 64 69  Expect);.}.#endi
13700 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  f../*.** Generat
13710 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61  e code for scala
13720 72 20 73 75 62 71 75 65 72 69 65 73 20 75 73 65  r subqueries use
13730 64 20 61 73 20 61 20 73 75 62 71 75 65 72 79 20  d as a subquery 
13740 65 78 70 72 65 73 73 69 6f 6e 2c 20 45 58 49 53  expression, EXIS
13750 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70 65  TS,.** or IN ope
13760 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65  rators.  Example
13770 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45  s:.**.**     (SE
13780 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
13790 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75          -- subqu
137a0 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54  ery.**     EXIST
137b0 53 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  S (SELECT a FROM
137c0 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20   b)   -- EXISTS 
137d0 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20  subquery.**     
137e0 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20  x IN (4,5,11)   
137f0 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e             -- IN
13800 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c   operator with l
13810 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e  ist on right-han
13820 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20  d side.**     x 
13830 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f  IN (SELECT a FRO
13840 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f  M b)     -- IN o
13850 70 65 72 61 74 6f 72 20 77 69 74 68 20 73 75 62  perator with sub
13860 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67  query on the rig
13870 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78  ht.**.** The pEx
13880 70 72 20 70 61 72 61 6d 65 74 65 72 20 64 65 73  pr parameter des
13890 63 72 69 62 65 73 20 74 68 65 20 65 78 70 72 65  cribes the expre
138a0 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61  ssion that conta
138b0 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70  ins the IN.** op
138c0 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71 75 65  erator or subque
138d0 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ry..**.** If par
138e0 61 6d 65 74 65 72 20 69 73 52 6f 77 69 64 20 69  ameter isRowid i
138f0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
13900 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
13910 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a  r is guaranteed.
13920 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74 68 65 20  ** to be of the 
13930 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e  form "<rowid> IN
13940 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65   (?, ?, ?)", whe
13950 72 65 20 3c 72 6f 77 69 64 3e 20 69 73 20 61 20  re <rowid> is a 
13960 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20  reference.** to 
13970 73 6f 6d 65 20 69 6e 74 65 67 65 72 20 6b 65 79  some integer key
13980 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62   column of a tab
13990 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e 20 74 68  le B-Tree. In th
139a0 69 73 20 63 61 73 65 2c 20 75 73 65 20 61 6e 0a  is case, use an.
139b0 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65  ** intkey B-Tree
139c0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65   to store the se
139d0 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c  t of IN(...) val
139e0 75 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20 74  ues instead of t
139f0 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f  he usual.** (slo
13a00 77 65 72 29 20 76 61 72 69 61 62 6c 65 20 6c 65  wer) variable le
13a10 6e 67 74 68 20 6b 65 79 73 20 42 2d 54 72 65 65  ngth keys B-Tree
13a20 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48  ..**.** If rMayH
13a30 61 76 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a  aveNull is non-z
13a40 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ero, that means 
13a50 74 68 61 74 20 74 68 65 20 6f 70 65 72 61 74 69  that the operati
13a60 6f 6e 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28  on is an IN.** (
13a70 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 6f 72 20  not a SELECT or 
13a80 45 58 49 53 54 53 29 20 61 6e 64 20 74 68 61 74  EXISTS) and that
13a90 20 74 68 65 20 52 48 53 20 6d 69 67 68 74 20 63   the RHS might c
13aa0 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a  ontains NULLs..*
13ab0 2a 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69  * All this routi
13ac0 6e 65 20 64 6f 65 73 20 69 73 20 69 6e 69 74 69  ne does is initi
13ad0 61 6c 69 7a 65 20 74 68 65 20 72 65 67 69 73 74  alize the regist
13ae0 65 72 20 67 69 76 65 6e 20 62 79 20 72 4d 61 79  er given by rMay
13af0 48 61 76 65 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 4e  HaveNull.** to N
13b00 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67 20 72 6f  ULL.  Calling ro
13b10 75 74 69 6e 65 73 20 77 69 6c 6c 20 74 61 6b 65  utines will take
13b20 20 63 61 72 65 20 6f 66 20 63 68 61 6e 67 69 6e   care of changin
13b30 67 20 74 68 69 73 20 72 65 67 69 73 74 65 72 0a  g this register.
13b40 2a 2a 20 76 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d  ** value to non-
13b50 4e 55 4c 4c 20 69 66 20 74 68 65 20 52 48 53 20  NULL if the RHS 
13b60 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a  is NULL-free..**
13b70 0a 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54  .** For a SELECT
13b80 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61   or EXISTS opera
13b90 74 6f 72 2c 20 72 65 74 75 72 6e 20 74 68 65 20  tor, return the 
13ba0 72 65 67 69 73 74 65 72 20 74 68 61 74 20 68 6f  register that ho
13bb0 6c 64 73 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  lds the.** resul
13bc0 74 2e 20 20 46 6f 72 20 61 20 6d 75 6c 74 69 2d  t.  For a multi-
13bd0 63 6f 6c 75 6d 6e 20 53 45 4c 45 43 54 2c 20 74  column SELECT, t
13be0 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f  he result is sto
13bf0 72 65 64 20 69 6e 20 61 20 63 6f 6e 74 69 67 75  red in a contigu
13c00 6f 75 73 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20  ous.** array of 
13c10 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68  registers and th
13c20 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
13c30 73 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6f  s the register o
13c40 66 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a  f the left-most.
13c50 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  ** result column
13c60 2e 20 20 52 65 74 75 72 6e 20 30 20 66 6f 72 20  .  Return 0 for 
13c70 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f 72 20  IN operators or 
13c80 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
13c90 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  rs..*/.#ifndef S
13ca0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
13cb0 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  ERY.int sqlite3C
13cc0 6f 64 65 53 75 62 73 65 6c 65 63 74 28 0a 20 20  odeSubselect(.  
13cd0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
13ce0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
13cf0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
13d00 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
13d10 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49          /* The I
13d20 4e 2c 20 53 45 4c 45 43 54 2c 20 6f 72 20 45 58  N, SELECT, or EX
13d30 49 53 54 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f  ISTS operator */
13d40 0a 20 20 69 6e 74 20 72 48 61 73 4e 75 6c 6c 46  .  int rHasNullF
13d50 6c 61 67 2c 20 20 20 20 20 20 20 2f 2a 20 52 65  lag,       /* Re
13d60 67 69 73 74 65 72 20 74 68 61 74 20 72 65 63 6f  gister that reco
13d70 72 64 73 20 77 68 65 74 68 65 72 20 4e 55 4c 4c  rds whether NULL
13d80 73 20 65 78 69 73 74 20 69 6e 20 52 48 53 20 2a  s exist in RHS *
13d90 2f 0a 20 20 69 6e 74 20 69 73 52 6f 77 69 64 20  /.  int isRowid 
13da0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
13db0 66 20 74 72 75 65 2c 20 4c 48 53 20 6f 66 20 49  f true, LHS of I
13dc0 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20  N operator is a 
13dd0 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  rowid */.){.  in
13de0 74 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d  t jmpIfDynamic =
13df0 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   -1;            
13e00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
13e10 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64 72 65  -time test addre
13e20 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67  ss */.  int rReg
13e30 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
13e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e50 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74 6f 72  /* Register stor
13e60 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f  ing resulting */
13e70 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
13e80 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
13e90 73 65 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  se);.  if( NEVER
13ea0 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20  (v==0) ) return 
13eb0 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  0;.  sqlite3Expr
13ec0 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
13ed0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 65 76 61  );..  /* The eva
13ee0 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49  luation of the I
13ef0 4e 2f 45 58 49 53 54 53 2f 53 45 4c 45 43 54 20  N/EXISTS/SELECT 
13f00 6d 75 73 74 20 62 65 20 72 65 70 65 61 74 65 64  must be repeated
13f10 20 65 76 65 72 79 20 74 69 6d 65 20 69 74 0a 20   every time it. 
13f20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   ** is encounter
13f30 65 64 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  ed if any of the
13f40 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72   following is tr
13f50 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ue:.  **.  **   
13f60 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61   *  The right-ha
13f70 6e 64 20 73 69 64 65 20 69 73 20 61 20 63 6f 72  nd side is a cor
13f80 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79  related subquery
13f90 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  .  **    *  The 
13fa0 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
13fb0 69 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  is an expression
13fc0 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67   list containing
13fd0 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20   variables.  ** 
13fe0 20 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73     *  We are ins
13ff0 69 64 65 20 61 20 74 72 69 67 67 65 72 0a 20 20  ide a trigger.  
14000 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f  **.  ** If all o
14010 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20  f the above are 
14020 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63  false, then we c
14030 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65  an run this code
14040 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20   just once.  ** 
14050 73 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 73  save the results
14060 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68 65 20  , and reuse the 
14070 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73  same result on s
14080 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61  ubsequent invoca
14090 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
140a0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
140b0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72  ty(pExpr, EP_Var
140c0 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6a  Select) ){.    j
140d0 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 73 71  mpIfDynamic = sq
140e0 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50  lite3CodeOnce(pP
140f0 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72  arse); VdbeCover
14100 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 23 69 66  age(v);.  }..#if
14110 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14120 5f 45 58 50 4c 41 49 4e 0a 20 20 69 66 28 20 70  _EXPLAIN.  if( p
14130 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
14140 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  2 ){.    char *z
14150 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
14160 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c  intf(pParse->db,
14170 20 22 45 58 45 43 55 54 45 20 25 73 25 73 20 53   "EXECUTE %s%s S
14180 55 42 51 55 45 52 59 20 25 64 22 2c 0a 20 20 20  UBQUERY %d",.   
14190 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69       jmpIfDynami
141a0 63 3e 3d 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41  c>=0?"":"CORRELA
141b0 54 45 44 20 22 2c 0a 20 20 20 20 20 20 20 20 70  TED ",.        p
141c0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f  Expr->op==TK_IN?
141d0 22 4c 49 53 54 22 3a 22 53 43 41 4c 41 52 22 2c  "LIST":"SCALAR",
141e0 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
141f0 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 0a 20  >iNextSelectId. 
14200 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
14210 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
14220 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73  P_Explain, pPars
14230 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c  e->iSelectId, 0,
14240 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e   0, zMsg, P4_DYN
14250 41 4d 49 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  AMIC);.  }.#endi
14260 66 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  f..  switch( pEx
14270 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
14280 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
14290 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20    int addr;     
142a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
142b0 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f   Address of OP_O
142c0 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
142d0 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  truction */.    
142e0 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
142f0 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a  pExpr->pLeft; /*
14300 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   the LHS of the 
14310 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
14320 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
14330 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20  eyInfo = 0;     
14340 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74   /* Key informat
14350 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ion */.      int
14360 20 6e 56 61 6c 3b 20 20 20 20 20 20 20 20 20 20   nVal;          
14370 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
14380 20 6f 66 20 76 65 63 74 6f 72 20 70 4c 65 66 74   of vector pLeft
14390 20 2a 2f 0a 20 20 20 20 20 20 0a 20 20 20 20 20   */.      .     
143a0 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 45   nVal = sqlite3E
143b0 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c  xprVectorSize(pL
143c0 65 66 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  eft);.      asse
143d0 72 74 28 20 21 69 73 52 6f 77 69 64 20 7c 7c 20  rt( !isRowid || 
143e0 6e 56 61 6c 3d 3d 31 20 29 3b 0a 0a 20 20 20 20  nVal==1 );..    
143f0 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69    /* Whether thi
14400 73 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45  s is an 'x IN(SE
14410 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20  LECT...)' or an 
14420 27 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e  'x IN(<exprlist>
14430 29 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72  )'.      ** expr
14440 65 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e  ession it is han
14450 64 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77 61  dled the same wa
14460 79 2e 20 20 41 6e 20 65 70 68 65 6d 65 72 61 6c  y.  An ephemeral
14470 20 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20   table is .     
14480 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20   ** filled with 
14490 69 6e 64 65 78 20 6b 65 79 73 20 72 65 70 72 65  index keys repre
144a0 73 65 6e 74 69 6e 67 20 74 68 65 20 72 65 73 75  senting the resu
144b0 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  lts from the .  
144c0 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 6f 72      ** SELECT or
144d0 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e   the <exprlist>.
144e0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
144f0 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20 65 78  ** If the 'x' ex
14500 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
14510 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74  lumn value, or t
14520 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20  he SELECT....   
14530 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
14540 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e  returns a column
14550 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65   value, then the
14560 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61   affinity of tha
14570 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  t.      ** colum
14580 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62 75 69  n is used to bui
14590 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79  ld the index key
145a0 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27 20 61  s. If both 'x' a
145b0 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  nd the.      ** 
145c0 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d  SELECT... statem
145d0 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c  ent are columns,
145e0 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66   then numeric af
145f0 66 69 6e 69 74 79 20 69 73 20 75 73 65 64 0a 20  finity is used. 
14600 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74 68 65       ** if eithe
14610 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d  r column has NUM
14620 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45 52 20  ERIC or INTEGER 
14630 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e 65 69  affinity. If nei
14640 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 27 78  ther.      ** 'x
14650 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43 54  ' nor the SELECT
14660 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72  ... statement ar
14670 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  e columns, then 
14680 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
14690 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73 65  .      ** is use
146a0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
146b0 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
146c0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
146d0 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
146e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
146f0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
14700 65 72 61 6c 2c 20 0a 20 20 20 20 20 20 20 20 20  eral, .         
14710 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
14720 28 69 73 52 6f 77 69 64 3f 30 3a 6e 56 61 6c 29  (isRowid?0:nVal)
14730 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66  );.      pKeyInf
14740 6f 20 3d 20 69 73 52 6f 77 69 64 20 3f 20 30 20  o = isRowid ? 0 
14750 3a 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  : sqlite3KeyInfo
14760 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
14770 2c 20 6e 56 61 6c 2c 20 31 29 3b 0a 0a 20 20 20  , nVal, 1);..   
14780 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
14790 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
147a0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
147b0 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31         /* Case 1
147c0 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53  :     expr IN (S
147d0 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20  ELECT ...).     
147e0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
147f0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
14800 6f 20 77 72 69 74 65 20 74 68 65 20 72 65 73 75  o write the resu
14810 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  lts of the selec
14820 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f  t into the tempo
14830 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  rary.        ** 
14840 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20  table allocated 
14850 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f 76 65  and opened above
14860 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
14870 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
14880 6c 65 63 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  lect = pExpr->x.
14890 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20  pSelect;.       
148a0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
148b0 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  t = pSelect->pEL
148c0 69 73 74 3b 0a 0a 20 20 20 20 20 20 20 20 61 73  ist;..        as
148d0 73 65 72 74 28 20 21 69 73 52 6f 77 69 64 20 29  sert( !isRowid )
148e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  ;.        if( pE
148f0 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 6e 56 61  List->nExpr!=nVa
14900 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  l ){.          s
14910 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45  qlite3SubselectE
14920 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 45 4c  rror(pParse, pEL
14930 69 73 74 2d 3e 6e 45 78 70 72 2c 20 6e 56 61 6c  ist->nExpr, nVal
14940 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
14950 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65  {.          Sele
14960 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20  ctDest dest;.   
14970 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
14980 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
14990 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
149a0 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45  est, SRT_Set, pE
149b0 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  xpr->iTable);.  
149c0 20 20 20 20 20 20 20 20 64 65 73 74 2e 7a 41 66          dest.zAf
149d0 66 53 64 73 74 20 3d 20 65 78 70 72 49 4e 41 66  fSdst = exprINAf
149e0 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 70  finity(pParse, p
149f0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
14a00 20 61 73 73 65 72 74 28 20 28 70 45 78 70 72 2d   assert( (pExpr-
14a10 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30 46 46  >iTable&0x0000FF
14a20 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  FF)==pExpr->iTab
14a30 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  le );.          
14a40 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20  pSelect->iLimit 
14a50 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 74  = 0;.          t
14a60 65 73 74 63 61 73 65 28 20 70 53 65 6c 65 63 74  estcase( pSelect
14a70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
14a80 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
14a90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14aa0 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f  pKeyInfo==0 ); /
14ab0 2a 20 43 61 75 73 65 64 20 62 79 20 4f 4f 4d 20  * Caused by OOM 
14ac0 69 6e 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  in sqlite3KeyInf
14ad0 6f 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20  oAlloc() */.    
14ae0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
14af0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
14b00 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 20  pSelect, &dest) 
14b10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
14b20 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
14b30 72 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41  rse->db, dest.zA
14b40 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20  ffSdst);.       
14b50 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49       sqlite3KeyI
14b60 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66  nfoUnref(pKeyInf
14b70 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  o);.            
14b80 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
14b90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
14ba0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
14bb0 61 72 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a  arse->db, dest.z
14bc0 41 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20  AffSdst);.      
14bd0 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79      assert( pKey
14be0 49 6e 66 6f 21 3d 30 20 29 3b 20 2f 2a 20 4f 4f  Info!=0 ); /* OO
14bf0 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 65 78 69  M will cause exi
14c00 74 20 61 66 74 65 72 20 73 71 6c 69 74 65 33 53  t after sqlite3S
14c10 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20 20 20 20  elect() */.     
14c20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c       assert( pEL
14c30 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist!=0 );.      
14c40 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
14c50 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
14c60 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
14c70 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
14c80 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49  sWriteable(pKeyI
14c90 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20  nfo) );.        
14ca0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61    for(i=0; i<nVa
14cb0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
14cc0 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 28       Expr *p = (
14cd0 6e 56 61 6c 3e 31 29 20 3f 20 73 71 6c 69 74 65  nVal>1) ? sqlite
14ce0 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65  3VectorFieldSube
14cf0 78 70 72 28 70 4c 65 66 74 2c 20 69 29 20 3a 20  xpr(pLeft, i) : 
14d00 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20  pLeft;.         
14d10 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f     pKeyInfo->aCo
14d20 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 42  ll[i] = sqlite3B
14d30 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
14d40 53 65 71 28 0a 20 20 20 20 20 20 20 20 20 20 20  Seq(.           
14d50 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 2c 20       pParse, p, 
14d60 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
14d70 70 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  pr.            )
14d80 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
14d90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
14da0 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70  lse if( ALWAYS(p
14db0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30  Expr->x.pList!=0
14dc0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
14dd0 43 61 73 65 20 32 3a 20 20 20 20 20 65 78 70 72  Case 2:     expr
14de0 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20   IN (exprlist). 
14df0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
14e00 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78    ** For each ex
14e10 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20  pression, build 
14e20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f  an index key fro
14e30 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e  m the evaluation
14e40 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
14e50 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20  store it in the 
14e60 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
14e70 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20   If <expr> is a 
14e80 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65  column, then use
14e90 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
14ea0 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74   columns affinit
14eb0 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20  y when building 
14ec0 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c  index keys. If <
14ed0 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20  expr> is not.   
14ee0 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e       ** a column
14ef0 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66  , use numeric af
14f00 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20  finity..        
14f10 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  */.        char 
14f20 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20 20  affinity;       
14f30 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
14f40 20 6f 66 20 74 68 65 20 4c 48 53 20 6f 66 20 74   of the LHS of t
14f50 68 65 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20  he IN */.       
14f60 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
14f70 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
14f80 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
14f90 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  ;.        struct
14fa0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
14fb0 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 69  pItem;.        i
14fc0 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 0a  nt r1, r2, r3;..
14fd0 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79          affinity
14fe0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
14ff0 66 69 6e 69 74 79 28 70 4c 65 66 74 29 3b 0a 20  finity(pLeft);. 
15000 20 20 20 20 20 20 20 69 66 28 20 21 61 66 66 69         if( !affi
15010 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20  nity ){.        
15020 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c    affinity = SQL
15030 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20  ITE_AFF_BLOB;.  
15040 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15050 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  if( pKeyInfo ){.
15060 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
15070 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  ( sqlite3KeyInfo
15080 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79  IsWriteable(pKey
15090 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20  Info) );.       
150a0 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f     pKeyInfo->aCo
150b0 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 45  ll[0] = sqlite3E
150c0 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
150d0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
150e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
150f0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72       /* Loop thr
15100 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73  ough each expres
15110 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73  sion in <exprlis
15120 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  t>. */.        r
15130 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
15140 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
15150 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69         r2 = sqli
15160 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
15170 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69  arse);.        i
15180 66 28 20 69 73 52 6f 77 69 64 20 29 20 73 71 6c  f( isRowid ) sql
15190 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
151a0 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32  , OP_Null, 0, r2
151b0 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
151c0 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  =pList->nExpr, p
151d0 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
151e0 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
151f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
15200 72 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e  r *pE2 = pItem->
15210 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
15220 20 69 6e 74 20 69 56 61 6c 54 6f 49 6e 73 3b 0a   int iValToIns;.
15230 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
15240 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
15250 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20  is not constant 
15260 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65  then we will nee
15270 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a  d to.          *
15280 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65  * disable the te
15290 73 74 20 74 68 61 74 20 77 61 73 20 67 65 6e 65  st that was gene
152a0 72 61 74 65 64 20 61 62 6f 76 65 20 74 68 61 74  rated above that
152b0 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20   makes sure.    
152c0 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f        ** this co
152d0 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73  de only executes
152e0 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20   once.  Because 
152f0 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61  for a non-consta
15300 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nt.          ** 
15310 65 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65  expression we ne
15320 65 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73  ed to rerun this
15330 20 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e   code each time.
15340 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
15350 20 20 20 20 20 20 20 20 69 66 28 20 6a 6d 70 49          if( jmpI
15360 66 44 79 6e 61 6d 69 63 3e 3d 30 20 26 26 20 21  fDynamic>=0 && !
15370 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
15380 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20  stant(pE2) ){.  
15390 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
153a0 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
153b0 70 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69  p(v, jmpIfDynami
153c0 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  c);.            
153d0 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d  jmpIfDynamic = -
153e0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  1;.          }..
153f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61            /* Eva
15400 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65 73  luate the expres
15410 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20  sion and insert 
15420 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70  it into the temp
15430 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
15440 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20      if( isRowid 
15450 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
15460 49 6e 74 65 67 65 72 28 70 45 32 2c 20 26 69 56  Integer(pE2, &iV
15470 61 6c 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20  alToIns) ){.    
15480 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15490 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
154a0 49 6e 73 65 72 74 49 6e 74 2c 20 70 45 78 70 72  InsertInt, pExpr
154b0 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 69 56  ->iTable, r2, iV
154c0 61 6c 54 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20  alToIns);.      
154d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
154e0 20 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69         r3 = sqli
154f0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
15500 74 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20 72  t(pParse, pE2, r
15510 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
15520 69 66 28 20 69 73 52 6f 77 69 64 20 29 7b 0a 20  if( isRowid ){. 
15530 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
15540 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15550 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
15560 72 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r3,.            
15570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15580 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
15590 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29  urrentAddr(v)+2)
155a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
155b0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
155c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
155d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
155e0 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70  (v, OP_Insert, p
155f0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32  Expr->iTable, r2
15600 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20 20  , r3);.         
15610 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15620 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15630 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
15640 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20  MakeRecord, r3, 
15650 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79  1, r2, &affinity
15660 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
15670 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
15680 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
15690 67 65 28 70 50 61 72 73 65 2c 20 72 33 2c 20 31  ge(pParse, r3, 1
156a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
156b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
156c0 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
156d0 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  rt, pExpr->iTabl
156e0 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20  e, r2);.        
156f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
15700 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
15710 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
15720 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
15730 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , r1);.        s
15740 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
15750 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29  pReg(pParse, r2)
15760 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15770 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  if( pKeyInfo ){.
15780 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15790 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61  dbeChangeP4(v, a
157a0 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65  ddr, (void *)pKe
157b0 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
157c0 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  O);.      }.    
157d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
157e0 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53      case TK_EXIS
157f0 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  TS:.    case TK_
15800 53 45 4c 45 43 54 3a 0a 20 20 20 20 64 65 66 61  SELECT:.    defa
15810 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ult: {.      /* 
15820 43 61 73 65 20 33 3a 20 20 20 20 28 53 45 4c 45  Case 3:    (SELE
15830 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29  CT ... FROM ...)
15840 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 6f 72  .      **     or
15850 3a 20 20 20 20 45 58 49 53 54 53 28 53 45 4c 45  :    EXISTS(SELE
15860 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29  CT ... FROM ...)
15870 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
15880 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54 2c  ** For a SELECT,
15890 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   generate code t
158a0 6f 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 73  o put the values
158b0 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73   for all columns
158c0 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   of.      ** the
158d0 20 66 69 72 73 74 20 72 6f 77 20 69 6e 74 6f 20   first row into 
158e0 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69  an array of regi
158f0 73 74 65 72 73 20 61 6e 64 20 72 65 74 75 72 6e  sters and return
15900 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 20 20   the index of.  
15910 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74      ** the first
15920 20 72 65 67 69 73 74 65 72 2e 0a 20 20 20 20 20   register..     
15930 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
15940 74 68 69 73 20 69 73 20 61 6e 20 45 58 49 53 54  this is an EXIST
15950 53 2c 20 77 72 69 74 65 20 61 6e 20 69 6e 74 65  S, write an inte
15960 67 65 72 20 30 20 28 6e 6f 74 20 65 78 69 73 74  ger 0 (not exist
15970 73 29 20 6f 72 20 31 20 28 65 78 69 73 74 73 29  s) or 1 (exists)
15980 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61  .      ** into a
15990 20 72 65 67 69 73 74 65 72 20 61 6e 64 20 72 65   register and re
159a0 74 75 72 6e 20 74 68 61 74 20 72 65 67 69 73 74  turn that regist
159b0 65 72 20 6e 75 6d 62 65 72 2e 0a 20 20 20 20 20  er number..     
159c0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20   **.      ** In 
159d0 62 6f 74 68 20 63 61 73 65 73 2c 20 74 68 65 20  both cases, the 
159e0 71 75 65 72 79 20 69 73 20 61 75 67 6d 65 6e 74  query is augment
159f0 65 64 20 77 69 74 68 20 22 4c 49 4d 49 54 20 31  ed with "LIMIT 1
15a00 22 2e 20 20 41 6e 79 20 0a 20 20 20 20 20 20 2a  ".  Any .      *
15a10 2a 20 70 72 65 65 78 69 73 74 69 6e 67 20 6c 69  * preexisting li
15a20 6d 69 74 20 69 73 20 64 69 73 63 61 72 64 65 64  mit is discarded
15a30 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65   in place of the
15a40 20 6e 65 77 20 4c 49 4d 49 54 20 31 2e 0a 20 20   new LIMIT 1..  
15a50 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c      */.      Sel
15a60 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 20  ect *pSel;      
15a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a80 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61     /* SELECT sta
15a90 74 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65  tement to encode
15aa0 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74   */.      Select
15ab0 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20  Dest dest;      
15ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ad0 2f 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c 20 77  /* How to deal w
15ae0 69 74 68 20 53 45 4c 45 43 54 20 72 65 73 75 6c  ith SELECT resul
15af0 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  t */.      int n
15b00 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Reg;            
15b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 74 6f   /* Registers to
15b30 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20 20   allocate */..  
15b40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
15b50 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53  xpr->op==TK_EXIS
15b60 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  TS );.      test
15b70 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
15b80 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20  =TK_SELECT );.  
15b90 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
15ba0 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  r->op==TK_EXISTS
15bb0 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
15bc0 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20  K_SELECT );.    
15bd0 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61    assert( ExprHa
15be0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
15bf0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
15c00 3b 0a 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20  ;..      pSel = 
15c10 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
15c20 3b 0a 20 20 20 20 20 20 6e 52 65 67 20 3d 20 70  ;.      nReg = p
15c30 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
15c40 45 43 54 20 3f 20 70 53 65 6c 2d 3e 70 45 4c 69  ECT ? pSel->pELi
15c50 73 74 2d 3e 6e 45 78 70 72 20 3a 20 31 3b 0a 20  st->nExpr : 1;. 
15c60 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
15c70 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
15c80 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65  , 0, pParse->nMe
15c90 6d 2b 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72  m+1);.      pPar
15ca0 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67  se->nMem += nReg
15cb0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
15cc0 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
15cd0 20 29 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74   ){.        dest
15ce0 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d  .eDest = SRT_Mem
15cf0 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 69  ;.        dest.i
15d00 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53 44 50  Sdst = dest.iSDP
15d10 61 72 6d 3b 0a 20 20 20 20 20 20 20 20 64 65 73  arm;.        des
15d20 74 2e 6e 53 64 73 74 20 3d 20 6e 52 65 67 3b 0a  t.nSdst = nReg;.
15d30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15d40 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
15d50 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 53  Null, 0, dest.iS
15d60 44 50 61 72 6d 2c 20 64 65 73 74 2e 69 53 44 50  DParm, dest.iSDP
15d70 61 72 6d 2b 6e 52 65 67 2d 31 29 3b 0a 20 20 20  arm+nReg-1);.   
15d80 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
15d90 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62 71 75  ((v, "Init subqu
15da0 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20  ery result"));. 
15db0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15dc0 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d      dest.eDest =
15dd0 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20   SRT_Exists;.   
15de0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15df0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
15e00 65 67 65 72 2c 20 30 2c 20 64 65 73 74 2e 69 53  eger, 0, dest.iS
15e10 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  DParm);.        
15e20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
15e30 22 49 6e 69 74 20 45 58 49 53 54 53 20 72 65 73  "Init EXISTS res
15e40 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a  ult"));.      }.
15e50 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
15e60 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
15e70 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74  db, pSel->pLimit
15e80 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 70  );.      pSel->p
15e90 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50  Limit = sqlite3P
15ea0 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
15eb0 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c 0a 20  INTEGER, 0, 0,. 
15ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ee0 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65   &sqlite3IntToke
15ef0 6e 73 5b 31 5d 29 3b 0a 20 20 20 20 20 20 70 53  ns[1]);.      pS
15f00 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  el->iLimit = 0;.
15f10 20 20 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46        pSel->selF
15f20 6c 61 67 73 20 26 3d 20 7e 53 46 5f 4d 75 6c 74  lags &= ~SF_Mult
15f30 69 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 69 66  iValue;.      if
15f40 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  ( sqlite3Select(
15f50 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 26 64  pParse, pSel, &d
15f60 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  est) ){.        
15f70 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
15f80 7d 0a 20 20 20 20 20 20 72 52 65 67 20 3d 20 64  }.      rReg = d
15f90 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20  est.iSDParm;.   
15fa0 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f     ExprSetVVAPro
15fb0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
15fc0 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20  NoReduce);.     
15fd0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
15fe0 7d 0a 0a 20 20 69 66 28 20 72 48 61 73 4e 75 6c  }..  if( rHasNul
15ff0 6c 46 6c 61 67 20 29 7b 0a 20 20 20 20 73 71 6c  lFlag ){.    sql
16000 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c  ite3SetHasNullFl
16010 61 67 28 76 2c 20 70 45 78 70 72 2d 3e 69 54 61  ag(v, pExpr->iTa
16020 62 6c 65 2c 20 72 48 61 73 4e 75 6c 6c 46 6c 61  ble, rHasNullFla
16030 67 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6a  g);.  }..  if( j
16040 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20 29  mpIfDynamic>=0 )
16050 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
16060 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70  eJumpHere(v, jmp
16070 49 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20 7d 0a  IfDynamic);.  }.
16080 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
16090 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 0a  hePop(pParse);..
160a0 20 20 72 65 74 75 72 6e 20 72 52 65 67 3b 0a 7d    return rReg;.}
160b0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
160c0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
160d0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
160e0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
160f0 0a 2f 2a 0a 2a 2a 20 45 78 70 72 20 70 49 6e 20  ./*.** Expr pIn 
16100 69 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 65 78  is an IN(...) ex
16110 70 72 65 73 73 69 6f 6e 2e 20 54 68 69 73 20 66  pression. This f
16120 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 74  unction checks t
16130 68 61 74 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d  hat the .** sub-
16140 73 65 6c 65 63 74 20 6f 6e 20 74 68 65 20 52 48  select on the RH
16150 53 20 6f 66 20 74 68 65 20 49 4e 28 29 20 6f 70  S of the IN() op
16160 65 72 61 74 6f 72 20 68 61 73 20 74 68 65 20 73  erator has the s
16170 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a  ame number of .*
16180 2a 20 63 6f 6c 75 6d 6e 73 20 61 73 20 74 68 65  * columns as the
16190 20 76 65 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c   vector on the L
161a0 48 53 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 52  HS. Or, if the R
161b0 48 53 20 6f 66 20 74 68 65 20 49 4e 28 29 20 69  HS of the IN() i
161c0 73 20 6e 6f 74 20 0a 2a 2a 20 61 20 73 75 62 2d  s not .** a sub-
161d0 71 75 65 72 79 2c 20 74 68 61 74 20 74 68 65 20  query, that the 
161e0 4c 48 53 20 69 73 20 61 20 76 65 63 74 6f 72 20  LHS is a vector 
161f0 6f 66 20 73 69 7a 65 20 31 2e 0a 2a 2f 0a 69 6e  of size 1..*/.in
16200 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65  t sqlite3ExprChe
16210 63 6b 49 4e 28 50 61 72 73 65 20 2a 70 50 61 72  ckIN(Parse *pPar
16220 73 65 2c 20 45 78 70 72 20 2a 70 49 6e 29 7b 0a  se, Expr *pIn){.
16230 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 20 3d 20    int nVector = 
16240 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
16250 72 53 69 7a 65 28 70 49 6e 2d 3e 70 4c 65 66 74  rSize(pIn->pLeft
16260 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 2d 3e 66  );.  if( (pIn->f
16270 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c  lags & EP_xIsSel
16280 65 63 74 29 20 29 7b 0a 20 20 20 20 69 66 28 20  ect) ){.    if( 
16290 6e 56 65 63 74 6f 72 21 3d 70 49 6e 2d 3e 78 2e  nVector!=pIn->x.
162a0 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
162b0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
162c0 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74  sqlite3Subselect
162d0 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 49  Error(pParse, pI
162e0 6e 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  n->x.pSelect->pE
162f0 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 6e 56 65  List->nExpr, nVe
16300 63 74 6f 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ctor);.      ret
16310 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
16320 65 6c 73 65 20 69 66 28 20 6e 56 65 63 74 6f 72  else if( nVector
16330 21 3d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 28  !=1 ){.    if( (
16340 70 49 6e 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  pIn->pLeft->flag
16350 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
16360 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
16370 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72  e3SubselectError
16380 28 70 50 61 72 73 65 2c 20 6e 56 65 63 74 6f 72  (pParse, nVector
16390 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 1);.    }else{
163a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
163b0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
163c0 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65  row value misuse
163d0 64 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  d");.    }.    r
163e0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
163f0 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
16400 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
16410 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
16420 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
16430 6f 64 65 20 66 6f 72 20 61 6e 20 49 4e 20 65 78  ode for an IN ex
16440 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
16450 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43       x IN (SELEC
16460 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20 20 20 78  T ...).**      x
16470 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75   IN (value, valu
16480 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  e, ...).**.** Th
16490 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65  e left-hand side
164a0 20 28 4c 48 53 29 20 69 73 20 61 20 73 63 61 6c   (LHS) is a scal
164b0 61 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ar expression.  
164c0 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
164d0 69 64 65 20 28 52 48 53 29 0a 2a 2a 20 69 73 20  ide (RHS).** is 
164e0 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65 72 6f  an array of zero
164f0 20 6f 72 20 6d 6f 72 65 20 76 61 6c 75 65 73 2e   or more values.
16500 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e    The expression
16510 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
16520 4c 48 53 20 69 73 0a 2a 2a 20 63 6f 6e 74 61 69  LHS is.** contai
16530 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52  ned within the R
16540 48 53 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6f  HS.  The value o
16550 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
16560 20 69 73 20 75 6e 6b 6e 6f 77 6e 20 28 4e 55 4c   is unknown (NUL
16570 4c 29 0a 2a 2a 20 69 66 20 74 68 65 20 4c 48 53  L).** if the LHS
16580 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74   is NULL or if t
16590 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f  he LHS is not co
165a0 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74  ntained within t
165b0 68 65 20 52 48 53 20 61 6e 64 20 74 68 65 0a 2a  he RHS and the.*
165c0 2a 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 6f  * RHS contains o
165d0 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20  ne or more NULL 
165e0 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  values..**.** Th
165f0 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
16600 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 6a  ates code that j
16610 75 6d 70 73 20 74 6f 20 64 65 73 74 49 66 46 61  umps to destIfFa
16620 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53 20 69  lse if the LHS i
16630 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61 69  s not .** contai
16640 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52  ned within the R
16650 48 53 2e 20 20 49 66 20 64 75 65 20 74 6f 20 4e  HS.  If due to N
16660 55 4c 4c 73 20 77 65 20 63 61 6e 6e 6f 74 20 64  ULLs we cannot d
16670 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
16680 4c 48 53 0a 2a 2a 20 69 73 20 63 6f 6e 74 61 69  LHS.** is contai
16690 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 20 74  ned in the RHS t
166a0 68 65 6e 20 6a 75 6d 70 20 74 6f 20 64 65 73 74  hen jump to dest
166b0 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 20  IfNull.  If the 
166c0 4c 48 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  LHS is contained
166d0 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 52  .** within the R
166e0 48 53 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72  HS then fall thr
166f0 6f 75 67 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ough..*/.static 
16700 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
16710 43 6f 64 65 49 4e 28 0a 20 20 50 61 72 73 65 20  CodeIN(.  Parse 
16720 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
16730 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
16740 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
16750 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
16760 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
16770 20 20 2f 2a 20 54 68 65 20 49 4e 20 65 78 70 72    /* The IN expr
16780 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
16790 64 65 73 74 49 66 46 61 6c 73 65 2c 20 20 20 20  destIfFalse,    
167a0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
167b0 66 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e  f LHS is not con
167c0 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48  tained in the RH
167d0 53 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49  S */.  int destI
167e0 66 4e 75 6c 6c 20 20 20 20 20 20 20 20 2f 2a 20  fNull        /* 
167f0 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65  Jump here if the
16800 20 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e 6b   results are unk
16810 6e 6f 77 6e 20 64 75 65 20 74 6f 20 4e 55 4c 4c  nown due to NULL
16820 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 52  s */.){.  int rR
16830 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 20 20  hsHasNull = 0;  
16840 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 61 74  /* Register that
16850 20 69 73 20 74 72 75 65 20 69 66 20 52 48 53 20   is true if RHS 
16860 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61  contains NULL va
16870 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 65 54  lues */.  int eT
16880 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ype;            
16890 2f 2a 20 54 79 70 65 20 6f 66 20 74 68 65 20 52  /* Type of the R
168a0 48 53 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20  HS */.  int r1, 
168b0 72 32 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r2;           /*
168c0 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72   Temporary use r
168d0 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 56 64  egisters */.  Vd
168e0 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
168f0 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74      /* Statement
16900 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
16910 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69  ion */.  int *ai
16920 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  Map = 0;       /
16930 2a 20 4d 61 70 20 66 72 6f 6d 20 76 65 63 74 6f  * Map from vecto
16940 72 20 66 69 65 6c 64 20 74 6f 20 69 6e 64 65 78  r field to index
16950 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61   column */.  cha
16960 72 20 2a 7a 41 66 66 20 3d 20 30 3b 20 20 20 20  r *zAff = 0;    
16970 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 73     /* Affinity s
16980 74 72 69 6e 67 20 66 6f 72 20 63 6f 6d 70 61 72  tring for compar
16990 69 73 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  isons */.  int n
169a0 56 65 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20  Vector;         
169b0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 76 65 63 74   /* Size of vect
169c0 6f 72 73 20 66 6f 72 20 74 68 69 73 20 49 4e 28  ors for this IN(
169d0 2e 2e 2e 29 20 6f 70 20 2a 2f 0a 20 20 69 6e 74  ...) op */.  int
169e0 20 69 44 75 6d 6d 79 3b 20 20 20 20 20 20 20 20   iDummy;        
169f0 20 20 20 2f 2a 20 44 75 6d 6d 79 20 70 61 72 61     /* Dummy para
16a00 6d 65 74 65 72 20 74 6f 20 65 78 70 72 43 6f 64  meter to exprCod
16a10 65 56 65 63 74 6f 72 28 29 20 2a 2f 0a 20 20 45  eVector() */.  E
16a20 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
16a30 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69 6e 74  pr->pLeft;.  int
16a40 20 69 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74   i;..  if( sqlit
16a50 65 33 45 78 70 72 43 68 65 63 6b 49 4e 28 70 50  e3ExprCheckIN(pP
16a60 61 72 73 65 2c 20 70 45 78 70 72 29 20 29 20 72  arse, pExpr) ) r
16a70 65 74 75 72 6e 3b 0a 20 20 7a 41 66 66 20 3d 20  eturn;.  zAff = 
16a80 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28 70  exprINAffinity(p
16a90 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
16aa0 20 69 66 28 20 7a 41 66 66 3d 3d 30 20 29 20 72   if( zAff==0 ) r
16ab0 65 74 75 72 6e 3b 0a 20 20 6e 56 65 63 74 6f 72  eturn;.  nVector
16ac0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
16ad0 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d 3e  ctorSize(pExpr->
16ae0 70 4c 65 66 74 29 3b 0a 20 20 61 69 4d 61 70 20  pLeft);.  aiMap 
16af0 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 44  = (int*)sqlite3D
16b00 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20  bMallocZero(.   
16b10 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e     pParse->db, n
16b20 56 65 63 74 6f 72 2a 28 73 69 7a 65 6f 66 28 69  Vector*(sizeof(i
16b30 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28 63 68 61  nt) + sizeof(cha
16b40 72 29 29 20 2b 20 31 0a 20 20 29 3b 0a 20 20 69  r)) + 1.  );.  i
16b50 66 28 20 61 69 4d 61 70 3d 3d 30 20 29 7b 0a 20  f( aiMap==0 ){. 
16b60 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
16b70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 41 66  (pParse->db, zAf
16b80 66 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  f);.    return;.
16b90 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 74 65 6d 70    }..  /* Attemp
16ba0 74 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  t to compute the
16bb0 20 52 48 53 2e 20 41 66 74 65 72 20 74 68 69 73   RHS. After this
16bc0 20 73 74 65 70 2c 20 69 66 20 61 6e 79 74 68 69   step, if anythi
16bd0 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 0a 20 20  ng other than.  
16be0 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  ** IN_INDEX_NOOP
16bf0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
16c00 65 20 74 61 62 6c 65 20 6f 70 65 6e 65 64 20 69  e table opened i
16c10 74 68 20 63 75 72 73 6f 72 20 70 45 78 70 72 2d  th cursor pExpr-
16c20 3e 69 54 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f  >iTable .  ** co
16c30 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65  ntains the value
16c40 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74  s that make up t
16c50 68 65 20 52 48 53 2e 20 49 66 20 49 4e 5f 49 4e  he RHS. If IN_IN
16c60 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72 65 74 75  DEX_NOOP is retu
16c70 72 6e 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 52  rned,.  ** the R
16c80 48 53 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  HS has not yet b
16c90 65 65 6e 20 63 6f 64 65 64 2e 20 20 2a 2f 0a 20  een coded.  */. 
16ca0 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
16cb0 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  be;.  assert( v!
16cc0 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f  =0 );       /* O
16cd0 4f 4d 20 64 65 74 65 63 74 65 64 20 70 72 69 6f  OM detected prio
16ce0 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  r to this routin
16cf0 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43  e */.  VdbeNoopC
16d00 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69  omment((v, "begi
16d10 6e 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 20 20  n IN expr"));.  
16d20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46  eType = sqlite3F
16d30 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73  indInIndex(pPars
16d40 65 2c 20 70 45 78 70 72 2c 0a 20 20 20 20 20 20  e, pExpr,.      
16d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d60 20 20 20 20 20 20 20 49 4e 5f 49 4e 44 45 58 5f         IN_INDEX_
16d70 4d 45 4d 42 45 52 53 48 49 50 20 7c 20 49 4e 5f  MEMBERSHIP | IN_
16d80 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a 20  INDEX_NOOP_OK,. 
16d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16da0 20 20 20 20 20 20 20 20 20 20 20 20 64 65 73 74              dest
16db0 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e  IfFalse==destIfN
16dc0 75 6c 6c 20 3f 20 30 20 3a 20 26 72 52 68 73 48  ull ? 0 : &rRhsH
16dd0 61 73 4e 75 6c 6c 2c 20 61 69 4d 61 70 29 3b 0a  asNull, aiMap);.
16de0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
16df0 65 2d 3e 6e 45 72 72 20 7c 7c 20 6e 56 65 63 74  e->nErr || nVect
16e00 6f 72 3d 3d 31 20 7c 7c 20 65 54 79 70 65 3d 3d  or==1 || eType==
16e10 49 4e 5f 49 4e 44 45 58 5f 45 50 48 0a 20 20 20  IN_INDEX_EPH.   
16e20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e      || eType==IN
16e30 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43  _INDEX_INDEX_ASC
16e40 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e   || eType==IN_IN
16e50 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 0a  DEX_INDEX_DESC .
16e60 20 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 64 65 20    );..  /* Code 
16e70 74 68 65 20 4c 48 53 2c 20 74 68 65 20 3c 65 78  the LHS, the <ex
16e80 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e  pr> from "<expr>
16e90 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 49 66 20 74   IN (...)". If t
16ea0 68 65 20 4c 48 53 20 69 73 20 61 20 0a 20 20 2a  he LHS is a .  *
16eb0 2a 20 76 65 63 74 6f 72 2c 20 74 68 65 6e 20 69  * vector, then i
16ec0 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  t is stored in a
16ed0 6e 20 61 72 72 61 79 20 6f 66 20 6e 56 65 63 74  n array of nVect
16ee0 6f 72 20 72 65 67 69 73 74 65 72 73 20 73 74 61  or registers sta
16ef0 72 74 69 6e 67 20 0a 20 20 2a 2a 20 61 74 20 72  rting .  ** at r
16f00 31 2e 0a 20 20 2a 2f 0a 20 20 72 31 20 3d 20 73  1..  */.  r1 = s
16f10 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
16f20 67 65 28 70 50 61 72 73 65 2c 20 6e 56 65 63 74  ge(pParse, nVect
16f30 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  or);.  sqlite3Ex
16f40 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
16f50 73 65 29 3b 0a 20 20 72 32 20 3d 20 65 78 70 72  se);.  r2 = expr
16f60 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72 73  CodeVector(pPars
16f70 65 2c 20 70 4c 65 66 74 2c 20 26 69 44 75 6d 6d  e, pLeft, &iDumm
16f80 79 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  y);.  for(i=0; i
16f90 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a  <nVector; i++){.
16fa0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16fb0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp3(v, OP_Copy
16fc0 2c 20 72 32 2b 69 2c 20 72 31 2b 61 69 4d 61 70  , r2+i, r1+aiMap
16fd0 5b 69 5d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  [i], 0);.  }..  
16fe0 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 46 69 6e  /* If sqlite3Fin
16ff0 64 49 6e 49 6e 64 65 78 28 29 20 64 69 64 20 6e  dInIndex() did n
17000 6f 74 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74  ot find or creat
17010 65 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  e an index that 
17020 69 73 0a 20 20 2a 2a 20 73 75 69 74 61 62 6c 65  is.  ** suitable
17030 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20   for evaluating 
17040 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c  the IN operator,
17050 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20 75   then evaluate u
17060 73 69 6e 67 20 61 0a 20 20 2a 2a 20 73 65 71 75  sing a.  ** sequ
17070 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73  ence of comparis
17080 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
17090 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
170a0 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 45 78 70 72  NOOP ){.    Expr
170b0 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
170c0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
170d0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
170e0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
170f0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
17100 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
17110 20 69 6e 74 20 6c 61 62 65 6c 4f 6b 20 3d 20 73   int labelOk = s
17120 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
17130 62 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74 20  bel(v);.    int 
17140 72 32 2c 20 72 65 67 54 6f 46 72 65 65 3b 0a 20  r2, regToFree;. 
17150 20 20 20 69 6e 74 20 72 65 67 43 6b 4e 75 6c 6c     int regCkNull
17160 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 69   = 0;.    int ii
17170 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
17180 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
17190 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
171a0 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 64  ct) );.    if( d
171b0 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49  estIfNull!=destI
171c0 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20  fFalse ){.      
171d0 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c 69  regCkNull = sqli
171e0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
171f0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
17200 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
17210 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 31 2c  , OP_BitAnd, r1,
17220 20 72 31 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b   r1, regCkNull);
17230 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
17240 69 3d 30 3b 20 69 69 3c 70 4c 69 73 74 2d 3e 6e  i=0; ii<pList->n
17250 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Expr; ii++){.   
17260 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
17270 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
17280 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 69 5d  se, pList->a[ii]
17290 2e 70 45 78 70 72 2c 20 26 72 65 67 54 6f 46 72  .pExpr, &regToFr
172a0 65 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ee);.      if( r
172b0 65 67 43 6b 4e 75 6c 6c 20 26 26 20 73 71 6c 69  egCkNull && sqli
172c0 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
172d0 28 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45  (pList->a[ii].pE
172e0 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
172f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17300 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20  3(v, OP_BitAnd, 
17310 72 65 67 43 6b 4e 75 6c 6c 2c 20 72 32 2c 20 72  regCkNull, r2, r
17320 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  egCkNull);.     
17330 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 69 3c   }.      if( ii<
17340 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 7c  pList->nExpr-1 |
17350 7c 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65  | destIfNull!=de
17360 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20  stIfFalse ){.   
17370 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17380 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 71 2c  AddOp4(v, OP_Eq,
17390 20 72 31 2c 20 6c 61 62 65 6c 4f 6b 2c 20 72 32   r1, labelOk, r2
173a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
173b0 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
173c0 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c  d*)pColl, P4_COL
173d0 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 56  LSEQ);.        V
173e0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
173f0 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72   ii<pList->nExpr
17400 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  -1);.        Vdb
17410 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 69  eCoverageIf(v, i
17420 69 3d 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  i==pList->nExpr-
17430 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
17440 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
17450 76 2c 20 7a 41 66 66 5b 30 5d 29 3b 0a 20 20 20  v, zAff[0]);.   
17460 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17470 20 20 61 73 73 65 72 74 28 20 64 65 73 74 49 66    assert( destIf
17480 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73  Null==destIfFals
17490 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e );.        sql
174a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
174b0 2c 20 4f 50 5f 4e 65 2c 20 72 31 2c 20 64 65 73  , OP_Ne, r1, des
174c0 74 49 66 46 61 6c 73 65 2c 20 72 32 2c 0a 20 20  tIfFalse, r2,.  
174d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174e0 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
174f0 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
17500 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
17510 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
17520 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
17530 76 2c 20 7a 41 66 66 5b 30 5d 20 7c 20 53 51 4c  v, zAff[0] | SQL
17540 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
17550 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
17560 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
17570 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
17580 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20  ToFree);.    }. 
17590 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c     if( regCkNull
175a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
175b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
175c0 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 43 6b 4e  P_IsNull, regCkN
175d0 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  ull, destIfNull)
175e0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
175f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17600 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74  VdbeGoto(v, dest
17610 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 7d 0a  IfFalse);.    }.
17620 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
17630 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
17640 61 62 65 6c 4f 6b 29 3b 0a 20 20 20 20 73 71 6c  abelOk);.    sql
17650 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
17660 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 43 6b  eg(pParse, regCk
17670 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Null);.  }else{.
17680 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79    .    /* If any
17690 20 76 61 6c 75 65 20 6f 6e 20 74 68 65 20 4c 48   value on the LH
176a0 53 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72  S is NULL, the r
176b0 65 73 75 6c 74 20 6f 66 20 74 68 65 20 49 4e 28  esult of the IN(
176c0 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 0a 20 20  ...) operator.  
176d0 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74    ** must be eit
176e0 68 65 72 20 66 61 6c 73 65 20 6f 72 20 4e 55 4c  her false or NUL
176f0 4c 2e 20 49 66 20 74 68 65 73 65 20 74 77 6f 20  L. If these two 
17700 61 72 65 20 68 61 6e 64 6c 65 64 20 69 64 65 6e  are handled iden
17710 74 69 63 61 6c 6c 79 2c 0a 20 20 20 20 2a 2a 20  tically,.    ** 
17720 74 65 73 74 20 74 68 65 20 4c 48 53 20 66 6f 72  test the LHS for
17730 20 4e 55 4c 4c 73 20 61 6e 64 20 6a 75 6d 70 20   NULLs and jump 
17740 64 69 72 65 63 74 6c 79 20 74 6f 20 64 65 73 74  directly to dest
17750 49 66 4e 75 6c 6c 20 69 66 20 61 6e 79 20 61 72  IfNull if any ar
17760 65 0a 20 20 20 20 2a 2a 20 66 6f 75 6e 64 2e 20  e.    ** found. 
17770 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f  .    **.    ** O
17780 74 68 65 72 77 69 73 65 2c 20 69 66 20 4e 55 4c  therwise, if NUL
17790 4c 20 61 6e 64 20 66 61 6c 73 65 20 61 72 65 20  L and false are 
177a0 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e  handled differen
177b0 74 6c 79 2c 20 61 6e 64 20 74 68 65 0a 20 20 20  tly, and the.   
177c0 20 2a 2a 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72   ** IN(...) oper
177d0 61 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61 20 76  ation is not a v
177e0 65 63 74 6f 72 20 6f 70 65 72 61 74 69 6f 6e 2c  ector operation,
177f0 20 61 6e 64 20 74 68 65 20 4c 48 53 20 6f 66 20   and the LHS of 
17800 74 68 65 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  the.    ** opera
17810 74 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  tor is NULL, the
17820 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  n the result is 
17830 66 61 6c 73 65 20 69 66 20 74 68 65 20 69 6e 64  false if the ind
17840 65 78 20 69 73 20 0a 20 20 20 20 2a 2a 20 63 6f  ex is .    ** co
17850 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2c 20  mpletely empty, 
17860 6f 72 20 4e 55 4c 4c 20 6f 74 68 65 72 77 69 73  or NULL otherwis
17870 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64  e.  */.    if( d
17880 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49  estIfNull==destI
17890 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20  fFalse ){.      
178a0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74  for(i=0; i<nVect
178b0 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  or; i++){.      
178c0 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
178d0 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
178e0 62 65 78 70 72 28 70 45 78 70 72 2d 3e 70 4c 65  bexpr(pExpr->pLe
178f0 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  ft, i);.        
17900 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
17910 61 6e 42 65 4e 75 6c 6c 28 70 29 20 29 7b 0a 20  anBeNull(p) ){. 
17920 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17930 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17940 5f 49 73 4e 75 6c 6c 2c 20 72 31 2b 61 69 4d 61  _IsNull, r1+aiMa
17950 70 5b 69 5d 2c 20 64 65 73 74 49 66 4e 75 6c 6c  p[i], destIfNull
17960 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
17970 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
17980 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
17990 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56      }else if( nV
179a0 65 63 74 6f 72 3d 3d 31 20 26 26 20 73 71 6c 69  ector==1 && sqli
179b0 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
179c0 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29  (pExpr->pLeft) )
179d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
179e0 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
179f0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e  ddOp1(v, OP_NotN
17a00 75 6c 6c 2c 20 72 31 29 3b 20 56 64 62 65 43 6f  ull, r1); VdbeCo
17a10 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
17a20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17a30 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
17a40 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
17a50 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
17a60 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
17a70 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
17a80 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65  e3VdbeGoto(v, de
17a90 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
17aa0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
17ab0 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
17ac0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
17ad0 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
17ae0 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20  _ROWID ){.      
17af0 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  /* In this case,
17b00 20 74 68 65 20 52 48 53 20 69 73 20 74 68 65 20   the RHS is the 
17b10 52 4f 57 49 44 20 6f 66 20 74 61 62 6c 65 20 62  ROWID of table b
17b20 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 73  -tree */.      s
17b30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
17b40 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64  (v, OP_SeekRowid
17b50 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
17b60 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31   destIfFalse, r1
17b70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
17b80 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 65  erage(v);.    }e
17b90 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  lse{.      /* In
17ba0 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20   this case, the 
17bb0 52 48 53 20 69 73 20 61 6e 20 69 6e 64 65 78 20  RHS is an index 
17bc0 62 2d 74 72 65 65 2e 20 41 70 70 6c 79 20 74 68  b-tree. Apply th
17bd0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20  e comparison.   
17be0 20 20 20 2a 2a 20 61 66 66 69 6e 69 74 69 65 73     ** affinities
17bf0 20 74 6f 20 65 61 63 68 20 76 61 6c 75 65 20 6f   to each value o
17c00 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65  n the LHS of the
17c10 20 6f 70 65 72 61 74 6f 72 2e 20 20 2a 2f 0a 20   operator.  */. 
17c20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17c30 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66  AddOp4(v, OP_Aff
17c40 69 6e 69 74 79 2c 20 72 31 2c 20 6e 56 65 63 74  inity, r1, nVect
17c50 6f 72 2c 20 30 2c 20 7a 41 66 66 2c 20 6e 56 65  or, 0, zAff, nVe
17c60 63 74 6f 72 29 3b 0a 20 20 20 20 20 20 0a 20 20  ctor);.      .  
17c70 20 20 20 20 69 66 28 20 6e 56 65 63 74 6f 72 3e      if( nVector>
17c80 31 20 26 26 20 64 65 73 74 49 66 4e 75 6c 6c 21  1 && destIfNull!
17c90 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a  =destIfFalse ){.
17ca0 20 20 20 20 20 20 20 20 69 6e 74 20 69 49 64 78          int iIdx
17cb0 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
17cc0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  ;.        int ad
17cd0 64 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  dr;.        int 
17ce0 61 64 64 72 4e 65 78 74 3b 0a 0a 20 20 20 20 20  addrNext;..     
17cf0 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65     /* Search the
17d00 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b   index for the k
17d10 65 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ey. */.        a
17d20 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
17d30 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
17d40 5f 46 6f 75 6e 64 2c 20 69 49 64 78 2c 20 30 2c  _Found, iIdx, 0,
17d50 20 72 31 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20   r1, nVector);. 
17d60 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
17d70 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 20  age(v);..       
17d80 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
17d90 74 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  t the specified 
17da0 6b 65 79 20 69 73 20 6e 6f 74 20 70 72 65 73 65  key is not prese
17db0 6e 74 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c  nt in the index,
17dc0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20   .        ** so 
17dd0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
17de0 65 20 49 4e 28 2e 2e 29 20 6f 70 65 72 61 74 6f  e IN(..) operato
17df0 72 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  r must be either
17e00 20 4e 55 4c 4c 20 6f 72 0a 20 20 20 20 20 20 20   NULL or.       
17e10 20 2a 2a 20 30 2e 20 54 68 65 20 76 64 62 65 20   ** 0. The vdbe 
17e20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
17e30 65 6c 6f 77 20 66 69 67 75 72 65 73 20 6f 75 74  elow figures out
17e40 20 77 68 69 63 68 2e 20 20 2a 2f 0a 20 20 20 20   which.  */.    
17e50 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20 31      addrNext = 1
17e60 2b 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f  +sqlite3VdbeAddO
17e70 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
17e80 20 69 49 64 78 2c 20 64 65 73 74 49 66 46 61 6c   iIdx, destIfFal
17e90 73 65 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  se);.        Vdb
17ea0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
17eb0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
17ec0 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b  i<nVector; i++){
17ed0 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
17ee0 2a 70 3b 0a 20 20 20 20 20 20 20 20 20 20 43 6f  *p;.          Co
17ef0 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
17f00 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d          int r2 =
17f10 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
17f20 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
17f30 20 20 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65        p = sqlite
17f40 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65  3VectorFieldSube
17f50 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20  xpr(pLeft, i);. 
17f60 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
17f70 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
17f80 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  Seq(pParse, p);.
17f90 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
17fa0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
17fb0 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 2c  OP_Column, iIdx,
17fc0 20 69 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20   i, r2);.       
17fd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17fe0 64 4f 70 34 28 76 2c 20 4f 50 5f 45 71 2c 20 72  dOp4(v, OP_Eq, r
17ff0 31 2b 69 2c 20 30 2c 20 72 32 2c 20 28 76 6f 69  1+i, 0, r2, (voi
18000 64 2a 29 70 43 6f 6c 6c 2c 50 34 5f 43 4f 4c 4c  d*)pColl,P4_COLL
18010 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20 20  SEQ);.          
18020 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
18030 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4a 55  eP5(v, SQLITE_JU
18040 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
18050 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
18060 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
18070 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18080 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 49  2(v, OP_Next, iI
18090 64 78 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20  dx, addrNext);. 
180a0 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
180b0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
180c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
180d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
180e0 2c 20 30 2c 20 64 65 73 74 49 66 46 61 6c 73 65  , 0, destIfFalse
180f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
18100 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
18110 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
18120 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 33 29  urrentAddr(v)-3)
18130 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
18140 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
18150 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
18160 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
18170 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18180 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
18190 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 0a  , destIfNull);..
181a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b          /* The k
181b0 65 79 20 77 61 73 20 66 6f 75 6e 64 20 69 6e 20  ey was found in 
181c0 74 68 65 20 69 6e 64 65 78 2e 20 49 66 20 69 74  the index. If it
181d0 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55   contains any NU
181e0 4c 4c 20 76 61 6c 75 65 73 2c 0a 20 20 20 20 20  LL values,.     
181f0 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 72     ** then the r
18200 65 73 75 6c 74 20 6f 66 20 74 68 65 20 49 4e 28  esult of the IN(
18210 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20 69 73  ...) operator is
18220 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73 65   NULL. Otherwise
18230 2c 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  , the.        **
18240 20 72 65 73 75 6c 74 20 69 73 20 31 2e 20 20 2a   result is 1.  *
18250 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
18260 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
18270 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20   addr);.        
18280 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74  for(i=0; i<nVect
18290 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  or; i++){.      
182a0 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
182b0 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
182c0 53 75 62 65 78 70 72 28 70 45 78 70 72 2d 3e 70  Subexpr(pExpr->p
182d0 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Left, i);.      
182e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
182f0 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 29 20  xprCanBeNull(p) 
18300 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
18310 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18320 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
18330 31 2b 61 69 4d 61 70 5b 69 5d 2c 20 64 65 73 74  1+aiMap[i], dest
18340 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  IfNull);.       
18350 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
18360 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
18370 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  }.        }..   
18380 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 52 68     }else if( rRh
18390 73 48 61 73 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20  sHasNull==0 ){. 
183a0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
183b0 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20 69 74  ranch runs if it
183c0 20 69 73 20 6b 6e 6f 77 6e 20 61 74 20 63 6f 6d   is known at com
183d0 70 69 6c 65 20 74 69 6d 65 20 74 68 61 74 20 74  pile time that t
183e0 68 65 20 52 48 53 0a 20 20 20 20 20 20 20 20 2a  he RHS.        *
183f0 2a 20 63 61 6e 6e 6f 74 20 63 6f 6e 74 61 69 6e  * cannot contain
18400 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 20 54 68   NULL values. Th
18410 69 73 20 68 61 70 70 65 6e 73 20 61 73 20 61 20  is happens as a 
18420 72 65 73 75 6c 74 0a 20 20 20 20 20 20 20 20 2a  result.        *
18430 2a 20 6f 66 20 22 4e 4f 54 20 4e 55 4c 4c 22 20  * of "NOT NULL" 
18440 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74  constraints in t
18450 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
18460 6d 61 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ma..        **. 
18470 20 20 20 20 20 20 20 2a 2a 20 41 6c 73 6f 20 72         ** Also r
18480 75 6e 20 74 68 69 73 20 62 72 61 6e 63 68 20 69  un this branch i
18490 66 20 4e 55 4c 4c 20 69 73 20 65 71 75 69 76 61  f NULL is equiva
184a0 6c 65 6e 74 20 74 6f 20 46 41 4c 53 45 0a 20 20  lent to FALSE.  
184b0 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 69        ** for thi
184c0 73 20 70 61 72 74 69 63 75 6c 61 72 20 49 4e 20  s particular IN 
184d0 6f 70 65 72 61 74 6f 72 2e 20 20 2a 2f 0a 20 20  operator.  */.  
184e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
184f0 65 41 64 64 4f 70 34 49 6e 74 28 0a 20 20 20 20  eAddOp4Int(.    
18500 20 20 20 20 20 20 20 20 76 2c 20 4f 50 5f 4e 6f          v, OP_No
18510 74 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  tFound, pExpr->i
18520 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c  Table, destIfFal
18530 73 65 2c 20 72 31 2c 20 6e 56 65 63 74 6f 72 0a  se, r1, nVector.
18540 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
18550 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
18560 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  v);.      }else{
18570 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  .        /* In t
18580 68 69 73 20 62 72 61 6e 63 68 2c 20 74 68 65 20  his branch, the 
18590 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6d 69  RHS of the IN mi
185a0 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55  ght contain a NU
185b0 4c 4c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  LL and.        *
185c0 2a 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f  * the presence o
185d0 66 20 61 20 4e 55 4c 4c 20 6f 6e 20 74 68 65 20  f a NULL on the 
185e0 52 48 53 20 6d 61 6b 65 73 20 61 20 64 69 66 66  RHS makes a diff
185f0 65 72 65 6e 63 65 20 69 6e 20 74 68 65 0a 20 20  erence in the.  
18600 20 20 20 20 20 20 2a 2a 20 6f 75 74 63 6f 6d 65        ** outcome
18610 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
18620 20 20 20 20 20 69 6e 74 20 61 64 64 72 31 3b 0a       int addr1;.
18630 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  .        /* Firs
18640 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  t check to see i
18650 66 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e  f the LHS is con
18660 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48  tained in the RH
18670 53 2e 20 20 49 66 20 73 6f 2c 0a 20 20 20 20 20  S.  If so,.     
18680 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 61     ** then the a
18690 6e 73 77 65 72 20 69 73 20 54 52 55 45 20 74 68  nswer is TRUE th
186a0 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 4e 55  e presence of NU
186b0 4c 4c 73 20 69 6e 20 74 68 65 20 52 48 53 20 64  LLs in the RHS d
186c0 6f 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  oes.        ** n
186d0 6f 74 20 6d 61 74 74 65 72 2e 20 20 49 66 20 74  ot matter.  If t
186e0 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f  he LHS is not co
186f0 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52  ntained in the R
18700 48 53 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  HS, then the.   
18710 20 20 20 20 20 2a 2a 20 61 6e 73 77 65 72 20 69       ** answer i
18720 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 52 48  s NULL if the RH
18730 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73  S contains NULLs
18740 20 61 6e 64 20 74 68 65 20 61 6e 73 77 65 72 20   and the answer 
18750 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 41  is.        ** FA
18760 4c 53 45 20 69 66 20 74 68 65 20 52 48 53 20 69  LSE if the RHS i
18770 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 20 20 20  s NULL-free..   
18780 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
18790 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
187a0 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
187b0 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d  OP_Found, pExpr-
187c0 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72 31 2c 20  >iTable, 0, r1, 
187d0 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  1);.        Vdbe
187e0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
187f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18800 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
18810 75 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c  ull, rRhsHasNull
18820 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
18830 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
18840 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
18850 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
18860 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
18870 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18880 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
18890 61 64 64 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a  addr1);.      }.
188a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
188b0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
188c0 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
188d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
188e0 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
188f0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
18900 61 72 73 65 2d 3e 64 62 2c 20 61 69 4d 61 70 29  arse->db, aiMap)
18910 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
18920 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 41  e(pParse->db, zA
18930 66 66 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65  ff);.  VdbeComme
18940 6e 74 28 28 76 2c 20 22 65 6e 64 20 49 4e 20 65  nt((v, "end IN e
18950 78 70 72 22 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  xpr"));.}.#endif
18960 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
18970 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66  SUBQUERY */..#if
18980 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18990 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
189a0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
189b0 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
189c0 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20  at will put the 
189d0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a  floating point.*
189e0 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69 62 65  * value describe
189f0 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69  d by z[0..n-1] i
18a00 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65  nto register iMe
18a10 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d  m..**.** The z[]
18a20 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f   string will pro
18a30 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72  bably not be zer
18a40 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42  o-terminated.  B
18a50 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20  ut the .** z[n] 
18a60 63 68 61 72 61 63 74 65 72 20 69 73 20 67 75 61  character is gua
18a70 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f  ranteed to be so
18a80 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65  mething that doe
18a90 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69  s not look.** li
18aa0 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74  ke the continuat
18ab0 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ion of the numbe
18ac0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
18ad0 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20  d codeReal(Vdbe 
18ae0 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *v, const char *
18af0 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61  z, int negateFla
18b00 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20  g, int iMem){.  
18b10 69 66 28 20 41 4c 57 41 59 53 28 7a 21 3d 30 29  if( ALWAYS(z!=0)
18b20 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76   ){.    double v
18b30 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  alue;.    sqlite
18b40 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c  3AtoF(z, &value,
18b50 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
18b60 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  (z), SQLITE_UTF8
18b70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
18b80 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c  sqlite3IsNaN(val
18b90 75 65 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65  ue) ); /* The ne
18ba0 77 20 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74  w AtoF never ret
18bb0 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20  urns NaN */.    
18bc0 69 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29  if( negateFlag )
18bd0 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b   value = -value;
18be0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
18bf0 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50  AddOp4Dup8(v, OP
18c00 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20  _Real, 0, iMem, 
18c10 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20  0, (u8*)&value, 
18c20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a  P4_REAL);.  }.}.
18c30 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47  #endif.../*.** G
18c40 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72  enerate an instr
18c50 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  uction that will
18c60 20 70 75 74 20 74 68 65 20 69 6e 74 65 67 65 72   put the integer
18c70 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20   describe by.** 
18c80 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69  text z[0..n-1] i
18c90 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65  nto register iMe
18ca0 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e  m..**.** Expr.u.
18cb0 7a 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79 73  zToken is always
18cc0 20 55 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d 74   UTF8 and zero-t
18cd0 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74  erminated..*/.st
18ce0 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e  atic void codeIn
18cf0 74 65 67 65 72 28 50 61 72 73 65 20 2a 70 50 61  teger(Parse *pPa
18d00 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
18d10 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69  , int negFlag, i
18d20 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65  nt iMem){.  Vdbe
18d30 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
18d40 64 62 65 3b 0a 20 20 69 66 28 20 70 45 78 70 72  dbe;.  if( pExpr
18d50 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74  ->flags & EP_Int
18d60 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e 74  Value ){.    int
18d70 20 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56   i = pExpr->u.iV
18d80 61 6c 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  alue;.    assert
18d90 28 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  ( i>=0 );.    if
18da0 28 20 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20  ( negFlag ) i = 
18db0 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  -i;.    sqlite3V
18dc0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18dd0 49 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d  Integer, i, iMem
18de0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
18df0 69 6e 74 20 63 3b 0a 20 20 20 20 69 36 34 20 76  int c;.    i64 v
18e00 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  alue;.    const 
18e10 63 68 61 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d  char *z = pExpr-
18e20 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61  >u.zToken;.    a
18e30 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20  ssert( z!=0 );. 
18e40 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 44 65     c = sqlite3De
18e50 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26  cOrHexToI64(z, &
18e60 76 61 6c 75 65 29 3b 0a 20 20 20 20 69 66 28 20  value);.    if( 
18e70 63 3d 3d 30 20 7c 7c 20 28 63 3d 3d 32 20 26 26  c==0 || (c==2 &&
18e80 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20 20 20   negFlag) ){.   
18e90 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29     if( negFlag )
18ea0 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d 32 20 3f  { value = c==2 ?
18eb0 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20   SMALLEST_INT64 
18ec0 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20 20 20  : -value; }.    
18ed0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18ee0 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 49 6e  Op4Dup8(v, OP_In
18ef0 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c  t64, 0, iMem, 0,
18f00 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34   (u8*)&value, P4
18f10 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c  _INT64);.    }el
18f20 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  se{.#ifdef SQLIT
18f30 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
18f40 50 4f 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69  POINT.      sqli
18f50 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
18f60 73 65 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69  se, "oversized i
18f70 6e 74 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e  nteger: %s%s", n
18f80 65 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22  egFlag ? "-" : "
18f90 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 23 69 66  ", z);.#else.#if
18fa0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18fb0 5f 48 45 58 5f 49 4e 54 45 47 45 52 0a 20 20 20  _HEX_INTEGER.   
18fc0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
18fd0 74 72 6e 69 63 6d 70 28 7a 2c 22 30 78 22 2c 32  trnicmp(z,"0x",2
18fe0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
18ff0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
19000 70 50 61 72 73 65 2c 20 22 68 65 78 20 6c 69 74  pParse, "hex lit
19010 65 72 61 6c 20 74 6f 6f 20 62 69 67 3a 20 25 73  eral too big: %s
19020 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ", z);.      }el
19030 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
19040 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65  {.        codeRe
19050 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67  al(v, z, negFlag
19060 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d  , iMem);.      }
19070 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
19080 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  }.}..#if defined
19090 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
190a0 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 65 20  *.** Verify the 
190b0 63 6f 6e 73 69 73 74 65 6e 63 79 20 6f 66 20 74  consistency of t
190c0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 0a  he column cache.
190d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61  */.static int ca
190e0 63 68 65 49 73 56 61 6c 69 64 28 50 61 72 73 65  cheIsValid(Parse
190f0 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74   *pParse){.  int
19100 20 69 2c 20 6e 3b 0a 20 20 66 6f 72 28 69 3d 6e   i, n;.  for(i=n
19110 3d 30 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  =0; i<SQLITE_N_C
19120 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 29 7b 0a 20  OLCACHE; i++){. 
19130 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61     if( pParse->a
19140 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67  ColCache[i].iReg
19150 3e 30 20 29 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20  >0 ) n++;.  }.  
19160 72 65 74 75 72 6e 20 6e 3d 3d 70 50 61 72 73 65  return n==pParse
19170 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 0a 7d 0a 23  ->nColCache;.}.#
19180 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  endif../*.** Cle
19190 61 72 20 61 20 63 61 63 68 65 20 65 6e 74 72 79  ar a cache entry
191a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
191b0 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72   cacheEntryClear
191c0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
191d0 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
191e0 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74   *p){.  if( p->t
191f0 65 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 69 66  empReg ){.    if
19200 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  ( pParse->nTempR
19210 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61  eg<ArraySize(pPa
19220 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29  rse->aTempReg) )
19230 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
19240 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d  aTempReg[pParse-
19250 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70  >nTempReg++] = p
19260 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20  ->iReg;.    }.  
19270 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30    p->tempReg = 0
19280 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 52 65 67 20  ;.  }.  p->iReg 
19290 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
192a0 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 61 73  ColCache--;.  as
192b0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
192c0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
192d0 7c 20 63 61 63 68 65 49 73 56 61 6c 69 64 28 70  | cacheIsValid(p
192e0 50 61 72 73 65 29 20 29 3b 0a 7d 0a 0a 0a 2f 2a  Parse) );.}.../*
192f0 0a 2a 2a 20 52 65 63 6f 72 64 20 69 6e 20 74 68  .** Record in th
19300 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 74  e column cache t
19310 68 61 74 20 61 20 70 61 72 74 69 63 75 6c 61 72  hat a particular
19320 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a   column from a.*
19330 2a 20 70 61 72 74 69 63 75 6c 61 72 20 74 61 62  * particular tab
19340 6c 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  le is stored in 
19350 61 20 70 61 72 74 69 63 75 6c 61 72 20 72 65 67  a particular reg
19360 69 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ister..*/.void s
19370 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53  qlite3ExprCacheS
19380 74 6f 72 65 28 50 61 72 73 65 20 2a 70 50 61 72  tore(Parse *pPar
19390 73 65 2c 20 69 6e 74 20 69 54 61 62 2c 20 69 6e  se, int iTab, in
193a0 74 20 69 43 6f 6c 2c 20 69 6e 74 20 69 52 65 67  t iCol, int iReg
193b0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
193c0 74 20 6d 69 6e 4c 72 75 3b 0a 20 20 69 6e 74 20  t minLru;.  int 
193d0 69 64 78 4c 72 75 3b 0a 20 20 73 74 72 75 63 74  idxLru;.  struct
193e0 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a   yColCache *p;..
193f0 20 20 2f 2a 20 55 6e 6c 65 73 73 20 61 6e 20 65    /* Unless an e
19400 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
19410 64 2c 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  d, register numb
19420 65 72 73 20 61 72 65 20 61 6c 77 61 79 73 20 70  ers are always p
19430 6f 73 69 74 69 76 65 2e 20 2a 2f 0a 20 20 61 73  ositive. */.  as
19440 73 65 72 74 28 20 69 52 65 67 3e 30 20 7c 7c 20  sert( iReg>0 || 
19450 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
19460 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
19470 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 61 73  ocFailed );.  as
19480 73 65 72 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26  sert( iCol>=-1 &
19490 26 20 69 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20  & iCol<32768 ); 
194a0 20 2f 2a 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d   /* Finite colum
194b0 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20  n numbers */..  
194c0 2f 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 43 6f  /* The SQLITE_Co
194d0 6c 75 6d 6e 43 61 63 68 65 20 66 6c 61 67 20 64  lumnCache flag d
194e0 69 73 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 75  isables the colu
194f0 6d 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  mn cache.  This 
19500 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 66 6f 72  is used.  ** for
19510 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 20 2d 20   testing only - 
19520 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 53  to verify that S
19530 51 4c 69 74 65 20 61 6c 77 61 79 73 20 67 65 74  QLite always get
19540 73 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  s the same answe
19550 72 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e 64 20  r.  ** with and 
19560 77 69 74 68 6f 75 74 20 74 68 65 20 63 6f 6c 75  without the colu
19570 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20  mn cache..  */. 
19580 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f   if( Optimizatio
19590 6e 44 69 73 61 62 6c 65 64 28 70 50 61 72 73 65  nDisabled(pParse
195a0 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 6c  ->db, SQLITE_Col
195b0 75 6d 6e 43 61 63 68 65 29 20 29 20 72 65 74 75  umnCache) ) retu
195c0 72 6e 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20  rn;..  /* First 
195d0 72 65 70 6c 61 63 65 20 61 6e 79 20 65 78 69 73  replace any exis
195e0 74 69 6e 67 20 65 6e 74 72 79 2e 0a 20 20 2a 2a  ting entry..  **
195f0 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20  .  ** Actually, 
19600 74 68 65 20 77 61 79 20 74 68 65 20 63 6f 6c 75  the way the colu
19610 6d 6e 20 63 61 63 68 65 20 69 73 20 63 75 72 72  mn cache is curr
19620 65 6e 74 6c 79 20 75 73 65 64 2c 20 77 65 20 61  ently used, we a
19630 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20  re guaranteed.  
19640 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 62 6a 65  ** that the obje
19650 63 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 6c  ct will never al
19660 72 65 61 64 79 20 62 65 20 69 6e 20 63 61 63 68  ready be in cach
19670 65 2e 20 20 56 65 72 69 66 79 20 74 68 69 73 20  e.  Verify this 
19680 67 75 61 72 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a  guarantee..  */.
19690 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
196a0 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
196b0 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
196c0 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
196d0 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
196e0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 52     assert( p->iR
196f0 65 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 54 61 62  eg==0 || p->iTab
19700 6c 65 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e 69  le!=iTab || p->i
19710 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a  Column!=iCol );.
19720 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
19730 20 46 69 6e 64 20 61 6e 20 65 6d 70 74 79 20 73   Find an empty s
19740 6c 6f 74 20 61 6e 64 20 72 65 70 6c 61 63 65 20  lot and replace 
19750 69 74 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  it */.  for(i=0,
19760 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
19770 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
19780 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
19790 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
197a0 3e 69 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20  >iReg==0 ){.    
197b0 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50    p->iLevel = pP
197c0 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
197d0 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 54 61 62  l;.      p->iTab
197e0 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20  le = iTab;.     
197f0 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43   p->iColumn = iC
19800 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65  ol;.      p->iRe
19810 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 20 20  g = iReg;.      
19820 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a  p->tempReg = 0;.
19830 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70        p->lru = p
19840 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74  Parse->iCacheCnt
19850 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  ++;.      pParse
19860 2d 3e 6e 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20  ->nColCache++;. 
19870 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
19880 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
19890 61 69 6c 65 64 20 7c 7c 20 63 61 63 68 65 49 73  ailed || cacheIs
198a0 56 61 6c 69 64 28 70 50 61 72 73 65 29 20 29 3b  Valid(pParse) );
198b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
198c0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
198d0 65 70 6c 61 63 65 20 74 68 65 20 6c 61 73 74 20  eplace the last 
198e0 72 65 63 65 6e 74 6c 79 20 75 73 65 64 20 2a 2f  recently used */
198f0 0a 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66  .  minLru = 0x7f
19900 66 66 66 66 66 66 3b 0a 20 20 69 64 78 4c 72 75  ffffff;.  idxLru
19910 20 3d 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30   = -1;.  for(i=0
19920 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
19930 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
19940 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
19950 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
19960 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20 29 7b 0a  ->lru<minLru ){.
19970 20 20 20 20 20 20 69 64 78 4c 72 75 20 3d 20 69        idxLru = i
19980 3b 0a 20 20 20 20 20 20 6d 69 6e 4c 72 75 20 3d  ;.      minLru =
19990 20 70 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d 0a 20   p->lru;.    }. 
199a0 20 7d 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28   }.  if( ALWAYS(
199b0 69 64 78 4c 72 75 3e 3d 30 29 20 29 7b 0a 20 20  idxLru>=0) ){.  
199c0 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61    p = &pParse->a
199d0 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72 75 5d  ColCache[idxLru]
199e0 3b 0a 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20  ;.    p->iLevel 
199f0 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
19a00 4c 65 76 65 6c 3b 0a 20 20 20 20 70 2d 3e 69 54  Level;.    p->iT
19a10 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20  able = iTab;.   
19a20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43   p->iColumn = iC
19a30 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69 52 65 67 20  ol;.    p->iReg 
19a40 3d 20 69 52 65 67 3b 0a 20 20 20 20 70 2d 3e 74  = iReg;.    p->t
19a50 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20  empReg = 0;.    
19a60 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d  p->lru = pParse-
19a70 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20  >iCacheCnt++;.  
19a80 20 20 61 73 73 65 72 74 28 20 63 61 63 68 65 49    assert( cacheI
19a90 73 56 61 6c 69 64 28 70 50 61 72 73 65 29 20 29  sValid(pParse) )
19aa0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
19ab0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63  }.}../*.** Indic
19ac0 61 74 65 20 74 68 61 74 20 72 65 67 69 73 74 65  ate that registe
19ad0 72 73 20 62 65 74 77 65 65 6e 20 69 52 65 67 2e  rs between iReg.
19ae0 2e 69 52 65 67 2b 6e 52 65 67 2d 31 20 61 72 65  .iReg+nReg-1 are
19af0 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74   being overwritt
19b00 65 6e 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68 65  en..** Purge the
19b10 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74   range of regist
19b20 65 72 73 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c  ers from the col
19b30 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f  umn cache..*/.vo
19b40 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
19b50 63 68 65 52 65 6d 6f 76 65 28 50 61 72 73 65 20  cheRemove(Parse 
19b60 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
19b70 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  g, int nReg){.  
19b80 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
19b90 20 2a 70 3b 0a 20 20 69 66 28 20 69 52 65 67 3c   *p;.  if( iReg<
19ba0 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 43  =0 || pParse->nC
19bb0 6f 6c 43 61 63 68 65 3d 3d 30 20 29 20 72 65 74  olCache==0 ) ret
19bc0 75 72 6e 3b 0a 20 20 70 20 3d 20 26 70 50 61 72  urn;.  p = &pPar
19bd0 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 53 51  se->aColCache[SQ
19be0 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 2d  LITE_N_COLCACHE-
19bf0 31 5d 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a  1];.  while(1){.
19c00 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20      if( p->iReg 
19c10 3e 3d 20 69 52 65 67 20 26 26 20 70 2d 3e 69 52  >= iReg && p->iR
19c20 65 67 20 3c 20 69 52 65 67 2b 6e 52 65 67 20 29  eg < iReg+nReg )
19c30 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72   cacheEntryClear
19c40 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
19c50 20 69 66 28 20 70 3d 3d 70 50 61 72 73 65 2d 3e   if( p==pParse->
19c60 61 43 6f 6c 43 61 63 68 65 20 29 20 62 72 65 61  aColCache ) brea
19c70 6b 3b 0a 20 20 20 20 70 2d 2d 3b 0a 20 20 7d 0a  k;.    p--;.  }.
19c80 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65  }../*.** Remembe
19c90 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  r the current co
19ca0 6c 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74 65  lumn cache conte
19cb0 78 74 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e 74  xt.  Any new ent
19cc0 72 69 65 73 20 61 64 64 65 64 0a 2a 2a 20 61 64  ries added.** ad
19cd0 64 65 64 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d  ded to the colum
19ce0 6e 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  n cache after th
19cf0 69 73 20 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f  is call are remo
19d00 76 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20  ved when the.** 
19d10 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f  corresponding po
19d20 70 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69  p occurs..*/.voi
19d30 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
19d40 68 65 50 75 73 68 28 50 61 72 73 65 20 2a 70 50  hePush(Parse *pP
19d50 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d  arse){.  pParse-
19d60 3e 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a  >iCacheLevel++;.
19d70 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
19d80 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65  BUG.  if( pParse
19d90 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
19da0 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72  LITE_VdbeAddopTr
19db0 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  ace ){.    print
19dc0 66 28 22 50 55 53 48 20 74 6f 20 25 64 5c 6e 22  f("PUSH to %d\n"
19dd0 2c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  , pParse->iCache
19de0 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64  Level);.  }.#end
19df0 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  if.}../*.** Remo
19e00 76 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75  ve from the colu
19e10 6d 6e 20 63 61 63 68 65 20 61 6e 79 20 65 6e 74  mn cache any ent
19e20 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20 61  ries that were a
19e30 64 64 65 64 20 73 69 6e 63 65 20 74 68 65 0a 2a  dded since the.*
19e40 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  * the previous s
19e50 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
19e60 75 73 68 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ush operation.  
19e70 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
19e80 72 65 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20 63  restore.** the c
19e90 61 63 68 65 20 74 6f 20 74 68 65 20 73 74 61 74  ache to the stat
19ea0 65 20 69 74 20 77 61 73 20 69 6e 20 70 72 69 6f  e it was in prio
19eb0 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  r the most recen
19ec0 74 20 50 75 73 68 2e 0a 2a 2f 0a 76 6f 69 64 20  t Push..*/.void 
19ed0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
19ee0 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  Pop(Parse *pPars
19ef0 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  e){.  int i;.  s
19f00 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
19f10 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  *p;.  assert( pP
19f20 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
19f30 6c 3e 3d 31 20 29 3b 0a 20 20 70 50 61 72 73 65  l>=1 );.  pParse
19f40 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2d 2d 3b  ->iCacheLevel--;
19f50 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
19f60 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73  EBUG.  if( pPars
19f70 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
19f80 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
19f90 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e  race ){.    prin
19fa0 74 66 28 22 50 4f 50 20 20 74 6f 20 25 64 5c 6e  tf("POP  to %d\n
19fb0 22 2c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  ", pParse->iCach
19fc0 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e  eLevel);.  }.#en
19fd0 64 69 66 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  dif.  for(i=0, p
19fe0 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
19ff0 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
1a000 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
1a010 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
1a020 52 65 67 20 26 26 20 70 2d 3e 69 4c 65 76 65 6c  Reg && p->iLevel
1a030 3e 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c  >pParse->iCacheL
1a040 65 76 65 6c 20 29 7b 0a 20 20 20 20 20 20 63 61  evel ){.      ca
1a050 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50  cheEntryClear(pP
1a060 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a  arse, p);.    }.
1a070 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65    }.}../*.** Whe
1a080 6e 20 61 20 63 61 63 68 65 64 20 63 6f 6c 75 6d  n a cached colum
1a090 6e 20 69 73 20 72 65 75 73 65 64 2c 20 6d 61 6b  n is reused, mak
1a0a0 65 20 73 75 72 65 20 74 68 61 74 20 69 74 73 20  e sure that its 
1a0b0 72 65 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e  register is.** n
1a0c0 6f 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c 61 62  o longer availab
1a0d0 6c 65 20 61 73 20 61 20 74 65 6d 70 20 72 65 67  le as a temp reg
1a0e0 69 73 74 65 72 2e 20 20 74 69 63 6b 65 74 20 23  ister.  ticket #
1a0f0 33 38 37 39 3a 20 20 74 68 61 74 20 73 61 6d 65  3879:  that same
1a100 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 6d 69 67  .** register mig
1a110 68 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63  ht be in the cac
1a120 68 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70  he in multiple p
1a130 6c 61 63 65 73 2c 20 73 6f 20 62 65 20 73 75 72  laces, so be sur
1a140 65 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d  e to.** get them
1a150 20 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   all..*/.static 
1a160 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1a170 43 61 63 68 65 50 69 6e 52 65 67 69 73 74 65 72  CachePinRegister
1a180 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1a190 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74  int iReg){.  int
1a1a0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
1a1b0 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72  lCache *p;.  for
1a1c0 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
1a1d0 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
1a1e0 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
1a1f0 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
1a200 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67  f( p->iReg==iReg
1a210 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d   ){.      p->tem
1a220 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pReg = 0;.    }.
1a230 20 20 7d 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61    }.}../* Genera
1a240 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
1a250 6c 20 6c 6f 61 64 20 69 6e 74 6f 20 72 65 67 69  l load into regi
1a260 73 74 65 72 20 72 65 67 4f 75 74 20 61 20 76 61  ster regOut a va
1a270 6c 75 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 61  lue that is.** a
1a280 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
1a290 68 65 20 69 49 64 78 43 6f 6c 2d 74 68 20 63 6f  he iIdxCol-th co
1a2a0 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49  lumn of index pI
1a2b0 64 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  dx..*/.void sqli
1a2c0 74 65 33 45 78 70 72 43 6f 64 65 4c 6f 61 64 49  te3ExprCodeLoadI
1a2d0 6e 64 65 78 43 6f 6c 75 6d 6e 28 0a 20 20 50 61  ndexColumn(.  Pa
1a2e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 2f 2a  rse *pParse,  /*
1a2f0 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
1a300 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20  text */.  Index 
1a310 2a 70 49 64 78 2c 20 20 20 20 2f 2a 20 54 68 65  *pIdx,    /* The
1a320 20 69 6e 64 65 78 20 77 68 6f 73 65 20 63 6f 6c   index whose col
1a330 75 6d 6e 20 69 73 20 74 6f 20 62 65 20 6c 6f 61  umn is to be loa
1a340 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ded */.  int iTa
1a350 62 43 75 72 2c 20 20 20 20 2f 2a 20 43 75 72 73  bCur,    /* Curs
1a360 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  or pointing to a
1a370 20 74 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20   table row */.  
1a380 69 6e 74 20 69 49 64 78 43 6f 6c 2c 20 20 20 20  int iIdxCol,    
1a390 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 66  /* The column of
1a3a0 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65   the index to be
1a3b0 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74   loaded */.  int
1a3c0 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20   regOut      /* 
1a3d0 53 74 6f 72 65 20 74 68 65 20 69 6e 64 65 78 20  Store the index 
1a3e0 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20  column value in 
1a3f0 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f  this register */
1a400 0a 29 7b 0a 20 20 69 31 36 20 69 54 61 62 43 6f  .){.  i16 iTabCo
1a410 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  l = pIdx->aiColu
1a420 6d 6e 5b 69 49 64 78 43 6f 6c 5d 3b 0a 20 20 69  mn[iIdxCol];.  i
1a430 66 28 20 69 54 61 62 43 6f 6c 3d 3d 58 4e 5f 45  f( iTabCol==XN_E
1a440 58 50 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72  XPR ){.    asser
1a450 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70  t( pIdx->aColExp
1a460 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  r );.    assert(
1a470 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d   pIdx->aColExpr-
1a480 3e 6e 45 78 70 72 3e 69 49 64 78 43 6f 6c 20 29  >nExpr>iIdxCol )
1a490 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53  ;.    pParse->iS
1a4a0 65 6c 66 54 61 62 20 3d 20 69 54 61 62 43 75 72  elfTab = iTabCur
1a4b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1a4c0 72 43 6f 64 65 43 6f 70 79 28 70 50 61 72 73 65  rCodeCopy(pParse
1a4d0 2c 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72  , pIdx->aColExpr
1a4e0 2d 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e 70 45 78  ->a[iIdxCol].pEx
1a4f0 70 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d  pr, regOut);.  }
1a500 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
1a510 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
1a520 6d 6e 4f 66 54 61 62 6c 65 28 70 50 61 72 73 65  mnOfTable(pParse
1a530 2d 3e 70 56 64 62 65 2c 20 70 49 64 78 2d 3e 70  ->pVdbe, pIdx->p
1a540 54 61 62 6c 65 2c 20 69 54 61 62 43 75 72 2c 0a  Table, iTabCur,.
1a550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a570 20 20 20 20 69 54 61 62 43 6f 6c 2c 20 72 65 67      iTabCol, reg
1a580 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Out);.  }.}../*.
1a590 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1a5a0 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65 20   to extract the 
1a5b0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 43 6f  value of the iCo
1a5c0 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  l-th column of a
1a5d0 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20   table..*/.void 
1a5e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1a5f0 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28  etColumnOfTable(
1a600 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
1a610 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 75     /* The VDBE u
1a620 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
1a630 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  n */.  Table *pT
1a640 61 62 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61  ab,    /* The ta
1a650 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
1a660 68 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e  he value */.  in
1a670 74 20 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a  t iTabCur,    /*
1a680 20 54 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f   The table curso
1a690 72 2e 20 20 4f 72 20 74 68 65 20 50 4b 20 63 75  r.  Or the PK cu
1a6a0 72 73 6f 72 20 66 6f 72 20 57 49 54 48 4f 55 54  rsor for WITHOUT
1a6b0 20 52 4f 57 49 44 20 2a 2f 0a 20 20 69 6e 74 20   ROWID */.  int 
1a6c0 69 43 6f 6c 2c 20 20 20 20 20 20 20 2f 2a 20 49  iCol,       /* I
1a6d0 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75  ndex of the colu
1a6e0 6d 6e 20 74 6f 20 65 78 74 72 61 63 74 20 2a 2f  mn to extract */
1a6f0 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20 20 20  .  int regOut   
1a700 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68     /* Extract th
1a710 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 69  e value into thi
1a720 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b  s register */.){
1a730 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c  .  if( iCol<0 ||
1a740 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b   iCol==pTab->iPK
1a750 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
1a760 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a770 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 43 75 72  P_Rowid, iTabCur
1a780 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c  , regOut);.  }el
1a790 73 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d  se{.    int op =
1a7a0 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
1a7b0 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20   ? OP_VColumn : 
1a7c0 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69  OP_Column;.    i
1a7d0 6e 74 20 78 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  nt x = iCol;.   
1a7e0 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70   if( !HasRowid(p
1a7f0 54 61 62 29 20 26 26 20 21 49 73 56 69 72 74 75  Tab) && !IsVirtu
1a800 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
1a810 20 20 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c    x = sqlite3Col
1a820 75 6d 6e 4f 66 49 6e 64 65 78 28 73 71 6c 69 74  umnOfIndex(sqlit
1a830 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
1a840 78 28 70 54 61 62 29 2c 20 69 43 6f 6c 29 3b 0a  x(pTab), iCol);.
1a850 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1a860 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f  3VdbeAddOp3(v, o
1a870 70 2c 20 69 54 61 62 43 75 72 2c 20 78 2c 20 72  p, iTabCur, x, r
1a880 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 66  egOut);.  }.  if
1a890 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20  ( iCol>=0 ){.   
1a8a0 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65   sqlite3ColumnDe
1a8b0 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69  fault(v, pTab, i
1a8c0 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  Col, regOut);.  
1a8d0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
1a8e0 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
1a8f0 6c 6c 20 65 78 74 72 61 63 74 20 74 68 65 20 69  ll extract the i
1a900 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e  Column-th column
1a910 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70   from.** table p
1a920 54 61 62 20 61 6e 64 20 73 74 6f 72 65 20 74 68  Tab and store th
1a930 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  e column value i
1a940 6e 20 61 20 72 65 67 69 73 74 65 72 2e 20 0a 2a  n a register. .*
1a950 2a 0a 2a 2a 20 41 6e 20 65 66 66 6f 72 74 20 69  *.** An effort i
1a960 73 20 6d 61 64 65 20 74 6f 20 73 74 6f 72 65 20  s made to store 
1a970 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  the column value
1a980 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65   in register iRe
1a990 67 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6e  g.  This.** is n
1a9a0 6f 74 20 67 61 72 61 6e 74 65 65 65 64 20 66 6f  ot garanteeed fo
1a9b0 72 20 47 65 74 43 6f 6c 75 6d 6e 28 29 20 2d 20  r GetColumn() - 
1a9c0 74 68 65 20 72 65 73 75 6c 74 20 63 61 6e 20 62  the result can b
1a9d0 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 61  e stored in.** a
1a9e0 6e 79 20 72 65 67 69 73 74 65 72 2e 20 20 42 75  ny register.  Bu
1a9f0 74 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  t the result is 
1aa00 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 61  guaranteed to la
1aa10 6e 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  nd in register i
1aa20 52 65 67 0a 2a 2a 20 66 6f 72 20 47 65 74 43 6f  Reg.** for GetCo
1aa30 6c 75 6d 6e 54 6f 52 65 67 28 29 2e 0a 2a 2a 0a  lumnToReg()..**.
1aa40 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  ** There must be
1aa50 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20   an open cursor 
1aa60 74 6f 20 70 54 61 62 20 69 6e 20 69 54 61 62 6c  to pTab in iTabl
1aa70 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
1aa80 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
1aa90 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20  .  If iColumn<0 
1aaa0 74 68 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e  then code is gen
1aab0 65 72 61 74 65 64 20 74 68 61 74 20 65 78 74 72  erated that extr
1aac0 61 63 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a  acts the rowid..
1aad0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
1aae0 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
1aaf0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1ab00 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61  ,   /* Parsing a
1ab10 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
1ab20 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1ab30 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
1ab40 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
1ab50 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20  of the table we 
1ab60 61 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d  are reading from
1ab70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
1ab80 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20  n,     /* Index 
1ab90 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c  of the table col
1aba0 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  umn */.  int iTa
1abb0 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ble,      /* The
1abc0 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   cursor pointing
1abd0 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   to the table */
1abe0 0a 20 20 69 6e 74 20 69 52 65 67 2c 20 20 20 20  .  int iReg,    
1abf0 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73      /* Store res
1ac00 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 75  ults here */.  u
1ac10 38 20 70 35 20 20 20 20 20 20 20 20 20 20 20 20  8 p5            
1ac20 2f 2a 20 50 35 20 76 61 6c 75 65 20 66 6f 72 20  /* P5 value for 
1ac30 4f 50 5f 43 6f 6c 75 6d 6e 20 2b 20 46 4c 41 47  OP_Column + FLAG
1ac40 53 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  S */.){.  Vdbe *
1ac50 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1ac60 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
1ac70 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
1ac80 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  p;..  for(i=0, p
1ac90 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
1aca0 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
1acb0 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
1acc0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
1acd0 52 65 67 3e 30 20 26 26 20 70 2d 3e 69 54 61 62  Reg>0 && p->iTab
1ace0 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 2d  le==iTable && p-
1acf0 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d  >iColumn==iColum
1ad00 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6c 72  n ){.      p->lr
1ad10 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  u = pParse->iCac
1ad20 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73  heCnt++;.      s
1ad30 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1ad40 69 6e 52 65 67 69 73 74 65 72 28 70 50 61 72 73  inRegister(pPars
1ad50 65 2c 20 70 2d 3e 69 52 65 67 29 3b 0a 20 20 20  e, p->iReg);.   
1ad60 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 52 65     return p->iRe
1ad70 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20  g;.    }.  }  . 
1ad80 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
1ad90 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  .  sqlite3ExprCo
1ada0 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62  deGetColumnOfTab
1adb0 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 54 61 62  le(v, pTab, iTab
1adc0 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65  le, iColumn, iRe
1add0 67 29 3b 0a 20 20 69 66 28 20 70 35 20 29 7b 0a  g);.  if( p5 ){.
1ade0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1adf0 68 61 6e 67 65 50 35 28 76 2c 20 70 35 29 3b 0a  hangeP5(v, p5);.
1ae00 20 20 7d 65 6c 73 65 7b 20 20 20 0a 20 20 20 20    }else{   .    
1ae10 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1ae20 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 54  Store(pParse, iT
1ae30 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69  able, iColumn, i
1ae40 52 65 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Reg);.  }.  retu
1ae50 72 6e 20 69 52 65 67 3b 0a 7d 0a 76 6f 69 64 20  rn iReg;.}.void 
1ae60 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1ae70 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 0a 20  etColumnToReg(. 
1ae80 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1ae90 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
1aea0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
1aeb0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61   context */.  Ta
1aec0 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f  ble *pTab,     /
1aed0 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * Description of
1aee0 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72   the table we ar
1aef0 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a  e reading from *
1af00 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c  /.  int iColumn,
1af10 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1af20 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d   the table colum
1af30 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  n */.  int iTabl
1af40 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  e,      /* The c
1af50 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
1af60 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  o the table */. 
1af70 20 69 6e 74 20 69 52 65 67 20 20 20 20 20 20 20   int iReg       
1af80 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c    /* Store resul
1af90 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
1afa0 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
1afb0 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
1afc0 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  n(pParse, pTab, 
1afd0 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 6c 65 2c  iColumn, iTable,
1afe0 20 69 52 65 67 2c 20 30 29 3b 0a 20 20 69 66 28   iReg, 0);.  if(
1aff0 20 72 31 21 3d 69 52 65 67 20 29 20 73 71 6c 69   r1!=iReg ) sqli
1b000 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50  te3VdbeAddOp2(pP
1b010 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
1b020 53 43 6f 70 79 2c 20 72 31 2c 20 69 52 65 67 29  SCopy, r1, iReg)
1b030 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ;.}.../*.** Clea
1b040 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63  r all column cac
1b050 68 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76  he entries..*/.v
1b060 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1b070 61 63 68 65 43 6c 65 61 72 28 50 61 72 73 65 20  acheClear(Parse 
1b080 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20  *pParse){.  int 
1b090 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
1b0a0 43 61 63 68 65 20 2a 70 3b 0a 0a 23 69 66 20 53  Cache *p;..#if S
1b0b0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66  QLITE_DEBUG.  if
1b0c0 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  ( pParse->db->fl
1b0d0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
1b0e0 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20  eAddopTrace ){. 
1b0f0 20 20 20 70 72 69 6e 74 66 28 22 43 4c 45 41 52     printf("CLEAR
1b100 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  \n");.  }.#endif
1b110 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
1b120 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
1b130 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
1b140 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
1b150 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67  .    if( p->iReg
1b160 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45   ){.      cacheE
1b170 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65  ntryClear(pParse
1b180 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , p);.    }.  }.
1b190 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20  }../*.** Record 
1b1a0 74 68 65 20 66 61 63 74 20 74 68 61 74 20 61 6e  the fact that an
1b1b0 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65   affinity change
1b1c0 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 6f 6e   has occurred on
1b1d0 20 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73   iCount.** regis
1b1e0 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 77 69  ters starting wi
1b1f0 74 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f  th iStart..*/.vo
1b200 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
1b210 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
1b220 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1b230 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74   int iStart, int
1b240 20 69 43 6f 75 6e 74 29 7b 0a 20 20 73 71 6c 69   iCount){.  sqli
1b250 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
1b260 76 65 28 70 50 61 72 73 65 2c 20 69 53 74 61 72  ve(pParse, iStar
1b270 74 2c 20 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f  t, iCount);.}../
1b280 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1b290 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65  de to move conte
1b2a0 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72  nt from register
1b2b0 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b  s iFrom...iFrom+
1b2c0 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74  nReg-1.** over t
1b2d0 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d  o iTo..iTo+nReg-
1b2e0 31 2e 20 4b 65 65 70 20 74 68 65 20 63 6f 6c 75  1. Keep the colu
1b2f0 6d 6e 20 63 61 63 68 65 20 75 70 2d 74 6f 2d 64  mn cache up-to-d
1b300 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ate..*/.void sql
1b310 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
1b320 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1b330 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
1b340 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  To, int nReg){. 
1b350 20 61 73 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d   assert( iFrom>=
1b360 69 54 6f 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f  iTo+nReg || iFro
1b370 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20  m+nReg<=iTo );. 
1b380 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b390 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p3(pParse->pVdbe
1b3a0 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d  , OP_Move, iFrom
1b3b0 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 20 20  , iTo, nReg);.  
1b3c0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1b3d0 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69  Remove(pParse, i
1b3e0 46 72 6f 6d 2c 20 6e 52 65 67 29 3b 0a 7d 0a 0a  From, nReg);.}..
1b3f0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1b400 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
1b410 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45  ined(SQLITE_COVE
1b420 52 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  RAGE_TEST)./*.**
1b430 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
1b440 61 6e 79 20 72 65 67 69 73 74 65 72 20 69 6e 20  any register in 
1b450 74 68 65 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e  the range iFrom.
1b460 2e 69 54 6f 20 28 69 6e 63 6c 75 73 69 76 65 29  .iTo (inclusive)
1b470 0a 2a 2a 20 69 73 20 75 73 65 64 20 61 73 20 70  .** is used as p
1b480 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  art of the colum
1b490 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54  n cache..**.** T
1b4a0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
1b4b0 73 65 64 20 77 69 74 68 69 6e 20 61 73 73 65 72  sed within asser
1b4c0 74 28 29 20 61 6e 64 20 74 65 73 74 63 61 73 65  t() and testcase
1b4d0 28 29 20 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a  () macros only.*
1b4e0 2a 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61  * and does not a
1b4f0 70 70 65 61 72 20 69 6e 20 61 20 6e 6f 72 6d 61  ppear in a norma
1b500 6c 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74  l build..*/.stat
1b510 69 63 20 69 6e 74 20 75 73 65 64 41 73 43 6f 6c  ic int usedAsCol
1b520 75 6d 6e 43 61 63 68 65 28 50 61 72 73 65 20 2a  umnCache(Parse *
1b530 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f  pParse, int iFro
1b540 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69  m, int iTo){.  i
1b550 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
1b560 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66  ColCache *p;.  f
1b570 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
1b580 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
1b590 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
1b5a0 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
1b5b0 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67   int r = p->iReg
1b5c0 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 46 72  ;.    if( r>=iFr
1b5d0 6f 6d 20 26 26 20 72 3c 3d 69 54 6f 20 29 20 72  om && r<=iTo ) r
1b5e0 65 74 75 72 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f  eturn 1;    /*NO
1b5f0 5f 54 45 53 54 2a 2f 0a 20 20 7d 0a 20 20 72 65  _TEST*/.  }.  re
1b600 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
1b610 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
1b620 20 7c 7c 20 53 51 4c 49 54 45 5f 43 4f 56 45 52   || SQLITE_COVER
1b630 41 47 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a  AGE_TEST */.../*
1b640 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 73 63  .** Convert a sc
1b650 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20  alar expression 
1b660 6e 6f 64 65 20 74 6f 20 61 20 54 4b 5f 52 45 47  node to a TK_REG
1b670 49 53 54 45 52 20 72 65 66 65 72 65 6e 63 69 6e  ISTER referencin
1b680 67 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 52  g.** register iR
1b690 65 67 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20  eg.  The caller 
1b6a0 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74  must ensure that
1b6b0 20 69 52 65 67 20 61 6c 72 65 61 64 79 20 63 6f   iReg already co
1b6c0 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 63 6f  ntains.** the co
1b6d0 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20  rrect value for 
1b6e0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  the expression..
1b6f0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
1b700 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 45 78  xprToRegister(Ex
1b710 70 72 20 2a 70 2c 20 69 6e 74 20 69 52 65 67 29  pr *p, int iReg)
1b720 7b 0a 20 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e  {.  p->op2 = p->
1b730 6f 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b  op;.  p->op = TK
1b740 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e  _REGISTER;.  p->
1b750 69 54 61 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20  iTable = iReg;. 
1b760 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72   ExprClearProper
1b770 74 79 28 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a  ty(p, EP_Skip);.
1b780 7d 0a 0a 2f 2a 0a 2a 2a 20 45 76 61 6c 75 61 74  }../*.** Evaluat
1b790 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
1b7a0 28 65 69 74 68 65 72 20 61 20 76 65 63 74 6f 72  (either a vector
1b7b0 20 6f 72 20 61 20 73 63 61 6c 61 72 20 65 78 70   or a scalar exp
1b7c0 72 65 73 73 69 6f 6e 29 20 61 6e 64 20 73 74 6f  ression) and sto
1b7d0 72 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  re.** the result
1b7e0 20 69 6e 20 63 6f 6e 74 69 6e 67 75 6f 75 73 20   in continguous 
1b7f0 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
1b800 65 72 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ers.  Return the
1b810 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
1b820 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
1b830 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  used to store th
1b840 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20  e result..**.** 
1b850 49 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  If the returned 
1b860 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20  result register 
1b870 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 73  is a temporary s
1b880 63 61 6c 61 72 2c 20 74 68 65 6e 20 61 6c 73 6f  calar, then also
1b890 20 77 72 69 74 65 0a 2a 2a 20 74 68 61 74 20 72   write.** that r
1b8a0 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 69  egister number i
1b8b0 6e 74 6f 20 2a 70 69 46 72 65 65 61 62 6c 65 2e  nto *piFreeable.
1b8c0 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 65    If the returne
1b8d0 64 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  d result registe
1b8e0 72 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 74 65  r.** is not a te
1b8f0 6d 70 6f 72 61 72 79 20 6f 72 20 69 66 20 74 68  mporary or if th
1b900 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1b910 61 20 76 65 63 74 6f 72 20 73 65 74 20 2a 70 69  a vector set *pi
1b920 46 72 65 65 61 62 6c 65 0a 2a 2a 20 74 6f 20 30  Freeable.** to 0
1b930 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b940 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 50  exprCodeVector(P
1b950 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
1b960 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 69 46 72  pr *p, int *piFr
1b970 65 65 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69  eeable){.  int i
1b980 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 6e 52  Result;.  int nR
1b990 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 45  esult = sqlite3E
1b9a0 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 29  xprVectorSize(p)
1b9b0 3b 0a 20 20 69 66 28 20 6e 52 65 73 75 6c 74 3d  ;.  if( nResult=
1b9c0 3d 31 20 29 7b 0a 20 20 20 20 69 52 65 73 75 6c  =1 ){.    iResul
1b9d0 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  t = sqlite3ExprC
1b9e0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1b9f0 70 2c 20 70 69 46 72 65 65 61 62 6c 65 29 3b 0a  p, piFreeable);.
1ba00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 69    }else{.    *pi
1ba10 46 72 65 65 61 62 6c 65 20 3d 20 30 3b 0a 20 20  Freeable = 0;.  
1ba20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
1ba30 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20  SELECT ){.      
1ba40 69 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65  iResult = sqlite
1ba50 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
1ba60 50 61 72 73 65 2c 20 70 2c 20 30 2c 20 30 29 3b  Parse, p, 0, 0);
1ba70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1ba80 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
1ba90 52 65 73 75 6c 74 20 3d 20 70 50 61 72 73 65 2d  Result = pParse-
1baa0 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 70  >nMem+1;.      p
1bab0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
1bac0 52 65 73 75 6c 74 3b 0a 20 20 20 20 20 20 66 6f  Result;.      fo
1bad0 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74  r(i=0; i<nResult
1bae0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1baf0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1bb00 70 50 61 72 73 65 2c 20 70 2d 3e 78 2e 70 4c 69  pParse, p->x.pLi
1bb10 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
1bb20 69 2b 69 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  i+iResult);.    
1bb30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1bb40 72 65 74 75 72 6e 20 69 52 65 73 75 6c 74 3b 0a  return iResult;.
1bb50 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
1bb60 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65  te code into the
1bb70 20 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f   current Vdbe to
1bb80 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69   evaluate the gi
1bb90 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
1bba0 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73  n.  Attempt to s
1bbb0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
1bbc0 20 69 6e 20 72 65 67 69 73 74 65 72 20 22 74 61   in register "ta
1bbd0 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e  rget"..** Return
1bbe0 20 74 68 65 20 72 65 67 69 73 74 65 72 20 77 68   the register wh
1bbf0 65 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  ere results are 
1bc00 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69  stored..**.** Wi
1bc10 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  th this routine,
1bc20 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61   there is no gua
1bc30 72 61 6e 74 65 65 20 74 68 61 74 20 72 65 73 75  rantee that resu
1bc40 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73  lts will.** be s
1bc50 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e  tored in target.
1bc60 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67    The result mig
1bc70 68 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ht be stored in 
1bc80 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65  some other.** re
1bc90 67 69 73 74 65 72 20 69 66 20 69 74 20 69 73 20  gister if it is 
1bca0 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f  convenient to do
1bcb0 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e   so.  The callin
1bcc0 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  g function.** mu
1bcd0 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74  st check the ret
1bce0 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76  urn code and mov
1bcf0 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f  e the results to
1bd00 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20   the desired.** 
1bd10 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74  register..*/.int
1bd20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1bd30 54 61 72 67 65 74 28 50 61 72 73 65 20 2a 70 50  Target(Parse *pP
1bd40 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1bd50 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
1bd60 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1bd70 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54  se->pVdbe;  /* T
1bd80 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73  he VM under cons
1bd90 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
1bda0 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
1bdb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
1bdc0 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65  pcode being code
1bdd0 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67  d */.  int inReg
1bde0 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20 20 20   = target;      
1bdf0 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72   /* Results stor
1be00 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ed in register i
1be10 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65  nReg */.  int re
1be20 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20  gFree1 = 0;     
1be30 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
1be40 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d  ro free this tem
1be50 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
1be60 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  */.  int regFree
1be70 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  2 = 0;         /
1be80 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72  * If non-zero fr
1be90 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  ee this temporar
1bea0 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  y register */.  
1beb0 69 6e 74 20 72 31 2c 20 72 32 3b 20 20 20 20 20  int r1, r2;     
1bec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 72            /* Var
1bed0 69 6f 75 73 20 72 65 67 69 73 74 65 72 20 6e 75  ious register nu
1bee0 6d 62 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74  mbers */.  sqlit
1bef0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1bf00 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61  >db; /* The data
1bf10 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1bf20 2a 2f 0a 20 20 45 78 70 72 20 74 65 6d 70 58 3b  */.  Expr tempX;
1bf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bf40 2a 20 54 65 6d 70 6f 72 61 72 79 20 65 78 70 72  * Temporary expr
1bf50 65 73 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f 0a 20  ession node */. 
1bf60 20 69 6e 74 20 70 35 20 3d 20 30 3b 0a 0a 20 20   int p5 = 0;..  
1bf70 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
1bf80 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72   && target<=pPar
1bf90 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66  se->nMem );.  if
1bfa0 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ( v==0 ){.    as
1bfb0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
1bfc0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1bfd0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1bfe0 20 20 7d 0a 0a 20 20 69 66 28 20 70 45 78 70 72    }..  if( pExpr
1bff0 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20  ==0 ){.    op = 
1c000 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65  TK_NULL;.  }else
1c010 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72  {.    op = pExpr
1c020 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74  ->op;.  }.  swit
1c030 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
1c040 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
1c050 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66  : {.      AggInf
1c060 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45  o *pAggInfo = pE
1c070 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20  xpr->pAggInfo;. 
1c080 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
1c090 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20  nfo_col *pCol = 
1c0a0 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  &pAggInfo->aCol[
1c0b0 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20  pExpr->iAgg];.  
1c0c0 20 20 20 20 69 66 28 20 21 70 41 67 67 49 6e 66      if( !pAggInf
1c0d0 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b  o->directMode ){
1c0e0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1c0f0 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b   pCol->iMem>0 );
1c100 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
1c110 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20   pCol->iMem;.   
1c120 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c130 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67    }else if( pAgg
1c140 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67  Info->useSorting
1c150 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Idx ){.        s
1c160 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1c170 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70  (v, OP_Column, p
1c180 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67  AggInfo->sorting
1c190 49 64 78 50 54 61 62 2c 0a 20 20 20 20 20 20 20  IdxPTab,.       
1c1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1b0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
1c1c0 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67  rterColumn, targ
1c1d0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  et);.        bre
1c1e0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1c1f0 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    /* Otherwise, 
1c200 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74  fall thru into t
1c210 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73  he TK_COLUMN cas
1c220 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63  e */.    }.    c
1c230 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
1c240 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61 62 20  .      int iTab 
1c250 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  = pExpr->iTable;
1c260 0a 20 20 20 20 20 20 69 66 28 20 69 54 61 62 3c  .      if( iTab<
1c270 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
1c280 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e   pParse->ckBase>
1c290 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
1c2a0 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 43 48 45  * Generating CHE
1c2b0 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  CK constraints o
1c2c0 72 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f  r inserting into
1c2d0 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 2a   partial index *
1c2e0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 52 65  /.          inRe
1c2f0 67 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  g = pExpr->iColu
1c300 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b 42  mn + pParse->ckB
1c310 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ase;.          b
1c320 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
1c330 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
1c340 2a 20 43 6f 64 69 6e 67 20 61 6e 20 65 78 70 72  * Coding an expr
1c350 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 70  ession that is p
1c360 61 72 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  art of an index 
1c370 77 68 65 72 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  where column nam
1c380 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
1c390 69 6e 20 74 68 65 20 69 6e 64 65 78 20 72 65 66  in the index ref
1c3a0 65 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  er to the table 
1c3b0 74 6f 20 77 68 69 63 68 20 74 68 65 20 69 6e 64  to which the ind
1c3c0 65 78 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20  ex belongs */.  
1c3d0 20 20 20 20 20 20 20 20 69 54 61 62 20 3d 20 70          iTab = p
1c3e0 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 3b  Parse->iSelfTab;
1c3f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c400 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   }.      inReg =
1c410 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c420 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  GetColumn(pParse
1c430 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20  , pExpr->pTab,. 
1c440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1c460 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54  xpr->iColumn, iT
1c470 61 62 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20  ab, target,.    
1c480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c490 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1c4a0 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 20 20 62 72  ->op2);.      br
1c4b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1c4c0 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
1c4d0 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65  {.      codeInte
1c4e0 67 65 72 28 70 50 61 72 73 65 2c 20 70 45 78 70  ger(pParse, pExp
1c4f0 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 0, target);. 
1c500 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c510 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1c520 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
1c530 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b  OINT.    case TK
1c540 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
1c550 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1c560 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1c570 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1c580 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
1c590 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1c5a0 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  n, 0, target);. 
1c5b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c5c0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
1c5d0 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20  e TK_STRING: {. 
1c5e0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1c5f0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1c600 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1c610 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) );.      sqlit
1c620 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67  e3VdbeLoadString
1c630 28 76 2c 20 74 61 72 67 65 74 2c 20 70 45 78 70  (v, target, pExp
1c640 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
1c650 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c660 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c  .    case TK_NUL
1c670 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
1c680 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1c690 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67  OP_Null, 0, targ
1c6a0 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  et);.      break
1c6b0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1c6c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42  SQLITE_OMIT_BLOB
1c6d0 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73  _LITERAL.    cas
1c6e0 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_BLOB: {.   
1c6f0 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
1c700 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
1c710 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62       char *zBlob
1c720 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1c730 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1c740 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1c750 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73  lue) );.      as
1c760 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
1c770 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c  Token[0]=='x' ||
1c780 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1c790 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20  [0]=='X' );.    
1c7a0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1c7b0 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c  >u.zToken[1]=='\
1c7c0 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20  '' );.      z = 
1c7d0 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  &pExpr->u.zToken
1c7e0 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73  [2];.      n = s
1c7f0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1c800 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73  ) - 1;.      ass
1c810 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20  ert( z[n]=='\'' 
1c820 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d  );.      zBlob =
1c830 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f   sqlite3HexToBlo
1c840 62 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  b(sqlite3VdbeDb(
1c850 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  v), z, n);.     
1c860 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c870 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e  p4(v, OP_Blob, n
1c880 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a  /2, target, 0, z
1c890 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43  Blob, P4_DYNAMIC
1c8a0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1c8b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1c8c0 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
1c8d0 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  E: {.      asser
1c8e0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1c8f0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1c900 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1c910 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1c920 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20  u.zToken!=0 );. 
1c930 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
1c940 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21  pr->u.zToken[0]!
1c950 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1c960 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1c970 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45   OP_Variable, pE
1c980 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61  xpr->iColumn, ta
1c990 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28  rget);.      if(
1c9a0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1c9b0 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  [1]!=0 ){.      
1c9c0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1c9d0 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f  >u.zToken[0]=='?
1c9e0 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ' .             
1c9f0 7c 7c 20 73 74 72 63 6d 70 28 70 45 78 70 72 2d  || strcmp(pExpr-
1ca00 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 50 61 72 73  >u.zToken, pPars
1ca10 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72 2d 3e  e->azVar[pExpr->
1ca20 69 43 6f 6c 75 6d 6e 2d 31 5d 29 3d 3d 30 20 29  iColumn-1])==0 )
1ca30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1ca40 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
1ca50 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56   -1, pParse->azV
1ca60 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ar[pExpr->iColum
1ca70 6e 2d 31 5d 2c 20 50 34 5f 53 54 41 54 49 43 29  n-1], P4_STATIC)
1ca80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ca90 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1caa0 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
1cab0 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67  R: {.      inReg
1cac0 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
1cad0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1cae0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1caf0 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20  ITE_OMIT_CAST.  
1cb00 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20    case TK_CAST: 
1cb10 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65  {.      /* Expre
1cb20 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f  ssions of the fo
1cb30 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74  rm:   CAST(pLeft
1cb40 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20   AS token) */.  
1cb50 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
1cb60 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
1cb70 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
1cb80 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b  >pLeft, target);
1cb90 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67  .      if( inReg
1cba0 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20  !=target ){.    
1cbb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1cbc0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
1cbd0 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74  y, inReg, target
1cbe0 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  );.        inReg
1cbf0 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20   = target;.     
1cc00 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1cc10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1cc20 5f 43 61 73 74 2c 20 74 61 72 67 65 74 2c 0a 20  _Cast, target,. 
1cc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 66         sqlite3Af
1cc50 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70 72  finityType(pExpr
1cc60 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 29 3b  ->u.zToken, 0));
1cc70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1cc80 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63   usedAsColumnCac
1cc90 68 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67  he(pParse, inReg
1cca0 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20 20 20 20  , inReg) );.    
1ccb0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1ccc0 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
1ccd0 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20  (pParse, inReg, 
1cce0 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
1ccf0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
1cd00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53   SQLITE_OMIT_CAS
1cd10 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  T */.    case TK
1cd20 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
1cd30 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 6f 70  _ISNOT:.      op
1cd40 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f   = (op==TK_IS) ?
1cd50 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a   TK_EQ : TK_NE;.
1cd60 20 20 20 20 20 20 70 35 20 3d 20 53 51 4c 49 54        p5 = SQLIT
1cd70 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20  E_NULLEQ;.      
1cd80 2f 2a 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68 20  /* fall-through 
1cd90 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  */.    case TK_L
1cda0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
1cdb0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
1cdc0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
1cdd0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
1cde0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
1cdf0 51 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20  Q: {.      Expr 
1ce00 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
1ce10 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 69 66 28  pLeft;.      if(
1ce20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65   sqlite3ExprIsVe
1ce30 63 74 6f 72 28 70 4c 65 66 74 29 20 29 7b 0a 20  ctor(pLeft) ){. 
1ce40 20 20 20 20 20 20 20 63 6f 64 65 56 65 63 74 6f         codeVecto
1ce50 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  rCompare(pParse,
1ce60 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20   pExpr, target, 
1ce70 6f 70 2c 20 70 35 29 3b 0a 20 20 20 20 20 20 7d  op, p5);.      }
1ce80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31  else{.        r1
1ce90 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1cea0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1ceb0 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1cec0 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73  ;.        r2 = s
1ced0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1cee0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1cef0 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
1cf00 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  ee2);.        co
1cf10 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
1cf20 2c 20 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  , pLeft, pExpr->
1cf30 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
1cf40 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
1cf50 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54  inReg, SQLITE_ST
1cf60 4f 52 45 50 32 20 7c 20 70 35 29 3b 0a 20 20 20  OREP2 | p5);.   
1cf70 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
1cf80 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63  T==OP_Lt); testc
1cf90 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20  ase(op==OP_Lt); 
1cfa0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1cfb0 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20  ,op==OP_Lt);.   
1cfc0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
1cfd0 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63  E==OP_Le); testc
1cfe0 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20  ase(op==OP_Le); 
1cff0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1d000 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20  ,op==OP_Le);.   
1d010 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
1d020 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63  T==OP_Gt); testc
1d030 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20  ase(op==OP_Gt); 
1d040 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1d050 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20  ,op==OP_Gt);.   
1d060 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
1d070 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63  E==OP_Ge); testc
1d080 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20  ase(op==OP_Ge); 
1d090 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1d0a0 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20  ,op==OP_Ge);.   
1d0b0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45       assert(TK_E
1d0c0 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63  Q==OP_Eq); testc
1d0d0 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20  ase(op==OP_Eq); 
1d0e0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1d0f0 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20  ,op==OP_Eq);.   
1d100 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e       assert(TK_N
1d110 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63  E==OP_Ne); testc
1d120 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20  ase(op==OP_Ne); 
1d130 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1d140 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20  ,op==OP_Ne);.   
1d150 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1d160 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1d170 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1d180 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
1d190 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
1d1a0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1d1b0 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63  se TK_AND:.    c
1d1c0 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63  ase TK_OR:.    c
1d1d0 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20  ase TK_PLUS:.   
1d1e0 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20   case TK_STAR:. 
1d1f0 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53     case TK_MINUS
1d200 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  :.    case TK_RE
1d210 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  M:.    case TK_B
1d220 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20  ITAND:.    case 
1d230 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61  TK_BITOR:.    ca
1d240 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20  se TK_SLASH:.   
1d250 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a   case TK_LSHIFT:
1d260 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48  .    case TK_RSH
1d270 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54  IFT: .    case T
1d280 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20  K_CONCAT: {.    
1d290 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44    assert( TK_AND
1d2a0 3d 3d 4f 50 5f 41 6e 64 20 29 3b 20 20 20 20 20  ==OP_And );     
1d2b0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1d2c0 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20   op==TK_AND );. 
1d2d0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1d2e0 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20 20 20  OR==OP_Or );    
1d2f0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
1d300 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b  se( op==TK_OR );
1d310 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1d320 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29  K_PLUS==OP_Add )
1d330 3b 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;           test
1d340 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55  case( op==TK_PLU
1d350 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  S );.      asser
1d360 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f  t( TK_MINUS==OP_
1d370 53 75 62 74 72 61 63 74 20 29 3b 20 20 20 20 20  Subtract );     
1d380 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1d390 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20 20 20  _MINUS );.      
1d3a0 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d  assert( TK_REM==
1d3b0 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 20  OP_Remainder ); 
1d3c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1d3d0 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20  p==TK_REM );.   
1d3e0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
1d3f0 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20  TAND==OP_BitAnd 
1d400 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65  );      testcase
1d410 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20  ( op==TK_BITAND 
1d420 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1d430 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69   TK_BITOR==OP_Bi
1d440 74 4f 72 20 29 3b 20 20 20 20 20 20 20 20 74 65  tOr );        te
1d450 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42  stcase( op==TK_B
1d460 49 54 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73  ITOR );.      as
1d470 73 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d  sert( TK_SLASH==
1d480 4f 50 5f 44 69 76 69 64 65 20 29 3b 20 20 20 20  OP_Divide );    
1d490 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1d4a0 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20  =TK_SLASH );.   
1d4b0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53     assert( TK_LS
1d4c0 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65  HIFT==OP_ShiftLe
1d4d0 66 74 20 29 3b 20 20 20 74 65 73 74 63 61 73 65  ft );   testcase
1d4e0 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20  ( op==TK_LSHIFT 
1d4f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1d500 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53   TK_RSHIFT==OP_S
1d510 68 69 66 74 52 69 67 68 74 20 29 3b 20 20 74 65  hiftRight );  te
1d520 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52  stcase( op==TK_R
1d530 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61  SHIFT );.      a
1d540 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54  ssert( TK_CONCAT
1d550 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 20 20  ==OP_Concat );  
1d560 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1d570 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20  ==TK_CONCAT );. 
1d580 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1d590 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1d5a0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1d5b0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1d5c0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
1d5d0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1d5e0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1d5f0 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
1d600 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1d610 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c  dbeAddOp3(v, op,
1d620 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29   r2, r1, target)
1d630 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1d640 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1d650 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d660 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
1d670 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d680 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
1d690 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45  MINUS: {.      E
1d6a0 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
1d6b0 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
1d6c0 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29   assert( pLeft )
1d6d0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66  ;.      if( pLef
1d6e0 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45  t->op==TK_INTEGE
1d6f0 52 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  R ){.        cod
1d700 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c  eInteger(pParse,
1d710 20 70 4c 65 66 74 2c 20 31 2c 20 74 61 72 67 65   pLeft, 1, targe
1d720 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t);.#ifndef SQLI
1d730 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
1d740 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65 6c  _POINT.      }el
1d750 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70  se if( pLeft->op
1d760 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20  ==TK_FLOAT ){.  
1d770 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1d780 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1d790 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
1d7a0 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  e) );.        co
1d7b0 64 65 52 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d  deReal(v, pLeft-
1d7c0 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61  >u.zToken, 1, ta
1d7d0 72 67 65 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rget);.#endif.  
1d7e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d7f0 20 20 20 74 65 6d 70 58 2e 6f 70 20 3d 20 54 4b     tempX.op = TK
1d800 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20  _INTEGER;.      
1d810 20 20 74 65 6d 70 58 2e 66 6c 61 67 73 20 3d 20    tempX.flags = 
1d820 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 54  EP_IntValue|EP_T
1d830 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 20 20  okenOnly;.      
1d840 20 20 74 65 6d 70 58 2e 75 2e 69 56 61 6c 75 65    tempX.u.iValue
1d850 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 31   = 0;.        r1
1d860 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1d870 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26  deTemp(pParse, &
1d880 74 65 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31  tempX, &regFree1
1d890 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20  );.        r2 = 
1d8a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1d8b0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1d8c0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
1d8d0 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ee2);.        sq
1d8e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1d8f0 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20  v, OP_Subtract, 
1d900 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b  r2, r1, target);
1d910 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1d920 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
1d930 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d940 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a  inReg = target;.
1d950 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d960 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
1d970 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20  ITNOT:.    case 
1d980 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
1d990 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f  assert( TK_BITNO
1d9a0 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 20  T==OP_BitNot ); 
1d9b0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1d9c0 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20  TK_BITNOT );.   
1d9d0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
1d9e0 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20 20 20  T==OP_Not );    
1d9f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1da00 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20  p==TK_NOT );.   
1da10 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1da20 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1da30 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1da40 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1da50 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1da60 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1da70 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65     inReg = targe
1da80 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
1da90 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
1daa0 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20  , r1, inReg);.  
1dab0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1dac0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
1dad0 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
1dae0 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
1daf0 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
1db00 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e    assert( TK_ISN
1db10 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29  ULL==OP_IsNull )
1db20 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  ;   testcase( op
1db30 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==TK_ISNULL );. 
1db40 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1db50 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e  NOTNULL==OP_NotN
1db60 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28  ull ); testcase(
1db70 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
1db80 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1db90 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1dba0 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72  _Integer, 1, tar
1dbb0 67 65 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  get);.      r1 =
1dbc0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1dbd0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1dbe0 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1dbf0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73  ree1);.      tes
1dc00 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1dc10 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72  =0 );.      addr
1dc20 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1dc30 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b  dOp1(v, op, r1);
1dc40 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
1dc50 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
1dc60 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56  ISNULL);.      V
1dc70 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1dc80 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29   op==TK_NOTNULL)
1dc90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1dca0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1dcb0 49 6e 74 65 67 65 72 2c 20 30 2c 20 74 61 72 67  Integer, 0, targ
1dcc0 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
1dcd0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
1dce0 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 62  , addr);.      b
1dcf0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1dd00 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
1dd10 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67  TION: {.      Ag
1dd20 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70  gInfo *pInfo = p
1dd30 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a  Expr->pAggInfo;.
1dd40 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d        if( pInfo=
1dd50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
1dd60 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1dd70 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1dd80 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1dd90 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1dda0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d  orMsg(pParse, "m
1ddb0 69 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61  isuse of aggrega
1ddc0 74 65 3a 20 25 73 28 29 22 2c 20 70 45 78 70 72  te: %s()", pExpr
1ddd0 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
1dde0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ddf0 20 20 69 6e 52 65 67 20 3d 20 70 49 6e 66 6f 2d    inReg = pInfo-
1de00 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41  >aFunc[pExpr->iA
1de10 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20  gg].iMem;.      
1de20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
1de30 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1de40 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
1de50 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 61     ExprList *pFa
1de60 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  rg;       /* Lis
1de70 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  t of function ar
1de80 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
1de90 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20 20 20   int nFarg;     
1dea0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1deb0 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  r of function ar
1dec0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
1ded0 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20   FuncDef *pDef; 
1dee0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
1def0 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69  unction definiti
1df00 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  on object */.   
1df10 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1df20 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Id;       /* The
1df30 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
1df40 2f 0a 20 20 20 20 20 20 75 33 32 20 63 6f 6e 73  /.      u32 cons
1df50 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 2f  tMask = 0;     /
1df60 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74 69  * Mask of functi
1df70 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61  on arguments tha
1df80 74 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 20 2a  t are constant *
1df90 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  /.      int i;  
1dfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1dfb0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
1dfc0 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d  /.      u8 enc =
1dfd0 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20 20 2f   ENC(db);      /
1dfe0 2a 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f 64  * The text encod
1dff0 69 6e 67 20 75 73 65 64 20 62 79 20 74 68 69 73  ing used by this
1e000 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
1e010 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
1e020 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20 63  l = 0;    /* A c
1e030 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1e040 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65  e */..      asse
1e050 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1e060 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
1e070 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
1e080 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
1e090 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1e0a0 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
1e0b0 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 30         pFarg = 0
1e0c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1e0d0 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 70         pFarg = p
1e0e0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
1e0f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 61       }.      nFa
1e100 72 67 20 3d 20 70 46 61 72 67 20 3f 20 70 46 61  rg = pFarg ? pFa
1e110 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20  rg->nExpr : 0;. 
1e120 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1e130 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1e140 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1e150 29 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d  ) );.      zId =
1e160 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1e170 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73  ;.      pDef = s
1e180 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
1e190 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 46 61 72  on(db, zId, nFar
1e1a0 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 23 69 66 64  g, enc, 0);.#ifd
1e1b0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1e1c0 5f 55 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e  _UNKNOWN_SQL_FUN
1e1d0 43 54 49 4f 4e 0a 20 20 20 20 20 20 69 66 28 20  CTION.      if( 
1e1e0 70 44 65 66 3d 3d 30 20 26 26 20 70 50 61 72 73  pDef==0 && pPars
1e1f0 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
1e200 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
1e210 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
1e220 28 64 62 2c 20 22 75 6e 6b 6e 6f 77 6e 22 2c 20  (db, "unknown", 
1e230 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a  nFarg, enc, 0);.
1e240 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1e250 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30       if( pDef==0
1e260 20 7c 7c 20 70 44 65 66 2d 3e 78 46 69 6e 61 6c   || pDef->xFinal
1e270 69 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize!=0 ){.      
1e280 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1e290 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f  g(pParse, "unkno
1e2a0 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73 28  wn function: %s(
1e2b0 29 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20  )", zId);.      
1e2c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1e2d0 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d  ..      /* Attem
1e2e0 70 74 20 61 20 64 69 72 65 63 74 20 69 6d 70 6c  pt a direct impl
1e2f0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
1e300 65 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c 45  e built-in COALE
1e310 53 43 45 28 29 20 61 6e 64 0a 20 20 20 20 20 20  SCE() and.      
1e320 2a 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63  ** IFNULL() func
1e330 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 61 76 6f  tions.  This avo
1e340 69 64 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20  ids unnecessary 
1e350 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 0a 20 20  evaluation of.  
1e360 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73      ** arguments
1e370 20 70 61 73 74 20 74 68 65 20 66 69 72 73 74 20   past the first 
1e380 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e  non-NULL argumen
1e390 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
1e3a0 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63    if( pDef->func
1e3b0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
1e3c0 55 4e 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a  UNC_COALESCE ){.
1e3d0 20 20 20 20 20 20 20 20 69 6e 74 20 65 6e 64 43          int endC
1e3e0 6f 61 6c 65 73 63 65 20 3d 20 73 71 6c 69 74 65  oalesce = sqlite
1e3f0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1e400 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1e410 74 28 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20  t( nFarg>=2 );. 
1e420 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1e430 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1e440 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
1e450 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1e460 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46     for(i=1; i<nF
1e470 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  arg; i++){.     
1e480 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e490 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp2(v, OP_Not
1e4a0 4e 75 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e  Null, target, en
1e4b0 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20  dCoalesce);.    
1e4c0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1e4d0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
1e4e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1e4f0 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20  eRemove(pParse, 
1e500 74 61 72 67 65 74 2c 20 31 29 3b 0a 20 20 20 20  target, 1);.    
1e510 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1e520 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
1e530 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
1e540 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1e550 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69  arse, pFarg->a[i
1e560 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
1e570 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1e580 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
1e590 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
1e5a0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
1e5b0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1e5c0 65 6c 28 76 2c 20 65 6e 64 43 6f 61 6c 65 73 63  el(v, endCoalesc
1e5d0 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  e);.        brea
1e5e0 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
1e5f0 20 20 2f 2a 20 54 68 65 20 55 4e 4c 49 4b 45 4c    /* The UNLIKEL
1e600 59 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  Y() function is 
1e610 61 20 6e 6f 2d 6f 70 2e 20 20 54 68 65 20 72 65  a no-op.  The re
1e620 73 75 6c 74 20 69 73 20 74 68 65 20 76 61 6c 75  sult is the valu
1e630 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  e.      ** of th
1e640 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1e650 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1e660 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46   if( pDef->funcF
1e670 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
1e680 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20  NC_UNLIKELY ){. 
1e690 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
1e6a0 46 61 72 67 3e 3d 31 20 29 3b 0a 20 20 20 20 20  Farg>=1 );.     
1e6b0 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
1e6c0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
1e6d0 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
1e6e0 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  a[0].pExpr, targ
1e6f0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  et);.        bre
1e700 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
1e710 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46     for(i=0; i<nF
1e720 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  arg; i++){.     
1e730 20 20 20 69 66 28 20 69 3c 33 32 20 26 26 20 73     if( i<32 && s
1e740 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
1e750 74 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d  tant(pFarg->a[i]
1e760 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
1e770 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
1e780 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20  ==31 );.        
1e790 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d    constMask |= M
1e7a0 41 53 4b 42 49 54 33 32 28 69 29 3b 0a 20 20 20  ASKBIT32(i);.   
1e7b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1e7c0 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c  f( (pDef->funcFl
1e7d0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
1e7e0 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26  C_NEEDCOLL)!=0 &
1e7f0 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  & !pColl ){.    
1e800 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
1e810 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1e820 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
1e830 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
1e840 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1e850 20 20 20 20 20 69 66 28 20 70 46 61 72 67 20 29       if( pFarg )
1e860 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  {.        if( co
1e870 6e 73 74 4d 61 73 6b 20 29 7b 0a 20 20 20 20 20  nstMask ){.     
1e880 20 20 20 20 20 72 31 20 3d 20 70 50 61 72 73 65       r1 = pParse
1e890 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20  ->nMem+1;.      
1e8a0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
1e8b0 20 2b 3d 20 6e 46 61 72 67 3b 0a 20 20 20 20 20   += nFarg;.     
1e8c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e8d0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1e8e0 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
1e8f0 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20  rse, nFarg);.   
1e900 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1e910 2f 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28 29 20  /* For length() 
1e920 61 6e 64 20 74 79 70 65 6f 66 28 29 20 66 75 6e  and typeof() fun
1e930 63 74 69 6f 6e 73 20 77 69 74 68 20 61 20 63 6f  ctions with a co
1e940 6c 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a 20  lumn argument,. 
1e950 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68         ** set th
1e960 65 20 50 35 20 70 61 72 61 6d 65 74 65 72 20 74  e P5 parameter t
1e970 6f 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20  o the OP_Column 
1e980 6f 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41 47  opcode to OPFLAG
1e990 5f 4c 45 4e 47 54 48 41 52 47 0a 20 20 20 20 20  _LENGTHARG.     
1e9a0 20 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47 5f     ** or OPFLAG_
1e9b0 54 59 50 45 4f 46 41 52 47 20 72 65 73 70 65 63  TYPEOFARG respec
1e9c0 74 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69 64  tively, to avoid
1e9d0 20 75 6e 6e 65 63 65 73 73 61 72 79 20 64 61 74   unnecessary dat
1e9e0 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 61  a.        ** loa
1e9f0 64 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ding..        */
1ea00 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44  .        if( (pD
1ea10 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
1ea20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e  (SQLITE_FUNC_LEN
1ea30 47 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f  GTH|SQLITE_FUNC_
1ea40 54 59 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a 20  TYPEOF))!=0 ){. 
1ea50 20 20 20 20 20 20 20 20 20 75 38 20 65 78 70 72           u8 expr
1ea60 4f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  Op;.          as
1ea70 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29  sert( nFarg==1 )
1ea80 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
1ea90 72 74 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  rt( pFarg->a[0].
1eaa0 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  pExpr!=0 );.    
1eab0 20 20 20 20 20 20 65 78 70 72 4f 70 20 3d 20 70        exprOp = p
1eac0 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
1ead0 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20  ->op;.          
1eae0 69 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 43  if( exprOp==TK_C
1eaf0 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70 3d  OLUMN || exprOp=
1eb00 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
1eb10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
1eb20 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e  sert( SQLITE_FUN
1eb30 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41 47  C_LENGTH==OPFLAG
1eb40 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20  _LENGTHARG );.  
1eb50 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1eb60 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59  ( SQLITE_FUNC_TY
1eb70 50 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59 50  PEOF==OPFLAG_TYP
1eb80 45 4f 46 41 52 47 20 29 3b 0a 20 20 20 20 20 20  EOFARG );.      
1eb90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1eba0 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
1ebb0 26 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41  & OPFLAG_LENGTHA
1ebc0 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  RG );.          
1ebd0 20 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45    pFarg->a[0].pE
1ebe0 78 70 72 2d 3e 6f 70 32 20 3d 20 0a 20 20 20 20  xpr->op2 = .    
1ebf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44                pD
1ec00 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
1ec10 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52  (OPFLAG_LENGTHAR
1ec20 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41  G|OPFLAG_TYPEOFA
1ec30 52 47 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  RG);.          }
1ec40 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1ec50 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1ec60 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
1ec70 3b 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20  ;     /* Ticket 
1ec80 32 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a  2ea2425d34be */.
1ec90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1eca0 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
1ecb0 70 50 61 72 73 65 2c 20 70 46 61 72 67 2c 20 72  pParse, pFarg, r
1ecc0 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  1, 0,.          
1ecd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ece0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45        SQLITE_ECE
1ecf0 4c 5f 44 55 50 7c 53 51 4c 49 54 45 5f 45 43 45  L_DUP|SQLITE_ECE
1ed00 4c 5f 46 41 43 54 4f 52 29 3b 0a 20 20 20 20 20  L_FACTOR);.     
1ed10 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1ed20 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 20  chePop(pParse); 
1ed30 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32       /* Ticket 2
1ed40 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20  ea2425d34be */. 
1ed50 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1ed60 20 20 20 20 72 31 20 3d 20 30 3b 0a 20 20 20 20      r1 = 0;.    
1ed70 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1ed80 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1ed90 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f  ABLE.      /* Po
1eda0 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20  ssibly overload 
1edb0 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20  the function if 
1edc0 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
1edd0 6e 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  nt is.      ** a
1ede0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63   virtual table c
1edf0 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a  olumn..      **.
1ee00 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66        ** For inf
1ee10 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49  ix functions (LI
1ee20 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50  KE, GLOB, REGEXP
1ee30 2c 20 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65  , and MATCH) use
1ee40 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65   the.      ** se
1ee50 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e  cond argument, n
1ee60 6f 74 20 74 68 65 20 66 69 72 73 74 2c 20 61 73  ot the first, as
1ee70 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   the argument to
1ee80 20 74 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a   test to.      *
1ee90 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 61  * see if it is a
1eea0 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72   column in a vir
1eeb0 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69  tual table.  Thi
1eec0 73 20 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73  s is done becaus
1eed0 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c  e.      ** the l
1eee0 65 66 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69  eft operand of i
1eef0 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28  nfix functions (
1ef00 74 68 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77  the operand we w
1ef10 61 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ant to.      ** 
1ef20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64  control overload
1ef30 69 6e 67 29 20 65 6e 64 73 20 75 70 20 61 73 20  ing) ends up as 
1ef40 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1ef50 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20  ent to the.     
1ef60 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54   ** function.  T
1ef70 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41  he expression "A
1ef80 20 67 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69   glob B" is equi
1ef90 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20  valent to .     
1efa0 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20   ** "glob(B,A). 
1efb0 20 57 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20   We want to use 
1efc0 74 68 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62  the A in "A glob
1efd0 20 42 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20   B" to test.    
1efe0 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f    ** for functio
1eff0 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20  n overloading.  
1f000 42 75 74 20 77 65 20 75 73 65 20 74 68 65 20 42  But we use the B
1f010 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42   term in "glob(B
1f020 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ,A)"..      */. 
1f030 20 20 20 20 20 69 66 28 20 6e 46 61 72 67 3e 3d       if( nFarg>=
1f040 32 20 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61  2 && (pExpr->fla
1f050 67 73 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e  gs & EP_InfixFun
1f060 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  c) ){.        pD
1f070 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  ef = sqlite3Vtab
1f080 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e  OverloadFunction
1f090 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67  (db, pDef, nFarg
1f0a0 2c 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45  , pFarg->a[1].pE
1f0b0 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  xpr);.      }els
1f0c0 65 20 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b  e if( nFarg>0 ){
1f0d0 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
1f0e0 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c  sqlite3VtabOverl
1f0f0 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  oadFunction(db, 
1f100 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61  pDef, nFarg, pFa
1f110 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  rg->a[0].pExpr);
1f120 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1f130 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
1f140 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
1f150 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
1f160 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1f170 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
1f180 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20   db->pDfltColl; 
1f190 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f1a0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1f1b0 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20  _CollSeq, 0, 0, 
1f1c0 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c  0, (char *)pColl
1f1d0 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
1f1e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1f1f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1f200 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 2c 20  , OP_Function0, 
1f210 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74  constMask, r1, t
1f220 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20  arget,.         
1f230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1f240 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46  char*)pDef, P4_F
1f250 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73  UNCDEF);.      s
1f260 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1f270 50 35 28 76 2c 20 28 75 38 29 6e 46 61 72 67 29  P5(v, (u8)nFarg)
1f280 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72  ;.      if( nFar
1f290 67 20 26 26 20 63 6f 6e 73 74 4d 61 73 6b 3d 3d  g && constMask==
1f2a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
1f2b0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1f2c0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c  ange(pParse, r1,
1f2d0 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d   nFarg);.      }
1f2e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1f2f0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1f300 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1f310 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
1f320 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  STS:.    case TK
1f330 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
1f340 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   int nCol;.     
1f350 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1f360 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20  K_EXISTS );.    
1f370 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1f380 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20  TK_SELECT );.   
1f390 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45     if( op==TK_SE
1f3a0 4c 45 43 54 20 26 26 20 28 6e 43 6f 6c 20 3d 20  LECT && (nCol = 
1f3b0 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
1f3c0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
1f3d0 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
1f3e0 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45  qlite3SubselectE
1f3f0 72 72 6f 72 28 70 50 61 72 73 65 2c 20 6e 43 6f  rror(pParse, nCo
1f400 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  l, 1);.      }el
1f410 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65  se{.        inRe
1f420 67 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53  g = sqlite3CodeS
1f430 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
1f440 20 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20   pExpr, 0, 0);. 
1f450 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
1f460 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1f470 73 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  se TK_SELECT_COL
1f480 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  UMN: {.      if(
1f490 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69   pExpr->pLeft->i
1f4a0 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Table==0 ){.    
1f4b0 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
1f4c0 2d 3e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74  ->iTable = sqlit
1f4d0 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
1f4e0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1f4f0 4c 65 66 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Left, 0, 0);.   
1f500 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67     }.      inReg
1f510 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d   = pExpr->pLeft-
1f520 3e 69 54 61 62 6c 65 20 2b 20 70 45 78 70 72 2d  >iTable + pExpr-
1f530 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
1f540 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1f550 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
1f560 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46       int destIfF
1f570 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  alse = sqlite3Vd
1f580 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1f590 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
1f5a0 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  Null = sqlite3Vd
1f5b0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1f5c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f5d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
1f5e0 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
1f5f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1f600 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
1f610 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c  pExpr, destIfFal
1f620 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  se, destIfNull);
1f630 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1f640 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1f650 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65  nteger, 1, targe
1f660 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1f670 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1f680 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65  l(v, destIfFalse
1f690 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f6a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1f6b0 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c  _AddImm, target,
1f6c0 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
1f6d0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1f6e0 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c  el(v, destIfNull
1f6f0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1f700 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
1f710 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1f720 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a  UERY */...    /*
1f730 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54  .    **    x BET
1f740 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20  WEEN y AND z.   
1f750 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
1f760 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
1f770 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1f780 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a    x>=y AND x<=z.
1f790 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20      **.    ** X 
1f7a0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
1f7b0 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a  pr->pLeft..    *
1f7c0 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Y is stored in
1f7d0 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
1f7e0 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [0].pExpr..    *
1f7f0 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Z is stored in
1f800 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
1f810 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [1].pExpr..    *
1f820 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  /.    case TK_BE
1f830 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 65  TWEEN: {.      e
1f840 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70  xprCodeBetween(p
1f850 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
1f860 72 67 65 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  rget, 0, 0);.   
1f870 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f880 20 20 20 20 63 61 73 65 20 54 4b 5f 53 50 41 4e      case TK_SPAN
1f890 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
1f8a0 4c 4c 41 54 45 3a 20 0a 20 20 20 20 63 61 73 65  LLATE: .    case
1f8b0 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20   TK_UPLUS: {.   
1f8c0 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
1f8d0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
1f8e0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1f8f0 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a  pLeft, target);.
1f900 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f910 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
1f920 54 52 49 47 47 45 52 3a 20 7b 0a 20 20 20 20 20  TRIGGER: {.     
1f930 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 63 6f 64   /* If the opcod
1f940 65 20 69 73 20 54 4b 5f 54 52 49 47 47 45 52 2c  e is TK_TRIGGER,
1f950 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
1f960 73 69 6f 6e 20 69 73 20 61 20 72 65 66 65 72 65  sion is a refere
1f970 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  nce.      ** to 
1f980 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  a column in the 
1f990 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70  new.* or old.* p
1f9a0 73 65 75 64 6f 2d 74 61 62 6c 65 73 20 61 76 61  seudo-tables ava
1f9b0 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20  ilable to.      
1f9c0 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  ** trigger progr
1f9d0 61 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ams. In this cas
1f9e0 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20 69 73  e Expr.iTable is
1f9f0 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20 74 68   set to 1 for th
1fa00 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a  e.      ** new.*
1fa10 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f   pseudo-table, o
1fa20 72 20 30 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e  r 0 for the old.
1fa30 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20  * pseudo-table. 
1fa40 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20  Expr.iColumn.   
1fa50 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20     ** is set to 
1fa60 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  the column of th
1fa70 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 74  e pseudo-table t
1fa80 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31  o read, or to -1
1fa90 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61   to.      ** rea
1faa0 64 20 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c  d the rowid fiel
1fab0 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
1fac0 20 20 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73    ** The express
1fad0 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
1fae0 65 64 20 75 73 69 6e 67 20 61 6e 20 4f 50 5f 50  ed using an OP_P
1faf0 61 72 61 6d 20 6f 70 63 6f 64 65 2e 20 54 68 65  aram opcode. The
1fb00 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 70 61 72   p1.      ** par
1fb10 61 6d 65 74 65 72 20 69 73 20 73 65 74 20 74 6f  ameter is set to
1fb20 20 30 20 66 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f   0 for an old.ro
1fb30 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 6f  wid reference, o
1fb40 72 20 74 6f 20 28 69 2b 31 29 0a 20 20 20 20 20  r to (i+1).     
1fb50 20 2a 2a 20 74 6f 20 72 65 66 65 72 65 6e 63 65   ** to reference
1fb60 20 61 6e 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20   another column 
1fb70 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65  of the old.* pse
1fb80 75 64 6f 2d 74 61 62 6c 65 2c 20 77 68 65 72 65  udo-table, where
1fb90 20 0a 20 20 20 20 20 20 2a 2a 20 69 20 69 73 20   .      ** i is 
1fba0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
1fbb0 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61 20 6e   column. For a n
1fbc0 65 77 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e  ew.rowid referen
1fbd0 63 65 2c 20 70 31 20 69 73 0a 20 20 20 20 20 20  ce, p1 is.      
1fbe0 2a 2a 20 73 65 74 20 74 6f 20 28 6e 2b 31 29 2c  ** set to (n+1),
1fbf0 20 77 68 65 72 65 20 6e 20 69 73 20 74 68 65 20   where n is the 
1fc00 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
1fc10 73 20 69 6e 20 65 61 63 68 20 70 73 65 75 64 6f  s in each pseudo
1fc20 2d 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a  -table..      **
1fc30 20 46 6f 72 20 61 20 72 65 66 65 72 65 6e 63 65   For a reference
1fc40 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 63 6f   to any other co
1fc50 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e  lumn in the new.
1fc60 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20  * pseudo-table, 
1fc70 70 31 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  p1.      ** is s
1fc80 65 74 20 74 6f 20 28 6e 2b 32 2b 69 29 2c 20 77  et to (n+2+i), w
1fc90 68 65 72 65 20 6e 20 61 6e 64 20 69 20 61 72 65  here n and i are
1fca0 20 61 73 20 64 65 66 69 6e 65 64 20 70 72 65 76   as defined prev
1fcb0 69 6f 75 73 6c 79 2e 20 46 6f 72 0a 20 20 20 20  iously. For.    
1fcc0 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66    ** example, if
1fcd0 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 77 68   the table on wh
1fce0 69 63 68 20 74 72 69 67 67 65 72 73 20 61 72 65  ich triggers are
1fcf0 20 62 65 69 6e 67 20 66 69 72 65 64 20 69 73 0a   being fired is.
1fd00 20 20 20 20 20 20 2a 2a 20 64 65 63 6c 61 72 65        ** declare
1fd10 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  d as:.      **. 
1fd20 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45       **   CREATE
1fd30 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
1fd40 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
1fd50 2a 2a 20 54 68 65 6e 20 70 31 20 69 73 20 69 6e  ** Then p1 is in
1fd60 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c  terpreted as fol
1fd70 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  lows:.      **. 
1fd80 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 30 20       **   p1==0 
1fd90 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f 77 69    ->    old.rowi
1fda0 64 20 20 20 20 20 70 31 3d 3d 33 20 20 20 2d 3e  d     p1==3   ->
1fdb0 20 20 20 20 6e 65 77 2e 72 6f 77 69 64 0a 20 20      new.rowid.  
1fdc0 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 31 20 20      **   p1==1  
1fdd0 20 2d 3e 20 20 20 20 6f 6c 64 2e 61 20 20 20 20   ->    old.a    
1fde0 20 20 20 20 20 70 31 3d 3d 34 20 20 20 2d 3e 20       p1==4   -> 
1fdf0 20 20 20 6e 65 77 2e 61 0a 20 20 20 20 20 20 2a     new.a.      *
1fe00 2a 20 20 20 70 31 3d 3d 32 20 20 20 2d 3e 20 20  *   p1==2   ->  
1fe10 20 20 6f 6c 64 2e 62 20 20 20 20 20 20 20 20 20    old.b         
1fe20 70 31 3d 3d 35 20 20 20 2d 3e 20 20 20 20 6e 65  p1==5   ->    ne
1fe30 77 2e 62 20 20 20 20 20 20 20 0a 20 20 20 20 20  w.b       .     
1fe40 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20   */.      Table 
1fe50 2a 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70  *pTab = pExpr->p
1fe60 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 70  Tab;.      int p
1fe70 31 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  1 = pExpr->iTabl
1fe80 65 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b  e * (pTab->nCol+
1fe90 31 29 20 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e  1) + 1 + pExpr->
1fea0 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20  iColumn;..      
1feb0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69  assert( pExpr->i
1fec0 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70  Table==0 || pExp
1fed0 72 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a  r->iTable==1 );.
1fee0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1fef0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31  xpr->iColumn>=-1
1ff00 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   && pExpr->iColu
1ff10 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  mn<pTab->nCol );
1ff20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1ff30 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20  Tab->iPKey<0 || 
1ff40 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  pExpr->iColumn!=
1ff50 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20  pTab->iPKey );. 
1ff60 20 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e       assert( p1>
1ff70 3d 30 20 26 26 20 70 31 3c 28 70 54 61 62 2d 3e  =0 && p1<(pTab->
1ff80 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20  nCol*2+2) );..  
1ff90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ffa0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72 61  ddOp2(v, OP_Para
1ffb0 6d 2c 20 70 31 2c 20 74 61 72 67 65 74 29 3b 0a  m, p1, target);.
1ffc0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
1ffd0 74 28 28 76 2c 20 22 25 73 2e 25 73 20 2d 3e 20  t((v, "%s.%s -> 
1ffe0 24 25 64 22 2c 0a 20 20 20 20 20 20 20 20 28 70  $%d",.        (p
1fff0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22  Expr->iTable ? "
20000 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20  new" : "old"),. 
20010 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69         (pExpr->i
20020 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69  Column<0 ? "rowi
20030 64 22 20 3a 20 70 45 78 70 72 2d 3e 70 54 61 62  d" : pExpr->pTab
20040 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43  ->aCol[pExpr->iC
20050 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a 20  olumn].zName),. 
20060 20 20 20 20 20 20 20 74 61 72 67 65 74 0a 20 20         target.  
20070 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65 66      ));..#ifndef
20080 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
20090 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
200a0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
200b0 6d 6e 20 68 61 73 20 52 45 41 4c 20 61 66 66 69  mn has REAL affi
200c0 6e 69 74 79 2c 20 69 74 20 6d 61 79 20 63 75 72  nity, it may cur
200d0 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64  rently be stored
200e0 20 61 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20   as an.      ** 
200f0 69 6e 74 65 67 65 72 2e 20 55 73 65 20 4f 50 5f  integer. Use OP_
20100 52 65 61 6c 41 66 66 69 6e 69 74 79 20 74 6f 20  RealAffinity to 
20110 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20  make sure it is 
20120 72 65 61 6c 6c 79 20 72 65 61 6c 2e 0a 20 20 20  really real..   
20130 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45     **.      ** E
20140 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 30  VIDENCE-OF: R-60
20150 39 38 35 2d 35 37 36 36 32 20 53 51 4c 69 74 65  985-57662 SQLite
20160 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74 68   will convert th
20170 65 20 76 61 6c 75 65 20 62 61 63 6b 20 74 6f 0a  e value back to.
20180 20 20 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e        ** floatin
20190 67 20 70 6f 69 6e 74 20 77 68 65 6e 20 65 78 74  g point when ext
201a0 72 61 63 74 69 6e 67 20 69 74 20 66 72 6f 6d 20  racting it from 
201b0 74 68 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f 0a  the record.  */.
201c0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
201d0 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20  >iColumn>=0 .   
201e0 20 20 20 20 26 26 20 70 54 61 62 2d 3e 61 43 6f      && pTab->aCo
201f0 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  l[pExpr->iColumn
20200 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ].affinity==SQLI
20210 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20 20  TE_AFF_REAL.    
20220 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c    ){.        sql
20230 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
20240 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74  , OP_RealAffinit
20250 79 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  y, target);.    
20260 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
20270 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
20280 20 20 20 63 61 73 65 20 54 4b 5f 56 45 43 54 4f     case TK_VECTO
20290 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
202a0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
202b0 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69  e, "row value mi
202c0 73 75 73 65 64 22 29 3b 0a 20 20 20 20 20 20 62  sused");.      b
202d0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
202e0 20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20   /*.    ** Form 
202f0 41 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45  A:.    **   CASE
20300 20 78 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20   x WHEN e1 THEN 
20310 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20  r1 WHEN e2 THEN 
20320 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54  r2 ... WHEN eN T
20330 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
20340 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
20350 46 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20  Form B:.    **  
20360 20 43 41 53 45 20 57 48 45 4e 20 65 31 20 54 48   CASE WHEN e1 TH
20370 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48  EN r1 WHEN e2 TH
20380 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65  EN r2 ... WHEN e
20390 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
203a0 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
203b0 2a 2a 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e  ** Form A is can
203c0 20 62 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20   be transformed 
203d0 69 6e 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c  into the equival
203e0 65 6e 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f  ent form B as fo
203f0 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20  llows:.    **   
20400 43 41 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54  CASE WHEN x=e1 T
20410 48 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32  HEN r1 WHEN x=e2
20420 20 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20   THEN r2 ....   
20430 20 2a 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20   **        WHEN 
20440 78 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53  x=eN THEN rN ELS
20450 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20  E y END.    **. 
20460 20 20 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65     ** X (if it e
20470 78 69 73 74 73 29 20 69 73 20 69 6e 20 70 45 78  xists) is in pEx
20480 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a  pr->pLeft..    *
20490 2a 20 59 20 69 73 20 69 6e 20 74 68 65 20 6c 61  * Y is in the la
204a0 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45  st element of pE
204b0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20  xpr->x.pList if 
204c0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
204d0 6e 45 78 70 72 20 69 73 0a 20 20 20 20 2a 2a 20  nExpr is.    ** 
204e0 6f 64 64 2e 20 20 54 68 65 20 59 20 69 73 20 61  odd.  The Y is a
204f0 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49  lso optional.  I
20500 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
20510 65 6c 65 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c  elements in x.pL
20520 69 73 74 0a 20 20 20 20 2a 2a 20 69 73 20 65 76  ist.    ** is ev
20530 65 6e 2c 20 74 68 65 6e 20 59 20 69 73 20 6f 6d  en, then Y is om
20540 69 74 74 65 64 20 61 6e 64 20 74 68 65 20 22 6f  itted and the "o
20550 74 68 65 72 77 69 73 65 22 20 72 65 73 75 6c 74  therwise" result
20560 20 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a   is NULL..    **
20570 20 45 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d   Ei is in pExpr-
20580 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61  >pList->a[i*2] a
20590 6e 64 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e  nd Ri is pExpr->
205a0 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e  pList->a[i*2+1].
205b0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
205c0 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
205d0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
205e0 68 65 20 52 69 20 66 6f 72 20 74 68 65 20 66 69  he Ri for the fi
205f0 72 73 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c  rst matching Ei,
20600 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68  .    ** or if th
20610 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69  ere is no matchi
20620 6e 67 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20  ng Ei, the ELSE 
20630 74 65 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68  term Y, or if th
20640 65 72 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f  ere is.    ** no
20650 20 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c   ELSE term, NULL
20660 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
20670 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70  ault: assert( op
20680 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20  ==TK_CASE ); {. 
20690 20 20 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65       int endLabe
206a0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
206b0 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c         /* GOTO l
206c0 61 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20  abel for end of 
206d0 43 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20  CASE stmt */.   
206e0 20 20 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b     int nextCase;
206f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20700 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62       /* GOTO lab
20710 65 6c 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e  el for next WHEN
20720 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
20730 20 69 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20   int nExpr;     
20740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20750 20 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20     /* 2x number 
20760 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f  of WHEN terms */
20770 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
20780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20790 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
207a0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
207b0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
207c0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
207d0 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57      /* List of W
207e0 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
207f0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
20800 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c  st_item *aListel
20810 65 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66  em;  /* Array of
20820 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
20830 20 20 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70       Expr opComp
20840 61 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  are;            
20850 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d         /* The X=
20860 3d 45 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  =Ei expression *
20870 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  /.      Expr *pX
20880 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
208a0 20 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f   X expression */
208b0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65  .      Expr *pTe
208c0 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
208d0 20 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45           /* X==E
208e0 69 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75  i (form A) or ju
208f0 73 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a  st Ei (form B) *
20900 2f 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59  /.      VVA_ONLY
20910 28 20 69 6e 74 20 69 43 61 63 68 65 4c 65 76 65  ( int iCacheLeve
20920 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  l = pParse->iCac
20930 68 65 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20  heLevel; )..    
20940 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
20950 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
20960 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
20970 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  && pExpr->x.pLis
20980 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
20990 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  t(pExpr->x.pList
209a0 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20  ->nExpr > 0);.  
209b0 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78      pEList = pEx
209c0 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
209d0 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70     aListelem = p
209e0 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  EList->a;.      
209f0 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e  nExpr = pEList->
20a00 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64  nExpr;.      end
20a10 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56  Label = sqlite3V
20a20 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
20a30 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 20 3d  .      if( (pX =
20a40 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d   pExpr->pLeft)!=
20a50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 6d  0 ){.        tem
20a60 70 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20  pX = *pX;.      
20a70 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
20a80 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
20a90 0a 20 20 20 20 20 20 20 20 65 78 70 72 54 6f 52  .        exprToR
20aa0 65 67 69 73 74 65 72 28 26 74 65 6d 70 58 2c 20  egister(&tempX, 
20ab0 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70  exprCodeVector(p
20ac0 50 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26  Parse, &tempX, &
20ad0 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20 20 20  regFree1));.    
20ae0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
20af0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
20b00 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 70 43       memset(&opC
20b10 6f 6d 70 61 72 65 2c 20 30 2c 20 73 69 7a 65 6f  ompare, 0, sizeo
20b20 66 28 6f 70 43 6f 6d 70 61 72 65 29 29 3b 0a 20  f(opCompare));. 
20b30 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65         opCompare
20b40 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20  .op = TK_EQ;.   
20b50 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70       opCompare.p
20b60 4c 65 66 74 20 3d 20 26 74 65 6d 70 58 3b 0a 20  Left = &tempX;. 
20b70 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 26         pTest = &
20b80 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20  opCompare;.     
20b90 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 62 33 35     /* Ticket b35
20ba0 31 64 39 35 66 39 63 64 35 65 66 31 37 65 39 64  1d95f9cd5ef17e9d
20bb0 39 64 62 61 65 31 38 66 35 63 61 38 36 31 31 31  9dbae18f5ca86111
20bc0 39 30 30 30 31 3a 0a 20 20 20 20 20 20 20 20 2a  90001:.        *
20bd0 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 72  * The value in r
20be0 65 67 46 72 65 65 31 20 6d 69 67 68 74 20 67 65  egFree1 might ge
20bf0 74 20 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20  t SCopy-ed into 
20c00 74 68 65 20 66 69 6c 65 20 72 65 73 75 6c 74 2e  the file result.
20c10 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d  .        ** So m
20c20 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
20c30 65 20 72 65 67 46 72 65 65 31 20 72 65 67 69 73  e regFree1 regis
20c40 74 65 72 20 69 73 20 6e 6f 74 20 72 65 75 73 65  ter is not reuse
20c50 64 20 66 6f 72 20 6f 74 68 65 72 0a 20 20 20 20  d for other.    
20c60 20 20 20 20 2a 2a 20 70 75 72 70 6f 73 65 73 20      ** purposes 
20c70 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 76 65  and possibly ove
20c80 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20  rwritten.  */.  
20c90 20 20 20 20 20 20 72 65 67 46 72 65 65 31 20 3d        regFree1 =
20ca0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
20cb0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
20cc0 70 72 2d 31 3b 20 69 3d 69 2b 32 29 7b 0a 20 20  pr-1; i=i+2){.  
20cd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20ce0 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
20cf0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
20d00 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pX ){.          
20d10 61 73 73 65 72 74 28 20 70 54 65 73 74 21 3d 30  assert( pTest!=0
20d20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70   );.          op
20d30 43 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d  Compare.pRight =
20d40 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45   aListelem[i].pE
20d50 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  xpr;.        }el
20d60 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54  se{.          pT
20d70 65 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b  est = aListelem[
20d80 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
20d90 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74    }.        next
20da0 43 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Case = sqlite3Vd
20db0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
20dc0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
20dd0 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pTest->op==TK_
20de0 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
20df0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
20e00 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65  alse(pParse, pTe
20e10 73 74 2c 20 6e 65 78 74 43 61 73 65 2c 20 53 51  st, nextCase, SQ
20e20 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
20e30 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
20e40 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b  se( aListelem[i+
20e50 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  1].pExpr->op==TK
20e60 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
20e70 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
20e80 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74  de(pParse, aList
20e90 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c  elem[i+1].pExpr,
20ea0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
20eb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
20ec0 6f 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a  o(v, endLabel);.
20ed0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
20ee0 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
20ef0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
20f00 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
20f10 61 62 65 6c 28 76 2c 20 6e 65 78 74 43 61 73 65  abel(v, nextCase
20f20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
20f30 20 69 66 28 20 28 6e 45 78 70 72 26 31 29 21 3d   if( (nExpr&1)!=
20f40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
20f50 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
20f60 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
20f70 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
20f80 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  de(pParse, pELis
20f90 74 2d 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e 70 45  t->a[nExpr-1].pE
20fa0 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
20fb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20fc0 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
20fd0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
20fe0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
20ff0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
21000 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
21010 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21020 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
21030 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  ocFailed || pPar
21040 73 65 2d 3e 6e 45 72 72 3e 30 20 0a 20 20 20 20  se->nErr>0 .    
21050 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65         || pParse
21060 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 69  ->iCacheLevel==i
21070 43 61 63 68 65 4c 65 76 65 6c 20 29 3b 0a 20 20  CacheLevel );.  
21080 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
21090 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
210a0 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  ndLabel);.      
210b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
210c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
210d0 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63 61 73  _TRIGGER.    cas
210e0 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20  e TK_RAISE: {.  
210f0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
21100 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
21110 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20 20  Rollback .      
21120 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61       || pExpr->a
21130 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72  ffinity==OE_Abor
21140 74 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  t.           || 
21150 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
21160 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20 20 20  =OE_Fail.       
21170 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66      || pExpr->af
21180 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72  finity==OE_Ignor
21190 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  e.      );.     
211a0 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 70 54   if( !pParse->pT
211b0 72 69 67 67 65 72 54 61 62 20 29 7b 0a 20 20 20  riggerTab ){.   
211c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
211d0 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
211e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211f0 20 20 20 20 22 52 41 49 53 45 28 29 20 6d 61 79      "RAISE() may
21200 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69   only be used wi
21210 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70  thin a trigger-p
21220 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20  rogram");.      
21230 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
21240 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
21250 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
21260 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20  E_Abort ){.     
21270 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f     sqlite3MayAbo
21280 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  rt(pParse);.    
21290 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
212a0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
212b0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
212c0 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
212d0 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  if( pExpr->affin
212e0 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29  ity==OE_Ignore )
212f0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
21300 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20  3VdbeAddOp4(.   
21310 20 20 20 20 20 20 20 20 20 76 2c 20 4f 50 5f 48           v, OP_H
21320 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  alt, SQLITE_OK, 
21330 4f 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20 70 45  OE_Ignore, 0, pE
21340 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29  xpr->u.zToken,0)
21350 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
21360 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
21370 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21380 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74  sqlite3HaltConst
21390 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 53 51  raint(pParse, SQ
213a0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
213b0 54 52 49 47 47 45 52 2c 0a 20 20 20 20 20 20 20  TRIGGER,.       
213c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213d0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66         pExpr->af
213e0 66 69 6e 69 74 79 2c 20 70 45 78 70 72 2d 3e 75  finity, pExpr->u
213f0 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 30 29 3b 0a  .zToken, 0, 0);.
21400 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62        }..      b
21410 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
21420 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  if.  }.  sqlite3
21430 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
21440 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
21450 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
21460 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
21470 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 72  , regFree2);.  r
21480 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a  eturn inReg;.}..
21490 2f 2a 0a 2a 2a 20 46 61 63 74 6f 72 20 6f 75 74  /*.** Factor out
214a0 20 74 68 65 20 63 6f 64 65 20 6f 66 20 74 68 65   the code of the
214b0 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
214c0 6e 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74  n to initializat
214d0 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69  ion time..*/.voi
214e0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
214f0 65 41 74 49 6e 69 74 28 0a 20 20 50 61 72 73 65  eAtInit(.  Parse
21500 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
21510 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
21520 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
21530 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78  ,      /* The ex
21540 70 72 65 73 73 69 6f 6e 20 74 6f 20 63 6f 64 65  pression to code
21550 20 77 68 65 6e 20 74 68 65 20 56 44 42 45 20 69   when the VDBE i
21560 6e 69 74 69 61 6c 69 7a 65 73 20 2a 2f 0a 20 20  nitializes */.  
21570 69 6e 74 20 72 65 67 44 65 73 74 2c 20 20 20 20  int regDest,    
21580 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 76    /* Store the v
21590 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65 67  alue in this reg
215a0 69 73 74 65 72 20 2a 2f 0a 20 20 75 38 20 72 65  ister */.  u8 re
215b0 75 73 61 62 6c 65 20 20 20 20 20 20 20 2f 2a 20  usable       /* 
215c0 54 72 75 65 20 69 66 20 74 68 69 73 20 65 78 70  True if this exp
215d0 72 65 73 73 69 6f 6e 20 69 73 20 72 65 75 73 61  ression is reusa
215e0 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ble */.){.  Expr
215f0 4c 69 73 74 20 2a 70 3b 0a 20 20 61 73 73 65 72  List *p;.  asser
21600 74 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b  t( ConstFactorOk
21610 28 70 50 61 72 73 65 29 20 29 3b 0a 20 20 70 20  (pParse) );.  p 
21620 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74  = pParse->pConst
21630 45 78 70 72 3b 0a 20 20 70 45 78 70 72 20 3d 20  Expr;.  pExpr = 
21640 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
21650 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72  Parse->db, pExpr
21660 2c 20 30 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69  , 0);.  p = sqli
21670 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
21680 64 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 78  d(pParse, p, pEx
21690 70 72 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  pr);.  if( p ){.
216a0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
216b0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
216c0 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70   = &p->a[p->nExp
216d0 72 2d 31 5d 3b 0a 20 20 20 20 20 70 49 74 65 6d  r-1];.     pItem
216e0 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65  ->u.iConstExprRe
216f0 67 20 3d 20 72 65 67 44 65 73 74 3b 0a 20 20 20  g = regDest;.   
21700 20 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c    pItem->reusabl
21710 65 20 3d 20 72 65 75 73 61 62 6c 65 3b 0a 20 20  e = reusable;.  
21720 7d 0a 20 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e  }.  pParse->pCon
21730 73 74 45 78 70 72 20 3d 20 70 3b 0a 7d 0a 0a 2f  stExpr = p;.}../
21740 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
21750 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  de to evaluate a
21760 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  n expression and
21770 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
21780 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67  ts.** into a reg
21790 69 73 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74  ister.  Return t
217a0 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  he register numb
217b0 65 72 20 77 68 65 72 65 20 74 68 65 20 72 65 73  er where the res
217c0 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72  ults.** are stor
217d0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
217e0 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20 74   register is a t
217f0 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
21800 72 20 74 68 61 74 20 63 61 6e 20 62 65 20 64 65  r that can be de
21810 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68  allocated,.** th
21820 65 6e 20 77 72 69 74 65 20 69 74 73 20 6e 75 6d  en write its num
21830 62 65 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20  ber into *pReg. 
21840 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 72   If the result r
21850 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a  egister is not.*
21860 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 2c 20 74  * a temporary, t
21870 68 65 6e 20 73 65 74 20 2a 70 52 65 67 20 74 6f  hen set *pReg to
21880 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   zero..**.** If 
21890 70 45 78 70 72 20 69 73 20 61 20 63 6f 6e 73 74  pExpr is a const
218a0 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ant, then this r
218b0 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 67 65 6e  outine might gen
218c0 65 72 61 74 65 20 74 68 69 73 0a 2a 2a 20 63 6f  erate this.** co
218d0 64 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 72  de to fill the r
218e0 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 69  egister in the i
218f0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73 65  nitialization se
21900 63 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  ction of the.** 
21910 56 44 42 45 20 70 72 6f 67 72 61 6d 2c 20 69 6e  VDBE program, in
21920 20 6f 72 64 65 72 20 74 6f 20 66 61 63 74 6f 72   order to factor
21930 20 69 74 20 6f 75 74 20 6f 66 20 74 68 65 20 65   it out of the e
21940 76 61 6c 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a  valuation loop..
21950 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
21960 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72 73 65  prCodeTemp(Parse
21970 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
21980 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 65 67  pExpr, int *pReg
21990 29 7b 0a 20 20 69 6e 74 20 72 32 3b 0a 20 20 70  ){.  int r2;.  p
219a0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
219b0 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
219c0 78 70 72 29 3b 0a 20 20 69 66 28 20 43 6f 6e 73  xpr);.  if( Cons
219d0 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65  tFactorOk(pParse
219e0 29 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 6f  ).   && pExpr->o
219f0 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 0a 20  p!=TK_REGISTER. 
21a00 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
21a10 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
21a20 6e 28 70 45 78 70 72 29 0a 20 20 29 7b 0a 20 20  n(pExpr).  ){.  
21a30 20 20 45 78 70 72 4c 69 73 74 20 2a 70 20 3d 20    ExprList *p = 
21a40 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78  pParse->pConstEx
21a50 70 72 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  pr;.    int i;. 
21a60 20 20 20 2a 70 52 65 67 20 20 3d 20 30 3b 0a 20     *pReg  = 0;. 
21a70 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
21a80 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
21a90 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
21aa0 20 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70       for(pItem=p
21ab0 2d 3e 61 2c 20 69 3d 70 2d 3e 6e 45 78 70 72 3b  ->a, i=p->nExpr;
21ac0 20 69 3e 30 3b 20 70 49 74 65 6d 2b 2b 2c 20 69   i>0; pItem++, i
21ad0 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  --){.        if(
21ae0 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65   pItem->reusable
21af0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
21b00 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45  ompare(pItem->pE
21b10 78 70 72 2c 70 45 78 70 72 2c 2d 31 29 3d 3d 30  xpr,pExpr,-1)==0
21b20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
21b30 74 75 72 6e 20 70 49 74 65 6d 2d 3e 75 2e 69 43  turn pItem->u.iC
21b40 6f 6e 73 74 45 78 70 72 52 65 67 3b 0a 20 20 20  onstExprReg;.   
21b50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
21b60 20 20 20 7d 0a 20 20 20 20 72 32 20 3d 20 2b 2b     }.    r2 = ++
21b70 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
21b80 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
21b90 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20  eAtInit(pParse, 
21ba0 70 45 78 70 72 2c 20 72 32 2c 20 31 29 3b 0a 20  pExpr, r2, 1);. 
21bb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
21bc0 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
21bd0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
21be0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
21bf0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
21c00 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31  Parse, pExpr, r1
21c10 29 3b 0a 20 20 20 20 69 66 28 20 72 32 3d 3d 72  );.    if( r2==r
21c20 31 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 67  1 ){.      *pReg
21c30 20 3d 20 72 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = r1;.    }else
21c40 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
21c50 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
21c60 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
21c70 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20   *pReg = 0;.    
21c80 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
21c90 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  2;.}../*.** Gene
21ca0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
21cb0 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70  ill evaluate exp
21cc0 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e  ression pExpr an
21cd0 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72  d store the.** r
21ce0 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74  esults in regist
21cf0 65 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20  er target.  The 
21d00 72 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72  results are guar
21d10 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72  anteed to appear
21d20 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20  .** in register 
21d30 74 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20  target..*/.void 
21d40 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
21d50 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
21d60 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
21d70 74 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69  target){.  int i
21d80 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  nReg;..  assert(
21d90 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72   target>0 && tar
21da0 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65  get<=pParse->nMe
21db0 6d 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72  m );.  if( pExpr
21dc0 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   && pExpr->op==T
21dd0 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20  K_REGISTER ){.  
21de0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21df0 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op2(pParse->pVdb
21e00 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70  e, OP_Copy, pExp
21e10 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65  r->iTable, targe
21e20 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
21e30 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
21e40 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
21e50 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
21e60 72 67 65 74 29 3b 0a 20 20 20 20 61 73 73 65 72  rget);.    asser
21e70 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  t( pParse->pVdbe
21e80 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  !=0 || pParse->d
21e90 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
21ea0 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67  );.    if( inReg
21eb0 21 3d 74 61 72 67 65 74 20 26 26 20 70 50 61 72  !=target && pPar
21ec0 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20  se->pVdbe ){.   
21ed0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21ee0 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp2(pParse->pVd
21ef0 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e  be, OP_SCopy, in
21f00 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  Reg, target);.  
21f10 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
21f20 20 4d 61 6b 65 20 61 20 74 72 61 6e 73 69 65 6e   Make a transien
21f30 74 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73  t copy of expres
21f40 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 74  sion pExpr and t
21f50 68 65 6e 20 63 6f 64 65 20 69 74 20 75 73 69 6e  hen code it usin
21f60 67 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72  g.** sqlite3Expr
21f70 43 6f 64 65 28 29 2e 20 20 54 68 69 73 20 72 6f  Code().  This ro
21f80 75 74 69 6e 65 20 77 6f 72 6b 73 20 6a 75 73 74  utine works just
21f90 20 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70   like sqlite3Exp
21fa0 72 43 6f 64 65 28 29 0a 2a 2a 20 65 78 63 65 70  rCode().** excep
21fb0 74 20 74 68 61 74 20 74 68 65 20 69 6e 70 75 74  t that the input
21fc0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 67   expression is g
21fd0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
21fe0 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f  unchanged..*/.vo
21ff0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
22000 64 65 43 6f 70 79 28 50 61 72 73 65 20 2a 70 50  deCopy(Parse *pP
22010 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
22020 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
22030 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
22040 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 45  pParse->db;.  pE
22050 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
22060 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20  rDup(db, pExpr, 
22070 30 29 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  0);.  if( !db->m
22080 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 73 71  allocFailed ) sq
22090 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
220a0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
220b0 67 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  get);.  sqlite3E
220c0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
220d0 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  xpr);.}../*.** G
220e0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
220f0 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20  t will evaluate 
22100 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
22110 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a   and store the.*
22120 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67  * results in reg
22130 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54  ister target.  T
22140 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67  he results are g
22150 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70  uaranteed to app
22160 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  ear.** in regist
22170 65 72 20 74 61 72 67 65 74 2e 20 20 49 66 20 74  er target.  If t
22180 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
22190 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20   constant, then 
221a0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
221b0 6d 69 67 68 74 20 63 68 6f 6f 73 65 20 74 6f 20  might choose to 
221c0 63 6f 64 65 20 74 68 65 20 65 78 70 72 65 73 73  code the express
221d0 69 6f 6e 20 61 74 20 69 6e 69 74 69 61 6c 69 7a  ion at initializ
221e0 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76  ation time..*/.v
221f0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
22200 6f 64 65 46 61 63 74 6f 72 61 62 6c 65 28 50 61  odeFactorable(Pa
22210 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
22220 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
22230 72 67 65 74 29 7b 0a 20 20 69 66 28 20 70 50 61  rget){.  if( pPa
22240 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74  rse->okConstFact
22250 6f 72 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  or && sqlite3Exp
22260 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70  rIsConstant(pExp
22270 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  r) ){.    sqlite
22280 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28  3ExprCodeAtInit(
22290 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
222a0 61 72 67 65 74 2c 20 30 29 3b 0a 20 20 7d 65 6c  arget, 0);.  }el
222b0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
222c0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
222d0 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
222e0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
222f0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
22300 65 76 61 6c 75 61 74 65 73 20 74 68 65 20 67 69  evaluates the gi
22310 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61  ven expression a
22320 6e 64 20 70 75 74 73 20 74 68 65 20 72 65 73 75  nd puts the resu
22330 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  lt.** in registe
22340 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20  r target..**.** 
22350 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79  Also make a copy
22360 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
22370 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20  on results into 
22380 61 6e 6f 74 68 65 72 20 22 63 61 63 68 65 22 20  another "cache" 
22390 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20  register.** and 
223a0 6d 6f 64 69 66 79 20 74 68 65 20 65 78 70 72 65  modify the expre
223b0 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68  ssion so that th
223c0 65 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69  e next time it i
223d0 73 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20  s evaluated,.** 
223e0 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20  the result is a 
223f0 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 63 68  copy of the cach
22400 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a  e register..**.*
22410 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
22420 73 20 75 73 65 64 20 66 6f 72 20 65 78 70 72 65  s used for expre
22430 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ssions that are 
22440 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a  used multiple .*
22450 2a 20 74 69 6d 65 73 2e 20 20 54 68 65 79 20 61  * times.  They a
22460 72 65 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63  re evaluated onc
22470 65 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74  e and the result
22480 73 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  s of the express
22490 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73 65  ion.** are reuse
224a0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
224b0 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63  e3ExprCodeAndCac
224c0 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  he(Parse *pParse
224d0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
224e0 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64  nt target){.  Vd
224f0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
22500 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65  pVdbe;.  int iMe
22510 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61  m;..  assert( ta
22520 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  rget>0 );.  asse
22530 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
22540 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20  K_REGISTER );.  
22550 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
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 29 3b 0a 20 20 69 4d 65 6d 20 3d  arget);.  iMem =
22580 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
22590 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
225a0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
225b0 20 74 61 72 67 65 74 2c 20 69 4d 65 6d 29 3b 0a   target, iMem);.
225c0 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72    exprToRegister
225d0 28 70 45 78 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d  (pExpr, iMem);.}
225e0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
225f0 20 63 6f 64 65 20 74 68 61 74 20 70 75 73 68 65   code that pushe
22600 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65  s the value of e
22610 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20  very element of 
22620 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70  the given.** exp
22630 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74  ression list int
22640 6f 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  o a sequence of 
22650 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e  registers beginn
22660 69 6e 67 20 61 74 20 74 61 72 67 65 74 2e 0a 2a  ing at target..*
22670 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
22680 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
22690 74 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2a  ts evaluated..**
226a0 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45  .** The SQLITE_E
226b0 43 45 4c 5f 44 55 50 20 66 6c 61 67 20 70 72 65  CEL_DUP flag pre
226c0 76 65 6e 74 73 20 74 68 65 20 61 72 67 75 6d 65  vents the argume
226d0 6e 74 73 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a  nts from being.*
226e0 2a 20 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 4f  * filled using O
226f0 50 5f 53 43 6f 70 79 2e 20 20 4f 50 5f 43 6f 70  P_SCopy.  OP_Cop
22700 79 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 69  y must be used i
22710 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  nstead..**.** Th
22720 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41  e SQLITE_ECEL_FA
22730 43 54 4f 52 20 61 72 67 75 6d 65 6e 74 20 61 6c  CTOR argument al
22740 6c 6f 77 73 20 63 6f 6e 73 74 61 6e 74 20 61 72  lows constant ar
22750 67 75 6d 65 6e 74 73 20 74 6f 20 62 65 0a 2a 2a  guments to be.**
22760 20 66 61 63 74 6f 72 65 64 20 6f 75 74 20 69 6e   factored out in
22770 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  to initializatio
22780 6e 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  n code..**.** Th
22790 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45  e SQLITE_ECEL_RE
227a0 46 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61  F flag means tha
227b0 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  t expressions in
227c0 20 74 68 65 20 6c 69 73 74 20 77 69 74 68 0a 2a   the list with.*
227d0 2a 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 75  * ExprList.a[].u
227e0 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30  .x.iOrderByCol>0
227f0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
22800 65 6e 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  en evaluated and
22810 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 72 65   stored.** in re
22820 67 69 73 74 65 72 73 20 61 74 20 73 72 63 52 65  gisters at srcRe
22830 67 2c 20 61 6e 64 20 73 6f 20 74 68 65 20 76 61  g, and so the va
22840 6c 75 65 20 63 61 6e 20 62 65 20 63 6f 70 69 65  lue can be copie
22850 64 20 66 72 6f 6d 20 74 68 65 72 65 2e 0a 2a 2f  d from there..*/
22860 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
22870 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20  CodeExprList(.  
22880 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
22890 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
228a0 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
228b0 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a  ist *pList,   /*
228c0 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
228d0 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64  list to be coded
228e0 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74   */.  int target
228f0 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72  ,        /* Wher
22900 65 20 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c  e to write resul
22910 74 73 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 52  ts */.  int srcR
22920 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 6f  eg,        /* So
22930 75 72 63 65 20 72 65 67 69 73 74 65 72 73 20 69  urce registers i
22940 66 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45  f SQLITE_ECEL_RE
22950 46 20 2a 2f 0a 20 20 75 38 20 66 6c 61 67 73 20  F */.  u8 flags 
22960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
22970 49 54 45 5f 45 43 45 4c 5f 2a 20 66 6c 61 67 73  ITE_ECEL_* flags
22980 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
22990 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
229a0 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Item;.  int i, j
229b0 2c 20 6e 3b 0a 20 20 75 38 20 63 6f 70 79 4f 70  , n;.  u8 copyOp
229c0 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
229d0 54 45 5f 45 43 45 4c 5f 44 55 50 29 20 3f 20 4f  TE_ECEL_DUP) ? O
229e0 50 5f 43 6f 70 79 20 3a 20 4f 50 5f 53 43 6f 70  P_Copy : OP_SCop
229f0 79 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  y;.  Vdbe *v = p
22a00 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
22a10 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
22a20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61   );.  assert( ta
22a30 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  rget>0 );.  asse
22a40 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62  rt( pParse->pVdb
22a50 65 21 3d 30 20 29 3b 20 20 2f 2a 20 4e 65 76 65  e!=0 );  /* Neve
22a60 72 20 67 65 74 73 20 74 68 69 73 20 66 61 72 20  r gets this far 
22a70 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 6e  otherwise */.  n
22a80 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
22a90 0a 20 20 69 66 28 20 21 43 6f 6e 73 74 46 61 63  .  if( !ConstFac
22aa0 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29 20  torOk(pParse) ) 
22ab0 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
22ac0 5f 45 43 45 4c 5f 46 41 43 54 4f 52 3b 0a 20 20  _ECEL_FACTOR;.  
22ad0 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
22ae0 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  >a, i=0; i<n; i+
22af0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
22b00 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
22b10 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
22b20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 53 51   if( (flags & SQ
22b30 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 29 21 3d  LITE_ECEL_REF)!=
22b40 30 20 26 26 20 28 6a 20 3d 20 70 4c 69 73 74 2d  0 && (j = pList-
22b50 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  >a[i].u.x.iOrder
22b60 42 79 43 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20  ByCol)>0 ){.    
22b70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22b80 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20 6a  Op2(v, copyOp, j
22b90 2b 73 72 63 52 65 67 2d 31 2c 20 74 61 72 67 65  +srcReg-1, targe
22ba0 74 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  t+i);.    }else 
22bb0 69 66 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c  if( (flags & SQL
22bc0 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29  ITE_ECEL_FACTOR)
22bd0 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 45 78  !=0 && sqlite3Ex
22be0 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78  prIsConstant(pEx
22bf0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  pr) ){.      sql
22c00 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e  ite3ExprCodeAtIn
22c10 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  it(pParse, pExpr
22c20 2c 20 74 61 72 67 65 74 2b 69 2c 20 30 29 3b 0a  , target+i, 0);.
22c30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22c40 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 73 71 6c   int inReg = sql
22c50 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
22c60 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
22c70 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20  , target+i);.   
22c80 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61     if( inReg!=ta
22c90 72 67 65 74 2b 69 20 29 7b 0a 20 20 20 20 20 20  rget+i ){.      
22ca0 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
22cb0 20 20 20 20 20 20 20 69 66 28 20 63 6f 70 79 4f         if( copyO
22cc0 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20  p==OP_Copy.     
22cd0 20 20 20 20 26 26 20 28 70 4f 70 3d 73 71 6c 69      && (pOp=sqli
22ce0 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
22cf0 2d 31 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50  -1))->opcode==OP
22d00 5f 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26  _Copy.         &
22d10 26 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70  & pOp->p1+pOp->p
22d20 33 2b 31 3d 3d 69 6e 52 65 67 0a 20 20 20 20 20  3+1==inReg.     
22d30 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70      && pOp->p2+p
22d40 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61 72 67 65 74  Op->p3+1==target
22d50 2b 69 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  +i.        ){.  
22d60 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 2b          pOp->p3+
22d70 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  +;.        }else
22d80 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
22d90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
22da0 20 63 6f 70 79 4f 70 2c 20 69 6e 52 65 67 2c 20   copyOp, inReg, 
22db0 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20  target+i);.     
22dc0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
22dd0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
22de0 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  n;.}../*.** Gene
22df0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
22e00 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72  BETWEEN operator
22e10 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20 42 45 54  ..**.**    x BET
22e20 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a  WEEN y AND z.**.
22e30 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73 20  ** The above is 
22e40 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 2a  equivalent to .*
22e50 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44  *.**    x>=y AND
22e60 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65   x<=z.**.** Code
22e70 20 69 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b   it as such, tak
22e80 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74  ing care to do t
22e90 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70  he common subexp
22ea0 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c 69 6d 69  ression.** elimi
22eb0 6e 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2a 0a  nation of x..**.
22ec0 2a 2a 20 54 68 65 20 78 4a 75 6d 70 49 66 20 70  ** The xJumpIf p
22ed0 61 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69  arameter determi
22ee0 6e 65 73 20 64 65 74 61 69 6c 73 3a 0a 2a 2a 0a  nes details:.**.
22ef0 2a 2a 20 20 20 20 4e 55 4c 4c 3a 20 20 20 20 20  **    NULL:     
22f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 74                St
22f10 6f 72 65 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20  ore the boolean 
22f20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 5b 64 65  result in reg[de
22f30 73 74 5d 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65  st].**    sqlite
22f40 33 45 78 70 72 49 66 54 72 75 65 3a 20 20 20 20  3ExprIfTrue:    
22f50 20 20 4a 75 6d 70 20 74 6f 20 64 65 73 74 20 69    Jump to dest i
22f60 66 20 74 72 75 65 0a 2a 2a 20 20 20 20 73 71 6c  f true.**    sql
22f70 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 3a  ite3ExprIfFalse:
22f80 20 20 20 20 20 4a 75 6d 70 20 74 6f 20 64 65 73       Jump to des
22f90 74 20 69 66 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a  t if false.**.**
22fa0 20 54 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   The jumpIfNull 
22fb0 70 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e  parameter is ign
22fc0 6f 72 65 64 20 69 66 20 78 4a 75 6d 70 49 66 20  ored if xJumpIf 
22fd0 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  is NULL..*/.stat
22fe0 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 64 65  ic void exprCode
22ff0 42 65 74 77 65 65 6e 28 0a 20 20 50 61 72 73 65  Between(.  Parse
23000 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
23010 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
23020 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
23030 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
23040 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  Expr,      /* Th
23050 65 20 42 45 54 57 45 45 4e 20 65 78 70 72 65 73  e BETWEEN expres
23060 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65  sion */.  int de
23070 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  st,         /* J
23080 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ump destination 
23090 6f 72 20 73 74 6f 72 61 67 65 20 6c 6f 63 61 74  or storage locat
230a0 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ion */.  void (*
230b0 78 4a 75 6d 70 29 28 50 61 72 73 65 2a 2c 45 78  xJump)(Parse*,Ex
230c0 70 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 20 2f 2a  pr*,int,int), /*
230d0 20 41 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20   Action to take 
230e0 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e  */.  int jumpIfN
230f0 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20 74  ull    /* Take t
23100 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42  he jump if the B
23110 45 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20 2a  ETWEEN is NULL *
23120 2f 0a 29 7b 0a 20 45 78 70 72 20 65 78 70 72 41  /.){. Expr exprA
23130 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 41  nd;     /* The A
23140 4e 44 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 20  ND operator in  
23150 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20 20 2a  x>=y AND x<=z  *
23160 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66  /.  Expr compLef
23170 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 20 78 3e  t;    /* The  x>
23180 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78  =y  term */.  Ex
23190 70 72 20 63 6f 6d 70 52 69 67 68 74 3b 20 20 20  pr compRight;   
231a0 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20 74 65  /* The  x<=z  te
231b0 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 65 78 70  rm */.  Expr exp
231c0 72 58 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  rX;       /* The
231d0 20 20 78 20 20 73 75 62 65 78 70 72 65 73 73 69    x  subexpressi
231e0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46  on */.  int regF
231f0 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54 65 6d  ree1 = 0; /* Tem
23200 70 6f 72 61 72 79 20 75 73 65 20 72 65 67 69 73  porary use regis
23210 74 65 72 20 2a 2f 0a 0a 0a 20 20 6d 65 6d 73 65  ter */...  memse
23220 74 28 26 63 6f 6d 70 4c 65 66 74 2c 20 30 2c 20  t(&compLeft, 0, 
23230 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20  sizeof(Expr));. 
23240 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 52 69 67   memset(&compRig
23250 68 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78  ht, 0, sizeof(Ex
23260 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  pr));.  memset(&
23270 65 78 70 72 41 6e 64 2c 20 30 2c 20 73 69 7a 65  exprAnd, 0, size
23280 6f 66 28 45 78 70 72 29 29 3b 0a 0a 20 20 61 73  of(Expr));..  as
23290 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
232a0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
232b0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
232c0 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d   exprX = *pExpr-
232d0 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e  >pLeft;.  exprAn
232e0 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20  d.op = TK_AND;. 
232f0 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d   exprAnd.pLeft =
23300 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 65 78   &compLeft;.  ex
23310 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26  prAnd.pRight = &
23320 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63 6f 6d  compRight;.  com
23330 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45  pLeft.op = TK_GE
23340 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65  ;.  compLeft.pLe
23350 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63  ft = &exprX;.  c
23360 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20 3d  ompLeft.pRight =
23370 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
23380 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 63  >a[0].pExpr;.  c
23390 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b  ompRight.op = TK
233a0 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74  _LE;.  compRight
233b0 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b  .pLeft = &exprX;
233c0 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69  .  compRight.pRi
233d0 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ght = pExpr->x.p
233e0 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
233f0 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69 73 74  ;.  exprToRegist
23400 65 72 28 26 65 78 70 72 58 2c 20 65 78 70 72 43  er(&exprX, exprC
23410 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72 73 65  odeVector(pParse
23420 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67 46 72  , &exprX, &regFr
23430 65 65 31 29 29 3b 0a 20 20 69 66 28 20 78 4a 75  ee1));.  if( xJu
23440 6d 70 20 29 7b 0a 20 20 20 20 78 4a 75 6d 70 28  mp ){.    xJump(
23450 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64  pParse, &exprAnd
23460 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
23470 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ll);.  }else{.  
23480 20 20 65 78 70 72 58 2e 66 6c 61 67 73 20 7c 3d    exprX.flags |=
23490 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20   EP_FromJoin;.  
234a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
234b0 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
234c0 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 29 3b  &exprAnd, dest);
234d0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
234e0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
234f0 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
23500 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 61 64 65  .  /* Ensure ade
23510 71 75 61 74 65 20 74 65 73 74 20 63 6f 76 65 72  quate test cover
23520 61 67 65 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  age */.  testcas
23530 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
23540 33 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20  3ExprIfTrue  && 
23550 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26  jumpIfNull==0 &&
23560 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
23570 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
23580 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
23590 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e  True  && jumpIfN
235a0 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
235b0 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1!=0 );.  testc
235c0 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
235d0 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20 26  te3ExprIfTrue  &
235e0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20  & jumpIfNull!=0 
235f0 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  && regFree1==0 )
23600 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
23610 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ump==sqlite3Expr
23620 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49  IfTrue  && jumpI
23630 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
23640 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73  ree1!=0 );.  tes
23650 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
23660 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
23670 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
23680 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
23690 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
236a0 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78  xJump==sqlite3Ex
236b0 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d  prIfFalse && jum
236c0 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
236d0 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74  gFree1!=0 );.  t
236e0 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
236f0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
23700 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  se && jumpIfNull
23710 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  !=0 && regFree1=
23720 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
23730 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
23740 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a  ExprIfFalse && j
23750 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
23760 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20  regFree1!=0 );. 
23770 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
23780 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ==0 );.}../*.** 
23790 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
237a0 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72  r a boolean expr
237b0 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74  ession such that
237c0 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a   a jump is made.
237d0 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20  ** to the label 
237e0 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78  "dest" if the ex
237f0 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65  pression is true
23800 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a   but execution.*
23810 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61  * continues stra
23820 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65  ight thru if the
23830 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
23840 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  alse..**.** If t
23850 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76  he expression ev
23860 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20  aluates to NULL 
23870 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f  (neither true no
23880 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a  r false), then.*
23890 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20  * take the jump 
238a0 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c  if the jumpIfNul
238b0 6c 20 66 6c 61 67 20 69 73 20 53 51 4c 49 54 45  l flag is SQLITE
238c0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a  _JUMPIFNULL..**.
238d0 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70  ** This code dep
238e0 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74  ends on the fact
238f0 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f   that certain to
23900 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ken values (ex: 
23910 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68  TK_EQ).** are th
23920 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65  e same as opcode
23930 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f   values (ex: OP_
23940 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  Eq) that impleme
23950 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  nt the correspon
23960 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  ding.** operatio
23970 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d  n.  Special comm
23980 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61  ents in vdbe.c a
23990 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68  nd the mkopcodeh
239a0 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a  .awk script in.*
239b0 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65  * the make proce
239c0 73 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76  ss cause these v
239d0 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20  alues to align. 
239e0 20 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68   Assert()s in th
239f0 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20  e code.** below 
23a00 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
23a10 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67  numbers are alig
23a20 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  ned correctly..*
23a30 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
23a40 70 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a  prIfTrue(Parse *
23a50 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
23a60 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
23a70 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
23a80 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
23a90 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
23aa0 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72   op = 0;.  int r
23ab0 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69  egFree1 = 0;.  i
23ac0 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  nt regFree2 = 0;
23ad0 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a  .  int r1, r2;..
23ae0 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66    assert( jumpIf
23af0 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d  Null==SQLITE_JUM
23b00 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49  PIFNULL || jumpI
23b10 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  fNull==0 );.  if
23b20 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
23b30 20 20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20      return;  /* 
23b40 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42  Existence of VDB
23b50 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c  E checked by cal
23b60 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ler */.  if( NEV
23b70 45 52 28 70 45 78 70 72 3d 3d 30 29 20 29 20 72  ER(pExpr==0) ) r
23b80 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61  eturn;  /* No wa
23b90 79 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65  y this can happe
23ba0 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45 78 70  n */.  op = pExp
23bb0 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28  r->op;.  switch(
23bc0 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
23bd0 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20  TK_AND: {.      
23be0 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
23bf0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
23c00 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
23c10 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
23c20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
23c30 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
23c40 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
23c50 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e  , d2,jumpIfNull^
23c60 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
23c70 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
23c80 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
23c90 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
23ca0 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
23cb0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
23cc0 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
23cd0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
23ce0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
23cf0 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a  veLabel(v, d2);.
23d00 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
23d10 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
23d20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
23d30 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
23d40 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 74 65  K_OR: {.      te
23d50 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
23d60 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
23d70 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
23d80 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
23d90 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
23da0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
23db0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
23dc0 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
23dd0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
23de0 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
23df0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
23e00 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
23e10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
23e20 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
23e30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
23e40 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
23e50 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  K_NOT: {.      t
23e60 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
23e70 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
23e80 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
23e90 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
23ea0 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
23eb0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
23ec0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
23ed0 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20     case TK_IS:. 
23ee0 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54     case TK_ISNOT
23ef0 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
23f00 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ( op==TK_IS );. 
23f10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
23f20 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20  p==TK_ISNOT );. 
23f30 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54       op = (op==T
23f40 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20  K_IS) ? TK_EQ : 
23f50 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 6a 75 6d  TK_NE;.      jum
23f60 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45  pIfNull = SQLITE
23f70 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f  _NULLEQ;.      /
23f80 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20  * Fall thru */. 
23f90 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
23fa0 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
23fb0 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
23fc0 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
23fd0 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
23fe0 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
23ff0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
24000 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
24010 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 20 67  Expr->pLeft) ) g
24020 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78 70 72  oto default_expr
24030 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
24040 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
24050 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
24060 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
24070 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
24080 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
24090 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
240a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
240b0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
240c0 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
240d0 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ee2);.      code
240e0 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
240f0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
24100 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
24110 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24120 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c     r1, r2, dest,
24130 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
24140 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54      assert(TK_LT
24150 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61  ==OP_Lt); testca
24160 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56  se(op==OP_Lt); V
24170 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
24180 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20  op==OP_Lt);.    
24190 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d    assert(TK_LE==
241a0 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Le); testcase
241b0 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62  (op==OP_Le); Vdb
241c0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
241d0 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20  ==OP_Le);.      
241e0 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50  assert(TK_GT==OP
241f0 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Gt); testcase(o
24200 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43  p==OP_Gt); VdbeC
24210 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
24220 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73  OP_Gt);.      as
24230 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47  sert(TK_GE==OP_G
24240 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
24250 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ge); VdbeCov
24260 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
24270 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Ge);.      asse
24280 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29  rt(TK_EQ==OP_Eq)
24290 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
242a0 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56 64 62  P_Eq);.      Vdb
242b0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
242c0 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70  p==OP_Eq && jump
242d0 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e  IfNull==SQLITE_N
242e0 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64  ULLEQ);.      Vd
242f0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
24300 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d  op==OP_Eq && jum
24310 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f  pIfNull!=SQLITE_
24320 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 61  NULLEQ);.      a
24330 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f  ssert(TK_NE==OP_
24340 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ne); testcase(op
24350 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ne);.      
24360 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
24370 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a  , op==OP_Ne && j
24380 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
24390 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
243a0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
243b0 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20  v, op==OP_Ne && 
243c0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49  jumpIfNull!=SQLI
243d0 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
243e0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
243f0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
24400 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
24410 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
24420 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
24430 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
24440 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
24450 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73  NULL: {.      as
24460 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d  sert( TK_ISNULL=
24470 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20  =OP_IsNull );   
24480 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
24490 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
244a0 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e   assert( TK_NOTN
244b0 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20  ULL==OP_NotNull 
244c0 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d  ); testcase( op=
244d0 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20  =TK_NOTNULL );. 
244e0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
244f0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
24500 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
24510 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
24520 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
24530 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72  eAddOp2(v, op, r
24540 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  1, dest);.      
24550 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
24560 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29  , op==TK_ISNULL)
24570 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
24580 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
24590 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  _NOTNULL);.     
245a0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
245b0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
245c0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
245d0 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
245e0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
245f0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
24600 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43  0 );.      exprC
24610 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73  odeBetween(pPars
24620 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
24630 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
24640 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  e, jumpIfNull);.
24650 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
24660 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
24670 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
24680 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
24690 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  {.      int dest
246a0 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65  IfFalse = sqlite
246b0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
246c0 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73  );.      int des
246d0 74 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49 66  tIfNull = jumpIf
246e0 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64 65  Null ? dest : de
246f0 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 20 20 20  stIfFalse;.     
24700 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
24710 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
24720 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64  , destIfFalse, d
24730 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
24740 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
24750 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  o(v, dest);.    
24760 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
24770 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
24780 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20  tIfFalse);.     
24790 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
247a0 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
247b0 3a 20 7b 0a 20 20 20 20 64 65 66 61 75 6c 74 5f  : {.    default_
247c0 65 78 70 72 3a 0a 20 20 20 20 20 20 69 66 28 20  expr:.      if( 
247d0 65 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 70  exprAlwaysTrue(p
247e0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
247f0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
24800 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  (v, dest);.     
24810 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72 41   }else if( exprA
24820 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78 70 72  lwaysFalse(pExpr
24830 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
24840 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d  No-op */.      }
24850 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31  else{.        r1
24860 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
24870 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
24880 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29  Expr, &regFree1)
24890 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
248a0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
248b0 50 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c 20  P_If, r1, dest, 
248c0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a  jumpIfNull!=0);.
248d0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
248e0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
248f0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
24900 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
24910 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
24920 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
24930 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
24940 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
24950 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
24960 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
24970 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
24980 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
24990 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
249a0 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ;  .}../*.** Gen
249b0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
249c0 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
249d0 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
249e0 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
249f0 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
24a00 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
24a10 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62  ssion is false b
24a20 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
24a30 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
24a40 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
24a50 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
24a60 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
24a70 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
24a80 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65  ates to NULL (ne
24a90 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66  ither true nor f
24aa0 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75  alse) then.** ju
24ab0 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c  mp if jumpIfNull
24ac0 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49   is SQLITE_JUMPI
24ad0 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68  FNULL or fall th
24ae0 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e  rough if jumpIfN
24af0 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a  ull.** is 0..*/.
24b00 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
24b10 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70  IfFalse(Parse *p
24b20 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
24b30 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
24b40 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
24b50 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
24b60 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
24b70 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  op = 0;.  int re
24b80 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e  gFree1 = 0;.  in
24b90 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a  t regFree2 = 0;.
24ba0 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20    int r1, r2;.. 
24bb0 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e   assert( jumpIfN
24bc0 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50  ull==SQLITE_JUMP
24bd0 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66  IFNULL || jumpIf
24be0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Null==0 );.  if(
24bf0 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72   NEVER(v==0) ) r
24c00 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74 65  eturn; /* Existe
24c10 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63  nce of VDBE chec
24c20 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f  ked by caller */
24c30 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
24c40 29 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20  )    return;..  
24c50 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  /* The value of 
24c60 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70  pExpr->op and op
24c70 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73 20   are related as 
24c80 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
24c90 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  **       pExpr->
24ca0 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f 70  op            op
24cb0 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d  .  **       ----
24cc0 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d  -----          -
24cd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20  ---------.  **  
24ce0 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20       TK_ISNULL  
24cf0 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75          OP_NotNu
24d00 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  ll.  **       TK
24d10 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20  _NOTNULL        
24d20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20   OP_IsNull.  ** 
24d30 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20        TK_NE     
24d40 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20           OP_Eq. 
24d50 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20   **       TK_EQ 
24d60 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
24d70 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Ne.  **       TK
24d80 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _GT             
24d90 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Le.  **     
24da0 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20    TK_LE         
24db0 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20       OP_Gt.  ** 
24dc0 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20        TK_GE     
24dd0 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20           OP_Lt. 
24de0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20   **       TK_LT 
24df0 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
24e00 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72  Ge.  **.  ** For
24e10 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66   other values of
24e20 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69   pExpr->op, op i
24e30 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20  s undefined and 
24e40 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65  unused..  ** The
24e50 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e   value of TK_ an
24e60 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20  d OP_ constants 
24e70 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75 63  are arranged suc
24e80 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63  h that we.  ** c
24e90 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d  an compute the m
24ea0 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69  apping above usi
24eb0 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
24ec0 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a   expression..  *
24ed0 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72 69  * Assert()s veri
24ee0 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70  fy that the comp
24ef0 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65  utation is corre
24f00 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20  ct..  */.  op = 
24f10 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f  ((pExpr->op+(TK_
24f20 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54  ISNULL&1))^1)-(T
24f30 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20  K_ISNULL&1);..  
24f40 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65 63  /* Verify correc
24f50 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54  t alignment of T
24f60 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
24f70 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ants.  */.  asse
24f80 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
24f90 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d  K_ISNULL || op==
24fa0 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20  OP_NotNull );.  
24fb0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
24fc0 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c  p!=TK_NOTNULL ||
24fd0 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29   op==OP_IsNull )
24fe0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
24ff0 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20  r->op!=TK_NE || 
25000 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61  op==OP_Eq );.  a
25010 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
25020 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_EQ || op==O
25030 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ne );.  assert
25040 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
25050 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20  LT || op==OP_Ge 
25060 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
25070 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c  pr->op!=TK_LE ||
25080 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20   op==OP_Gt );.  
25090 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
250a0 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d  p!=TK_GT || op==
250b0 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Le );.  asser
250c0 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
250d0 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74  _GE || op==OP_Lt
250e0 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70   );..  switch( p
250f0 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
25100 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
25110 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
25120 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
25130 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
25140 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
25150 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
25160 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
25170 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
25180 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
25190 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
251a0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
251b0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
251c0 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
251d0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
251e0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
251f0 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
25200 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
25210 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b     case TK_OR: {
25220 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20  .      int d2 = 
25230 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
25240 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74  abel(v);.      t
25250 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
25260 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
25270 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
25280 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
25290 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70  >pLeft, d2, jump
252a0 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55  IfNull^SQLITE_JU
252b0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
252c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
252d0 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
252e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
252f0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
25300 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
25310 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
25320 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
25330 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
25340 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71  v, d2);.      sq
25350 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
25360 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
25370 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
25380 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
25390 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
253a0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
253b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
253c0 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
253d0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
253e0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
253f0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
25400 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
25410 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IS:.    case T
25420 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74  K_ISNOT:.      t
25430 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
25440 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
25450 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
25460 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
25470 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28   );.      op = (
25480 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
25490 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45  ) ? TK_NE : TK_E
254a0 51 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49 66 4e  Q;.      jumpIfN
254b0 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c  ull = SQLITE_NUL
254c0 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61  LEQ;.      /* Fa
254d0 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63  ll thru */.    c
254e0 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
254f0 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
25500 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
25510 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
25520 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
25530 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
25540 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
25550 70 72 49 73 56 65 63 74 6f 72 28 70 45 78 70 72  prIsVector(pExpr
25560 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f 74 6f 20  ->pLeft) ) goto 
25570 64 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20  default_expr;.  
25580 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
25590 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
255a0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
255b0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
255c0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
255d0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
255e0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
255f0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
25600 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
25610 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
25620 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
25630 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
25640 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
25650 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
25660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
25670 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d  1, r2, dest, jum
25680 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
25690 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50  assert(TK_LT==OP
256a0 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Lt); testcase(o
256b0 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43  p==OP_Lt); VdbeC
256c0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
256d0 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73  OP_Lt);.      as
256e0 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c  sert(TK_LE==OP_L
256f0 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
25700 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Le); VdbeCov
25710 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
25720 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Le);.      asse
25730 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29  rt(TK_GT==OP_Gt)
25740 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
25750 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Gt); VdbeCover
25760 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
25770 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
25780 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20  (TK_GE==OP_Ge); 
25790 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
257a0 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
257b0 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
257c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
257d0 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65  K_EQ==OP_Eq); te
257e0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71  stcase(op==OP_Eq
257f0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
25800 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
25810 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Eq && jumpIfNu
25820 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll!=SQLITE_NULLE
25830 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
25840 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
25850 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Eq && jumpIfN
25860 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull==SQLITE_NULL
25870 45 51 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  EQ);.      asser
25880 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b  t(TK_NE==OP_Ne);
25890 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
258a0 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _Ne);.      Vdbe
258b0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
258c0 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49  ==OP_Ne && jumpI
258d0 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55  fNull!=SQLITE_NU
258e0 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62  LLEQ);.      Vdb
258f0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
25900 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70  p==OP_Ne && jump
25910 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e  IfNull==SQLITE_N
25920 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65  ULLEQ);.      te
25930 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
25940 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
25950 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
25960 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
25970 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
25980 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
25990 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
259a0 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  : {.      r1 = s
259b0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
259c0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
259d0 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
259e0 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e1);.      sqlit
259f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
25a00 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20  op, r1, dest);. 
25a10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
25a20 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20  p==TK_ISNULL ); 
25a30 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
25a40 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  (v, op==TK_ISNUL
25a50 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  L);.      testca
25a60 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  se( op==TK_NOTNU
25a70 4c 4c 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72  LL );  VdbeCover
25a80 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
25a90 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  NOTNULL);.      
25aa0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
25ab0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e1==0 );.      b
25ac0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
25ad0 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
25ae0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
25af0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
25b00 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f   );.      exprCo
25b10 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65  deBetween(pParse
25b20 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 73  , pExpr, dest, s
25b30 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
25b40 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  e, jumpIfNull);.
25b50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25b60 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
25b70 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
25b80 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
25b90 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 75 6d 70  {.      if( jump
25ba0 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  IfNull ){.      
25bb0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
25bc0 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70  eIN(pParse, pExp
25bd0 72 2c 20 64 65 73 74 2c 20 64 65 73 74 29 3b 0a  r, dest, dest);.
25be0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
25bf0 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
25c00 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ull = sqlite3Vdb
25c10 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
25c20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
25c30 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
25c40 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65   pExpr, dest, de
25c50 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
25c60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
25c70 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
25c80 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
25c90 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
25ca0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
25cb0 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
25cc0 64 65 66 61 75 6c 74 5f 65 78 70 72 3a 20 0a 20  default_expr: . 
25cd0 20 20 20 20 20 69 66 28 20 65 78 70 72 41 6c 77       if( exprAlw
25ce0 61 79 73 46 61 6c 73 65 28 70 45 78 70 72 29 20  aysFalse(pExpr) 
25cf0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
25d00 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65  e3VdbeGoto(v, de
25d10 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
25d20 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 54   if( exprAlwaysT
25d30 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  rue(pExpr) ){.  
25d40 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a        /* no-op *
25d50 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  /.      }else{. 
25d60 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
25d70 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
25d80 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26  pParse, pExpr, &
25d90 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
25da0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
25db0 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp3(v, OP_IfNot
25dc0 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r1, dest, jump
25dd0 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20  IfNull!=0);.    
25de0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
25df0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  (v);.        tes
25e00 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
25e10 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
25e20 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
25e30 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  ll==0 );.      }
25e40 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
25e50 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
25e60 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
25e70 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
25e80 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
25e90 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
25ea0 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a  e, regFree2);.}.
25eb0 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69  ./*.** Like sqli
25ec0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 29  te3ExprIfFalse()
25ed0 20 65 78 63 65 70 74 20 74 68 61 74 20 61 20 63   except that a c
25ee0 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 70  opy is made of p
25ef0 45 78 70 72 20 62 65 66 6f 72 65 0a 2a 2a 20 63  Expr before.** c
25f00 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2c 20  ode generation, 
25f10 61 6e 64 20 74 68 61 74 20 63 6f 70 79 20 69 73  and that copy is
25f20 20 64 65 6c 65 74 65 64 20 61 66 74 65 72 20 63   deleted after c
25f30 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20  ode generation. 
25f40 54 68 69 73 0a 2a 2a 20 65 6e 73 75 72 65 73 20  This.** ensures 
25f50 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
25f60 6c 20 70 45 78 70 72 20 69 73 20 75 6e 63 68 61  l pExpr is uncha
25f70 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  nged..*/.void sq
25f80 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
25f90 44 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  Dup(Parse *pPars
25fa0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
25fb0 69 6e 74 20 64 65 73 74 2c 69 6e 74 20 6a 75 6d  int dest,int jum
25fc0 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 73 71 6c 69  pIfNull){.  sqli
25fd0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
25fe0 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 43  ->db;.  Expr *pC
25ff0 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  opy = sqlite3Exp
26000 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20  rDup(db, pExpr, 
26010 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  0);.  if( db->ma
26020 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b  llocFailed==0 ){
26030 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
26040 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
26050 70 43 6f 70 79 2c 20 64 65 73 74 2c 20 6a 75 6d  pCopy, dest, jum
26060 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20  pIfNull);.  }.  
26070 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
26080 65 28 64 62 2c 20 70 43 6f 70 79 29 3b 0a 7d 0a  e(db, pCopy);.}.
26090 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65  ../*.** Do a dee
260a0 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20  p comparison of 
260b0 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74  two expression t
260c0 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 30 20  rees.  Return 0 
260d0 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78  if the two.** ex
260e0 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 63 6f  pressions are co
260f0 6d 70 6c 65 74 65 6c 79 20 69 64 65 6e 74 69 63  mpletely identic
26100 61 6c 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  al.  Return 1 if
26110 20 74 68 65 79 20 64 69 66 66 65 72 20 6f 6e 6c   they differ onl
26120 79 0a 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41 54  y.** by a COLLAT
26130 45 20 6f 70 65 72 61 74 6f 72 20 61 74 20 74 68  E operator at th
26140 65 20 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52 65  e top level.  Re
26150 74 75 72 6e 20 32 20 69 66 20 74 68 65 72 65 20  turn 2 if there 
26160 61 72 65 20 64 69 66 66 65 72 65 6e 63 65 73 0a  are differences.
26170 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ** other than th
26180 65 20 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c  e top-level COLL
26190 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  ATE operator..**
261a0 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c  .** If any subel
261b0 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20  ement of pB has 
261c0 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31  Expr.iTable==(-1
261d0 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c  ) then it is all
261e0 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61  owed.** to compa
261f0 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65  re equal to an e
26200 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e  quivalent elemen
26210 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70  t in pA with Exp
26220 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a  r.iTable==iTab..
26230 2a 2a 0a 2a 2a 20 54 68 65 20 70 41 20 73 69 64  **.** The pA sid
26240 65 20 6d 69 67 68 74 20 62 65 20 75 73 69 6e 67  e might be using
26250 20 54 4b 5f 52 45 47 49 53 54 45 52 2e 20 20 49   TK_REGISTER.  I
26260 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61  f that is the ca
26270 73 65 20 61 6e 64 20 70 42 20 69 73 0a 2a 2a 20  se and pB is.** 
26280 6e 6f 74 20 75 73 69 6e 67 20 54 4b 5f 52 45 47  not using TK_REG
26290 49 53 54 45 52 20 62 75 74 20 69 73 20 6f 74 68  ISTER but is oth
262a0 65 72 77 69 73 65 20 65 71 75 69 76 61 6c 65 6e  erwise equivalen
262b0 74 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65  t, then still re
262c0 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f  turn 0..**.** So
262d0 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75  metimes this rou
262e0 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
262f0 20 32 20 65 76 65 6e 20 69 66 20 74 68 65 20 74   2 even if the t
26300 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  wo expressions.*
26310 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75  * really are equ
26320 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20  ivalent.  If we 
26330 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61  cannot prove tha
26340 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
26350 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63  s are.** identic
26360 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32 20  al, we return 2 
26370 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e  just to be safe.
26380 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75    So if this rou
26390 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
263a0 32 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e  2, then you do n
263b0 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66  ot really know f
263c0 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20 74 68  or certain if th
263d0 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73  e two.** express
263e0 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d  ions are the sam
263f0 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20 67  e.  But if you g
26400 65 74 20 61 20 30 20 6f 72 20 31 20 72 65 74 75  et a 0 or 1 retu
26410 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20  rn, then you.** 
26420 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 65 20  can be sure the 
26430 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
26440 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68  the same.  In th
26450 65 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a  e places where.*
26460 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
26470 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20  s used, it does 
26480 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74 20  not hurt to get 
26490 61 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68 61  an extra 2 - tha
264a0 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20  t.** just might 
264b0 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73  result in some s
264c0 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63  lightly slower c
264d0 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e  ode.  But return
264e0 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72  ing.** an incorr
264f0 65 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c 64  ect 0 or 1 could
26500 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75   lead to a malfu
26510 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
26520 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
26530 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72  e(Expr *pA, Expr
26540 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b   *pB, int iTab){
26550 0a 20 20 75 33 32 20 63 6f 6d 62 69 6e 65 64 46  .  u32 combinedF
26560 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 41 3d 3d  lags;.  if( pA==
26570 30 20 7c 7c 20 70 42 3d 3d 30 20 29 7b 0a 20 20  0 || pB==0 ){.  
26580 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 20    return pB==pA 
26590 3f 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20 63  ? 0 : 2;.  }.  c
265a0 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 3d 20 70  ombinedFlags = p
265b0 41 2d 3e 66 6c 61 67 73 20 7c 20 70 42 2d 3e 66  A->flags | pB->f
265c0 6c 61 67 73 3b 0a 20 20 69 66 28 20 63 6f 6d 62  lags;.  if( comb
265d0 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 49  inedFlags & EP_I
265e0 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69  ntValue ){.    i
265f0 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 26 70 42  f( (pA->flags&pB
26600 2d 3e 66 6c 61 67 73 26 45 50 5f 49 6e 74 56 61  ->flags&EP_IntVa
26610 6c 75 65 29 21 3d 30 20 26 26 20 70 41 2d 3e 75  lue)!=0 && pA->u
26620 2e 69 56 61 6c 75 65 3d 3d 70 42 2d 3e 75 2e 69  .iValue==pB->u.i
26630 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 72  Value ){.      r
26640 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
26650 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
26660 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70  .  if( pA->op!=p
26670 42 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 69 66 28  B->op ){.    if(
26680 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   pA->op==TK_COLL
26690 41 54 45 20 26 26 20 73 71 6c 69 74 65 33 45 78  ATE && sqlite3Ex
266a0 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c  prCompare(pA->pL
266b0 65 66 74 2c 20 70 42 2c 20 69 54 61 62 29 3c 32  eft, pB, iTab)<2
266c0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
266d0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
266e0 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pB->op==TK_COL
266f0 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33 45  LATE && sqlite3E
26700 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2c 20 70  xprCompare(pA, p
26710 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3c  B->pLeft, iTab)<
26720 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  2 ){.      retur
26730 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  n 1;.    }.    r
26740 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69  eturn 2;.  }.  i
26750 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  f( pA->op!=TK_CO
26760 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 6f 70 21 3d  LUMN && pA->op!=
26770 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 26 26  TK_AGG_COLUMN &&
26780 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b   pA->u.zToken ){
26790 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d  .    if( pA->op=
267a0 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a  =TK_FUNCTION ){.
267b0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
267c0 33 53 74 72 49 43 6d 70 28 70 41 2d 3e 75 2e 7a  3StrICmp(pA->u.z
267d0 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b  Token,pB->u.zTok
267e0 65 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20  en)!=0 ) return 
267f0 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  2;.    }else if(
26800 20 73 74 72 63 6d 70 28 70 41 2d 3e 75 2e 7a 54   strcmp(pA->u.zT
26810 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65  oken,pB->u.zToke
26820 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  n)!=0 ){.      r
26830 65 74 75 72 6e 20 70 41 2d 3e 6f 70 3d 3d 54 4b  eturn pA->op==TK
26840 5f 43 4f 4c 4c 41 54 45 20 3f 20 31 20 3a 20 32  _COLLATE ? 1 : 2
26850 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
26860 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45  ( (pA->flags & E
26870 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42  P_Distinct)!=(pB
26880 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
26890 74 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20  tinct) ) return 
268a0 32 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  2;.  if( ALWAYS(
268b0 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26  (combinedFlags &
268c0 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d   EP_TokenOnly)==
268d0 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20 63 6f  0) ){.    if( co
268e0 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
268f0 5f 78 49 73 53 65 6c 65 63 74 20 29 20 72 65 74  _xIsSelect ) ret
26900 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73  urn 2;.    if( s
26910 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
26920 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d  e(pA->pLeft, pB-
26930 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 20 29 20  >pLeft, iTab) ) 
26940 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
26950 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
26960 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c  pare(pA->pRight,
26970 20 70 42 2d 3e 70 52 69 67 68 74 2c 20 69 54 61   pB->pRight, iTa
26980 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  b) ) return 2;. 
26990 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
269a0 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 41  prListCompare(pA
269b0 2d 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d 3e 78  ->x.pList, pB->x
269c0 2e 70 4c 69 73 74 2c 20 69 54 61 62 29 20 29 20  .pList, iTab) ) 
269d0 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
269e0 28 20 41 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e  ( ALWAYS((combin
269f0 65 64 46 6c 61 67 73 20 26 20 45 50 5f 52 65 64  edFlags & EP_Red
26a00 75 63 65 64 29 3d 3d 30 29 20 26 26 20 70 41 2d  uced)==0) && pA-
26a10 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47 20 29  >op!=TK_STRING )
26a20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e  {.      if( pA->
26a30 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f  iColumn!=pB->iCo
26a40 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 32 3b  lumn ) return 2;
26a50 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e 69  .      if( pA->i
26a60 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c  Table!=pB->iTabl
26a70 65 20 0a 20 20 20 20 20 20 20 26 26 20 28 70 41  e .       && (pA
26a80 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c  ->iTable!=iTab |
26a90 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69 54 61 62  | NEVER(pB->iTab
26aa0 6c 65 3e 3d 30 29 29 20 29 20 72 65 74 75 72 6e  le>=0)) ) return
26ab0 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   2;.    }.  }.  
26ac0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
26ad0 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 45  ** Compare two E
26ae0 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 2e  xprList objects.
26af0 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68    Return 0 if th
26b00 65 79 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  ey are identical
26b10 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72   and .** non-zer
26b20 6f 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72  o if they differ
26b30 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a   in any way..**.
26b40 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c 65  ** If any subele
26b50 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20 45  ment of pB has E
26b60 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29  xpr.iTable==(-1)
26b70 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f   then it is allo
26b80 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72  wed.** to compar
26b90 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65 71  e equal to an eq
26ba0 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74  uivalent element
26bb0 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70 72   in pA with Expr
26bc0 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a  .iTable==iTab..*
26bd0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
26be0 65 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 6e  e might return n
26bf0 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71 75 69  on-zero for equi
26c00 76 61 6c 65 6e 74 20 45 78 70 72 4c 69 73 74 73  valent ExprLists
26c10 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63  .  The.** only c
26c20 6f 6e 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 20  onsequence will 
26c30 62 65 20 64 69 73 61 62 6c 65 64 20 6f 70 74 69  be disabled opti
26c40 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75 74 20  mizations.  But 
26c50 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
26c60 6d 75 73 74 20 6e 65 76 65 72 20 72 65 74 75 72  must never retur
26c70 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 20 45  n 0 if the two E
26c80 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 20  xprList objects 
26c90 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20 6f  are different, o
26ca0 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63 74 69  r.** a malfuncti
26cb0 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 2e 0a  on will result..
26cc0 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 70  **.** Two NULL p
26cd0 6f 69 6e 74 65 72 73 20 61 72 65 20 63 6f 6e 73  ointers are cons
26ce0 69 64 65 72 65 64 20 74 6f 20 62 65 20 74 68 65  idered to be the
26cf0 20 73 61 6d 65 2e 20 20 42 75 74 20 61 20 4e 55   same.  But a NU
26d00 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 61 6c  LL pointer.** al
26d10 77 61 79 73 20 64 69 66 66 65 72 73 20 66 72 6f  ways differs fro
26d20 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69  m a non-NULL poi
26d30 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nter..*/.int sql
26d40 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
26d50 61 72 65 28 45 78 70 72 4c 69 73 74 20 2a 70 41  are(ExprList *pA
26d60 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 42 2c 20  , ExprList *pB, 
26d70 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 6e 74  int iTab){.  int
26d80 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20   i;.  if( pA==0 
26d90 26 26 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72  && pB==0 ) retur
26da0 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30  n 0;.  if( pA==0
26db0 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72 65 74 75   || pB==0 ) retu
26dc0 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 41 2d 3e  rn 1;.  if( pA->
26dd0 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45 78 70 72  nExpr!=pB->nExpr
26de0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66   ) return 1;.  f
26df0 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 6e 45  or(i=0; i<pA->nE
26e00 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
26e10 78 70 72 20 2a 70 45 78 70 72 41 20 3d 20 70 41  xpr *pExprA = pA
26e20 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
26e30 20 20 45 78 70 72 20 2a 70 45 78 70 72 42 20 3d    Expr *pExprB =
26e40 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b   pB->a[i].pExpr;
26e50 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 61 5b 69  .    if( pA->a[i
26e60 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d 70 42 2d  ].sortOrder!=pB-
26e70 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[i].sortOrder 
26e80 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
26e90 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
26ea0 6f 6d 70 61 72 65 28 70 45 78 70 72 41 2c 20 70  ompare(pExprA, p
26eb0 45 78 70 72 42 2c 20 69 54 61 62 29 20 29 20 72  ExprB, iTab) ) r
26ec0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
26ed0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
26ee0 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
26ef0 20 77 65 20 63 61 6e 20 70 72 6f 76 65 20 74 68   we can prove th
26f00 65 20 70 45 32 20 77 69 6c 6c 20 61 6c 77 61 79  e pE2 will alway
26f10 73 20 62 65 20 74 72 75 65 20 69 66 20 70 45 31  s be true if pE1
26f20 20 69 73 0a 2a 2a 20 74 72 75 65 2e 20 20 52 65   is.** true.  Re
26f30 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 77 65  turn false if we
26f40 20 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   cannot complete
26f50 20 74 68 65 20 70 72 6f 6f 66 20 6f 72 20 69 66   the proof or if
26f60 20 70 45 32 20 6d 69 67 68 74 0a 2a 2a 20 62 65   pE2 might.** be
26f70 20 66 61 6c 73 65 2e 20 20 45 78 61 6d 70 6c 65   false.  Example
26f80 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 45 31  s:.**.**     pE1
26f90 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 70 45 32  : x==5       pE2
26fa0 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20  : x==5          
26fb0 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a     Result: true.
26fc0 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3e 30 20  **     pE1: x>0 
26fd0 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35         pE2: x==5
26fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65 73               Res
26ff0 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20  ult: false.**   
27000 20 20 70 45 31 3a 20 78 3d 32 31 20 20 20 20 20    pE1: x=21     
27010 20 20 70 45 32 3a 20 78 3d 32 31 20 4f 52 20 79    pE2: x=21 OR y
27020 3d 34 33 20 20 20 20 20 52 65 73 75 6c 74 3a 20  =43     Result: 
27030 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  true.**     pE1:
27040 20 78 21 3d 31 32 33 20 20 20 20 20 70 45 32 3a   x!=123     pE2:
27050 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20   x IS NOT NULL  
27060 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a    Result: true.*
27070 2a 20 20 20 20 20 70 45 31 3a 20 78 21 3d 3f 31  *     pE1: x!=?1
27080 20 20 20 20 20 20 70 45 32 3a 20 78 20 49 53 20        pE2: x IS 
27090 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75  NOT NULL    Resu
270a0 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20  lt: true.**     
270b0 70 45 31 3a 20 78 20 49 53 20 4e 55 4c 4c 20 20  pE1: x IS NULL  
270c0 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55  pE2: x IS NOT NU
270d0 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61  LL    Result: fa
270e0 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  lse.**     pE1: 
270f0 78 20 49 53 20 3f 32 20 20 20 20 70 45 32 3a 20  x IS ?2    pE2: 
27100 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  x IS NOT NULL   
27110 20 52 65 75 73 6c 74 3a 20 66 61 6c 73 65 0a 2a   Reuslt: false.*
27120 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 61 72  *.** When compar
27130 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f  ing TK_COLUMN no
27140 64 65 73 20 62 65 74 77 65 65 6e 20 70 45 31 20  des between pE1 
27150 61 6e 64 20 70 45 32 2c 20 69 66 20 70 45 32 20  and pE2, if pE2 
27160 68 61 73 0a 2a 2a 20 45 78 70 72 2e 69 54 61 62  has.** Expr.iTab
27170 6c 65 3c 30 20 74 68 65 6e 20 61 73 73 75 6d 65  le<0 then assume
27180 20 61 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20   a table number 
27190 67 69 76 65 6e 20 62 79 20 69 54 61 62 2e 0a 2a  given by iTab..*
271a0 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e 20 64 6f 75  *.** When in dou
271b0 62 74 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65  bt, return false
271c0 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 74 72 75  .  Returning tru
271d0 65 20 6d 69 67 68 74 20 67 69 76 65 20 61 20 70  e might give a p
271e0 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d  erformance.** im
271f0 70 72 6f 76 65 6d 65 6e 74 2e 20 20 52 65 74 75  provement.  Retu
27200 72 6e 69 6e 67 20 66 61 6c 73 65 20 6d 69 67 68  rning false migh
27210 74 20 63 61 75 73 65 20 61 20 70 65 72 66 6f 72  t cause a perfor
27220 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2c  mance reduction,
27230 20 62 75 74 0a 2a 2a 20 69 74 20 77 69 6c 6c 20   but.** it will 
27240 61 6c 77 61 79 73 20 67 69 76 65 20 74 68 65 20  always give the 
27250 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 61  correct answer a
27260 6e 64 20 69 73 20 68 65 6e 63 65 20 61 6c 77 61  nd is hence alwa
27270 79 73 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20  ys safe..*/.int 
27280 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69  sqlite3ExprImpli
27290 65 73 45 78 70 72 28 45 78 70 72 20 2a 70 45 31  esExpr(Expr *pE1
272a0 2c 20 45 78 70 72 20 2a 70 45 32 2c 20 69 6e 74  , Expr *pE2, int
272b0 20 69 54 61 62 29 7b 0a 20 20 69 66 28 20 73 71   iTab){.  if( sq
272c0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
272d0 28 70 45 31 2c 20 70 45 32 2c 20 69 54 61 62 29  (pE1, pE2, iTab)
272e0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
272f0 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 1;.  }.  if( p
27300 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20 20  E2->op==TK_OR.  
27310 20 26 26 20 28 73 71 6c 69 74 65 33 45 78 70 72   && (sqlite3Expr
27320 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45 31 2c  ImpliesExpr(pE1,
27330 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61   pE2->pLeft, iTa
27340 62 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b).             
27350 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d  || sqlite3ExprIm
27360 70 6c 69 65 73 45 78 70 72 28 70 45 31 2c 20 70  pliesExpr(pE1, p
27370 45 32 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62  E2->pRight, iTab
27380 29 20 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ) ).  ){.    ret
27390 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
273a0 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54   pE2->op==TK_NOT
273b0 4e 55 4c 4c 0a 20 20 20 26 26 20 73 71 6c 69 74  NULL.   && sqlit
273c0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45  e3ExprCompare(pE
273d0 31 2d 3e 70 4c 65 66 74 2c 20 70 45 32 2d 3e 70  1->pLeft, pE2->p
273e0 4c 65 66 74 2c 20 69 54 61 62 29 3d 3d 30 0a 20  Left, iTab)==0. 
273f0 20 20 26 26 20 28 70 45 31 2d 3e 6f 70 21 3d 54    && (pE1->op!=T
27400 4b 5f 49 53 4e 55 4c 4c 20 26 26 20 70 45 31 2d  K_ISNULL && pE1-
27410 3e 6f 70 21 3d 54 4b 5f 49 53 29 0a 20 20 29 7b  >op!=TK_IS).  ){
27420 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
27430 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
27440 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
27450 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
27460 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69  wing structure i
27470 73 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72  s used by the tr
27480 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20  ee walker.** to 
27490 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20  determine if an 
274a0 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62  expression can b
274b0 65 20 65 76 61 6c 75 61 74 65 64 20 62 79 20 72  e evaluated by r
274c0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a  eference to the.
274d0 2a 2a 20 69 6e 64 65 78 20 6f 6e 6c 79 2c 20 77  ** index only, w
274e0 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
274f0 20 64 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72   do a search for
27500 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
27510 6e 67 0a 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72  ng.** table entr
27520 79 2e 20 20 54 68 65 20 49 64 78 43 6f 76 65 72  y.  The IdxCover
27530 2e 70 49 64 78 20 66 69 65 6c 64 20 69 73 20 74  .pIdx field is t
27540 68 65 20 69 6e 64 65 78 2e 20 20 49 64 78 43 6f  he index.  IdxCo
27550 76 65 72 2e 69 43 75 72 0a 2a 2a 20 69 73 20 74  ver.iCur.** is t
27560 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  he cursor for th
27570 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75  e table..*/.stru
27580 63 74 20 49 64 78 43 6f 76 65 72 20 7b 0a 20 20  ct IdxCover {.  
27590 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
275a0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f   /* The index to
275b0 20 62 65 20 74 65 73 74 65 64 20 66 6f 72 20 63   be tested for c
275c0 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 69 6e 74  overage */.  int
275d0 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 2f 2a   iCur;        /*
275e0 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   Cursor number f
275f0 6f 72 20 74 68 65 20 74 61 62 6c 65 20 63 6f 72  or the table cor
27600 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
27610 65 20 69 6e 64 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f  e index */.};../
27620 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
27630 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 72  e if there are r
27640 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
27650 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 0a 2a  umns in table .*
27660 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64  * pWalker->u.pId
27670 78 43 6f 76 65 72 2d 3e 69 43 75 72 20 63 61 6e  xCover->iCur can
27680 20 62 65 20 73 61 74 69 73 66 69 65 64 20 75 73   be satisfied us
27690 69 6e 67 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a  ing the index.**
276a0 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78   pWalker->u.pIdx
276b0 43 6f 76 65 72 2d 3e 70 49 64 78 2e 0a 2a 2f 0a  Cover->pIdx..*/.
276c0 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 49  static int exprI
276d0 64 78 43 6f 76 65 72 28 57 61 6c 6b 65 72 20 2a  dxCover(Walker *
276e0 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
276f0 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78  Expr){.  if( pEx
27700 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
27710 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69  N.   && pExpr->i
27720 54 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e  Table==pWalker->
27730 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75  u.pIdxCover->iCu
27740 72 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 43  r.   && sqlite3C
27750 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 57 61  olumnOfIndex(pWa
27760 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65  lker->u.pIdxCove
27770 72 2d 3e 70 49 64 78 2c 20 70 45 78 70 72 2d 3e  r->pIdx, pExpr->
27780 69 43 6f 6c 75 6d 6e 29 3c 30 0a 20 20 29 7b 0a  iColumn)<0.  ){.
27790 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
277a0 64 65 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  de = 1;.    retu
277b0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
277c0 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
277d0 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
277e0 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61  * Determine if a
277f0 6e 20 69 6e 64 65 78 20 70 49 64 78 20 6f 6e 20  n index pIdx on 
27800 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f  table with curso
27810 72 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20  r iCur contains 
27820 77 69 6c 6c 0a 2a 2a 20 74 68 65 20 65 78 70 72  will.** the expr
27830 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52  ession pExpr.  R
27840 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
27850 65 20 69 6e 64 65 78 20 64 6f 65 73 20 63 6f 76  e index does cov
27860 65 72 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  er the.** expres
27870 73 69 6f 6e 20 61 6e 64 20 66 61 6c 73 65 20 69  sion and false i
27880 66 20 74 68 65 20 70 45 78 70 72 20 65 78 70 72  f the pExpr expr
27890 65 73 73 69 6f 6e 20 72 65 66 65 72 65 6e 63 65  ession reference
278a0 73 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 0a  s table columns.
278b0 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  ** that are not 
278c0 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 69 6e 64  found in the ind
278d0 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 41  ex pIdx..**.** A
278e0 6e 20 69 6e 64 65 78 20 63 6f 76 65 72 69 6e 67  n index covering
278f0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d   an expression m
27900 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 65 78  eans that the ex
27910 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 0a  pression can be.
27920 2a 2a 20 65 76 61 6c 75 61 74 65 64 20 75 73 69  ** evaluated usi
27930 6e 67 20 6f 6e 6c 79 20 74 68 65 20 69 6e 64 65  ng only the inde
27940 78 20 61 6e 64 20 77 69 74 68 6f 75 74 20 68 61  x and without ha
27950 76 69 6e 67 20 74 6f 20 6c 6f 6f 6b 75 70 20 74  ving to lookup t
27960 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  he.** correspond
27970 69 6e 67 20 74 61 62 6c 65 20 65 6e 74 72 79 2e  ing table entry.
27980 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
27990 78 70 72 43 6f 76 65 72 65 64 42 79 49 6e 64 65  xprCoveredByInde
279a0 78 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  x(.  Expr *pExpr
279b0 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
279c0 69 6e 64 65 78 20 74 6f 20 62 65 20 74 65 73 74  index to be test
279d0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  ed */.  int iCur
279e0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
279f0 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
27a00 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70   for the corresp
27a10 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a  onding table */.
27a20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
27a30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
27a40 65 78 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  ex that might be
27a50 20 75 73 65 64 20 66 6f 72 20 63 6f 76 65 72 61   used for covera
27a60 67 65 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65  ge */.){.  Walke
27a70 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20 49 64  r w;.  struct Id
27a80 78 43 6f 76 65 72 20 78 63 6f 76 3b 0a 20 20 6d  xCover xcov;.  m
27a90 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
27aa0 65 6f 66 28 77 29 29 3b 0a 20 20 78 63 6f 76 2e  eof(w));.  xcov.
27ab0 69 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 78  iCur = iCur;.  x
27ac0 63 6f 76 2e 70 49 64 78 20 3d 20 70 49 64 78 3b  cov.pIdx = pIdx;
27ad0 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
27ae0 63 6b 20 3d 20 65 78 70 72 49 64 78 43 6f 76 65  ck = exprIdxCove
27af0 72 3b 0a 20 20 77 2e 75 2e 70 49 64 78 43 6f 76  r;.  w.u.pIdxCov
27b00 65 72 20 3d 20 26 78 63 6f 76 3b 0a 20 20 73 71  er = &xcov;.  sq
27b10 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
27b20 2c 20 70 45 78 70 72 29 3b 0a 20 20 72 65 74 75  , pExpr);.  retu
27b30 72 6e 20 21 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a  rn !w.eCode;.}..
27b40 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
27b50 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
27b60 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
27b70 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72 65   used by the tre
27b80 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63  e walker.** to c
27b90 6f 75 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20  ount references 
27ba0 74 6f 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  to table columns
27bb0 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
27bc0 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 61 67 67 72  s of an .** aggr
27bd0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20  egate function, 
27be0 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c  in order to impl
27bf0 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 73 71 6c  ement the.** sql
27c00 69 74 65 33 46 75 6e 63 74 69 6f 6e 54 68 69 73  ite3FunctionThis
27c10 53 72 63 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a  Src() routine..*
27c20 2f 0a 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e  /.struct SrcCoun
27c30 74 20 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  t {.  SrcList *p
27c40 53 72 63 3b 20 20 20 2f 2a 20 4f 6e 65 20 70 61  Src;   /* One pa
27c50 72 74 69 63 75 6c 61 72 20 46 52 4f 4d 20 63 6c  rticular FROM cl
27c60 61 75 73 65 20 69 6e 20 61 20 6e 65 73 74 65 64  ause in a nested
27c70 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
27c80 6e 54 68 69 73 3b 20 20 20 20 20 20 20 2f 2a 20  nThis;       /* 
27c90 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  Number of refere
27ca0 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20  nces to columns 
27cb0 69 6e 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20  in pSrcList */. 
27cc0 20 69 6e 74 20 6e 4f 74 68 65 72 3b 20 20 20 20   int nOther;    
27cd0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
27ce0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
27cf0 75 6d 6e 73 20 69 6e 20 6f 74 68 65 72 20 46 52  umns in other FR
27d00 4f 4d 20 63 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b  OM clauses */.};
27d10 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68  ../*.** Count th
27d20 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
27d30 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e  rences to column
27d40 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
27d50 20 65 78 70 72 53 72 63 43 6f 75 6e 74 28 57 61   exprSrcCount(Wa
27d60 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
27d70 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 2f  xpr *pExpr){.  /
27d80 2a 20 54 68 65 20 4e 45 56 45 52 28 29 20 6f 6e  * The NEVER() on
27d90 20 74 68 65 20 73 65 63 6f 6e 64 20 74 65 72 6d   the second term
27da0 20 69 73 20 62 65 63 61 75 73 65 20 73 71 6c 69   is because sqli
27db0 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54  te3FunctionUsesT
27dc0 68 69 73 53 72 63 28 29 0a 20 20 2a 2a 20 69 73  hisSrc().  ** is
27dd0 20 61 6c 77 61 79 73 20 63 61 6c 6c 65 64 20 62   always called b
27de0 65 66 6f 72 65 20 73 71 6c 69 74 65 33 45 78 70  efore sqlite3Exp
27df0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
27e00 65 73 28 29 20 61 6e 64 20 73 6f 20 74 68 65 0a  es() and so the.
27e10 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20    ** TK_COLUMNs 
27e20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65  have not yet bee
27e30 6e 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  n converted into
27e40 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20   TK_AGG_COLUMN. 
27e50 20 49 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   If.  ** sqlite3
27e60 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73  FunctionUsesThis
27e70 53 72 63 28 29 20 69 73 20 75 73 65 64 20 64 69  Src() is used di
27e80 66 66 65 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  fferently in the
27e90 20 66 75 74 75 72 65 2c 20 74 68 65 0a 20 20 2a   future, the.  *
27ea0 2a 20 4e 45 56 45 52 28 29 20 77 69 6c 6c 20 6e  * NEVER() will n
27eb0 65 65 64 20 74 6f 20 62 65 20 72 65 6d 6f 76 65  eed to be remove
27ec0 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  d. */.  if( pExp
27ed0 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
27ee0 20 7c 7c 20 4e 45 56 45 52 28 70 45 78 70 72 2d   || NEVER(pExpr-
27ef0 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
27f00 4d 4e 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  MN) ){.    int i
27f10 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  ;.    struct Src
27f20 43 6f 75 6e 74 20 2a 70 20 3d 20 70 57 61 6c 6b  Count *p = pWalk
27f30 65 72 2d 3e 75 2e 70 53 72 63 43 6f 75 6e 74 3b  er->u.pSrcCount;
27f40 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53  .    SrcList *pS
27f50 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
27f60 20 20 69 6e 74 20 6e 53 72 63 20 3d 20 70 53 72    int nSrc = pSr
27f70 63 20 3f 20 70 53 72 63 2d 3e 6e 53 72 63 20 3a  c ? pSrc->nSrc :
27f80 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
27f90 20 69 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20   i<nSrc; i++){. 
27fa0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
27fb0 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b  iTable==pSrc->a[
27fc0 69 5d 2e 69 43 75 72 73 6f 72 20 29 20 62 72 65  i].iCursor ) bre
27fd0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
27fe0 28 20 69 3c 6e 53 72 63 20 29 7b 0a 20 20 20 20  ( i<nSrc ){.    
27ff0 20 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20    p->nThis++;.  
28000 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
28010 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20 20 20  ->nOther++;.    
28020 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  }.  }.  return W
28030 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
28040 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
28050 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 61 72  if any of the ar
28060 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 70  guments to the p
28070 45 78 70 72 20 46 75 6e 63 74 69 6f 6e 20 72 65  Expr Function re
28080 66 65 72 65 6e 63 65 0a 2a 2a 20 70 53 72 63 4c  ference.** pSrcL
28090 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75  ist.  Return tru
280a0 65 20 69 66 20 74 68 65 79 20 64 6f 2e 20 20 41  e if they do.  A
280b0 6c 73 6f 20 72 65 74 75 72 6e 20 74 72 75 65 20  lso return true 
280c0 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a  if the function.
280d0 2a 2a 20 68 61 73 20 6e 6f 20 61 72 67 75 6d 65  ** has no argume
280e0 6e 74 73 20 6f 72 20 68 61 73 20 6f 6e 6c 79 20  nts or has only 
280f0 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e  constant argumen
28100 74 73 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73  ts.  Return fals
28110 65 20 69 66 20 70 45 78 70 72 0a 2a 2a 20 72 65  e if pExpr.** re
28120 66 65 72 65 6e 63 65 73 20 63 6f 6c 75 6d 6e 73  ferences columns
28130 20 62 75 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73   but not columns
28140 20 6f 66 20 74 61 62 6c 65 73 20 66 6f 75 6e 64   of tables found
28150 20 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2f   in pSrcList..*/
28160 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 75 6e 63  .int sqlite3Func
28170 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28  tionUsesThisSrc(
28180 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53 72 63  Expr *pExpr, Src
28190 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 29 7b  List *pSrcList){
281a0 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73  .  Walker w;.  s
281b0 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 63  truct SrcCount c
281c0 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  nt;.  assert( pE
281d0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
281e0 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 6d 65  FUNCTION );.  me
281f0 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
28200 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70  of(w));.  w.xExp
28210 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
28220 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77 2e 75 2e  SrcCount;.  w.u.
28230 70 53 72 63 43 6f 75 6e 74 20 3d 20 26 63 6e 74  pSrcCount = &cnt
28240 3b 0a 20 20 63 6e 74 2e 70 53 72 63 20 3d 20 70  ;.  cnt.pSrc = p
28250 53 72 63 4c 69 73 74 3b 0a 20 20 63 6e 74 2e 6e  SrcList;.  cnt.n
28260 54 68 69 73 20 3d 20 30 3b 0a 20 20 63 6e 74 2e  This = 0;.  cnt.
28270 6e 4f 74 68 65 72 20 3d 20 30 3b 0a 20 20 73 71  nOther = 0;.  sq
28280 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73  lite3WalkExprLis
28290 74 28 26 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70  t(&w, pExpr->x.p
282a0 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  List);.  return 
282b0 63 6e 74 2e 6e 54 68 69 73 3e 30 20 7c 7c 20 63  cnt.nThis>0 || c
282c0 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a  nt.nOther==0;.}.
282d0 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
282e0 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
282f0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
28300 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
28310 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20  the index of.** 
28320 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e  the new element.
28330 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74    Return a negat
28340 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61  ive number if ma
28350 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  lloc fails..*/.s
28360 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67  tatic int addAgg
28370 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74  InfoColumn(sqlit
28380 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20  e3 *db, AggInfo 
28390 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69  *pInfo){.  int i
283a0 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20  ;.  pInfo->aCol 
283b0 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
283c0 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64  locate(.       d
283d0 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d  b,.       pInfo-
283e0 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69  >aCol,.       si
283f0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c  zeof(pInfo->aCol
28400 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49  [0]),.       &pI
28410 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20  nfo->nColumn,.  
28420 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72       &i.  );.  r
28430 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a  eturn i;.}    ..
28440 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
28450 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70  element to the p
28460 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
28470 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
28480 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20  the index of.** 
28490 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e  the new element.
284a0 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74    Return a negat
284b0 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61  ive number if ma
284c0 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  lloc fails..*/.s
284d0 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67  tatic int addAgg
284e0 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74 65 33  InfoFunc(sqlite3
284f0 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70   *db, AggInfo *p
28500 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Info){.  int i;.
28510 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d    pInfo->aFunc =
28520 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c   sqlite3ArrayAll
28530 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62  ocate(.       db
28540 2c 20 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d  , .       pInfo-
28550 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 73  >aFunc,.       s
28560 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75  izeof(pInfo->aFu
28570 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26  nc[0]),.       &
28580 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20  pInfo->nFunc,.  
28590 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72       &i.  );.  r
285a0 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a  eturn i;.}    ..
285b0 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
285c0 65 20 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  e xExprCallback 
285d0 66 6f 72 20 61 20 74 72 65 65 20 77 61 6c 6b 65  for a tree walke
285e0 72 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 74  r.  It is used t
285f0 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73  o.** implement s
28600 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
28610 65 41 67 67 72 65 67 61 74 65 73 28 29 2e 20 20  eAggregates().  
28620 53 65 65 20 73 71 6c 69 74 65 33 45 78 70 72 41  See sqlite3ExprA
28630 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
28640 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .** for addition
28650 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
28660 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e  */.static int an
28670 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28 57  alyzeAggregate(W
28680 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
28690 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
286a0 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
286b0 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c  text *pNC = pWal
286c0 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61  ker->u.pNC;.  Pa
286d0 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e  rse *pParse = pN
286e0 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72 63  C->pParse;.  Src
286f0 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d  List *pSrcList =
28700 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a   pNC->pSrcList;.
28710 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49    AggInfo *pAggI
28720 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49  nfo = pNC->pAggI
28730 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  nfo;..  switch( 
28740 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
28750 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
28760 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UMN:.    case TK
28770 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
28780 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
28790 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
287a0 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  UMN );.      tes
287b0 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
287c0 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
287d0 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
287e0 20 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75   see if the colu
287f0 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20  mn is in one of 
28800 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68  the tables in th
28810 65 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20  e FROM.      ** 
28820 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67  clause of the ag
28830 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f  gregate query */
28840 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
28850 53 28 70 53 72 63 4c 69 73 74 21 3d 30 29 20 29  S(pSrcList!=0) )
28860 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
28870 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
28880 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d  Item = pSrcList-
28890 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  >a;.        for(
288a0 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d  i=0; i<pSrcList-
288b0 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
288c0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
288d0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
288e0 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20  ol *pCol;.      
288f0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
28900 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
28910 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
28920 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
28930 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
28940 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74  xpr->iTable==pIt
28950 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20  em->iCursor ){. 
28960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
28970 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
28980 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74  oint, it means t
28990 68 61 74 20 70 45 78 70 72 20 72 65 66 65 72 73  hat pExpr refers
289a0 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20   to a table.    
289b0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
289c0 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  is in the FROM c
289d0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67  lause of the agg
289e0 72 65 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a  regate query.  .
289f0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20              **. 
28a00 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61             ** Ma
28a10 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  ke an entry for 
28a20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41  the column in pA
28a30 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69  ggInfo->aCol[] i
28a40 66 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20  f there.        
28a50 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e      ** is not an
28a60 20 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72   entry there alr
28a70 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20  eady..          
28a80 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
28a90 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20   int k;.        
28aa0 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49      pCol = pAggI
28ab0 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  nfo->aCol;.     
28ac0 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20         for(k=0; 
28ad0 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  k<pAggInfo->nCol
28ae0 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b  umn; k++, pCol++
28af0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
28b00 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c   if( pCol->iTabl
28b10 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e==pExpr->iTable
28b20 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
28b30 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c        pCol->iCol
28b40 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn==pExpr->iCol
28b50 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
28b60 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
28b70 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
28b80 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
28b90 20 20 20 20 20 20 20 20 69 66 28 20 28 6b 3e 3d          if( (k>=
28ba0 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
28bb0 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n).             
28bc0 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e  && (k = addAggIn
28bd0 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d  foColumn(pParse-
28be0 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e  >db, pAggInfo))>
28bf0 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0 .            
28c00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
28c10 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66   pCol = &pAggInf
28c20 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20  o->aCol[k];.    
28c30 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
28c40 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54  pTab = pExpr->pT
28c50 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab;.            
28c60 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d    pCol->iTable =
28c70 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
28c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
28c90 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45  ol->iColumn = pE
28ca0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
28cb0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
28cc0 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  ->iMem = ++pPars
28cd0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
28ce0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
28cf0 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  rterColumn = -1;
28d00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
28d10 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  Col->pExpr = pEx
28d20 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
28d30 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e    if( pAggInfo->
28d40 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
28d50 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
28d60 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  j, n;.          
28d70 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
28d80 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  pGB = pAggInfo->
28d90 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  pGroupBy;.      
28da0 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
28db0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
28dc0 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a  pTerm = pGB->a;.
28dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28de0 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a  n = pGB->nExpr;.
28df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e00 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b  for(j=0; j<n; j+
28e10 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
28e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
28e30 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d  xpr *pE = pTerm-
28e40 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
28e50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
28e60 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
28e70 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70  && pE->iTable==p
28e80 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a  Expr->iTable &&.
28e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ea0 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d        pE->iColum
28eb0 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n==pExpr->iColum
28ec0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
28ed0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
28ee0 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a  SorterColumn = j
28ef0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
28f00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
28f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
28f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28f30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
28f40 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
28f50 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74   if( pCol->iSort
28f60 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  erColumn<0 ){.  
28f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
28f80 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
28f90 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53  n = pAggInfo->nS
28fa0 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a  ortingColumn++;.
28fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
28fc0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
28fd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
28fe0 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74  re is now an ent
28ff0 72 79 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20  ry for pExpr in 
29000 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
29010 20 28 65 69 74 68 65 72 0a 20 20 20 20 20 20 20   (either.       
29020 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20       ** because 
29030 69 74 20 77 61 73 20 74 68 65 72 65 20 62 65 66  it was there bef
29040 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65 20 77  ore or because w
29050 65 20 6a 75 73 74 20 63 72 65 61 74 65 64 20 69  e just created i
29060 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  t)..            
29070 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70  ** Convert the p
29080 45 78 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f  Expr to be a TK_
29090 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72  AGG_COLUMN refer
290a0 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20  ring to that.   
290b0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67           ** pAgg
290c0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74  Info->aCol[] ent
290d0 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry..            
290e0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  */.            E
290f0 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74  xprSetVVAPropert
29100 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65  y(pExpr, EP_NoRe
29110 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20  duce);.         
29120 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e     pExpr->pAggIn
29130 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20  fo = pAggInfo;. 
29140 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
29150 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f  ->op = TK_AGG_CO
29160 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20  LUMN;.          
29170 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
29180 28 69 31 36 29 6b 3b 0a 20 20 20 20 20 20 20 20  (i16)k;.        
29190 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
291a0 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20       } /* endif 
291b0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
291c0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f  Item->iCursor */
291d0 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e  .        } /* en
291e0 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63  d loop over pSrc
291f0 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  List */.      }.
29200 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
29210 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  _Prune;.    }.  
29220 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
29230 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
29240 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67  if( (pNC->ncFlag
29250 73 20 26 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63  s & NC_InAggFunc
29260 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70  )==0.       && p
29270 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65  Walker->walkerDe
29280 70 74 68 3d 3d 70 45 78 70 72 2d 3e 6f 70 32 0a  pth==pExpr->op2.
29290 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
292a0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
292b0 20 69 66 20 70 45 78 70 72 20 69 73 20 61 20 64   if pExpr is a d
292c0 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74  uplicate of anot
292d0 68 65 72 20 61 67 67 72 65 67 61 74 65 20 0a 20  her aggregate . 
292e0 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
292f0 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65 61  on that is alrea
29300 64 79 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e  dy in the pAggIn
29310 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 20  fo structure.   
29320 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
29330 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
29340 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67  unc *pItem = pAg
29350 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20  gInfo->aFunc;.  
29360 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
29370 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
29380 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
29390 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
293a0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
293b0 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20  e(pItem->pExpr, 
293c0 70 45 78 70 72 2c 20 2d 31 29 3d 3d 30 20 29 7b  pExpr, -1)==0 ){
293d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
293e0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
293f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29400 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66    if( i>=pAggInf
29410 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20  o->nFunc ){.    
29420 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69        /* pExpr i
29430 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b  s original.  Mak
29440 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  e a new entry in
29450 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
29460 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  [].          */.
29470 20 20 20 20 20 20 20 20 20 20 75 38 20 65 6e 63            u8 enc
29480 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64   = ENC(pParse->d
29490 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  b);.          i 
294a0 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63  = addAggInfoFunc
294b0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67  (pParse->db, pAg
294c0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  gInfo);.        
294d0 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20    if( i>=0 ){.  
294e0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
294f0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
29500 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
29510 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
29520 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26         pItem = &
29530 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
29540 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i];.            
29550 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pItem->pExpr = p
29560 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
29570 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20    pItem->iMem = 
29580 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
29590 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
295a0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
295b0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
295c0 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
295d0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
295e0 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69  Func = sqlite3Fi
295f0 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  ndFunction(pPars
29600 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20  e->db,.         
29610 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
29620 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 0a 20 20 20 20  >u.zToken, .    
29630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
29640 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20  Expr->x.pList ? 
29650 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
29660 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20  nExpr : 0, enc, 
29670 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
29680 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
29690 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29   & EP_Distinct )
296a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
296b0 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74  pItem->iDistinct
296c0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
296d0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  +;.            }
296e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
296f0 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74      pItem->iDist
29700 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  inct = -1;.     
29710 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29720 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
29730 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70         /* Make p
29740 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68  Expr point to th
29750 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 70 41  e appropriate pA
29760 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20  ggInfo->aFunc[] 
29770 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f  entry.        */
29780 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
29790 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
297a0 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
297b0 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
297c0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70  ) );.        Exp
297d0 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28  rSetVVAProperty(
297e0 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75  pExpr, EP_NoRedu
297f0 63 65 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78  ce);.        pEx
29800 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29  pr->iAgg = (i16)
29810 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  i;.        pExpr
29820 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67  ->pAggInfo = pAg
29830 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72  gInfo;.        r
29840 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
29850 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
29860 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
29870 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20  _Continue;.     
29880 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
29890 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
298a0 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  ue;.}.static int
298b0 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
298c0 65 73 49 6e 53 65 6c 65 63 74 28 57 61 6c 6b 65  esInSelect(Walke
298d0 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
298e0 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
298f0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
29900 28 70 57 61 6c 6b 65 72 29 3b 0a 20 20 55 4e 55  (pWalker);.  UNU
29910 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 53  SED_PARAMETER(pS
29920 65 6c 65 63 74 29 3b 0a 20 20 72 65 74 75 72 6e  elect);.  return
29930 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
29940 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  ../*.** Analyze 
29950 74 68 65 20 70 45 78 70 72 20 65 78 70 72 65 73  the pExpr expres
29960 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  sion looking for
29970 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
29980 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
29990 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e  variables that n
299a0 65 65 64 20 74 6f 20 62 65 20 61 64 64 65 64 20  eed to be added 
299b0 74 6f 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63  to AggInfo objec
299c0 74 20 74 68 61 74 20 70 4e 43 2d 3e 70 41 67 67  t that pNC->pAgg
299d0 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  Info.** points t
299e0 6f 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65  o.  Additional e
299f0 6e 74 72 69 65 73 20 61 72 65 20 6d 61 64 65 20  ntries are made 
29a00 6f 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 6f  on the AggInfo o
29a10 62 6a 65 63 74 20 61 73 0a 2a 2a 20 6e 65 63 65  bject as.** nece
29a20 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ssary..**.** Thi
29a30 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
29a40 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
29a50 61 66 74 65 72 20 74 68 65 20 65 78 70 72 65 73  after the expres
29a60 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a  sion has been.**
29a70 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c   analyzed by sql
29a80 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
29a90 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  ames()..*/.void 
29aa0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
29ab0 7a 65 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d  zeAggregates(Nam
29ac0 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45  eContext *pNC, E
29ad0 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57  xpr *pExpr){.  W
29ae0 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65  alker w;.  memse
29af0 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
29b00 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  w));.  w.xExprCa
29b10 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65  llback = analyze
29b20 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78  Aggregate;.  w.x
29b30 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
29b40 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
29b50 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e  esInSelect;.  w.
29b60 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 61  u.pNC = pNC;.  a
29b70 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63  ssert( pNC->pSrc
29b80 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73 71 6c  List!=0 );.  sql
29b90 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
29ba0 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pExpr);.}../*.*
29bb0 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78  * Call sqlite3Ex
29bc0 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
29bd0 74 65 73 28 29 20 66 6f 72 20 65 76 65 72 79 20  tes() for every 
29be0 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e  expression in an
29bf0 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
29c00 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ist.  Return the
29c10 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
29c20 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  s..**.** If an e
29c30 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74  rror is found, t
29c40 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63  he analysis is c
29c50 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69  ut short..*/.voi
29c60 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  d sqlite3ExprAna
29c70 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65  lyzeAggList(Name
29c80 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78  Context *pNC, Ex
29c90 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
29ca0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
29cb0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
29cc0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
29cd0 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70  ist ){.    for(p
29ce0 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
29cf0 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
29d00 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
29d10 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
29d20 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
29d30 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d  gates(pNC, pItem
29d40 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ->pExpr);.    }.
29d50 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
29d60 6f 63 61 74 65 20 61 20 73 69 6e 67 6c 65 20 6e  ocate a single n
29d70 65 77 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ew register for 
29d80 75 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d 65  use to hold some
29d90 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
29da0 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sult..*/.int sql
29db0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 50  ite3GetTempReg(P
29dc0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
29dd0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65   if( pParse->nTe
29de0 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20  mpReg==0 ){.    
29df0 72 65 74 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d  return ++pParse-
29e00 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74  >nMem;.  }.  ret
29e10 75 72 6e 20 70 50 61 72 73 65 2d 3e 61 54 65 6d  urn pParse->aTem
29e20 70 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e  pReg[--pParse->n
29e30 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a  TempReg];.}../*.
29e40 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20  ** Deallocate a 
29e50 72 65 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e 67  register, making
29e60 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72   available for r
29e70 65 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74  euse for some ot
29e80 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e 0a  her.** purpose..
29e90 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73  **.** If a regis
29ea0 74 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ter is currently
29eb0 20 62 65 69 6e 67 20 75 73 65 64 20 62 79 20 74   being used by t
29ec0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2c  he column cache,
29ed0 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64 65 61   then.** the dea
29ee0 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 64 65 66  llocation is def
29ef0 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20  erred until the 
29f00 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 6c 69 6e  column cache lin
29f10 65 20 74 68 61 74 20 75 73 65 73 0a 2a 2a 20 74  e that uses.** t
29f20 68 65 20 72 65 67 69 73 74 65 72 20 62 65 63 6f  he register beco
29f30 6d 65 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f  mes stale..*/.vo
29f40 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  id sqlite3Releas
29f50 65 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a  eTempReg(Parse *
29f60 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
29f70 29 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26 26  ){.  if( iReg &&
29f80 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
29f90 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72  g<ArraySize(pPar
29fa0 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b  se->aTempReg) ){
29fb0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
29fc0 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
29fd0 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30   *p;.    for(i=0
29fe0 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
29ff0 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
2a000 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
2a010 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   p++){.      if(
2a020 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29   p->iReg==iReg )
2a030 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 74 65 6d  {.        p->tem
2a040 70 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  pReg = 1;.      
2a050 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
2a060 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  }.    }.    pPar
2a070 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61  se->aTempReg[pPa
2a080 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d  rse->nTempReg++]
2a090 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a   = iReg;.  }.}..
2a0a0 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f  /*.** Allocate o
2a0b0 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62  r deallocate a b
2a0c0 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e  lock of nReg con
2a0d0 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65  secutive registe
2a0e0 72 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  rs.*/.int sqlite
2a0f0 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61  3GetTempRange(Pa
2a100 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
2a110 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c   nReg){.  int i,
2a120 20 6e 3b 0a 20 20 69 20 3d 20 70 50 61 72 73 65   n;.  i = pParse
2a130 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e  ->iRangeReg;.  n
2a140 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67   = pParse->nRang
2a150 65 52 65 67 3b 0a 20 20 69 66 28 20 6e 52 65 67  eReg;.  if( nReg
2a160 3c 3d 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  <=n ){.    asser
2a170 74 28 20 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e  t( !usedAsColumn
2a180 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 2c  Cache(pParse, i,
2a190 20 69 2b 6e 2d 31 29 20 29 3b 0a 20 20 20 20 70   i+n-1) );.    p
2a1a0 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
2a1b0 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50   += nReg;.    pP
2a1c0 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
2a1d0 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65  -= nReg;.  }else
2a1e0 7b 0a 20 20 20 20 69 20 3d 20 70 50 61 72 73 65  {.    i = pParse
2a1f0 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50  ->nMem+1;.    pP
2a200 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
2a210 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  eg;.  }.  return
2a220 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74   i;.}.void sqlit
2a230 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
2a240 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
2a250 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20  , int iReg, int 
2a260 6e 52 65 67 29 7b 0a 20 20 73 71 6c 69 74 65 33  nReg){.  sqlite3
2a270 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
2a280 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 52  pParse, iReg, nR
2a290 65 67 29 3b 0a 20 20 69 66 28 20 6e 52 65 67 3e  eg);.  if( nReg>
2a2a0 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
2a2b0 67 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  g ){.    pParse-
2a2c0 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65  >nRangeReg = nRe
2a2d0 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69  g;.    pParse->i
2a2e0 52 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b  RangeReg = iReg;
2a2f0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
2a300 72 6b 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79  rk all temporary
2a310 20 72 65 67 69 73 74 65 72 73 20 61 73 20 62 65   registers as be
2a320 69 6e 67 20 75 6e 61 76 61 69 6c 61 62 6c 65 20  ing unavailable 
2a330 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f 0a 76 6f  for reuse..*/.vo
2a340 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54  id sqlite3ClearT
2a350 65 6d 70 52 65 67 43 61 63 68 65 28 50 61 72 73  empRegCache(Pars
2a360 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50  e *pParse){.  pP
2a370 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d  arse->nTempReg =
2a380 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 52   0;.  pParse->nR
2a390 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d 0a 0a  angeReg = 0;.}..
2a3a0 2f 2a 0a 2a 2a 20 56 61 6c 69 64 61 74 65 20 74  /*.** Validate t
2a3b0 68 61 74 20 6e 6f 20 74 65 6d 70 6f 72 61 72 79  hat no temporary
2a3c0 20 72 65 67 69 73 74 65 72 20 66 61 6c 6c 73 20   register falls 
2a3d0 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65  within the range
2a3e0 20 6f 66 0a 2a 2a 20 69 46 69 72 73 74 2e 2e 69   of.** iFirst..i
2a3f0 4c 61 73 74 2c 20 69 6e 63 6c 75 73 69 76 65 2e  Last, inclusive.
2a400 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
2a410 73 20 6f 6e 6c 79 20 63 61 6c 6c 20 66 72 6f 6d  s only call from
2a420 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29   within assert()
2a430 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  .** statements..
2a440 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2a450 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74  _DEBUG.int sqlit
2a460 65 33 4e 6f 54 65 6d 70 73 49 6e 52 61 6e 67 65  e3NoTempsInRange
2a470 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2a480 69 6e 74 20 69 46 69 72 73 74 2c 20 69 6e 74 20  int iFirst, int 
2a490 69 4c 61 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  iLast){.  int i;
2a4a0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
2a4b0 52 61 6e 67 65 52 65 67 3e 30 0a 20 20 20 26 26  RangeReg>0.   &&
2a4c0 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
2a4d0 65 67 2b 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67  eg+pParse->nRang
2a4e0 65 52 65 67 3c 69 4c 61 73 74 0a 20 20 20 26 26  eReg<iLast.   &&
2a4f0 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
2a500 65 67 3e 3d 69 46 69 72 73 74 0a 20 20 29 7b 0a  eg>=iFirst.  ){.
2a510 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
2a520 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
2a530 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
2a540 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
2a550 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
2a560 5b 69 5d 3e 3d 69 46 69 72 73 74 20 26 26 20 70  [i]>=iFirst && p
2a570 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
2a580 69 5d 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20  i]<=iLast ){.   
2a590 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
2a5a0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2a5b0 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1;.}.#endif /* S
2a5c0 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a     QLITE_DEBUG */.