/ Hex Artifact Content
Login

Artifact 866bcb6e85806beb0f96e651e9d17811e1ecbda5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  t.h"../* Forward
0220: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   declarations */
0230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
0240: 72 43 6f 64 65 42 65 74 77 65 65 6e 28 50 61 72  rCodeBetween(Par
0250: 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 76 6f  se*,Expr*,int,vo
0260: 69 64 28 2a 29 28 50 61 72 73 65 2a 2c 45 78 70  id(*)(Parse*,Exp
0270: 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69 6e 74 29  r*,int,int),int)
0280: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  ;.static int exp
0290: 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
02a0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
02b0: 2a 70 2c 20 69 6e 74 20 2a 70 69 54 6f 46 72 65  *p, int *piToFre
02c0: 65 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e);.../*.** Retu
02d0: 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74 79  rn the 'affinity
02e0: 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  ' of the express
02f0: 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e 79  ion pExpr if any
0300: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
0310: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61 20   is a column, a 
0320: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 63  reference to a c
0330: 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41 53  olumn via an 'AS
0340: 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20 61  ' alias,.** or a
0350: 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74 68   sub-select with
0360: 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65   a column as the
0370: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 74   return value, t
0380: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66 69  hen the .** affi
0390: 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f 6c  nity of that col
03a0: 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  umn is returned.
03b0: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30 30   Otherwise, 0x00
03c0: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
03d0: 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 61   indicating no a
03e0: 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65 20  ffinity for the 
03f0: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
0400: 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52 45  * i.e. the WHERE
0410: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69   clause expressi
0420: 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ons in the follo
0430: 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
0440: 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20 61  all.** have an a
0450: 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20 43  ffinity:.**.** C
0460: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
0470: 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  );.** SELECT * F
0480: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b 0a  ROM t1 WHERE a;.
0490: 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20 62  ** SELECT a AS b
04a0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62   FROM t1 WHERE b
04b0: 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46 52  ;.** SELECT * FR
04c0: 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65 6c  OM t1 WHERE (sel
04d0: 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b 0a  ect a from t1);.
04e0: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 45  */.char sqlite3E
04f0: 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70 72  xprAffinity(Expr
0500: 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
0510: 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71  op;.  pExpr = sq
0520: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
0530: 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20 69  late(pExpr);.  i
0540: 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
0550: 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20 72  & EP_Generic ) r
0560: 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d 20  eturn 0;.  op = 
0570: 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28  pExpr->op;.  if(
0580: 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29   op==TK_SELECT )
0590: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
05a0: 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78 49  xpr->flags&EP_xI
05b0: 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20 72  sSelect );.    r
05c0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
05d0: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  rAffinity(pExpr-
05e0: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
05f0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
0600: 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54  .  }.  if( op==T
0610: 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20  K_REGISTER ) op 
0620: 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 23 69  = pExpr->op2;.#i
0630: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
0640: 54 5f 43 41 53 54 0a 20 20 69 66 28 20 6f 70 3d  T_CAST.  if( op=
0650: 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20 20 20  =TK_CAST ){.    
0660: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
0670: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
0680: 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
0690: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
06a0: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70  e3AffinityType(p
06b0: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
06c0: 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  0);.  }.#endif. 
06d0: 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47 47   if( (op==TK_AGG
06e0: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54  _COLUMN || op==T
06f0: 4b 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 45 78  K_COLUMN) && pEx
0700: 70 72 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20  pr->pTab!=0 ){. 
0710: 20 20 20 69 6e 74 20 6a 20 3d 20 70 45 78 70 72     int j = pExpr
0720: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69  ->iColumn;.    i
0730: 66 28 20 6a 3c 30 20 29 20 72 65 74 75 72 6e 20  f( j<0 ) return 
0740: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
0750: 45 52 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ER;.    assert( 
0760: 70 45 78 70 72 2d 3e 70 54 61 62 20 26 26 20 6a  pExpr->pTab && j
0770: 3c 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e 6e 43  <pExpr->pTab->nC
0780: 6f 6c 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ol );.    return
0790: 20 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43   pExpr->pTab->aC
07a0: 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  ol[j].affinity;.
07b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78    }.  return pEx
07c0: 70 72 2d 3e 61 66 66 69 6e 69 74 79 3b 0a 7d 0a  pr->affinity;.}.
07d0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63  ./*.** Set the c
07e0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
07f0: 65 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  e for expression
0800: 20 70 45 78 70 72 20 74 6f 20 62 65 20 74 68 65   pExpr to be the
0810: 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65   collating.** se
0820: 71 75 65 6e 63 65 20 6e 61 6d 65 64 20 62 79 20  quence named by 
0830: 70 54 6f 6b 65 6e 2e 20 20 20 52 65 74 75 72 6e  pToken.   Return
0840: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
0850: 6e 65 77 20 45 78 70 72 20 6e 6f 64 65 20 74 68  new Expr node th
0860: 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73  at.** implements
0870: 20 74 68 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65   the COLLATE ope
0880: 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rator..**.** If 
0890: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
08a0: 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ion error occurs
08b0: 2c 20 74 68 61 74 20 66 61 63 74 20 69 73 20 72  , that fact is r
08c0: 65 63 6f 72 64 65 64 20 69 6e 20 70 50 61 72 73  ecorded in pPars
08d0: 65 2d 3e 64 62 0a 2a 2a 20 61 6e 64 20 74 68 65  e->db.** and the
08e0: 20 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72   pExpr parameter
08f0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 75 6e 63   is returned unc
0900: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 45 78 70 72 20  hanged..*/.Expr 
0910: 2a 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43  *sqlite3ExprAddC
0920: 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 0a 20 20 50  ollateToken(.  P
0930: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
0940: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
0950: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
0960: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
0970: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
0980: 74 68 65 20 22 43 4f 4c 4c 41 54 45 22 20 63 6c  the "COLLATE" cl
0990: 61 75 73 65 20 74 6f 20 74 68 69 73 20 65 78 70  ause to this exp
09a0: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  ression */.  con
09b0: 73 74 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c 4e  st Token *pCollN
09c0: 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame,  /* Name of
09d0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
09e0: 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71  nce */.  int deq
09f0: 75 6f 74 65 20 20 20 20 20 20 20 20 20 20 20 20  uote            
0a00: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 71    /* True to deq
0a10: 75 6f 74 65 20 70 43 6f 6c 6c 4e 61 6d 65 20 2a  uote pCollName *
0a20: 2f 0a 29 7b 0a 20 20 69 66 28 20 70 43 6f 6c 6c  /.){.  if( pColl
0a30: 4e 61 6d 65 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20  Name->n>0 ){.   
0a40: 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71   Expr *pNew = sq
0a50: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70  lite3ExprAlloc(p
0a60: 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 43 4f  Parse->db, TK_CO
0a70: 4c 4c 41 54 45 2c 20 70 43 6f 6c 6c 4e 61 6d 65  LLATE, pCollName
0a80: 2c 20 64 65 71 75 6f 74 65 29 3b 0a 20 20 20 20  , dequote);.    
0a90: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
0aa0: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
0ab0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65  pExpr;.      pNe
0ac0: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43  w->flags |= EP_C
0ad0: 6f 6c 6c 61 74 65 7c 45 50 5f 53 6b 69 70 3b 0a  ollate|EP_Skip;.
0ae0: 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e        pExpr = pN
0af0: 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ew;.    }.  }.  
0b00: 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
0b10: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
0b20: 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e  rAddCollateStrin
0b30: 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  g(Parse *pParse,
0b40: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 6f   Expr *pExpr, co
0b50: 6e 73 74 20 63 68 61 72 20 2a 7a 43 29 7b 0a 20  nst char *zC){. 
0b60: 20 54 6f 6b 65 6e 20 73 3b 0a 20 20 61 73 73 65   Token s;.  asse
0b70: 72 74 28 20 7a 43 21 3d 30 20 29 3b 0a 20 20 73  rt( zC!=0 );.  s
0b80: 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28  qlite3TokenInit(
0b90: 26 73 2c 20 28 63 68 61 72 2a 29 7a 43 29 3b 0a  &s, (char*)zC);.
0ba0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
0bb0: 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f  ExprAddCollateTo
0bc0: 6b 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70  ken(pParse, pExp
0bd0: 72 2c 20 26 73 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  r, &s, 0);.}../*
0be0: 0a 2a 2a 20 53 6b 69 70 20 6f 76 65 72 20 61 6e  .** Skip over an
0bf0: 79 20 54 4b 5f 43 4f 4c 4c 41 54 45 20 6f 70 65  y TK_COLLATE ope
0c00: 72 61 74 6f 72 73 20 61 6e 64 20 61 6e 79 20 75  rators and any u
0c10: 6e 6c 69 6b 65 6c 79 28 29 0a 2a 2a 20 6f 72 20  nlikely().** or 
0c20: 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 66 75 6e  likelihood() fun
0c30: 63 74 69 6f 6e 20 61 74 20 74 68 65 20 72 6f 6f  ction at the roo
0c40: 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
0c50: 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  on..*/.Expr *sql
0c60: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
0c70: 61 74 65 28 45 78 70 72 20 2a 70 45 78 70 72 29  ate(Expr *pExpr)
0c80: 7b 0a 20 20 77 68 69 6c 65 28 20 70 45 78 70 72  {.  while( pExpr
0c90: 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65   && ExprHasPrope
0ca0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 6b  rty(pExpr, EP_Sk
0cb0: 69 70 29 20 29 7b 0a 20 20 20 20 69 66 28 20 45  ip) ){.    if( E
0cc0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
0cd0: 45 78 70 72 2c 20 45 50 5f 55 6e 6c 69 6b 65 6c  Expr, EP_Unlikel
0ce0: 79 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  y) ){.      asse
0cf0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
0d00: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
0d10: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
0d20: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
0d30: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
0d40: 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >0 );.      asse
0d50: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
0d60: 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  K_FUNCTION );.  
0d70: 20 20 20 20 70 45 78 70 72 20 3d 20 70 45 78 70      pExpr = pExp
0d80: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d  r->x.pList->a[0]
0d90: 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73  .pExpr;.    }els
0da0: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
0db0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
0dc0: 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20 20 20  OLLATE );.      
0dd0: 70 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 70  pExpr = pExpr->p
0de0: 4c 65 66 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  Left;.    }.  } 
0df0: 20 20 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70    .  return pExp
0e00: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  r;.}../*.** Retu
0e10: 72 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  rn the collation
0e20: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
0e30: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
0e40: 70 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20  pr. If.** there 
0e50: 69 73 20 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f  is no defined co
0e60: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
0e70: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  , return NULL..*
0e80: 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69  *.** The collati
0e90: 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 69 67 68  ng sequence migh
0ea0: 74 20 62 65 20 64 65 74 65 72 6d 69 6e 65 64 20  t be determined 
0eb0: 62 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65  by a COLLATE ope
0ec0: 72 61 74 6f 72 0a 2a 2a 20 6f 72 20 62 79 20 74  rator.** or by t
0ed0: 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 61  he presence of a
0ee0: 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 61 20 64   column with a d
0ef0: 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67  efined collating
0f00: 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 20 43 4f   sequence..** CO
0f10: 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73 20  LLATE operators 
0f20: 74 61 6b 65 20 66 69 72 73 74 20 70 72 65 63 65  take first prece
0f30: 64 65 6e 63 65 2e 20 20 4c 65 66 74 20 6f 70 65  dence.  Left ope
0f40: 72 61 6e 64 73 20 74 61 6b 65 0a 2a 2a 20 70 72  rands take.** pr
0f50: 65 63 65 64 65 6e 63 65 20 6f 76 65 72 20 72 69  ecedence over ri
0f60: 67 68 74 20 6f 70 65 72 61 6e 64 73 2e 0a 2a 2f  ght operands..*/
0f70: 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65  .CollSeq *sqlite
0f80: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 50 61 72  3ExprCollSeq(Par
0f90: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
0fa0: 20 2a 70 45 78 70 72 29 7b 0a 20 20 73 71 6c 69   *pExpr){.  sqli
0fb0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
0fc0: 2d 3e 64 62 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  ->db;.  CollSeq 
0fd0: 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 45 78  *pColl = 0;.  Ex
0fe0: 70 72 20 2a 70 20 3d 20 70 45 78 70 72 3b 0a 20  pr *p = pExpr;. 
0ff0: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
1000: 20 69 6e 74 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b   int op = p->op;
1010: 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  .    if( p->flag
1020: 73 20 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29  s & EP_Generic )
1030: 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
1040: 6f 70 3d 3d 54 4b 5f 43 41 53 54 20 7c 7c 20 6f  op==TK_CAST || o
1050: 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 7b 0a 20  p==TK_UPLUS ){. 
1060: 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66       p = p->pLef
1070: 74 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  t;.      continu
1080: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
1090: 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20   op==TK_COLLATE 
10a0: 7c 7c 20 28 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  || (op==TK_REGIS
10b0: 54 45 52 20 26 26 20 70 2d 3e 6f 70 32 3d 3d 54  TER && p->op2==T
10c0: 4b 5f 43 4f 4c 4c 41 54 45 29 20 29 7b 0a 20 20  K_COLLATE) ){.  
10d0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
10e0: 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50  te3GetCollSeq(pP
10f0: 61 72 73 65 2c 20 45 4e 43 28 64 62 29 2c 20 30  arse, ENC(db), 0
1100: 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  , p->u.zToken);.
1110: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1120: 20 7d 0a 20 20 20 20 69 66 28 20 28 6f 70 3d 3d   }.    if( (op==
1130: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c 7c  TK_AGG_COLUMN ||
1140: 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20   op==TK_COLUMN. 
1150: 20 20 20 20 20 20 20 20 20 7c 7c 20 6f 70 3d 3d           || op==
1160: 54 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f  TK_REGISTER || o
1170: 70 3d 3d 54 4b 5f 54 52 49 47 47 45 52 29 0a 20  p==TK_TRIGGER). 
1180: 20 20 20 20 26 26 20 70 2d 3e 70 54 61 62 21 3d      && p->pTab!=
1190: 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  0.    ){.      /
11a0: 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  * op==TK_REGISTE
11b0: 52 20 26 26 20 70 2d 3e 70 54 61 62 21 3d 30 20  R && p->pTab!=0 
11c0: 68 61 70 70 65 6e 73 20 77 68 65 6e 20 70 45 78  happens when pEx
11d0: 70 72 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c  pr was originall
11e0: 79 0a 20 20 20 20 20 20 2a 2a 20 61 20 54 4b 5f  y.      ** a TK_
11f0: 43 4f 4c 55 4d 4e 20 62 75 74 20 77 61 73 20 70  COLUMN but was p
1200: 72 65 76 69 6f 75 73 6c 79 20 65 76 61 6c 75 61  reviously evalua
1210: 74 65 64 20 61 6e 64 20 63 61 63 68 65 64 20 69  ted and cached i
1220: 6e 20 61 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  n a register */.
1230: 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 2d        int j = p-
1240: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
1250: 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20 20  if( j>=0 ){.    
1260: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1270: 7a 43 6f 6c 6c 20 3d 20 70 2d 3e 70 54 61 62 2d  zColl = p->pTab-
1280: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a  >aCol[j].zColl;.
1290: 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
12a0: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
12b0: 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20  eq(db, ENC(db), 
12c0: 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20  zColl, 0);.     
12d0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
12e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
12f0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
1300: 61 74 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ate ){.      if(
1310: 20 70 2d 3e 70 4c 65 66 74 20 26 26 20 28 70 2d   p->pLeft && (p-
1320: 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20  >pLeft->flags & 
1330: 45 50 5f 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29  EP_Collate)!=0 )
1340: 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 2d  {.        p = p-
1350: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 65  >pLeft;.      }e
1360: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 78 70  lse{.        Exp
1370: 72 20 2a 70 4e 65 78 74 20 20 3d 20 70 2d 3e 70  r *pNext  = p->p
1380: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 2f  Right;.        /
1390: 2a 20 54 68 65 20 45 78 70 72 2e 78 20 75 6e 69  * The Expr.x uni
13a0: 6f 6e 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  on is never used
13b0: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
13c0: 65 20 61 73 20 45 78 70 72 2e 70 52 69 67 68 74  e as Expr.pRight
13d0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
13e0: 72 74 28 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d  rt( p->x.pList==
13f0: 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d  0 || p->pRight==
1400: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 );.        /* 
1410: 70 2d 3e 66 6c 61 67 73 20 68 6f 6c 64 73 20 45  p->flags holds E
1420: 50 5f 43 6f 6c 6c 61 74 65 20 61 6e 64 20 70 2d  P_Collate and p-
1430: 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 64 6f  >pLeft->flags do
1440: 65 73 20 6e 6f 74 2e 20 20 41 6e 64 0a 20 20 20  es not.  And.   
1450: 20 20 20 20 20 2a 2a 20 70 2d 3e 78 2e 70 53 65       ** p->x.pSe
1460: 6c 65 63 74 20 63 61 6e 6e 6f 74 2e 20 20 53 6f  lect cannot.  So
1470: 20 69 66 20 70 2d 3e 78 2e 70 4c 65 66 74 20 65   if p->x.pLeft e
1480: 78 69 73 74 73 2c 20 69 74 20 6d 75 73 74 20 68  xists, it must h
1490: 6f 6c 64 20 61 74 0a 20 20 20 20 20 20 20 20 2a  old at.        *
14a0: 2a 20 6c 65 61 73 74 20 6f 6e 65 20 45 50 5f 43  * least one EP_C
14b0: 6f 6c 6c 61 74 65 2e 20 54 68 75 73 20 74 68 65  ollate. Thus the
14c0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 41   following two A
14d0: 4c 57 41 59 53 2e 20 2a 2f 0a 20 20 20 20 20 20  LWAYS. */.      
14e0: 20 20 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74    if( p->x.pList
14f0: 21 3d 30 20 26 26 20 41 4c 57 41 59 53 28 21 45  !=0 && ALWAYS(!E
1500: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1510: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 29  , EP_xIsSelect))
1520: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
1530: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 66  t i;.          f
1540: 6f 72 28 69 3d 30 3b 20 41 4c 57 41 59 53 28 69  or(i=0; ALWAYS(i
1550: 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  <p->x.pList->nEx
1560: 70 72 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  pr); i++){.     
1570: 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48         if( ExprH
1580: 61 73 50 72 6f 70 65 72 74 79 28 70 2d 3e 78 2e  asProperty(p->x.
1590: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
15a0: 72 2c 20 45 50 5f 43 6f 6c 6c 61 74 65 29 20 29  r, EP_Collate) )
15b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
15c0: 70 4e 65 78 74 20 3d 20 70 2d 3e 78 2e 70 4c 69  pNext = p->x.pLi
15d0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
15e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
15f0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
1600: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
1610: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1620: 20 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20   p = pNext;.    
1630: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
1640: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1650: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  }.  }.  if( sqli
1660: 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28  te3CheckCollSeq(
1670: 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29  pParse, pColl) )
1680: 7b 20 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30  { .    pColl = 0
1690: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
16a0: 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  Coll;.}../*.** p
16b0: 45 78 70 72 20 69 73 20 61 6e 20 6f 70 65 72 61  Expr is an opera
16c0: 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73  nd of a comparis
16d0: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 61 66  on operator.  af
16e0: 66 32 20 69 73 20 74 68 65 0a 2a 2a 20 74 79 70  f2 is the.** typ
16f0: 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68  e affinity of th
1700: 65 20 6f 74 68 65 72 20 6f 70 65 72 61 6e 64 2e  e other operand.
1710: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72    This routine r
1720: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 74 79  eturns the.** ty
1730: 70 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74  pe affinity that
1740: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
1750: 66 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73  for the comparis
1760: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a  on operator..*/.
1770: 63 68 61 72 20 73 71 6c 69 74 65 33 43 6f 6d 70  char sqlite3Comp
1780: 61 72 65 41 66 66 69 6e 69 74 79 28 45 78 70 72  areAffinity(Expr
1790: 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20 61 66   *pExpr, char af
17a0: 66 32 29 7b 0a 20 20 63 68 61 72 20 61 66 66 31  f2){.  char aff1
17b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
17c0: 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20  finity(pExpr);. 
17d0: 20 69 66 28 20 61 66 66 31 20 26 26 20 61 66 66   if( aff1 && aff
17e0: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42 6f 74 68  2 ){.    /* Both
17f0: 20 73 69 64 65 73 20 6f 66 20 74 68 65 20 63 6f   sides of the co
1800: 6d 70 61 72 69 73 6f 6e 20 61 72 65 20 63 6f 6c  mparison are col
1810: 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20 68 61 73  umns. If one has
1820: 20 6e 75 6d 65 72 69 63 0a 20 20 20 20 2a 2a 20   numeric.    ** 
1830: 61 66 66 69 6e 69 74 79 2c 20 75 73 65 20 74 68  affinity, use th
1840: 61 74 2e 20 4f 74 68 65 72 77 69 73 65 20 75 73  at. Otherwise us
1850: 65 20 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20  e no affinity.. 
1860: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71     */.    if( sq
1870: 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66  lite3IsNumericAf
1880: 66 69 6e 69 74 79 28 61 66 66 31 29 20 7c 7c 20  finity(aff1) || 
1890: 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63  sqlite3IsNumeric
18a0: 41 66 66 69 6e 69 74 79 28 61 66 66 32 29 20 29  Affinity(aff2) )
18b0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
18c0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
18d0: 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  C;.    }else{.  
18e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18f0: 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20  E_AFF_BLOB;.    
1900: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61  }.  }else if( !a
1910: 66 66 31 20 26 26 20 21 61 66 66 32 20 29 7b 0a  ff1 && !aff2 ){.
1920: 20 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 73      /* Neither s
1930: 69 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 61  ide of the compa
1940: 72 69 73 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  rison is a colum
1950: 6e 2e 20 20 43 6f 6d 70 61 72 65 20 74 68 65 0a  n.  Compare the.
1960: 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 20 64      ** results d
1970: 69 72 65 63 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a  irectly..    */.
1980: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1990: 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d 65  E_AFF_BLOB;.  }e
19a0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20  lse{.    /* One 
19b0: 73 69 64 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e  side is a column
19c0: 2c 20 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e  , the other is n
19d0: 6f 74 2e 20 55 73 65 20 74 68 65 20 63 6f 6c 75  ot. Use the colu
19e0: 6d 6e 73 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f  mns affinity. */
19f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 66 66  .    assert( aff
1a00: 31 3d 3d 30 20 7c 7c 20 61 66 66 32 3d 3d 30 20  1==0 || aff2==0 
1a10: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 61  );.    return (a
1a20: 66 66 31 20 2b 20 61 66 66 32 29 3b 0a 20 20 7d  ff1 + aff2);.  }
1a30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
1a40: 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  is a comparison 
1a50: 6f 70 65 72 61 74 6f 72 2e 20 20 52 65 74 75 72  operator.  Retur
1a60: 6e 20 74 68 65 20 74 79 70 65 20 61 66 66 69 6e  n the type affin
1a70: 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64 0a  ity that should.
1a80: 2a 2a 20 62 65 20 61 70 70 6c 69 65 64 20 74 6f  ** be applied to
1a90: 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 70   both operands p
1aa0: 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 74 68  rior to doing th
1ab0: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f  e comparison..*/
1ac0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 63 6f 6d  .static char com
1ad0: 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28  parisonAffinity(
1ae0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
1af0: 63 68 61 72 20 61 66 66 3b 0a 20 20 61 73 73 65  char aff;.  asse
1b00: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
1b10: 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_EQ || pExpr->o
1b20: 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70 45 78 70  p==TK_IN || pExp
1b30: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a  r->op==TK_LT ||.
1b40: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1b50: 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70 45  >op==TK_GT || pE
1b60: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c  xpr->op==TK_GE |
1b70: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
1b80: 4c 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  LE ||.          
1b90: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45  pExpr->op==TK_NE
1ba0: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
1bb0: 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_IS || pExpr->o
1bc0: 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20  p==TK_ISNOT );. 
1bd0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1be0: 70 4c 65 66 74 20 29 3b 0a 20 20 61 66 66 20 3d  pLeft );.  aff =
1bf0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
1c00: 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66  nity(pExpr->pLef
1c10: 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  t);.  if( pExpr-
1c20: 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 61  >pRight ){.    a
1c30: 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ff = sqlite3Comp
1c40: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70  areAffinity(pExp
1c50: 72 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 29 3b  r->pRight, aff);
1c60: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70  .  }else if( Exp
1c70: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1c80: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
1c90: 29 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73  ) ){.    aff = s
1ca0: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
1cb0: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 78 2e 70  inity(pExpr->x.p
1cc0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
1cd0: 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61 66 66 29  a[0].pExpr, aff)
1ce0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4e 45  ;.  }else if( NE
1cf0: 56 45 52 28 61 66 66 3d 3d 30 29 20 29 7b 0a 20  VER(aff==0) ){. 
1d00: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
1d10: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20  AFF_BLOB;.  }.  
1d20: 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f  return aff;.}../
1d30: 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20  *.** pExpr is a 
1d40: 63 6f 6d 70 61 72 69 73 6f 6e 20 65 78 70 72 65  comparison expre
1d50: 73 73 69 6f 6e 2c 20 65 67 2e 20 27 3d 27 2c 20  ssion, eg. '=', 
1d60: 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20 65 74 63  '<', IN(...) etc
1d70: 2e 0a 2a 2a 20 69 64 78 5f 61 66 66 69 6e 69 74  ..** idx_affinit
1d80: 79 20 69 73 20 74 68 65 20 61 66 66 69 6e 69 74  y is the affinit
1d90: 79 20 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20  y of an indexed 
1da0: 63 6f 6c 75 6d 6e 2e 20 52 65 74 75 72 6e 20 74  column. Return t
1db0: 72 75 65 0a 2a 2a 20 69 66 20 74 68 65 20 69 6e  rue.** if the in
1dc0: 64 65 78 20 77 69 74 68 20 61 66 66 69 6e 69 74  dex with affinit
1dd0: 79 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20 6d  y idx_affinity m
1de0: 61 79 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d  ay be used to im
1df0: 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 63  plement.** the c
1e00: 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20 70 45 78  omparison in pEx
1e10: 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  pr..*/.int sqlit
1e20: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f  e3IndexAffinityO
1e30: 6b 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63  k(Expr *pExpr, c
1e40: 68 61 72 20 69 64 78 5f 61 66 66 69 6e 69 74 79  har idx_affinity
1e50: 29 7b 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20  ){.  char aff = 
1e60: 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
1e70: 74 79 28 70 45 78 70 72 29 3b 0a 20 20 73 77 69  ty(pExpr);.  swi
1e80: 74 63 68 28 20 61 66 66 20 29 7b 0a 20 20 20 20  tch( aff ){.    
1e90: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f  case SQLITE_AFF_
1ea0: 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75  BLOB:.      retu
1eb0: 72 6e 20 31 3b 0a 20 20 20 20 63 61 73 65 20 53  rn 1;.    case S
1ec0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a  QLITE_AFF_TEXT:.
1ed0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 64 78        return idx
1ee0: 5f 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  _affinity==SQLIT
1ef0: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
1f00: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72  default:.      r
1f10: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 73 4e  eturn sqlite3IsN
1f20: 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 69  umericAffinity(i
1f30: 64 78 5f 61 66 66 69 6e 69 74 79 29 3b 0a 20 20  dx_affinity);.  
1f40: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
1f50: 6e 20 74 68 65 20 50 35 20 76 61 6c 75 65 20 74  n the P5 value t
1f60: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
1f70: 65 64 20 66 6f 72 20 61 20 62 69 6e 61 72 79 20  ed for a binary 
1f80: 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70  comparison.** op
1f90: 63 6f 64 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f  code (OP_Eq, OP_
1fa0: 47 65 20 65 74 63 2e 29 20 75 73 65 64 20 74 6f  Ge etc.) used to
1fb0: 20 63 6f 6d 70 61 72 65 20 70 45 78 70 72 31 20   compare pExpr1 
1fc0: 61 6e 64 20 70 45 78 70 72 32 2e 0a 2a 2f 0a 73  and pExpr2..*/.s
1fd0: 74 61 74 69 63 20 75 38 20 62 69 6e 61 72 79 43  tatic u8 binaryC
1fe0: 6f 6d 70 61 72 65 50 35 28 45 78 70 72 20 2a 70  ompareP5(Expr *p
1ff0: 45 78 70 72 31 2c 20 45 78 70 72 20 2a 70 45 78  Expr1, Expr *pEx
2000: 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  pr2, int jumpIfN
2010: 75 6c 6c 29 7b 0a 20 20 75 38 20 61 66 66 20 3d  ull){.  u8 aff =
2020: 20 28 63 68 61 72 29 73 71 6c 69 74 65 33 45 78   (char)sqlite3Ex
2030: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
2040: 32 29 3b 0a 20 20 61 66 66 20 3d 20 28 75 38 29  2);.  aff = (u8)
2050: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
2060: 66 69 6e 69 74 79 28 70 45 78 70 72 31 2c 20 61  finity(pExpr1, a
2070: 66 66 29 20 7c 20 28 75 38 29 6a 75 6d 70 49 66  ff) | (u8)jumpIf
2080: 4e 75 6c 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61  Null;.  return a
2090: 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ff;.}../*.** Ret
20a0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
20b0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
20c0: 65 71 75 65 6e 63 65 20 74 68 61 74 20 73 68 6f  equence that sho
20d0: 75 6c 64 20 62 65 20 75 73 65 64 20 62 79 0a 2a  uld be used by.*
20e0: 2a 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61  * a binary compa
20f0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 63  rison operator c
2100: 6f 6d 70 61 72 69 6e 67 20 70 4c 65 66 74 20 61  omparing pLeft a
2110: 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a  nd pRight..**.**
2120: 20 49 66 20 74 68 65 20 6c 65 66 74 20 68 61 6e   If the left han
2130: 64 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73  d expression has
2140: 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   a collating seq
2150: 75 65 6e 63 65 20 74 79 70 65 2c 20 74 68 65 6e  uence type, then
2160: 20 69 74 20 69 73 0a 2a 2a 20 75 73 65 64 2e 20   it is.** used. 
2170: 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 63 6f  Otherwise the co
2180: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
2190: 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 20 68   for the right h
21a0: 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  and expression.*
21b0: 2a 20 69 73 20 75 73 65 64 2c 20 6f 72 20 74 68  * is used, or th
21c0: 65 20 64 65 66 61 75 6c 74 20 28 42 49 4e 41 52  e default (BINAR
21d0: 59 29 20 69 66 20 6e 65 69 74 68 65 72 20 65 78  Y) if neither ex
21e0: 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63  pression has a c
21f0: 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74 79 70 65  ollating.** type
2200: 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
2210: 20 70 52 69 67 68 74 20 28 62 75 74 20 6e 6f 74   pRight (but not
2220: 20 70 4c 65 66 74 29 20 6d 61 79 20 62 65 20 61   pLeft) may be a
2230: 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 49   null pointer. I
2240: 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20  n this case,.** 
2250: 69 74 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64  it is not consid
2260: 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71  ered..*/.CollSeq
2270: 20 2a 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43   *sqlite3BinaryC
2280: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20  ompareCollSeq(. 
2290: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
22a0: 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20  .  Expr *pLeft, 
22b0: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 0a  .  Expr *pRight.
22c0: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
22d0: 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70  oll;.  assert( p
22e0: 4c 65 66 74 20 29 3b 0a 20 20 69 66 28 20 70 4c  Left );.  if( pL
22f0: 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  eft->flags & EP_
2300: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 70  Collate ){.    p
2310: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
2320: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
2330: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 7d 65 6c 73  , pLeft);.  }els
2340: 65 20 69 66 28 20 70 52 69 67 68 74 20 26 26 20  e if( pRight && 
2350: 28 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26  (pRight->flags &
2360: 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21 3d 30 20   EP_Collate)!=0 
2370: 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  ){.    pColl = s
2380: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
2390: 71 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  q(pParse, pRight
23a0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
23b0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
23c0: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
23d0: 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69  e, pLeft);.    i
23e0: 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
23f0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
2400: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
2410: 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20  arse, pRight);. 
2420: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2430: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pColl;.}../*.*
2440: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
2450: 66 6f 72 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e  for a comparison
2460: 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74   operator..*/.st
2470: 61 74 69 63 20 69 6e 74 20 63 6f 64 65 43 6f 6d  atic int codeCom
2480: 70 61 72 65 28 0a 20 20 50 61 72 73 65 20 2a 70  pare(.  Parse *p
2490: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 54 68 65  Parse,    /* The
24a0: 20 70 61 72 73 69 6e 67 20 28 61 6e 64 20 63 6f   parsing (and co
24b0: 64 65 20 67 65 6e 65 72 61 74 69 6e 67 29 20 63  de generating) c
24c0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
24d0: 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 2f 2a   *pLeft,      /*
24e0: 20 54 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e   The left operan
24f0: 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69  d */.  Expr *pRi
2500: 67 68 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  ght,     /* The 
2510: 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f  right operand */
2520: 0a 20 20 69 6e 74 20 6f 70 63 6f 64 65 2c 20 20  .  int opcode,  
2530: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
2540: 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f  arison opcode */
2550: 0a 20 20 69 6e 74 20 69 6e 31 2c 20 69 6e 74 20  .  int in1, int 
2560: 69 6e 32 2c 20 2f 2a 20 52 65 67 69 73 74 65 72  in2, /* Register
2570: 20 68 6f 6c 64 69 6e 67 20 6f 70 65 72 61 6e 64   holding operand
2580: 73 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c  s */.  int dest,
2590: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
25a0: 20 68 65 72 65 20 69 66 20 74 72 75 65 2e 20 20   here if true.  
25b0: 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e  */.  int jumpIfN
25c0: 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20 74 72 75  ull    /* If tru
25d0: 65 2c 20 6a 75 6d 70 20 69 66 20 65 69 74 68 65  e, jump if eithe
25e0: 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c  r operand is NUL
25f0: 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 35  L */.){.  int p5
2600: 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20  ;.  int addr;.  
2610: 43 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a 0a 20 20  CollSeq *p4;..  
2620: 70 34 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  p4 = sqlite3Bina
2630: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
2640: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
2650: 70 52 69 67 68 74 29 3b 0a 20 20 70 35 20 3d 20  pRight);.  p5 = 
2660: 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28  binaryCompareP5(
2670: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 6a  pLeft, pRight, j
2680: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 61 64  umpIfNull);.  ad
2690: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
26a0: 41 64 64 4f 70 34 28 70 50 61 72 73 65 2d 3e 70  AddOp4(pParse->p
26b0: 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c 20 69 6e  Vdbe, opcode, in
26c0: 32 2c 20 64 65 73 74 2c 20 69 6e 31 2c 0a 20 20  2, dest, in1,.  
26d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e0: 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
26f0: 70 34 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  p4, P4_COLLSEQ);
2700: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
2710: 61 6e 67 65 50 35 28 70 50 61 72 73 65 2d 3e 70  angeP5(pParse->p
2720: 56 64 62 65 2c 20 28 75 38 29 70 35 29 3b 0a 20  Vdbe, (u8)p5);. 
2730: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
2740: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
2750: 75 65 20 69 66 20 65 78 70 72 65 73 73 69 6f 6e  ue if expression
2760: 20 70 45 78 70 72 20 69 73 20 61 20 76 65 63 74   pExpr is a vect
2770: 6f 72 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68  or, or false oth
2780: 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  erwise..**.** A 
2790: 76 65 63 74 6f 72 20 69 73 20 64 65 66 69 6e 65  vector is define
27a0: 64 20 61 73 20 61 6e 79 20 65 78 70 72 65 73 73  d as any express
27b0: 69 6f 6e 20 74 68 61 74 20 72 65 73 75 6c 74 73  ion that results
27c0: 20 69 6e 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a   in two or more.
27d0: 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 72 65  ** columns of re
27e0: 73 75 6c 74 2e 20 20 45 76 65 72 79 20 54 4b 5f  sult.  Every TK_
27f0: 56 45 43 54 4f 52 20 6e 6f 64 65 20 69 73 20 61  VECTOR node is a
2800: 6e 20 76 65 63 74 6f 72 20 62 65 63 61 75 73 65  n vector because
2810: 20 74 68 65 0a 2a 2a 20 70 61 72 73 65 72 20 77   the.** parser w
2820: 69 6c 6c 20 6e 6f 74 20 67 65 6e 65 72 61 74 65  ill not generate
2830: 20 61 20 54 4b 5f 56 45 43 54 4f 52 20 77 69 74   a TK_VECTOR wit
2840: 68 20 66 65 77 65 72 20 74 68 61 6e 20 74 77 6f  h fewer than two
2850: 20 65 6e 74 72 69 65 73 2e 0a 2a 2a 20 42 75 74   entries..** But
2860: 20 61 20 54 4b 5f 53 45 4c 45 43 54 20 6d 69 67   a TK_SELECT mig
2870: 68 74 20 62 65 20 65 69 74 68 65 72 20 61 20 76  ht be either a v
2880: 65 63 74 6f 72 20 6f 72 20 61 20 73 63 61 6c 61  ector or a scala
2890: 72 2e 20 49 74 20 69 73 20 6f 6e 6c 79 0a 2a 2a  r. It is only.**
28a0: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 65   considered a ve
28b0: 63 74 6f 72 20 69 66 20 69 74 20 68 61 73 20 74  ctor if it has t
28c0: 77 6f 20 6f 72 20 6d 6f 72 65 20 72 65 73 75 6c  wo or more resul
28d0: 74 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 69 6e  t columns..*/.in
28e0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56  t sqlite3ExprIsV
28f0: 65 63 74 6f 72 28 45 78 70 72 20 2a 70 45 78 70  ector(Expr *pExp
2900: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  r){.  return sql
2910: 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
2920: 7a 65 28 70 45 78 70 72 29 3e 31 3b 0a 7d 0a 0a  ze(pExpr)>1;.}..
2930: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
2940: 72 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61  ression passed a
2950: 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
2960: 65 6e 74 20 69 73 20 6f 66 20 74 79 70 65 20 54  ent is of type T
2970: 4b 5f 56 45 43 54 4f 52 20 0a 2a 2a 20 72 65 74  K_VECTOR .** ret
2980: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
2990: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  f expressions in
29a0: 20 74 68 65 20 76 65 63 74 6f 72 2e 20 4f 72 2c   the vector. Or,
29b0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
29c0: 6f 6e 0a 2a 2a 20 69 73 20 61 20 73 75 62 2d 73  on.** is a sub-s
29d0: 65 6c 65 63 74 2c 20 72 65 74 75 72 6e 20 74 68  elect, return th
29e0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
29f0: 6d 6e 73 20 69 6e 20 74 68 65 20 73 75 62 2d 73  mns in the sub-s
2a00: 65 6c 65 63 74 2e 20 46 6f 72 0a 2a 2a 20 61 6e  elect. For.** an
2a10: 79 20 6f 74 68 65 72 20 74 79 70 65 20 6f 66 20  y other type of 
2a20: 65 78 70 72 65 73 73 69 6f 6e 2c 20 72 65 74 75  expression, retu
2a30: 72 6e 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rn 1..*/.int sql
2a40: 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
2a50: 7a 65 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  ze(Expr *pExpr){
2a60: 0a 20 20 75 38 20 6f 70 20 3d 20 70 45 78 70 72  .  u8 op = pExpr
2a70: 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
2a80: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
2a90: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 20   = pExpr->op2;. 
2aa0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 45 43 54   if( op==TK_VECT
2ab0: 4f 52 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OR ){.    return
2ac0: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
2ad0: 3e 6e 45 78 70 72 3b 0a 20 20 7d 65 6c 73 65 20  >nExpr;.  }else 
2ae0: 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  if( op==TK_SELEC
2af0: 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  T ){.    return 
2b00: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
2b10: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
2b20: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
2b30: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 23  turn 1;.  }.}..#
2b40: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2b50: 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
2b60: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
2b70: 65 72 20 74 6f 20 61 20 73 75 62 65 78 70 72 65  er to a subexpre
2b80: 73 73 69 6f 6e 20 6f 66 20 70 56 65 63 74 6f 72  ssion of pVector
2b90: 20 74 68 61 74 20 69 73 20 74 68 65 20 69 2d 74   that is the i-t
2ba0: 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  h.** column of t
2bb0: 68 65 20 76 65 63 74 6f 72 20 28 6e 75 6d 62 65  he vector (numbe
2bc0: 72 65 64 20 73 74 61 72 74 69 6e 67 20 77 69 74  red starting wit
2bd0: 68 20 30 29 2e 20 20 54 68 65 20 63 61 6c 6c 65  h 0).  The calle
2be0: 72 20 6d 75 73 74 0a 2a 2a 20 65 6e 73 75 72 65  r must.** ensure
2bf0: 20 74 68 61 74 20 69 20 69 73 20 77 69 74 68 69   that i is withi
2c00: 6e 20 72 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 49  n range..**.** I
2c10: 66 20 70 56 65 63 74 6f 72 20 69 73 20 72 65 61  f pVector is rea
2c20: 6c 6c 79 20 61 20 73 63 61 6c 61 72 20 28 61 6e  lly a scalar (an
2c30: 64 20 22 73 63 61 6c 61 72 22 20 68 65 72 65 20  d "scalar" here 
2c40: 69 6e 63 6c 75 64 65 73 20 73 75 62 71 75 65 72  includes subquer
2c50: 69 65 73 0a 2a 2a 20 74 68 61 74 20 72 65 74 75  ies.** that retu
2c60: 72 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  rn a single colu
2c70: 6d 6e 21 29 20 74 68 65 6e 20 72 65 74 75 72 6e  mn!) then return
2c80: 20 70 56 65 63 74 6f 72 20 75 6e 6d 6f 64 69 66   pVector unmodif
2c90: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 70 56 65 63 74  ied..**.** pVect
2ca0: 6f 72 20 72 65 74 61 69 6e 73 20 6f 77 6e 65 72  or retains owner
2cb0: 73 68 69 70 20 6f 66 20 74 68 65 20 72 65 74 75  ship of the retu
2cc0: 72 6e 65 64 20 73 75 62 65 78 70 72 65 73 73 69  rned subexpressi
2cd0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  on..**.** If the
2ce0: 20 76 65 63 74 6f 72 20 69 73 20 61 20 28 53 45   vector is a (SE
2cf0: 4c 45 43 54 20 2e 2e 2e 29 20 74 68 65 6e 20 74  LECT ...) then t
2d00: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  he expression re
2d10: 74 75 72 6e 65 64 20 69 73 0a 2a 2a 20 6a 75 73  turned is.** jus
2d20: 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
2d30: 20 66 6f 72 20 74 68 65 20 69 2d 74 68 20 74 65   for the i-th te
2d40: 72 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rm of the result
2d50: 20 73 65 74 2c 20 61 6e 64 20 6d 61 79 0a 2a 2a   set, and may.**
2d60: 20 6e 6f 74 20 62 65 20 72 65 61 64 79 20 66 6f   not be ready fo
2d70: 72 20 65 76 61 6c 75 61 74 69 6f 6e 20 62 65 63  r evaluation bec
2d80: 61 75 73 65 20 74 68 65 20 74 61 62 6c 65 20 63  ause the table c
2d90: 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 79 65  ursor has not ye
2da0: 74 0a 2a 2a 20 62 65 65 6e 20 70 6f 73 69 74 69  t.** been positi
2db0: 6f 6e 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  oned..*/.Expr *s
2dc0: 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
2dd0: 64 53 75 62 65 78 70 72 28 45 78 70 72 20 2a 70  dSubexpr(Expr *p
2de0: 56 65 63 74 6f 72 2c 20 69 6e 74 20 69 29 7b 0a  Vector, int i){.
2df0: 20 20 61 73 73 65 72 74 28 20 69 3c 73 71 6c 69    assert( i<sqli
2e00: 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
2e10: 65 28 70 56 65 63 74 6f 72 29 20 29 3b 0a 20 20  e(pVector) );.  
2e20: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
2e30: 73 56 65 63 74 6f 72 28 70 56 65 63 74 6f 72 29  sVector(pVector)
2e40: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 56 65 63   ){.    if( pVec
2e50: 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  tor->op==TK_SELE
2e60: 43 54 0a 20 20 20 20 20 7c 7c 20 28 70 56 65 63  CT.     || (pVec
2e70: 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49  tor->op==TK_REGI
2e80: 53 54 45 52 20 26 26 20 70 56 65 63 74 6f 72 2d  STER && pVector-
2e90: 3e 6f 70 32 3d 3d 54 4b 5f 53 45 4c 45 43 54 29  >op2==TK_SELECT)
2ea0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
2eb0: 74 75 72 6e 20 70 56 65 63 74 6f 72 2d 3e 78 2e  turn pVector->x.
2ec0: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
2ed0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
2ee0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
2ef0: 74 75 72 6e 20 70 56 65 63 74 6f 72 2d 3e 78 2e  turn pVector->x.
2f00: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
2f10: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  r;.    }.  }.  r
2f20: 65 74 75 72 6e 20 70 56 65 63 74 6f 72 3b 0a 7d  eturn pVector;.}
2f30: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
2f40: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2f50: 53 55 42 51 55 45 52 59 29 20 2a 2f 0a 0a 23 69  SUBQUERY) */..#i
2f60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2f70: 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
2f80: 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74   Compute and ret
2f90: 75 72 6e 20 61 20 6e 65 77 20 45 78 70 72 20 6f  urn a new Expr o
2fa0: 62 6a 65 63 74 20 77 68 69 63 68 20 77 68 65 6e  bject which when
2fb0: 20 70 61 73 73 65 64 20 74 6f 0a 2a 2a 20 73 71   passed to.** sq
2fc0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 20  lite3ExprCode() 
2fd0: 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 61 6c  will generate al
2fe0: 6c 20 6e 65 63 65 73 73 61 72 79 20 63 6f 64 65  l necessary code
2ff0: 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74   to compute.** t
3000: 68 65 20 69 46 69 65 6c 64 2d 74 68 20 63 6f 6c  he iField-th col
3010: 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f  umn of the vecto
3020: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 70 56 65  r expression pVe
3030: 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ctor..**.** It i
3040: 73 20 6f 6b 20 66 6f 72 20 70 56 65 63 74 6f 72  s ok for pVector
3050: 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20   to be a scalar 
3060: 28 61 73 20 6c 6f 6e 67 20 61 73 20 69 46 69 65  (as long as iFie
3070: 6c 64 3d 3d 30 29 2e 20 20 0a 2a 2a 20 49 6e 20  ld==0).  .** In 
3080: 74 68 61 74 20 63 61 73 65 2c 20 74 68 69 73 20  that case, this 
3090: 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69  routine works li
30a0: 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 44 75  ke sqlite3ExprDu
30b0: 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  p()..**.** The c
30c0: 61 6c 6c 65 72 20 6f 77 6e 73 20 74 68 65 20 72  aller owns the r
30d0: 65 74 75 72 6e 65 64 20 45 78 70 72 20 6f 62 6a  eturned Expr obj
30e0: 65 63 74 20 61 6e 64 20 69 73 20 72 65 73 70 6f  ect and is respo
30f0: 6e 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 65 6e  nsible for.** en
3100: 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 65 20  suring that the 
3110: 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 65  returned value e
3120: 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66  ventually gets f
3130: 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  reed..**.** The 
3140: 63 61 6c 6c 65 72 20 72 65 74 61 69 6e 73 20 6f  caller retains o
3150: 77 6e 65 72 73 68 69 70 20 6f 66 20 70 56 65 63  wnership of pVec
3160: 74 6f 72 2e 20 20 49 66 20 70 56 65 63 74 6f 72  tor.  If pVector
3170: 20 69 73 20 61 20 54 4b 5f 53 45 4c 45 43 54 2c   is a TK_SELECT,
3180: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 74  .** then the ret
3190: 75 72 6e 65 20 6f 62 6a 65 63 74 20 77 69 6c 6c  urne object will
31a0: 20 72 65 66 65 72 65 6e 63 65 20 70 56 65 63 74   reference pVect
31b0: 6f 72 20 61 6e 64 20 73 6f 20 70 56 65 63 74 6f  or and so pVecto
31c0: 72 20 6d 75 73 74 20 72 65 6d 61 69 6e 0a 2a 2a  r must remain.**
31d0: 20 76 61 6c 69 64 20 66 6f 72 20 74 68 65 20 6c   valid for the l
31e0: 69 66 65 20 6f 66 20 74 68 65 20 72 65 74 75 72  ife of the retur
31f0: 6e 65 64 20 6f 62 6a 65 63 74 2e 20 20 49 66 20  ned object.  If 
3200: 70 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b 5f  pVector is a TK_
3210: 56 45 43 54 4f 52 0a 2a 2a 20 6f 72 20 61 20 73  VECTOR.** or a s
3220: 63 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  calar expression
3230: 2c 20 74 68 65 6e 20 69 74 20 63 61 6e 20 62 65  , then it can be
3240: 20 64 65 6c 65 74 65 64 20 61 73 20 73 6f 6f 6e   deleted as soon
3250: 20 61 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65   as this routine
3260: 0a 2a 2a 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a  .** returns..**.
3270: 2a 2a 20 41 20 74 72 69 63 6b 20 74 6f 20 63 61  ** A trick to ca
3280: 75 73 65 20 61 20 54 4b 5f 53 45 4c 45 43 54 20  use a TK_SELECT 
3290: 70 56 65 63 74 6f 72 20 74 6f 20 62 65 20 64 65  pVector to be de
32a0: 6c 65 74 65 64 20 74 6f 67 65 74 68 65 72 20 77  leted together w
32b0: 69 74 68 0a 2a 2a 20 74 68 65 20 72 65 74 75 72  ith.** the retur
32c0: 6e 65 64 20 45 78 70 72 20 6f 62 6a 65 63 74 20  ned Expr object 
32d0: 69 73 20 74 6f 20 61 74 74 61 63 68 20 74 68 65  is to attach the
32e0: 20 70 56 65 63 74 6f 72 20 74 6f 20 74 68 65 20   pVector to the 
32f0: 70 52 69 67 68 74 20 66 69 65 6c 64 0a 2a 2a 20  pRight field.** 
3300: 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  of the returned 
3310: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
3320: 20 45 78 70 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f   Expr object..*/
3330: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
3340: 70 72 46 6f 72 56 65 63 74 6f 72 46 69 65 6c 64  prForVectorField
3350: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
3360: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
3370: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
3380: 20 45 78 70 72 20 2a 70 56 65 63 74 6f 72 2c 20   Expr *pVector, 
3390: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 65 63        /* The vec
33a0: 74 6f 72 2e 20 20 4c 69 73 74 20 6f 66 20 65 78  tor.  List of ex
33b0: 70 72 65 73 73 69 6f 6e 73 20 6f 72 20 61 20 73  pressions or a s
33c0: 75 62 2d 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69  ub-SELECT */.  i
33d0: 6e 74 20 69 46 69 65 6c 64 20 20 20 20 20 20 20  nt iField       
33e0: 20 20 20 20 2f 2a 20 57 68 69 63 68 20 63 6f 6c      /* Which col
33f0: 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f  umn of the vecto
3400: 72 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 29  r to return */.)
3410: 7b 0a 20 20 45 78 70 72 20 2a 70 52 65 74 3b 0a  {.  Expr *pRet;.
3420: 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f    if( pVector->o
3430: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
3440: 20 20 20 20 61 73 73 65 72 74 28 20 70 56 65 63      assert( pVec
3450: 74 6f 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  tor->flags & EP_
3460: 78 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20  xIsSelect );.   
3470: 20 2f 2a 20 54 68 65 20 54 4b 5f 53 45 4c 45 43   /* The TK_SELEC
3480: 54 5f 43 4f 4c 55 4d 4e 20 45 78 70 72 20 6e 6f  T_COLUMN Expr no
3490: 64 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  de:.    **.    *
34a0: 2a 20 70 4c 65 66 74 3a 20 20 20 20 20 20 20 20  * pLeft:        
34b0: 20 20 20 70 56 65 63 74 6f 72 20 63 6f 6e 74 61     pVector conta
34c0: 69 6e 69 6e 67 20 54 4b 5f 53 45 4c 45 43 54 0a  ining TK_SELECT.
34d0: 20 20 20 20 2a 2a 20 70 52 69 67 68 74 3a 20 20      ** pRight:  
34e0: 20 20 20 20 20 20 20 20 6e 6f 74 20 75 73 65 64          not used
34f0: 2e 20 20 42 75 74 20 72 65 63 75 72 73 69 76 65  .  But recursive
3500: 6c 79 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  ly deleted..    
3510: 2a 2a 20 69 43 6f 6c 75 6d 6e 3a 20 20 20 20 20  ** iColumn:     
3520: 20 20 20 20 49 6e 64 65 78 20 6f 66 20 61 20 63      Index of a c
3530: 6f 6c 75 6d 6e 20 69 6e 20 70 56 65 63 74 6f 72  olumn in pVector
3540: 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 2d 3e 69  .    ** pLeft->i
3550: 54 61 62 6c 65 3a 20 20 20 46 69 72 73 74 20 69  Table:   First i
3560: 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  n an array of re
3570: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72  gister holding r
3580: 65 73 75 6c 74 2c 20 6f 72 20 30 0a 20 20 20 20  esult, or 0.    
3590: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
35a0: 20 20 20 20 69 66 20 74 68 65 20 72 65 73 75 6c      if the resul
35b0: 74 20 69 73 20 6e 6f 74 20 79 65 74 20 63 6f 6d  t is not yet com
35c0: 70 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  puted..    **.  
35d0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72    ** sqlite3Expr
35e0: 44 65 6c 65 74 65 28 29 20 73 70 65 63 69 66 69  Delete() specifi
35f0: 63 61 6c 6c 79 20 73 6b 69 70 73 20 74 68 65 20  cally skips the 
3600: 72 65 63 75 72 73 69 76 65 20 64 65 6c 65 74 65  recursive delete
3610: 20 6f 66 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74   of.    ** pLeft
3620: 20 6f 6e 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f   on TK_SELECT_CO
3630: 4c 55 4d 4e 20 6e 6f 64 65 73 2e 20 20 42 75 74  LUMN nodes.  But
3640: 20 70 52 69 67 68 74 20 69 73 20 66 6f 6c 6c 6f   pRight is follo
3650: 77 65 64 2c 20 73 6f 20 70 56 65 63 74 6f 72 0a  wed, so pVector.
3660: 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 61 74      ** can be at
3670: 74 61 63 68 65 64 20 74 6f 20 70 52 69 67 68 74  tached to pRight
3680: 20 74 6f 20 63 61 75 73 65 20 74 68 69 73 20 6e   to cause this n
3690: 6f 64 65 20 74 6f 20 74 61 6b 65 20 6f 77 6e 65  ode to take owne
36a0: 72 73 68 69 70 20 6f 66 0a 20 20 20 20 2a 2a 20  rship of.    ** 
36b0: 70 56 65 63 74 6f 72 2e 20 20 54 79 70 69 63 61  pVector.  Typica
36c0: 6c 6c 79 20 74 68 65 72 65 20 77 69 6c 6c 20 62  lly there will b
36d0: 65 20 6d 75 6c 74 69 70 6c 65 20 54 4b 5f 53 45  e multiple TK_SE
36e0: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  LECT_COLUMN node
36f0: 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68  s.    ** with th
3700: 65 20 73 61 6d 65 20 70 4c 65 66 74 20 70 6f 69  e same pLeft poi
3710: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 56 65 63  nter to the pVec
3720: 74 6f 72 2c 20 62 75 74 20 6f 6e 6c 79 20 6f 6e  tor, but only on
3730: 65 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a  e of them.    **
3740: 20 77 69 6c 6c 20 6f 77 6e 20 74 68 65 20 70 56   will own the pV
3750: 65 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  ector..    */.  
3760: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
3770: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
3780: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 2c 20  _SELECT_COLUMN, 
3790: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 0, 0);.    if
37a0: 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20  ( pRet ){.      
37b0: 70 52 65 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  pRet->iColumn = 
37c0: 69 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 70 52  iField;.      pR
37d0: 65 74 2d 3e 70 4c 65 66 74 20 3d 20 70 56 65 63  et->pLeft = pVec
37e0: 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  tor;.    }.    a
37f0: 73 73 65 72 74 28 20 70 52 65 74 3d 3d 30 20 7c  ssert( pRet==0 |
3800: 7c 20 70 52 65 74 2d 3e 69 54 61 62 6c 65 3d 3d  | pRet->iTable==
3810: 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0 );.  }else{.  
3820: 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f    if( pVector->o
3830: 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 29 20 70  p==TK_VECTOR ) p
3840: 56 65 63 74 6f 72 20 3d 20 70 56 65 63 74 6f 72  Vector = pVector
3850: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69  ->x.pList->a[iFi
3860: 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  eld].pExpr;.    
3870: 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  pRet = sqlite3Ex
3880: 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  prDup(pParse->db
3890: 2c 20 70 56 65 63 74 6f 72 2c 20 30 29 3b 0a 20  , pVector, 0);. 
38a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
38b0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
38c0: 65 66 69 6e 65 28 53 51 4c 49 54 45 5f 4f 4d 49  efine(SQLITE_OMI
38d0: 54 5f 53 55 42 51 55 45 52 59 29 20 2a 2f 0a 0a  T_SUBQUERY) */..
38e0: 2f 2a 0a 2a 2a 20 49 66 20 65 78 70 72 65 73 73  /*.** If express
38f0: 69 6f 6e 20 70 45 78 70 72 20 69 73 20 6f 66 20  ion pExpr is of 
3900: 74 79 70 65 20 54 4b 5f 53 45 4c 45 43 54 2c 20  type TK_SELECT, 
3910: 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  generate code to
3920: 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 69 74 2e   evaluate.** it.
3930: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69   Return the regi
3940: 73 74 65 72 20 69 6e 20 77 68 69 63 68 20 74 68  ster in which th
3950: 65 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72  e result is stor
3960: 65 64 20 28 6f 72 2c 20 69 66 20 74 68 65 20 0a  ed (or, if the .
3970: 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 20 72 65  ** sub-select re
3980: 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20  turns more than 
3990: 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20  one column, the 
39a0: 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61  first in an arra
39b0: 79 0a 2a 2a 20 6f 66 20 72 65 67 69 73 74 65 72  y.** of register
39c0: 73 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 72  s in which the r
39d0: 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64 29  esult is stored)
39e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
39f0: 20 69 73 20 6e 6f 74 20 61 20 54 4b 5f 53 45 4c   is not a TK_SEL
3a00: 45 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ECT expression, 
3a10: 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61  return 0..*/.sta
3a20: 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f 64 65  tic int exprCode
3a30: 53 75 62 73 65 6c 65 63 74 28 50 61 72 73 65 20  Subselect(Parse 
3a40: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
3a50: 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 72 65 67  Expr){.  int reg
3a60: 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
3a70: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
3a80: 52 59 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  RY.  if( pExpr->
3a90: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
3aa0: 0a 20 20 20 20 72 65 67 20 3d 20 73 71 6c 69 74  .    reg = sqlit
3ab0: 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
3ac0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30  pParse, pExpr, 0
3ad0: 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
3ae0: 0a 20 20 72 65 74 75 72 6e 20 72 65 67 3b 0a 7d  .  return reg;.}
3af0: 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ../*.** Argument
3b00: 20 70 56 65 63 74 6f 72 20 70 6f 69 6e 74 73 20   pVector points 
3b10: 74 6f 20 61 20 76 65 63 74 6f 72 20 65 78 70 72  to a vector expr
3b20: 65 73 73 69 6f 6e 20 2d 20 65 69 74 68 65 72 20  ession - either 
3b30: 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f  a TK_VECTOR.** o
3b40: 72 20 54 4b 5f 53 45 4c 45 43 54 20 74 68 61 74  r TK_SELECT that
3b50: 20 72 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68   returns more th
3b60: 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2e 20 54  an one column. T
3b70: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
3b80: 75 72 6e 73 0a 2a 2a 20 74 68 65 20 72 65 67 69  urns.** the regi
3b90: 73 74 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 61  ster number of a
3ba0: 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20 63   register that c
3bb0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75  ontains the valu
3bc0: 65 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20  e of.** element 
3bd0: 69 46 69 65 6c 64 20 6f 66 20 74 68 65 20 76 65  iField of the ve
3be0: 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ctor..**.** If p
3bf0: 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b 5f 53  Vector is a TK_S
3c00: 45 4c 45 43 54 20 65 78 70 72 65 73 73 69 6f 6e  ELECT expression
3c10: 2c 20 74 68 65 6e 20 63 6f 64 65 20 66 6f 72 20  , then code for 
3c20: 69 74 20 6d 75 73 74 20 68 61 76 65 20 0a 2a 2a  it must have .**
3c30: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 67 65   already been ge
3c40: 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 74 68  nerated using th
3c50: 65 20 65 78 70 72 43 6f 64 65 53 75 62 73 65 6c  e exprCodeSubsel
3c60: 65 63 74 28 29 20 72 6f 75 74 69 6e 65 2e 20 49  ect() routine. I
3c70: 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 70  n this.** case p
3c80: 61 72 61 6d 65 74 65 72 20 72 65 67 53 65 6c 65  arameter regSele
3c90: 63 74 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  ct should be the
3ca0: 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72   first in an arr
3cb0: 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a  ay of registers.
3cc0: 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ** containing th
3cd0: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
3ce0: 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 0a 2a 2a   sub-select. .**
3cf0: 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72 20 69  .** If pVector i
3d00: 73 20 6f 66 20 74 79 70 65 20 54 4b 5f 56 45 43  s of type TK_VEC
3d10: 54 4f 52 2c 20 74 68 65 6e 20 63 6f 64 65 20 66  TOR, then code f
3d20: 6f 72 20 74 68 65 20 72 65 71 75 65 73 74 65 64  or the requested
3d30: 20 66 69 65 6c 64 0a 2a 2a 20 69 73 20 67 65 6e   field.** is gen
3d40: 65 72 61 74 65 64 2e 20 49 6e 20 74 68 69 73 20  erated. In this 
3d50: 63 61 73 65 20 28 2a 70 52 65 67 46 72 65 65 29  case (*pRegFree)
3d60: 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 74   may be set to t
3d70: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
3d80: 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  a temporary regi
3d90: 73 74 65 72 20 74 6f 20 62 65 20 66 72 65 65 64  ster to be freed
3da0: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62   by the caller b
3db0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
3dc0: 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
3dd0: 74 75 72 6e 69 6e 67 2c 20 6f 75 74 70 75 74 20  turning, output 
3de0: 70 61 72 61 6d 65 74 65 72 20 28 2a 70 70 45 78  parameter (*ppEx
3df0: 70 72 29 20 69 73 20 73 65 74 20 74 6f 20 70 6f  pr) is set to po
3e00: 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20 45 78  int to the.** Ex
3e10: 70 72 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73  pr object corres
3e20: 70 6f 6e 64 69 6e 67 20 74 6f 20 65 6c 65 6d 65  ponding to eleme
3e30: 6e 74 20 69 45 6c 65 6d 20 6f 66 20 74 68 65 20  nt iElem of the 
3e40: 76 65 63 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  vector..*/.stati
3e50: 63 20 69 6e 74 20 65 78 70 72 56 65 63 74 6f 72  c int exprVector
3e60: 52 65 67 69 73 74 65 72 28 0a 20 20 50 61 72 73  Register(.  Pars
3e70: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
3e80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3e90: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
3ea0: 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f 72 2c    Expr *pVector,
3eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ec0: 20 20 2f 2a 20 56 65 63 74 6f 72 20 74 6f 20 65    /* Vector to e
3ed0: 78 74 72 61 63 74 20 65 6c 65 6d 65 6e 74 20 66  xtract element f
3ee0: 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69  rom */.  int iFi
3ef0: 65 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  eld,            
3f00: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 65 6c           /* Fiel
3f10: 64 20 74 6f 20 65 78 74 72 61 63 74 20 66 72 6f  d to extract fro
3f20: 6d 20 70 56 65 63 74 6f 72 20 2a 2f 0a 20 20 69  m pVector */.  i
3f30: 6e 74 20 72 65 67 53 65 6c 65 63 74 2c 20 20 20  nt regSelect,   
3f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3f50: 2a 20 46 69 72 73 74 20 69 6e 20 61 72 72 61 79  * First in array
3f60: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 2a 2f   of registers */
3f70: 0a 20 20 45 78 70 72 20 2a 2a 70 70 45 78 70 72  .  Expr **ppExpr
3f80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3f90: 20 20 20 2f 2a 20 4f 55 54 3a 20 45 78 70 72 65     /* OUT: Expre
3fa0: 73 73 69 6f 6e 20 65 6c 65 6d 65 6e 74 20 2a 2f  ssion element */
3fb0: 0a 20 20 69 6e 74 20 2a 70 52 65 67 46 72 65 65  .  int *pRegFree
3fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fd0: 20 20 20 2f 2a 20 4f 55 54 3a 20 54 65 6d 70 20     /* OUT: Temp 
3fe0: 72 65 67 69 73 74 65 72 20 74 6f 20 66 72 65 65  register to free
3ff0: 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 6f 70 20 3d   */.){.  u8 op =
4000: 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3b 0a 20 20   pVector->op;.  
4010: 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 56  assert( op==TK_V
4020: 45 43 54 4f 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  ECTOR || op==TK_
4030: 53 45 4c 45 43 54 20 7c 7c 20 6f 70 3d 3d 54 4b  SELECT || op==TK
4040: 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 69  _REGISTER );.  i
4050: 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  f( op==TK_REGIST
4060: 45 52 20 29 7b 0a 20 20 20 20 2a 70 70 45 78 70  ER ){.    *ppExp
4070: 72 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f  r = sqlite3Vecto
4080: 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 56  rFieldSubexpr(pV
4090: 65 63 74 6f 72 2c 20 69 46 69 65 6c 64 29 3b 0a  ector, iField);.
40a0: 20 20 20 20 72 65 74 75 72 6e 20 70 56 65 63 74      return pVect
40b0: 6f 72 2d 3e 69 54 61 62 6c 65 2b 69 46 69 65 6c  or->iTable+iFiel
40c0: 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d  d;.  }.  if( op=
40d0: 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20  =TK_SELECT ){.  
40e0: 20 20 2a 70 70 45 78 70 72 20 3d 20 70 56 65 63    *ppExpr = pVec
40f0: 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  tor->x.pSelect->
4100: 70 45 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64  pEList->a[iField
4110: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 72 65  ].pExpr;.     re
4120: 74 75 72 6e 20 72 65 67 53 65 6c 65 63 74 2b 69  turn regSelect+i
4130: 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 2a 70 70  Field;.  }.  *pp
4140: 45 78 70 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e  Expr = pVector->
4150: 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c  x.pList->a[iFiel
4160: 64 5d 2e 70 45 78 70 72 3b 0a 20 20 72 65 74 75  d].pExpr;.  retu
4170: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  rn sqlite3ExprCo
4180: 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 2a  deTemp(pParse, *
4190: 70 70 45 78 70 72 2c 20 70 52 65 67 46 72 65 65  ppExpr, pRegFree
41a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72  );.}../*.** Expr
41b0: 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20  ession pExpr is 
41c0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65 74  a comparison bet
41d0: 77 65 65 6e 20 74 77 6f 20 76 65 63 74 6f 72 20  ween two vector 
41e0: 76 61 6c 75 65 73 2e 20 43 6f 6d 70 75 74 65 0a  values. Compute.
41f0: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ** the result of
4200: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
4210: 28 31 2c 20 30 2c 20 6f 72 20 4e 55 4c 4c 29 20  (1, 0, or NULL) 
4220: 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 0a 2a  and write that.*
4230: 2a 20 72 65 73 75 6c 74 20 69 6e 74 6f 20 72 65  * result into re
4240: 67 69 73 74 65 72 20 64 65 73 74 2e 0a 2a 2a 0a  gister dest..**.
4250: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
4260: 73 74 20 73 61 74 69 73 66 79 20 74 68 65 20 66  st satisfy the f
4270: 6f 6c 6c 6f 77 69 6e 67 20 70 72 65 63 6f 6e 64  ollowing precond
4280: 69 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  itions:.**.**   
4290: 20 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   if pExpr->op==T
42a0: 4b 5f 49 53 3a 20 20 20 20 20 20 6f 70 3d 3d 54  K_IS:      op==T
42b0: 4b 5f 45 51 20 61 6e 64 20 70 35 3d 3d 53 51 4c  K_EQ and p5==SQL
42c0: 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20 20 20  ITE_NULLEQ.**   
42d0: 20 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   if pExpr->op==T
42e0: 4b 5f 49 53 4e 4f 54 3a 20 20 20 6f 70 3d 3d 54  K_ISNOT:   op==T
42f0: 4b 5f 4e 45 20 61 6e 64 20 70 35 3d 3d 53 51 4c  K_NE and p5==SQL
4300: 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20 20 20  ITE_NULLEQ.**   
4310: 20 6f 74 68 65 72 77 69 73 65 3a 20 20 20 20 20   otherwise:     
4320: 20 20 20 20 20 20 20 20 20 20 20 6f 70 3d 3d 70             op==p
4330: 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 70 35 3d  Expr->op and p5=
4340: 3d 30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  =0.*/.static voi
4350: 64 20 63 6f 64 65 56 65 63 74 6f 72 43 6f 6d 70  d codeVectorComp
4360: 61 72 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  are(.  Parse *pP
4370: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
4380: 43 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 63  Code generator c
4390: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
43a0: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
43b0: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69    /* The compari
43c0: 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  son operation */
43d0: 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20  .  int dest,    
43e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
43f0: 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 74  e results into t
4400: 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
4410: 20 20 75 38 20 6f 70 2c 20 20 20 20 20 20 20 20    u8 op,        
4420: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61          /* Compa
4430: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 2a  rison operator *
4440: 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20 20 20  /.  u8 p5       
4450: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
4460: 49 54 45 5f 4e 55 4c 4c 45 51 20 6f 72 20 7a 65  ITE_NULLEQ or ze
4470: 72 6f 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  ro */.){.  Vdbe 
4480: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
4490: 62 65 3b 0a 20 20 45 78 70 72 20 2a 70 4c 65 66  be;.  Expr *pLef
44a0: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
44b0: 3b 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  ;.  Expr *pRight
44c0: 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74   = pExpr->pRight
44d0: 3b 0a 20 20 69 6e 74 20 6e 4c 65 66 74 20 3d 20  ;.  int nLeft = 
44e0: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
44f0: 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20  rSize(pLeft);.  
4500: 69 6e 74 20 6e 52 69 67 68 74 20 3d 20 73 71 6c  int nRight = sql
4510: 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
4520: 7a 65 28 70 52 69 67 68 74 29 3b 0a 0a 20 20 2f  ze(pRight);..  /
4530: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 62 6f 74  * Check that bot
4540: 68 20 73 69 64 65 73 20 6f 66 20 74 68 65 20 63  h sides of the c
4550: 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20 76 65  omparison are ve
4560: 63 74 6f 72 73 2c 20 61 6e 64 20 74 68 61 74 0a  ctors, and that.
4570: 20 20 2a 2a 20 62 6f 74 68 20 61 72 65 20 74 68    ** both are th
4580: 65 20 73 61 6d 65 20 6c 65 6e 67 74 68 2e 20 20  e same length.  
4590: 2a 2f 0a 20 20 69 66 28 20 6e 4c 65 66 74 21 3d  */.  if( nLeft!=
45a0: 6e 52 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71  nRight ){.    sq
45b0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
45c0: 61 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65  arse, "row value
45d0: 20 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 7d 65   misused");.  }e
45e0: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  lse{.    int i;.
45f0: 20 20 20 20 69 6e 74 20 72 65 67 4c 65 66 74 20      int regLeft 
4600: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 67  = 0;.    int reg
4610: 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 75  Right = 0;.    u
4620: 38 20 6f 70 78 20 3d 20 6f 70 3b 0a 20 20 20 20  8 opx = op;.    
4630: 69 6e 74 20 61 64 64 72 44 6f 6e 65 20 3d 20 73  int addrDone = s
4640: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
4650: 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 61 73 73  bel(v);..    ass
4660: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
4670: 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_EQ || pExpr->
4680: 6f 70 3d 3d 54 4b 5f 4e 45 20 0a 20 20 20 20 20  op==TK_NE .     
4690: 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70      || pExpr->op
46a0: 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72  ==TK_IS || pExpr
46b0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 0a  ->op==TK_ISNOT .
46c0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70           || pExp
46d0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20  r->op==TK_LT || 
46e0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54  pExpr->op==TK_GT
46f0: 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45   .         || pE
4700: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c  xpr->op==TK_LE |
4710: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
4720: 47 45 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61  GE .    );.    a
4730: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
4740: 3d 3d 6f 70 20 7c 7c 20 28 70 45 78 70 72 2d 3e  ==op || (pExpr->
4750: 6f 70 3d 3d 54 4b 5f 49 53 20 26 26 20 6f 70 3d  op==TK_IS && op=
4760: 3d 54 4b 5f 45 51 29 0a 20 20 20 20 20 20 20 20  =TK_EQ).        
4770: 20 20 20 20 20 20 7c 7c 20 28 70 45 78 70 72 2d        || (pExpr-
4780: 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 26 26  >op==TK_ISNOT &&
4790: 20 6f 70 3d 3d 54 4b 5f 4e 45 29 20 29 3b 0a 20   op==TK_NE) );. 
47a0: 20 20 20 61 73 73 65 72 74 28 20 70 35 3d 3d 30     assert( p5==0
47b0: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f   || pExpr->op!=o
47c0: 70 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  p );.    assert(
47d0: 20 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c   p5==SQLITE_NULL
47e0: 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  EQ || pExpr->op=
47f0: 3d 6f 70 20 29 3b 0a 0a 20 20 20 20 70 35 20 7c  =op );..    p5 |
4800: 3d 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  = SQLITE_STOREP2
4810: 3b 0a 20 20 20 20 69 66 28 20 6f 70 78 3d 3d 54  ;.    if( opx==T
4820: 4b 5f 4c 45 20 29 20 6f 70 78 20 3d 20 54 4b 5f  K_LE ) opx = TK_
4830: 4c 54 3b 0a 20 20 20 20 69 66 28 20 6f 70 78 3d  LT;.    if( opx=
4840: 3d 54 4b 5f 47 45 20 29 20 6f 70 78 20 3d 20 54  =TK_GE ) opx = T
4850: 4b 5f 47 54 3b 0a 0a 20 20 20 20 72 65 67 4c 65  K_GT;..    regLe
4860: 66 74 20 3d 20 65 78 70 72 43 6f 64 65 53 75 62  ft = exprCodeSub
4870: 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
4880: 4c 65 66 74 29 3b 0a 20 20 20 20 72 65 67 52 69  Left);.    regRi
4890: 67 68 74 20 3d 20 65 78 70 72 43 6f 64 65 53 75  ght = exprCodeSu
48a0: 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
48b0: 70 52 69 67 68 74 29 3b 0a 0a 20 20 20 20 66 6f  pRight);..    fo
48c0: 72 28 69 3d 30 3b 20 31 20 2f 2a 4c 6f 6f 70 20  r(i=0; 1 /*Loop 
48d0: 65 78 69 74 73 20 62 79 20 22 62 72 65 61 6b 22  exits by "break"
48e0: 2a 2f 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  */; i++){.      
48f0: 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
4900: 2c 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a  , regFree2 = 0;.
4910: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 2c 20        Expr *pL, 
4920: 2a 70 52 3b 20 0a 20 20 20 20 20 20 69 6e 74 20  *pR; .      int 
4930: 72 31 2c 20 72 32 3b 0a 20 20 20 20 20 20 61 73  r1, r2;.      as
4940: 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
4950: 6e 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69  nLeft );.      i
4960: 66 28 20 69 3e 30 20 29 20 73 71 6c 69 74 65 33  f( i>0 ) sqlite3
4970: 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
4980: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72 31 20  arse);.      r1 
4990: 3d 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69  = exprVectorRegi
49a0: 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 4c 65  ster(pParse, pLe
49b0: 66 74 2c 20 69 2c 20 72 65 67 4c 65 66 74 2c 20  ft, i, regLeft, 
49c0: 26 70 4c 2c 20 26 72 65 67 46 72 65 65 31 29 3b  &pL, &regFree1);
49d0: 0a 20 20 20 20 20 20 72 32 20 3d 20 65 78 70 72  .      r2 = expr
49e0: 56 65 63 74 6f 72 52 65 67 69 73 74 65 72 28 70  VectorRegister(p
49f0: 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 69  Parse, pRight, i
4a00: 2c 20 72 65 67 52 69 67 68 74 2c 20 26 70 52 2c  , regRight, &pR,
4a10: 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
4a20: 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
4a30: 50 61 72 73 65 2c 20 70 4c 2c 20 70 52 2c 20 6f  Parse, pL, pR, o
4a40: 70 78 2c 20 72 31 2c 20 72 32 2c 20 64 65 73 74  px, r1, r2, dest
4a50: 2c 20 70 35 29 3b 0a 20 20 20 20 20 20 74 65 73  , p5);.      tes
4a60: 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29  tcase(op==OP_Lt)
4a70: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
4a80: 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20  (v,op==OP_Lt);. 
4a90: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70       testcase(op
4aa0: 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f  ==OP_Le); VdbeCo
4ab0: 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
4ac0: 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 74 65 73  P_Le);.      tes
4ad0: 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29  tcase(op==OP_Gt)
4ae0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
4af0: 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20  (v,op==OP_Gt);. 
4b00: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70       testcase(op
4b10: 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ge); VdbeCo
4b20: 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
4b30: 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 74 65 73  P_Ge);.      tes
4b40: 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29  tcase(op==OP_Eq)
4b50: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
4b60: 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20  (v,op==OP_Eq);. 
4b70: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70       testcase(op
4b80: 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ne); VdbeCo
4b90: 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
4ba0: 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  P_Ne);.      sql
4bb0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
4bc0: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
4bd0: 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee1);.      sqli
4be0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
4bf0: 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
4c00: 65 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  e2);.      if( i
4c10: 3e 30 20 29 20 73 71 6c 69 74 65 33 45 78 70 72  >0 ) sqlite3Expr
4c20: 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
4c30: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 6e  ;.      if( i==n
4c40: 4c 65 66 74 2d 31 20 29 7b 0a 20 20 20 20 20 20  Left-1 ){.      
4c50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
4c60: 0a 20 20 20 20 20 20 69 66 28 20 6f 70 78 3d 3d  .      if( opx==
4c70: 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 20  TK_EQ ){.       
4c80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4c90: 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p2(v, OP_IfNot, 
4ca0: 64 65 73 74 2c 20 61 64 64 72 44 6f 6e 65 29 3b  dest, addrDone);
4cb0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
4cc0: 3b 0a 20 20 20 20 20 20 20 20 70 35 20 7c 3d 20  ;.        p5 |= 
4cd0: 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c 3b  SQLITE_KEEPNULL;
4ce0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
4cf0: 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20 29 7b 0a 20   opx==TK_NE ){. 
4d00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4d10: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
4d20: 66 2c 20 64 65 73 74 2c 20 61 64 64 72 44 6f 6e  f, dest, addrDon
4d30: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
4d40: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 70 35 20  (v);.        p5 
4d50: 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55  |= SQLITE_KEEPNU
4d60: 4c 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LL;.      }else{
4d70: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
4d80: 20 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70   op==TK_LT || op
4d90: 3d 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 54  ==TK_GT || op==T
4da0: 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47  K_LE || op==TK_G
4db0: 45 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  E );.        sql
4dc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
4dd0: 2c 20 4f 50 5f 45 6c 73 65 4e 6f 74 45 71 2c 20  , OP_ElseNotEq, 
4de0: 30 2c 20 61 64 64 72 44 6f 6e 65 29 3b 0a 20 20  0, addrDone);.  
4df0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
4e00: 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c  geIf(v, op==TK_L
4e10: 54 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  T);.        Vdbe
4e20: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
4e30: 3d 3d 54 4b 5f 47 54 29 3b 0a 20 20 20 20 20 20  ==TK_GT);.      
4e40: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
4e50: 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 45 29 3b 0a  (v, op==TK_LE);.
4e60: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
4e70: 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
4e80: 5f 47 45 29 3b 0a 20 20 20 20 20 20 20 20 69 66  _GE);.        if
4e90: 28 20 69 3d 3d 6e 4c 65 66 74 2d 32 20 29 20 6f  ( i==nLeft-2 ) o
4ea0: 70 78 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 7d  px = op;.      }
4eb0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
4ec0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
4ed0: 65 6c 28 76 2c 20 61 64 64 72 44 6f 6e 65 29 3b  el(v, addrDone);
4ee0: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  .  }.}..#if SQLI
4ef0: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
4f00: 48 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  H>0./*.** Check 
4f10: 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20 6e 48  that argument nH
4f20: 65 69 67 68 74 20 69 73 20 6c 65 73 73 20 74 68  eight is less th
4f30: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
4f40: 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 65 78  he maximum.** ex
4f50: 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68 20 61  pression depth a
4f60: 6c 6c 6f 77 65 64 2e 20 49 66 20 69 74 20 69 73  llowed. If it is
4f70: 20 6e 6f 74 2c 20 6c 65 61 76 65 20 61 6e 20 65   not, leave an e
4f80: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 0a  rror message in.
4f90: 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e  ** pParse..*/.in
4fa0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65  t sqlite3ExprChe
4fb0: 63 6b 48 65 69 67 68 74 28 50 61 72 73 65 20 2a  ckHeight(Parse *
4fc0: 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 48 65 69  pParse, int nHei
4fd0: 67 68 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ght){.  int rc =
4fe0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
4ff0: 74 20 6d 78 48 65 69 67 68 74 20 3d 20 70 50 61  t mxHeight = pPa
5000: 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  rse->db->aLimit[
5010: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50  SQLITE_LIMIT_EXP
5020: 52 5f 44 45 50 54 48 5d 3b 0a 20 20 69 66 28 20  R_DEPTH];.  if( 
5030: 6e 48 65 69 67 68 74 3e 6d 78 48 65 69 67 68 74  nHeight>mxHeight
5040: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
5050: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
5060: 0a 20 20 20 20 20 20 20 22 45 78 70 72 65 73 73  .       "Express
5070: 69 6f 6e 20 74 72 65 65 20 69 73 20 74 6f 6f 20  ion tree is too 
5080: 6c 61 72 67 65 20 28 6d 61 78 69 6d 75 6d 20 64  large (maximum d
5090: 65 70 74 68 20 25 64 29 22 2c 20 6d 78 48 65 69  epth %d)", mxHei
50a0: 67 68 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 72  ght.    );.    r
50b0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
50c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
50d0: 63 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c  c;.}../* The fol
50e0: 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e  lowing three fun
50f0: 63 74 69 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66  ctions, heightOf
5100: 45 78 70 72 28 29 2c 20 68 65 69 67 68 74 4f 66  Expr(), heightOf
5110: 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e  ExprList().** an
5120: 64 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74  d heightOfSelect
5130: 28 29 2c 20 61 72 65 20 75 73 65 64 20 74 6f 20  (), are used to 
5140: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 61  determine the ma
5150: 78 69 6d 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20  ximum height.** 
5160: 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  of any expressio
5170: 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65  n tree reference
5180: 64 20 62 79 20 74 68 65 20 73 74 72 75 63 74 75  d by the structu
5190: 72 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  re passed as the
51a0: 0a 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65  .** first argume
51b0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  nt..**.** If thi
51c0: 73 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  s maximum height
51d0: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
51e0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
51f0: 75 65 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f  ue pointed.** to
5200: 20 62 79 20 70 6e 48 65 69 67 68 74 2c 20 74 68   by pnHeight, th
5210: 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
5220: 65 72 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 6e  er, then set *pn
5230: 48 65 69 67 68 74 20 74 6f 20 74 68 61 74 0a 2a  Height to that.*
5240: 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  * value..*/.stat
5250: 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66  ic void heightOf
5260: 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e  Expr(Expr *p, in
5270: 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20  t *pnHeight){.  
5280: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  if( p ){.    if(
5290: 20 70 2d 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48   p->nHeight>*pnH
52a0: 65 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2a  eight ){.      *
52b0: 70 6e 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48  pnHeight = p->nH
52c0: 65 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  eight;.    }.  }
52d0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  .}.static void h
52e0: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
52f0: 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74  ExprList *p, int
5300: 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69   *pnHeight){.  i
5310: 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  f( p ){.    int 
5320: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
5330: 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  i<p->nExpr; i++)
5340: 7b 0a 20 20 20 20 20 20 68 65 69 67 68 74 4f 66  {.      heightOf
5350: 45 78 70 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78  Expr(p->a[i].pEx
5360: 70 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  pr, pnHeight);. 
5370: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
5380: 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 53  c void heightOfS
5390: 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c  elect(Select *p,
53a0: 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b   int *pnHeight){
53b0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
53c0: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
53d0: 70 57 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74  pWhere, pnHeight
53e0: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  );.    heightOfE
53f0: 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20  xpr(p->pHaving, 
5400: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
5410: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
5420: 4c 69 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29  Limit, pnHeight)
5430: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
5440: 70 72 28 70 2d 3e 70 4f 66 66 73 65 74 2c 20 70  pr(p->pOffset, p
5450: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
5460: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
5470: 2d 3e 70 45 4c 69 73 74 2c 20 70 6e 48 65 69 67  ->pEList, pnHeig
5480: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
5490: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72  fExprList(p->pGr
54a0: 6f 75 70 42 79 2c 20 70 6e 48 65 69 67 68 74 29  oupBy, pnHeight)
54b0: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
54c0: 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72  prList(p->pOrder
54d0: 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  By, pnHeight);. 
54e0: 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63     heightOfSelec
54f0: 74 28 70 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48  t(p->pPrior, pnH
5500: 65 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  eight);.  }.}../
5510: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
5520: 72 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61 62  r.nHeight variab
5530: 6c 65 20 69 6e 20 74 68 65 20 73 74 72 75 63 74  le in the struct
5540: 75 72 65 20 70 61 73 73 65 64 20 61 73 20 61 6e  ure passed as an
5550: 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41   .** argument. A
5560: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74  n expression wit
5570: 68 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45  h no children, E
5580: 78 70 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a  xpr.pList or .**
5590: 20 45 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65   Expr.pSelect me
55a0: 6d 62 65 72 20 68 61 73 20 61 20 68 65 69 67 68  mber has a heigh
55b0: 74 20 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65  t of 1. Any othe
55c0: 72 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  r expression.** 
55d0: 68 61 73 20 61 20 68 65 69 67 68 74 20 65 71 75  has a height equ
55e0: 61 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  al to the maximu
55f0: 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20  m height of any 
5600: 6f 74 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65  other .** refere
5610: 6e 63 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f  nced Expr plus o
5620: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70  ne..**.** Also p
5630: 72 6f 70 61 67 61 74 65 20 45 50 5f 50 72 6f 70  ropagate EP_Prop
5640: 61 67 61 74 65 20 66 6c 61 67 73 20 75 70 20 66  agate flags up f
5650: 72 6f 6d 20 45 78 70 72 2e 78 2e 70 4c 69 73 74  rom Expr.x.pList
5660: 20 74 6f 20 45 78 70 72 2e 66 6c 61 67 73 2c 0a   to Expr.flags,.
5670: 2a 2a 20 69 66 20 61 70 70 72 6f 70 72 69 61 74  ** if appropriat
5680: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
5690: 64 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28  d exprSetHeight(
56a0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Expr *p){.  int 
56b0: 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68  nHeight = 0;.  h
56c0: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
56d0: 4c 65 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  Left, &nHeight);
56e0: 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  .  heightOfExpr(
56f0: 70 2d 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69  p->pRight, &nHei
5700: 67 68 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72  ght);.  if( Expr
5710: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
5720: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
5730: 20 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65      heightOfSele
5740: 63 74 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  ct(p->x.pSelect,
5750: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65   &nHeight);.  }e
5760: 6c 73 65 20 69 66 28 20 70 2d 3e 78 2e 70 4c 69  lse if( p->x.pLi
5770: 73 74 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74  st ){.    height
5780: 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e  OfExprList(p->x.
5790: 70 4c 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29  pList, &nHeight)
57a0: 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c  ;.    p->flags |
57b0: 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26  = EP_Propagate &
57c0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
57d0: 46 6c 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74  Flags(p->x.pList
57e0: 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69  );.  }.  p->nHei
57f0: 67 68 74 20 3d 20 6e 48 65 69 67 68 74 20 2b 20  ght = nHeight + 
5800: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  1;.}../*.** Set 
5810: 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74  the Expr.nHeight
5820: 20 76 61 72 69 61 62 6c 65 20 75 73 69 6e 67 20   variable using 
5830: 74 68 65 20 65 78 70 72 53 65 74 48 65 69 67 68  the exprSetHeigh
5840: 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66  t() function. If
5850: 0a 2a 2a 20 74 68 65 20 68 65 69 67 68 74 20 69  .** the height i
5860: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
5870: 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77  he maximum allow
5880: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65  ed expression de
5890: 70 74 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e  pth,.** leave an
58a0: 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65   error in pParse
58b0: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f  ..**.** Also pro
58c0: 70 61 67 61 74 65 20 61 6c 6c 20 45 50 5f 50 72  pagate all EP_Pr
58d0: 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20 66 72  opagate flags fr
58e0: 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c  om the Expr.x.pL
58f0: 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72  ist into.** Expr
5900: 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64  .flags. .*/.void
5910: 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48   sqlite3ExprSetH
5920: 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28 50 61  eightAndFlags(Pa
5930: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
5940: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 50 61  r *p){.  if( pPa
5950: 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
5960: 72 6e 3b 0a 20 20 65 78 70 72 53 65 74 48 65 69  rn;.  exprSetHei
5970: 67 68 74 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ght(p);.  sqlite
5980: 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74  3ExprCheckHeight
5990: 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69  (pParse, p->nHei
59a0: 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ght);.}../*.** R
59b0: 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75  eturn the maximu
59c0: 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20  m height of any 
59d0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
59e0: 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79  referenced.** by
59f0: 20 74 68 65 20 73 65 6c 65 63 74 20 73 74 61 74   the select stat
5a00: 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20  ement passed as 
5a10: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  an argument..*/.
5a20: 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
5a30: 74 45 78 70 72 48 65 69 67 68 74 28 53 65 6c 65  tExprHeight(Sele
5a40: 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48  ct *p){.  int nH
5a50: 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69  eight = 0;.  hei
5a60: 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2c 20 26  ghtOfSelect(p, &
5a70: 6e 48 65 69 67 68 74 29 3b 0a 20 20 72 65 74 75  nHeight);.  retu
5a80: 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65  rn nHeight;.}.#e
5a90: 6c 73 65 20 2f 2a 20 41 42 4f 56 45 3a 20 20 48  lse /* ABOVE:  H
5aa0: 65 69 67 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e  eight enforcemen
5ab0: 74 20 65 6e 61 62 6c 65 64 2e 20 20 42 45 4c 4f  t enabled.  BELO
5ac0: 57 3a 20 48 65 69 67 68 74 20 65 6e 66 6f 72 63  W: Height enforc
5ad0: 65 6d 65 6e 74 20 6f 66 66 20 2a 2f 0a 2f 2a 0a  ement off */./*.
5ae0: 2a 2a 20 50 72 6f 70 61 67 61 74 65 20 61 6c 6c  ** Propagate all
5af0: 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c   EP_Propagate fl
5b00: 61 67 73 20 66 72 6f 6d 20 74 68 65 20 45 78 70  ags from the Exp
5b10: 72 2e 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a  r.x.pList into.*
5b20: 2a 20 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a  * Expr.flags. .*
5b30: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
5b40: 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c  prSetHeightAndFl
5b50: 61 67 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ags(Parse *pPars
5b60: 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  e, Expr *p){.  i
5b70: 66 28 20 70 20 26 26 20 70 2d 3e 78 2e 70 4c 69  f( p && p->x.pLi
5b80: 73 74 20 26 26 20 21 45 78 70 72 48 61 73 50 72  st && !ExprHasPr
5b90: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73  operty(p, EP_xIs
5ba0: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 70  Select) ){.    p
5bb0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72  ->flags |= EP_Pr
5bc0: 6f 70 61 67 61 74 65 20 26 20 73 71 6c 69 74 65  opagate & sqlite
5bd0: 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70  3ExprListFlags(p
5be0: 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a  ->x.pList);.  }.
5bf0: 7d 0a 23 64 65 66 69 6e 65 20 65 78 70 72 53 65  }.#define exprSe
5c00: 74 48 65 69 67 68 74 28 79 29 0a 23 65 6e 64 69  tHeight(y).#endi
5c10: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f  f /* SQLITE_MAX_
5c20: 45 58 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a  EXPR_DEPTH>0 */.
5c30: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
5c40: 69 6e 65 20 69 73 20 74 68 65 20 63 6f 72 65 20  ine is the core 
5c50: 61 6c 6c 6f 63 61 74 6f 72 20 66 6f 72 20 45 78  allocator for Ex
5c60: 70 72 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20  pr nodes..**.** 
5c70: 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  Construct a new 
5c80: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
5c90: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
5ca0: 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d  nter to it.  Mem
5cb0: 6f 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20  ory.** for this 
5cc0: 6e 6f 64 65 20 61 6e 64 20 66 6f 72 20 74 68 65  node and for the
5cd0: 20 70 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74   pToken argument
5ce0: 20 69 73 20 61 20 73 69 6e 67 6c 65 20 61 6c 6c   is a single all
5cf0: 6f 63 61 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69  ocation.** obtai
5d00: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
5d10: 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65  DbMalloc().  The
5d20: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
5d30: 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69  n.** is responsi
5d40: 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73  ble for making s
5d50: 75 72 65 20 74 68 65 20 6e 6f 64 65 20 65 76 65  ure the node eve
5d60: 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65  ntually gets fre
5d70: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 71  ed..**.** If deq
5d80: 75 6f 74 65 20 69 73 20 74 72 75 65 2c 20 74 68  uote is true, th
5d90: 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20 28 69 66  en the token (if
5da0: 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20 64   it exists) is d
5db0: 65 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 64  equoted..** If d
5dc0: 65 71 75 6f 74 65 20 69 73 20 66 61 6c 73 65 2c  equote is false,
5dd0: 20 6e 6f 20 64 65 71 75 6f 74 69 6e 67 20 69 73   no dequoting is
5de0: 20 70 65 72 66 6f 72 6d 65 64 2e 20 20 54 68 65   performed.  The
5df0: 20 64 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61   deQuote.** para
5e00: 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64  meter is ignored
5e10: 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55   if pToken is NU
5e20: 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 74 6f 6b  LL or if the tok
5e30: 65 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61  en does not.** a
5e40: 70 70 65 61 72 20 74 6f 20 62 65 20 71 75 6f 74  ppear to be quot
5e50: 65 64 2e 20 20 49 66 20 74 68 65 20 71 75 6f 74  ed.  If the quot
5e60: 65 73 20 77 65 72 65 20 6f 66 20 74 68 65 20 66  es were of the f
5e70: 6f 72 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c  orm "..." (doubl
5e80: 65 2d 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65  e-quotes).** the
5e90: 6e 20 74 68 65 20 45 50 5f 44 62 6c 51 75 6f 74  n the EP_DblQuot
5ea0: 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f  ed flag is set o
5eb0: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
5ec0: 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65   node..**.** Spe
5ed0: 63 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20 6f  cial case:  If o
5ee0: 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e  p==TK_INTEGER an
5ef0: 64 20 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20  d pToken points 
5f00: 74 6f 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  to a string that
5f10: 0a 2a 2a 20 63 61 6e 20 62 65 20 74 72 61 6e 73  .** can be trans
5f20: 6c 61 74 65 64 20 69 6e 74 6f 20 61 20 33 32 2d  lated into a 32-
5f30: 62 69 74 20 69 6e 74 65 67 65 72 2c 20 74 68 65  bit integer, the
5f40: 6e 20 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e  n the token is n
5f50: 6f 74 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  ot.** stored in 
5f60: 75 2e 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65  u.zToken.  Inste
5f70: 61 64 2c 20 74 68 65 20 69 6e 74 65 67 65 72 20  ad, the integer 
5f80: 76 61 6c 75 65 73 20 69 73 20 77 72 69 74 74 65  values is writte
5f90: 6e 0a 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c  n.** into u.iVal
5fa0: 75 65 20 61 6e 64 20 74 68 65 20 45 50 5f 49 6e  ue and the EP_In
5fb0: 74 56 61 6c 75 65 20 66 6c 61 67 20 69 73 20 73  tValue flag is s
5fc0: 65 74 2e 20 20 4e 6f 20 65 78 74 72 61 20 73 74  et.  No extra st
5fd0: 6f 72 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f  orage.** is allo
5fe0: 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  cated to hold th
5ff0: 65 20 69 6e 74 65 67 65 72 20 74 65 78 74 20 61  e integer text a
6000: 6e 64 20 74 68 65 20 64 65 71 75 6f 74 65 20 66  nd the dequote f
6010: 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a  lag is ignored..
6020: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
6030: 45 78 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c  ExprAlloc(.  sql
6040: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
6050: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
6060: 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  or sqlite3DbMall
6070: 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65  ocZero() (may be
6080: 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20   null) */.  int 
6090: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
60a0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
60b0: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  n opcode */.  co
60c0: 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  nst Token *pToke
60d0: 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61  n,    /* Token a
60e0: 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20  rgument.  Might 
60f0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
6100: 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20   dequote        
6110: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
6120: 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20  dequote */.){.  
6130: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  Expr *pNew;.  in
6140: 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20  t nExtra = 0;.  
6150: 69 6e 74 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a  int iValue = 0;.
6160: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
6170: 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e   );.  if( pToken
6180: 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d   ){.    if( op!=
6190: 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 70 54  TK_INTEGER || pT
61a0: 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20 20 20  oken->z==0.     
61b0: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47       || sqlite3G
61c0: 65 74 49 6e 74 33 32 28 70 54 6f 6b 65 6e 2d 3e  etInt32(pToken->
61d0: 7a 2c 20 26 69 56 61 6c 75 65 29 3d 3d 30 20 29  z, &iValue)==0 )
61e0: 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 3d  {.      nExtra =
61f0: 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a 20 20   pToken->n+1;.  
6200: 20 20 20 20 61 73 73 65 72 74 28 20 69 56 61 6c      assert( iVal
6210: 75 65 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  ue>=0 );.    }. 
6220: 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69   }.  pNew = sqli
6230: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
6240: 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  (db, sizeof(Expr
6250: 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28  )+nExtra);.  if(
6260: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 6d 65 6d   pNew ){.    mem
6270: 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a  set(pNew, 0, siz
6280: 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 20 20  eof(Expr));.    
6290: 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29 6f  pNew->op = (u8)o
62a0: 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41 67  p;.    pNew->iAg
62b0: 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  g = -1;.    if( 
62c0: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20  pToken ){.      
62d0: 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29 7b  if( nExtra==0 ){
62e0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  .        pNew->f
62f0: 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61  lags |= EP_IntVa
6300: 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  lue;.        pNe
6310: 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 56  w->u.iValue = iV
6320: 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  alue;.      }els
6330: 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  e{.        pNew-
6340: 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61  >u.zToken = (cha
6350: 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20  r*)&pNew[1];.   
6360: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f       assert( pTo
6370: 6b 65 6e 2d 3e 7a 21 3d 30 20 7c 7c 20 70 54 6f  ken->z!=0 || pTo
6380: 6b 65 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20  ken->n==0 );.   
6390: 20 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d       if( pToken-
63a0: 3e 6e 20 29 20 6d 65 6d 63 70 79 28 70 4e 65 77  >n ) memcpy(pNew
63b0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54 6f 6b  ->u.zToken, pTok
63c0: 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e  en->z, pToken->n
63d0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
63e0: 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b 65 6e  >u.zToken[pToken
63f0: 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  ->n] = 0;.      
6400: 20 20 69 66 28 20 64 65 71 75 6f 74 65 20 26 26    if( dequote &&
6410: 20 73 71 6c 69 74 65 33 49 73 71 75 6f 74 65 28   sqlite3Isquote(
6420: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  pNew->u.zToken[0
6430: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
6440: 69 66 28 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b  if( pNew->u.zTok
6450: 65 6e 5b 30 5d 3d 3d 27 22 27 20 29 20 70 4e 65  en[0]=='"' ) pNe
6460: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 44  w->flags |= EP_D
6470: 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20 20 20  blQuoted;.      
6480: 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
6490: 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65  te(pNew->u.zToke
64a0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  n);.        }.  
64b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 20      }.    }.#if 
64c0: 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
64d0: 44 45 50 54 48 3e 30 0a 20 20 20 20 70 4e 65 77  DEPTH>0.    pNew
64e0: 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b 0a 23  ->nHeight = 1;.#
64f0: 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20 72 65  endif  .  }.  re
6500: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
6510: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
6520: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ew expression no
6530: 64 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 74  de from a zero-t
6540: 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65 6e 20  erminated token 
6550: 74 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c 72 65  that has.** alre
6560: 61 64 79 20 62 65 65 6e 20 64 65 71 75 6f 74 65  ady been dequote
6570: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
6580: 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c 69 74  te3Expr(.  sqlit
6590: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
65a0: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
65b0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
65c0: 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e  Zero() (may be n
65d0: 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  ull) */.  int op
65e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
65f0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
6600: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  opcode */.  cons
6610: 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 20  t char *zToken  
6620: 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67      /* Token arg
6630: 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65  ument.  Might be
6640: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 6f   NULL */.){.  To
6650: 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d 20 7a  ken x;.  x.z = z
6660: 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d 20 7a  Token;.  x.n = z
6670: 54 6f 6b 65 6e 20 3f 20 73 71 6c 69 74 65 33 53  Token ? sqlite3S
6680: 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e 29 20  trlen30(zToken) 
6690: 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  : 0;.  return sq
66a0: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
66b0: 62 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b 0a 7d  b, op, &x, 0);.}
66c0: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20 73  ../*.** Attach s
66d0: 75 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e  ubtrees pLeft an
66e0: 64 20 70 52 69 67 68 74 20 74 6f 20 74 68 65 20  d pRight to the 
66f0: 45 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f 74 2e  Expr node pRoot.
6700: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f 74 3d  .**.** If pRoot=
6710: 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
6720: 20 74 68 61 74 20 61 20 6d 65 6d 6f 72 79 20 61   that a memory a
6730: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
6740: 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a  has occurred..**
6750: 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64   In that case, d
6760: 65 6c 65 74 65 20 74 68 65 20 73 75 62 74 72 65  elete the subtre
6770: 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69  es pLeft and pRi
6780: 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ght..*/.void sql
6790: 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53 75  ite3ExprAttachSu
67a0: 62 74 72 65 65 73 28 0a 20 20 73 71 6c 69 74 65  btrees(.  sqlite
67b0: 33 20 2a 64 62 2c 0a 20 20 45 78 70 72 20 2a 70  3 *db,.  Expr *p
67c0: 52 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a 70 4c  Root,.  Expr *pL
67d0: 65 66 74 2c 0a 20 20 45 78 70 72 20 2a 70 52 69  eft,.  Expr *pRi
67e0: 67 68 74 0a 29 7b 0a 20 20 69 66 28 20 70 52 6f  ght.){.  if( pRo
67f0: 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ot==0 ){.    ass
6800: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
6810: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c  ailed );.    sql
6820: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
6830: 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  b, pLeft);.    s
6840: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
6850: 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  (db, pRight);.  
6860: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
6870: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70  Right ){.      p
6880: 52 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d 20 70  Root->pRight = p
6890: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70 52 6f  Right;.      pRo
68a0: 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ot->flags |= EP_
68b0: 50 72 6f 70 61 67 61 74 65 20 26 20 70 52 69 67  Propagate & pRig
68c0: 68 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d  ht->flags;.    }
68d0: 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 20 29  .    if( pLeft )
68e0: 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70  {.      pRoot->p
68f0: 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20  Left = pLeft;.  
6900: 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73      pRoot->flags
6910: 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65   |= EP_Propagate
6920: 20 26 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 3b   & pLeft->flags;
6930: 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 70 72 53  .    }.    exprS
6940: 65 74 48 65 69 67 68 74 28 70 52 6f 6f 74 29 3b  etHeight(pRoot);
6950: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
6960: 6c 6f 63 61 74 65 20 61 6e 20 45 78 70 72 20 6e  locate an Expr n
6970: 6f 64 65 20 77 68 69 63 68 20 6a 6f 69 6e 73 20  ode which joins 
6980: 61 73 20 6d 61 6e 79 20 61 73 20 74 77 6f 20 73  as many as two s
6990: 75 62 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f  ubtrees..**.** O
69a0: 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68  ne or both of th
69b0: 65 20 73 75 62 74 72 65 65 73 20 63 61 6e 20 62  e subtrees can b
69c0: 65 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 20  e NULL.  Return 
69d0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
69e0: 20 6e 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f 64   new.** Expr nod
69f0: 65 2e 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f  e.  Or, if an OO
6a00: 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  M error occurs, 
6a10: 73 65 74 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  set pParse->db->
6a20: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a  mallocFailed,.**
6a30: 20 66 72 65 65 20 74 68 65 20 73 75 62 74 72 65   free the subtre
6a40: 65 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  es and return NU
6a50: 4c 4c 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  LL..*/.Expr *sql
6a60: 69 74 65 33 50 45 78 70 72 28 0a 20 20 50 61 72  ite3PExpr(.  Par
6a70: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
6a80: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
6a90: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
6aa0: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
6ab0: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
6ac0: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45  on opcode */.  E
6ad0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  xpr *pLeft,     
6ae0: 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f         /* Left o
6af0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72  perand */.  Expr
6b00: 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 20 20   *pRight,       
6b10: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65      /* Right ope
6b20: 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rand */.  const 
6b30: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20 20  Token *pToken   
6b40: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
6b50: 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ken */.){.  Expr
6b60: 20 2a 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54   *p;.  if( op==T
6b70: 4b 5f 41 4e 44 20 26 26 20 70 50 61 72 73 65 2d  K_AND && pParse-
6b80: 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
6b90: 2f 2a 20 54 61 6b 65 20 61 64 76 61 6e 74 61 67  /* Take advantag
6ba0: 65 20 6f 66 20 73 68 6f 72 74 2d 63 69 72 63 75  e of short-circu
6bb0: 69 74 20 66 61 6c 73 65 20 6f 70 74 69 6d 69 7a  it false optimiz
6bc0: 61 74 69 6f 6e 20 66 6f 72 20 41 4e 44 20 2a 2f  ation for AND */
6bd0: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
6be0: 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e  ExprAnd(pParse->
6bf0: 64 62 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  db, pLeft, pRigh
6c00: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
6c10: 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   p = sqlite3Expr
6c20: 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
6c30: 2c 20 6f 70 20 26 20 54 4b 46 4c 47 5f 4d 41 53  , op & TKFLG_MAS
6c40: 4b 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20  K, pToken, 1);. 
6c50: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74     sqlite3ExprAt
6c60: 74 61 63 68 53 75 62 74 72 65 65 73 28 70 50 61  tachSubtrees(pPa
6c70: 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66  rse->db, p, pLef
6c80: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a  t, pRight);.  }.
6c90: 20 20 69 66 28 20 70 20 29 20 7b 0a 20 20 20 20    if( p ) {.    
6ca0: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
6cb0: 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70  Height(pParse, p
6cc0: 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a  ->nHeight);.  }.
6cd0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
6ce0: 2a 0a 2a 2a 20 41 64 64 20 70 53 65 6c 65 63 74  *.** Add pSelect
6cf0: 20 74 6f 20 74 68 65 20 45 78 70 72 2e 78 2e 70   to the Expr.x.p
6d00: 53 65 6c 65 63 74 20 66 69 65 6c 64 2e 20 20 4f  Select field.  O
6d10: 72 2c 20 69 66 20 70 45 78 70 72 20 69 73 20 4e  r, if pExpr is N
6d20: 55 4c 4c 20 28 64 75 65 0a 2a 2a 20 64 6f 20 61  ULL (due.** do a
6d30: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
6d40: 6f 6e 20 66 61 69 6c 75 72 65 29 20 74 68 65 6e  on failure) then
6d50: 20 64 65 6c 65 74 65 20 74 68 65 20 70 53 65 6c   delete the pSel
6d60: 65 63 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76  ect object..*/.v
6d70: 6f 69 64 20 73 71 6c 69 74 65 33 50 45 78 70 72  oid sqlite3PExpr
6d80: 41 64 64 53 65 6c 65 63 74 28 50 61 72 73 65 20  AddSelect(Parse 
6d90: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
6da0: 45 78 70 72 2c 20 53 65 6c 65 63 74 20 2a 70 53  Expr, Select *pS
6db0: 65 6c 65 63 74 29 7b 0a 20 20 69 66 28 20 70 45  elect){.  if( pE
6dc0: 78 70 72 20 29 7b 0a 20 20 20 20 70 45 78 70 72  xpr ){.    pExpr
6dd0: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 70 53  ->x.pSelect = pS
6de0: 65 6c 65 63 74 3b 0a 20 20 20 20 45 78 70 72 53  elect;.    ExprS
6df0: 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
6e00: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 7c 45  , EP_xIsSelect|E
6e10: 50 5f 53 75 62 71 75 65 72 79 29 3b 0a 20 20 20  P_Subquery);.   
6e20: 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48   sqlite3ExprSetH
6e30: 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28 70 50  eightAndFlags(pP
6e40: 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
6e50: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
6e60: 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  t( pParse->db->m
6e70: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
6e80: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
6e90: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
6ea0: 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d  b, pSelect);.  }
6eb0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .}.../*.** If th
6ec0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
6ed0: 61 6c 77 61 79 73 20 65 69 74 68 65 72 20 54 52  always either TR
6ee0: 55 45 20 6f 72 20 46 41 4c 53 45 20 28 72 65 73  UE or FALSE (res
6ef0: 70 65 63 74 69 76 65 6c 79 29 2c 0a 2a 2a 20 74  pectively),.** t
6f00: 68 65 6e 20 72 65 74 75 72 6e 20 31 2e 20 20 49  hen return 1.  I
6f10: 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 64 65 74  f one cannot det
6f20: 65 72 6d 69 6e 65 20 74 68 65 20 74 72 75 74 68  ermine the truth
6f30: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a   value of the.**
6f40: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74 20 63   expression at c
6f50: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 72 65 74 75  ompile-time retu
6f60: 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rn 0..**.** This
6f70: 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
6f80: 69 6f 6e 2e 20 20 49 66 20 69 73 20 4f 4b 20 74  ion.  If is OK t
6f90: 6f 20 72 65 74 75 72 6e 20 30 20 68 65 72 65 20  o return 0 here 
6fa0: 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20 65  even if.** the e
6fb0: 78 70 72 65 73 73 69 6f 6e 20 72 65 61 6c 6c 79  xpression really
6fc0: 20 69 73 20 61 6c 77 61 79 73 20 66 61 6c 73 65   is always false
6fd0: 20 6f 72 20 66 61 6c 73 65 20 28 61 20 66 61 6c   or false (a fal
6fe0: 73 65 20 6e 65 67 61 74 69 76 65 29 2e 0a 2a 2a  se negative)..**
6ff0: 20 42 75 74 20 69 74 20 69 73 20 61 20 62 75 67   But it is a bug
7000: 20 74 6f 20 72 65 74 75 72 6e 20 31 20 69 66 20   to return 1 if 
7010: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  the expression m
7020: 69 67 68 74 20 68 61 76 65 20 64 69 66 66 65 72  ight have differ
7030: 65 6e 74 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20 76  ent.** boolean v
7040: 61 6c 75 65 73 20 69 6e 20 64 69 66 66 65 72 65  alues in differe
7050: 6e 74 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  nt circumstances
7060: 20 28 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69   (a false positi
7070: 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ve.).**.** Note 
7080: 74 68 61 74 20 69 66 20 74 68 65 20 65 78 70 72  that if the expr
7090: 65 73 73 69 6f 6e 20 69 73 20 70 61 72 74 20 6f  ession is part o
70a0: 66 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 66 6f  f conditional fo
70b0: 72 20 61 0a 2a 2a 20 4c 45 46 54 20 4a 4f 49 4e  r a.** LEFT JOIN
70c0: 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74  , then we cannot
70d0: 20 64 65 74 65 72 6d 69 6e 65 20 61 74 20 63 6f   determine at co
70e0: 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68  mpile-time wheth
70f0: 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 69 73 20  er or not.** is 
7100: 69 74 20 74 72 75 65 20 6f 72 20 66 61 6c 73 65  it true or false
7110: 2c 20 73 6f 20 61 6c 77 61 79 73 20 72 65 74 75  , so always retu
7120: 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rn 0..*/.static 
7130: 69 6e 74 20 65 78 70 72 41 6c 77 61 79 73 54 72  int exprAlwaysTr
7140: 75 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  ue(Expr *p){.  i
7150: 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20  nt v = 0;.  if( 
7160: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
7170: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  p, EP_FromJoin) 
7180: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
7190: 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73  ( !sqlite3ExprIs
71a0: 49 6e 74 65 67 65 72 28 70 2c 20 26 76 29 20 29  Integer(p, &v) )
71b0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
71c0: 75 72 6e 20 76 21 3d 30 3b 0a 7d 0a 73 74 61 74  urn v!=0;.}.stat
71d0: 69 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61 79  ic int exprAlway
71e0: 73 46 61 6c 73 65 28 45 78 70 72 20 2a 70 29 7b  sFalse(Expr *p){
71f0: 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20  .  int v = 0;.  
7200: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
7210: 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rty(p, EP_FromJo
7220: 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  in) ) return 0;.
7230: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
7240: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26  prIsInteger(p, &
7250: 76 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  v) ) return 0;. 
7260: 20 72 65 74 75 72 6e 20 76 3d 3d 30 3b 0a 7d 0a   return v==0;.}.
7270: 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f 20  ./*.** Join two 
7280: 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73 69 6e  expressions usin
7290: 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  g an AND operato
72a0: 72 2e 20 20 49 66 20 65 69 74 68 65 72 20 65 78  r.  If either ex
72b0: 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 4e  pression is.** N
72c0: 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20 72  ULL, then just r
72d0: 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65 72 20  eturn the other 
72e0: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
72f0: 2a 20 49 66 20 6f 6e 65 20 73 69 64 65 20 6f 72  * If one side or
7300: 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
7310: 65 20 41 4e 44 20 69 73 20 6b 6e 6f 77 6e 20 74  e AND is known t
7320: 6f 20 62 65 20 66 61 6c 73 65 2c 20 74 68 65 6e  o be false, then
7330: 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 72   instead.** of r
7340: 65 74 75 72 6e 69 6e 67 20 61 6e 20 41 4e 44 20  eturning an AND 
7350: 65 78 70 72 65 73 73 69 6f 6e 2c 20 6a 75 73 74  expression, just
7360: 20 72 65 74 75 72 6e 20 61 20 63 6f 6e 73 74 61   return a consta
7370: 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  nt expression wi
7380: 74 68 0a 2a 2a 20 61 20 76 61 6c 75 65 20 6f 66  th.** a value of
7390: 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45 78 70 72 20   false..*/.Expr 
73a0: 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28  *sqlite3ExprAnd(
73b0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
73c0: 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20 2a  r *pLeft, Expr *
73d0: 70 52 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70  pRight){.  if( p
73e0: 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Left==0 ){.    r
73f0: 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a 20 20  eturn pRight;.  
7400: 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68 74  }else if( pRight
7410: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
7420: 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73 65  n pLeft;.  }else
7430: 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 46   if( exprAlwaysF
7440: 61 6c 73 65 28 70 4c 65 66 74 29 20 7c 7c 20 65  alse(pLeft) || e
7450: 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
7460: 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71  Right) ){.    sq
7470: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
7480: 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20  db, pLeft);.    
7490: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
74a0: 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20  e(db, pRight);. 
74b0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
74c0: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
74d0: 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c 69  K_INTEGER, &sqli
74e0: 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30 5d 2c  te3IntTokens[0],
74f0: 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
7500: 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73    Expr *pNew = s
7510: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
7520: 64 62 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20 30  db, TK_AND, 0, 0
7530: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
7540: 70 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73  prAttachSubtrees
7550: 28 64 62 2c 20 70 4e 65 77 2c 20 70 4c 65 66 74  (db, pNew, pLeft
7560: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72  , pRight);.    r
7570: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 20 20 7d 0a  eturn pNew;.  }.
7580: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75  }../*.** Constru
7590: 63 74 20 61 20 6e 65 77 20 65 78 70 72 65 73 73  ct a new express
75a0: 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20 66  ion node for a f
75b0: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c  unction with mul
75c0: 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  tiple.** argumen
75d0: 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ts..*/.Expr *sql
75e0: 69 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f 6e  ite3ExprFunction
75f0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
7600: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
7610: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
7620: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
7630: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
7640: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73  Parse->db;.  ass
7650: 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20  ert( pToken );. 
7660: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
7670: 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f  xprAlloc(db, TK_
7680: 46 55 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b 65 6e  FUNCTION, pToken
7690: 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  , 1);.  if( pNew
76a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
76b0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
76c0: 28 64 62 2c 20 70 4c 69 73 74 29 3b 20 2f 2a 20  (db, pList); /* 
76d0: 41 76 6f 69 64 20 6d 65 6d 6f 72 79 20 6c 65 61  Avoid memory lea
76e0: 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61  k when malloc fa
76f0: 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ils */.    retur
7700: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  n 0;.  }.  pNew-
7710: 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74  >x.pList = pList
7720: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  ;.  assert( !Exp
7730: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
7740: 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  w, EP_xIsSelect)
7750: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
7760: 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61  rSetHeightAndFla
7770: 67 73 28 70 50 61 72 73 65 2c 20 70 4e 65 77 29  gs(pParse, pNew)
7780: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
7790: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
77a0: 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62   a variable numb
77b0: 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73  er to an express
77c0: 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64 65 73  ion that encodes
77d0: 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69   a wildcard.** i
77e0: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
77f0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a  QL statement.  .
7800: 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20  **.** Wildcards 
7810: 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20  consisting of a 
7820: 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65 20 61  single "?" are a
7830: 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65 78 74  ssigned the next
7840: 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 76   sequential.** v
7850: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e 0a  ariable number..
7860: 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20  **.** Wildcards 
7870: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e  of the form "?nn
7880: 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  n" are assigned 
7890: 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e 22  the number "nnn"
78a0: 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73 75  .  We make.** su
78b0: 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74 20  re "nnn" is not 
78c0: 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69 64 20  too be to avoid 
78d0: 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65 72 76  a denial of serv
78e0: 69 63 65 20 61 74 74 61 63 6b 20 77 68 65 6e 0a  ice attack when.
78f0: 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  ** the SQL state
7900: 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20  ment comes from 
7910: 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f 75 72  an external sour
7920: 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  ce..**.** Wildca
7930: 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rds of the form 
7940: 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22 2c 20  ":aaa", "@aaa", 
7950: 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61 73  or "$aaa" are as
7960: 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65 20  signed the same 
7970: 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68 65  number.** as the
7980: 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61 6e   previous instan
7990: 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 77  ce of the same w
79a0: 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66 20  ildcard.  Or if 
79b0: 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
79c0: 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66  t.** instance of
79d0: 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20 74   the wildcard, t
79e0: 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69  he next sequenti
79f0: 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  al variable numb
7a00: 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65  er is.** assigne
7a10: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
7a20: 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e  e3ExprAssignVarN
7a30: 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50 61  umber(Parse *pPa
7a40: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
7a50: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
7a60: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
7a70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
7a80: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
7a90: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
7aa0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
7ab0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
7ac0: 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65 64 75 63  ntValue|EP_Reduc
7ad0: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  ed|EP_TokenOnly)
7ae0: 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78 70 72 2d   );.  z = pExpr-
7af0: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 61 73 73  >u.zToken;.  ass
7b00: 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 61  ert( z!=0 );.  a
7b10: 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d 30 20 29  ssert( z[0]!=0 )
7b20: 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 30 20  ;.  if( z[1]==0 
7b30: 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  ){.    /* Wildca
7b40: 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rd of the form "
7b50: 3f 22 2e 20 20 41 73 73 69 67 6e 20 74 68 65 20  ?".  Assign the 
7b60: 6e 65 78 74 20 76 61 72 69 61 62 6c 65 20 6e 75  next variable nu
7b70: 6d 62 65 72 20 2a 2f 0a 20 20 20 20 61 73 73 65  mber */.    asse
7b80: 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b  rt( z[0]=='?' );
7b90: 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c  .    pExpr->iCol
7ba0: 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b  umn = (ynVar)(++
7bb0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20  pParse->nVar);. 
7bc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 79 6e 56 61   }else{.    ynVa
7bd0: 72 20 78 20 3d 20 30 3b 0a 20 20 20 20 75 33 32  r x = 0;.    u32
7be0: 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
7bf0: 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69 66 28  en30(z);.    if(
7c00: 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20   z[0]=='?' ){.  
7c10: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20      /* Wildcard 
7c20: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e  of the form "?nn
7c30: 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e  n".  Convert "nn
7c40: 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  n" to an integer
7c50: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75 73   and.      ** us
7c60: 65 20 69 74 20 61 73 20 74 68 65 20 76 61 72 69  e it as the vari
7c70: 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  able number */. 
7c80: 20 20 20 20 20 69 36 34 20 69 3b 0a 20 20 20 20       i64 i;.    
7c90: 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3d 3d 73    int bOk = 0==s
7ca0: 71 6c 69 74 65 33 41 74 6f 69 36 34 28 26 7a 5b  qlite3Atoi64(&z[
7cb0: 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53 51 4c  1], &i, n-1, SQL
7cc0: 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20  ITE_UTF8);.     
7cd0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
7ce0: 3d 20 78 20 3d 20 28 79 6e 56 61 72 29 69 3b 0a  = x = (ynVar)i;.
7cf0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
7d00: 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  i==0 );.      te
7d10: 73 74 63 61 73 65 28 20 69 3d 3d 31 20 29 3b 0a  stcase( i==1 );.
7d20: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
7d30: 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  i==db->aLimit[SQ
7d40: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
7d50: 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20 29 3b  BLE_NUMBER]-1 );
7d60: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
7d70: 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53   i==db->aLimit[S
7d80: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
7d90: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 3b 0a  ABLE_NUMBER] );.
7da0: 20 20 20 20 20 20 69 66 28 20 62 4f 6b 3d 3d 30        if( bOk==0
7db0: 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e 64 62 2d   || i<1 || i>db-
7dc0: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
7dd0: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
7de0: 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 20 20 20  MBER] ){.       
7df0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7e00: 28 70 50 61 72 73 65 2c 20 22 76 61 72 69 61 62  (pParse, "variab
7e10: 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 62  le number must b
7e20: 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e 64  e between ?1 and
7e30: 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20   ?%d",.         
7e40: 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51     db->aLimit[SQ
7e50: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
7e60: 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20 20  BLE_NUMBER]);.  
7e70: 20 20 20 20 20 20 78 20 3d 20 30 3b 0a 20 20 20        x = 0;.   
7e80: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
7e90: 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b  >pParse->nVar ){
7ea0: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
7eb0: 3e 6e 56 61 72 20 3d 20 28 69 6e 74 29 69 3b 0a  >nVar = (int)i;.
7ec0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
7ed0: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64  e{.      /* Wild
7ee0: 63 61 72 64 73 20 6c 69 6b 65 20 22 3a 61 61 61  cards like ":aaa
7ef0: 22 2c 20 22 24 61 61 61 22 20 6f 72 20 22 40 61  ", "$aaa" or "@a
7f00: 61 61 22 2e 20 20 52 65 75 73 65 20 74 68 65 20  aa".  Reuse the 
7f10: 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20  same variable.  
7f20: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73      ** number as
7f30: 20 74 68 65 20 70 72 69 6f 72 20 61 70 70 65 61   the prior appea
7f40: 72 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d  rance of the sam
7f50: 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68  e name, or if th
7f60: 65 20 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20  e name.      ** 
7f70: 68 61 73 20 6e 65 76 65 72 20 61 70 70 65 61 72  has never appear
7f80: 65 64 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65  ed before, reuse
7f90: 20 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62   the same variab
7fa0: 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20  le number.      
7fb0: 2a 2f 0a 20 20 20 20 20 20 79 6e 56 61 72 20 69  */.      ynVar i
7fc0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
7fd0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72   i<pParse->nzVar
7fe0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
7ff0: 69 66 28 20 70 50 61 72 73 65 2d 3e 61 7a 56 61  if( pParse->azVa
8000: 72 5b 69 5d 20 26 26 20 73 74 72 63 6d 70 28 70  r[i] && strcmp(p
8010: 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 69 5d 2c  Parse->azVar[i],
8020: 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  z)==0 ){.       
8030: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
8040: 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72 29 69  n = x = (ynVar)i
8050: 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  +1;.          br
8060: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
8070: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
8080: 20 78 3d 3d 30 20 29 20 78 20 3d 20 70 45 78 70   x==0 ) x = pExp
8090: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e  r->iColumn = (yn
80a0: 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e  Var)(++pParse->n
80b0: 56 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Var);.    }.    
80c0: 69 66 28 20 78 3e 30 20 29 7b 0a 20 20 20 20 20  if( x>0 ){.     
80d0: 20 69 66 28 20 78 3e 70 50 61 72 73 65 2d 3e 6e   if( x>pParse->n
80e0: 7a 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20  zVar ){.        
80f0: 63 68 61 72 20 2a 2a 61 3b 0a 20 20 20 20 20 20  char **a;.      
8100: 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62 52    a = sqlite3DbR
8110: 65 61 6c 6c 6f 63 28 64 62 2c 20 70 50 61 72 73  ealloc(db, pPars
8120: 65 2d 3e 61 7a 56 61 72 2c 20 78 2a 73 69 7a 65  e->azVar, x*size
8130: 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20  of(a[0]));.     
8140: 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20     if( a==0 ){. 
8150: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
8160: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
8170: 64 20 29 3b 20 2f 2a 20 45 72 72 6f 72 20 72 65  d ); /* Error re
8180: 70 6f 72 74 65 64 20 74 68 72 6f 75 67 68 20 6d  ported through m
8190: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 2a 2f 0a 20  allocFailed */. 
81a0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b           return;
81b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
81c0: 20 20 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72     pParse->azVar
81d0: 20 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 6d 65   = a;.        me
81e0: 6d 73 65 74 28 26 61 5b 70 50 61 72 73 65 2d 3e  mset(&a[pParse->
81f0: 6e 7a 56 61 72 5d 2c 20 30 2c 20 28 78 2d 70 50  nzVar], 0, (x-pP
8200: 61 72 73 65 2d 3e 6e 7a 56 61 72 29 2a 73 69 7a  arse->nzVar)*siz
8210: 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20 20  eof(a[0]));.    
8220: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61      pParse->nzVa
8230: 72 20 3d 20 78 3b 0a 20 20 20 20 20 20 7d 0a 20  r = x;.      }. 
8240: 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27       if( z[0]!='
8250: 3f 27 20 7c 7c 20 70 50 61 72 73 65 2d 3e 61 7a  ?' || pParse->az
8260: 56 61 72 5b 78 2d 31 5d 3d 3d 30 20 29 7b 0a 20  Var[x-1]==0 ){. 
8270: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
8280: 46 72 65 65 28 64 62 2c 20 70 50 61 72 73 65 2d  Free(db, pParse-
8290: 3e 61 7a 56 61 72 5b 78 2d 31 5d 29 3b 0a 20 20  >azVar[x-1]);.  
82a0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 7a        pParse->az
82b0: 56 61 72 5b 78 2d 31 5d 20 3d 20 73 71 6c 69 74  Var[x-1] = sqlit
82c0: 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
82d0: 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  z, n);.      }. 
82e0: 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66 28 20     }.  } .  if( 
82f0: 21 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 26 26  !pParse->nErr &&
8300: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 64 62   pParse->nVar>db
8310: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
8320: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
8330: 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 73 71  UMBER] ){.    sq
8340: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8350: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
8360: 53 51 4c 20 76 61 72 69 61 62 6c 65 73 22 29 3b  SQL variables");
8370: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
8380: 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65  cursively delete
8390: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
83a0: 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  ree..*/.static S
83b0: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
83c0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 44  oid sqlite3ExprD
83d0: 65 6c 65 74 65 4e 4e 28 73 71 6c 69 74 65 33 20  eleteNN(sqlite3 
83e0: 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20  *db, Expr *p){. 
83f0: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
8400: 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
8410: 63 6b 3a 20 41 73 73 65 72 74 20 74 68 61 74 20  ck: Assert that 
8420: 74 68 65 20 49 6e 74 56 61 6c 75 65 20 69 73 20  the IntValue is 
8430: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 66 20  non-negative if 
8440: 69 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 61  it exists */.  a
8450: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
8460: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e  roperty(p, EP_In
8470: 74 56 61 6c 75 65 29 20 7c 7c 20 70 2d 3e 75 2e  tValue) || p->u.
8480: 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 69  iValue>=0 );.  i
8490: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
84a0: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
84b0: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  nly) ){.    /* T
84c0: 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20  he Expr.x union 
84d0: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61 74  is never used at
84e0: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
84f0: 73 20 45 78 70 72 2e 70 52 69 67 68 74 20 2a 2f  s Expr.pRight */
8500: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
8510: 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d  x.pList==0 || p-
8520: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
8530: 20 20 69 66 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f    if( p->op!=TK_
8540: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 20  SELECT_COLUMN ) 
8550: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
8560: 65 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b  e(db, p->pLeft);
8570: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
8580: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 52  Delete(db, p->pR
8590: 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20 45  ight);.    if( E
85a0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
85b0: 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29  , EP_MemToken) )
85c0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
85d0: 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  b, p->u.zToken);
85e0: 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
85f0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
8600: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
8610: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
8620: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e  Delete(db, p->x.
8630: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65  pSelect);.    }e
8640: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
8650: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
8660: 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29  (db, p->x.pList)
8670: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
8680: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
8690: 74 79 28 70 2c 20 45 50 5f 53 74 61 74 69 63 29  ty(p, EP_Static)
86a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
86b0: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
86c0: 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
86d0: 45 78 70 72 44 65 6c 65 74 65 28 73 71 6c 69 74  ExprDelete(sqlit
86e0: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29  e3 *db, Expr *p)
86f0: 7b 0a 20 20 69 66 28 20 70 20 29 20 73 71 6c 69  {.  if( p ) sqli
8700: 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28  te3ExprDeleteNN(
8710: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
8720: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
8730: 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f  er of bytes allo
8740: 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 65 78  cated for the ex
8750: 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63 74 75  pression structu
8760: 72 65 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73  re .** passed as
8770: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
8780: 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61 6c 77  ent. This is alw
8790: 61 79 73 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f  ays one of EXPR_
87a0: 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50  FULLSIZE,.** EXP
87b0: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72  R_REDUCEDSIZE or
87c0: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
87d0: 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  IZE..*/.static i
87e0: 6e 74 20 65 78 70 72 53 74 72 75 63 74 53 69 7a  nt exprStructSiz
87f0: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  e(Expr *p){.  if
8800: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
8810: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
8820: 79 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52  y) ) return EXPR
8830: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a  _TOKENONLYSIZE;.
8840: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
8850: 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75  perty(p, EP_Redu
8860: 63 65 64 29 20 29 20 72 65 74 75 72 6e 20 45 58  ced) ) return EX
8870: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 3b 0a  PR_REDUCEDSIZE;.
8880: 20 20 72 65 74 75 72 6e 20 45 58 50 52 5f 46 55    return EXPR_FU
8890: 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  LLSIZE;.}../*.**
88a0: 20 54 68 65 20 64 75 70 65 64 45 78 70 72 2a 53   The dupedExpr*S
88b0: 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 73 20 65  ize() routines e
88c0: 61 63 68 20 72 65 74 75 72 6e 20 74 68 65 20 6e  ach return the n
88d0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
88e0: 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 73 74  equired.** to st
88f0: 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20 61 6e  ore a copy of an
8900: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 20 65   expression or e
8910: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
8920: 20 54 68 65 79 20 64 69 66 66 65 72 20 69 6e 0a   They differ in.
8930: 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66 20 74  ** how much of t
8940: 68 65 20 74 72 65 65 20 69 73 20 6d 65 61 73 75  he tree is measu
8950: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64  red..**.**     d
8960: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
8970: 7a 65 28 29 20 20 20 20 20 53 69 7a 65 20 6f 66  ze()     Size of
8980: 20 6f 6e 6c 79 20 74 68 65 20 45 78 70 72 20 73   only the Expr s
8990: 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 20 20 20  tructure .**    
89a0: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
89b0: 7a 65 28 29 20 20 20 20 20 20 20 53 69 7a 65 20  ze()       Size 
89c0: 6f 66 20 45 78 70 72 20 2b 20 73 70 61 63 65 20  of Expr + space 
89d0: 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20  for token.**    
89e0: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 29   dupedExprSize()
89f0: 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
8a00: 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74 72 65  + token + subtre
8a10: 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a  e components.**.
8a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
8a70: 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72 53  * The dupedExprS
8a80: 74 72 75 63 74 53 69 7a 65 28 29 20 66 75 6e 63  tructSize() func
8a90: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 77 6f  tion returns two
8aa0: 20 76 61 6c 75 65 73 20 4f 52 2d 65 64 20 74 6f   values OR-ed to
8ab0: 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28 31 29  gether:  .** (1)
8ac0: 20 74 68 65 20 73 70 61 63 65 20 72 65 71 75 69   the space requi
8ad0: 72 65 64 20 66 6f 72 20 61 20 63 6f 70 79 20 6f  red for a copy o
8ae0: 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63  f the Expr struc
8af0: 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a  ture only and .*
8b00: 2a 20 28 32 29 20 74 68 65 20 45 50 5f 78 78 78  * (2) the EP_xxx
8b10: 20 66 6c 61 67 73 20 74 68 61 74 20 69 6e 64 69   flags that indi
8b20: 63 61 74 65 20 77 68 61 74 20 74 68 65 20 73 74  cate what the st
8b30: 72 75 63 74 75 72 65 20 73 69 7a 65 20 73 68 6f  ructure size sho
8b40: 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65 20 72  uld be..** The r
8b50: 65 74 75 72 6e 20 76 61 6c 75 65 73 20 69 73 20  eturn values is 
8b60: 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a  always one of:.*
8b70: 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 46  *.**      EXPR_F
8b80: 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20 20 20  ULLSIZE.**      
8b90: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
8ba0: 20 20 20 7c 20 45 50 5f 52 65 64 75 63 65 64 0a     | EP_Reduced.
8bb0: 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 54 4f 4b  **      EXPR_TOK
8bc0: 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f  ENONLYSIZE | EP_
8bd0: 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20  TokenOnly.**.** 
8be0: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
8bf0: 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65  structure can be
8c00: 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e   found by maskin
8c10: 67 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  g the return val
8c20: 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f  ue.** of this ro
8c30: 75 74 69 6e 65 20 77 69 74 68 20 30 78 66 66 66  utine with 0xfff
8c40: 2e 20 20 54 68 65 20 66 6c 61 67 73 20 63 61 6e  .  The flags can
8c50: 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73   be found by mas
8c60: 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65 74 75  king the.** retu
8c70: 72 6e 20 76 61 6c 75 65 20 77 69 74 68 20 45 50  rn value with EP
8c80: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
8c90: 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  nOnly..**.** Not
8ca0: 65 20 74 68 61 74 20 77 69 74 68 20 66 6c 61 67  e that with flag
8cb0: 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43  s==EXPRDUP_REDUC
8cc0: 45 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 73  E, this routines
8cd0: 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73   works on full-s
8ce0: 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75 63 65  ize.** (unreduce
8cf0: 64 29 20 45 78 70 72 20 6f 62 6a 65 63 74 73 20  d) Expr objects 
8d00: 61 73 20 74 68 65 79 20 6f 72 20 6f 72 69 67 69  as they or origi
8d10: 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63 74 65  nally constructe
8d20: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e  d by the parser.
8d30: 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78 70 72 65  .** During expre
8d40: 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 2c 20  ssion analysis, 
8d50: 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f  extra informatio
8d60: 6e 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e  n is computed an
8d70: 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a 20  d moved into.** 
8d80: 6c 61 74 65 72 20 70 61 72 74 73 20 6f 66 20 74  later parts of t
8d90: 65 68 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61  eh Expr object a
8da0: 6e 64 20 74 68 61 74 20 65 78 74 72 61 20 69 6e  nd that extra in
8db0: 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68 74 20  formation might 
8dc0: 67 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a 20 6f  get chopped.** o
8dd0: 66 66 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ff if the expres
8de0: 73 69 6f 6e 20 69 73 20 72 65 64 75 63 65 64 2e  sion is reduced.
8df0: 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74    Note also that
8e00: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72   it does not wor
8e10: 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61 6e 20  k to.** make an 
8e20: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 63  EXPRDUP_REDUCE c
8e30: 6f 70 79 20 6f 66 20 61 20 72 65 64 75 63 65 64  opy of a reduced
8e40: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 74   expression.  It
8e50: 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a   is only legal.*
8e60: 2a 20 74 6f 20 72 65 64 75 63 65 20 61 20 70 72  * to reduce a pr
8e70: 69 73 74 69 6e 65 20 65 78 70 72 65 73 73 69 6f  istine expressio
8e80: 6e 20 74 72 65 65 20 66 72 6f 6d 20 74 68 65 20  n tree from the 
8e90: 70 61 72 73 65 72 2e 20 20 54 68 65 20 69 6d 70  parser.  The imp
8ea0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f  lementation.** o
8eb0: 66 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63  f dupedExprStruc
8ec0: 74 53 69 7a 65 28 29 20 63 6f 6e 74 61 69 6e 20  tSize() contain 
8ed0: 6d 75 6c 74 69 70 6c 65 20 61 73 73 65 72 74 28  multiple assert(
8ee0: 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  ) statements tha
8ef0: 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20  t attempt.** to 
8f00: 65 6e 66 6f 72 63 65 20 74 68 69 73 20 63 6f 6e  enforce this con
8f10: 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74  straint..*/.stat
8f20: 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72  ic int dupedExpr
8f30: 53 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20  StructSize(Expr 
8f40: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
8f50: 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20 20 61    int nSize;.  a
8f60: 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 45 58  ssert( flags==EX
8f70: 50 52 44 55 50 5f 52 45 44 55 43 45 20 7c 7c 20  PRDUP_REDUCE || 
8f80: 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f  flags==0 ); /* O
8f90: 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76 61 6c  nly one flag val
8fa0: 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20  ue allowed */.  
8fb0: 61 73 73 65 72 74 28 20 45 58 50 52 5f 46 55 4c  assert( EXPR_FUL
8fc0: 4c 53 49 5a 45 3c 3d 30 78 66 66 66 20 29 3b 0a  LSIZE<=0xfff );.
8fd0: 20 20 61 73 73 65 72 74 28 20 28 30 78 66 66 66    assert( (0xfff
8fe0: 20 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45   & (EP_Reduced|E
8ff0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30  P_TokenOnly))==0
9000: 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d 66 6c 61   );.  if( 0==fla
9010: 67 73 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20  gs ){.    nSize 
9020: 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b  = EXPR_FULLSIZE;
9030: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
9040: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
9050: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
9060: 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
9070: 64 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  d) );.    assert
9080: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
9090: 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  ty(p, EP_FromJoi
90a0: 6e 29 20 29 3b 20 0a 20 20 20 20 61 73 73 65 72  n) ); .    asser
90b0: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
90c0: 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b  rty(p, EP_MemTok
90d0: 65 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  en) );.    asser
90e0: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
90f0: 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75  rty(p, EP_NoRedu
9100: 63 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ce) );.    if( p
9110: 2d 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e 78 2e  ->pLeft || p->x.
9120: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e  pList ){.      n
9130: 53 69 7a 65 20 3d 20 45 58 50 52 5f 52 45 44 55  Size = EXPR_REDU
9140: 43 45 44 53 49 5a 45 20 7c 20 45 50 5f 52 65 64  CEDSIZE | EP_Red
9150: 75 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  uced;.    }else{
9160: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9170: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
9180: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50       nSize = EXP
9190: 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20  R_TOKENONLYSIZE 
91a0: 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a  | EP_TokenOnly;.
91b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
91c0: 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a  rn nSize;.}../*.
91d0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
91e0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 70 61   returns the spa
91f0: 63 65 20 69 6e 20 62 79 74 65 73 20 72 65 71 75  ce in bytes requ
9200: 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  ired to store th
9210: 65 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74 68  e copy .** of th
9220: 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  e Expr structure
9230: 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 74   and a copy of t
9240: 68 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e  he Expr.u.zToken
9250: 20 73 74 72 69 6e 67 20 28 69 66 20 74 68 61 74   string (if that
9260: 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 64 65  .** string is de
9270: 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61 74 69  fined.).*/.stati
9280: 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 4e  c int dupedExprN
9290: 6f 64 65 53 69 7a 65 28 45 78 70 72 20 2a 70 2c  odeSize(Expr *p,
92a0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
92b0: 6e 74 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64  nt nByte = duped
92c0: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  ExprStructSize(p
92d0: 2c 20 66 6c 61 67 73 29 20 26 20 30 78 66 66 66  , flags) & 0xfff
92e0: 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  ;.  if( !ExprHas
92f0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49  Property(p, EP_I
9300: 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75  ntValue) && p->u
9310: 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 6e  .zToken ){.    n
9320: 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53  Byte += sqlite3S
9330: 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f  trlen30(p->u.zTo
9340: 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65  ken)+1;.  }.  re
9350: 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74  turn ROUND8(nByt
9360: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  e);.}../*.** Ret
9370: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
9380: 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64  f bytes required
9390: 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 75 70   to create a dup
93a0: 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20 0a 2a  licate of the .*
93b0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73  * expression pas
93c0: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
93d0: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 73   argument. The s
93e0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
93f0: 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74  s a.** mask cont
9400: 61 69 6e 69 6e 67 20 45 58 50 52 44 55 50 5f 58  aining EXPRDUP_X
9410: 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20  XX flags..**.** 
9420: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
9430: 65 64 20 69 6e 63 6c 75 64 65 73 20 73 70 61 63  ed includes spac
9440: 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f  e to create a co
9450: 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73  py of the Expr s
9460: 74 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20  truct.** itself 
9470: 61 6e 64 20 74 68 65 20 62 75 66 66 65 72 20 72  and the buffer r
9480: 65 66 65 72 72 65 64 20 74 6f 20 62 79 20 45 78  eferred to by Ex
9490: 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20  pr.u.zToken, if 
94a0: 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  any..**.** If th
94b0: 65 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  e EXPRDUP_REDUCE
94c0: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
94d0: 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  en the return va
94e0: 6c 75 65 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a  lue includes .**
94f0: 20 73 70 61 63 65 20 74 6f 20 64 75 70 6c 69 63   space to duplic
9500: 61 74 65 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64  ate all Expr nod
9510: 65 73 20 69 6e 20 74 68 65 20 74 72 65 65 20 66  es in the tree f
9520: 6f 72 6d 65 64 20 62 79 20 45 78 70 72 2e 70 4c  ormed by Expr.pL
9530: 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72  eft .** and Expr
9540: 2e 70 52 69 67 68 74 20 76 61 72 69 61 62 6c 65  .pRight variable
9550: 73 20 28 62 75 74 20 6e 6f 74 20 66 6f 72 20 61  s (but not for a
9560: 6e 79 20 73 74 72 75 63 74 75 72 65 73 20 70 6f  ny structures po
9570: 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20  inted to or .** 
9580: 64 65 73 63 65 6e 64 65 64 20 66 72 6f 6d 20 74  descended from t
9590: 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20  he Expr.x.pList 
95a0: 6f 72 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63  or Expr.x.pSelec
95b0: 74 20 76 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f  t variables)..*/
95c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65  .static int dupe
95d0: 64 45 78 70 72 53 69 7a 65 28 45 78 70 72 20 2a  dExprSize(Expr *
95e0: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
95f0: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a   int nByte = 0;.
9600: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 6e    if( p ){.    n
9610: 42 79 74 65 20 3d 20 64 75 70 65 64 45 78 70 72  Byte = dupedExpr
9620: 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c 61 67  NodeSize(p, flag
9630: 73 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67  s);.    if( flag
9640: 73 26 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  s&EXPRDUP_REDUCE
9650: 20 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20   ){.      nByte 
9660: 2b 3d 20 64 75 70 65 64 45 78 70 72 53 69 7a 65  += dupedExprSize
9670: 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73  (p->pLeft, flags
9680: 29 20 2b 20 64 75 70 65 64 45 78 70 72 53 69 7a  ) + dupedExprSiz
9690: 65 28 70 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61  e(p->pRight, fla
96a0: 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  gs);.    }.  }. 
96b0: 20 72 65 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d   return nByte;.}
96c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
96d0: 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72  ction is similar
96e0: 20 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 44   to sqlite3ExprD
96f0: 75 70 28 29 2c 20 65 78 63 65 70 74 20 74 68 61  up(), except tha
9700: 74 20 69 66 20 70 7a 42 75 66 66 65 72 20 0a 2a  t if pzBuffer .*
9710: 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  * is not NULL th
9720: 65 6e 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20  en *pzBuffer is 
9730: 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74  assumed to point
9740: 20 74 6f 20 61 20 62 75 66 66 65 72 20 6c 61 72   to a buffer lar
9750: 67 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f  ge enough .** to
9760: 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20   store the copy 
9770: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 2c  of expression p,
9780: 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 70   the copies of p
9790: 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69  ->u.zToken.** (i
97a0: 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 61  f applicable), a
97b0: 6e 64 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66  nd the copies of
97c0: 20 74 68 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e   the p->pLeft an
97d0: 64 20 70 2d 3e 70 52 69 67 68 74 20 65 78 70 72  d p->pRight expr
97e0: 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61  essions,.** if a
97f0: 6e 79 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72  ny. Before retur
9800: 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65 72 20  ning, *pzBuffer 
9810: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 66 69  is set to the fi
9820: 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
9830: 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f 66 20  e.** portion of 
9840: 74 68 65 20 62 75 66 66 65 72 20 63 6f 70 69 65  the buffer copie
9850: 64 20 69 6e 74 6f 20 62 79 20 74 68 69 73 20 66  d into by this f
9860: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
9870: 69 63 20 45 78 70 72 20 2a 65 78 70 72 44 75 70  ic Expr *exprDup
9880: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
9890: 70 72 20 2a 70 2c 20 69 6e 74 20 64 75 70 46 6c  pr *p, int dupFl
98a0: 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66  ags, u8 **pzBuff
98b0: 65 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  er){.  Expr *pNe
98c0: 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  w;           /* 
98d0: 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
98e0: 2a 2f 0a 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b  */.  u8 *zAlloc;
98f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
9900: 6d 6f 72 79 20 73 70 61 63 65 20 66 72 6f 6d 20  mory space from 
9910: 77 68 69 63 68 20 74 6f 20 62 75 69 6c 64 20 45  which to build E
9920: 78 70 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  xpr object */.  
9930: 75 33 32 20 73 74 61 74 69 63 46 6c 61 67 3b 20  u32 staticFlag; 
9940: 20 20 20 20 20 20 2f 2a 20 45 50 5f 53 74 61 74        /* EP_Stat
9950: 69 63 20 69 66 20 73 70 61 63 65 20 6e 6f 74 20  ic if space not 
9960: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
9970: 6c 6c 6f 63 20 2a 2f 0a 0a 20 20 61 73 73 65 72  lloc */..  asser
9980: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t( db!=0 );.  as
9990: 73 65 72 74 28 20 70 20 29 3b 0a 20 20 61 73 73  sert( p );.  ass
99a0: 65 72 74 28 20 64 75 70 46 6c 61 67 73 3d 3d 30  ert( dupFlags==0
99b0: 20 7c 7c 20 64 75 70 46 6c 61 67 73 3d 3d 45 58   || dupFlags==EX
99c0: 50 52 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a  PRDUP_REDUCE );.
99d0: 20 20 61 73 73 65 72 74 28 20 70 7a 42 75 66 66    assert( pzBuff
99e0: 65 72 3d 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67  er==0 || dupFlag
99f0: 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43  s==EXPRDUP_REDUC
9a00: 45 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  E );..  /* Figur
9a10: 65 20 6f 75 74 20 77 68 65 72 65 20 74 6f 20 77  e out where to w
9a20: 72 69 74 65 20 74 68 65 20 6e 65 77 20 45 78 70  rite the new Exp
9a30: 72 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a  r structure. */.
9a40: 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29    if( pzBuffer )
9a50: 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a  {.    zAlloc = *
9a60: 70 7a 42 75 66 66 65 72 3b 0a 20 20 20 20 73 74  pzBuffer;.    st
9a70: 61 74 69 63 46 6c 61 67 20 3d 20 45 50 5f 53 74  aticFlag = EP_St
9a80: 61 74 69 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  atic;.  }else{. 
9a90: 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69     zAlloc = sqli
9aa0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
9ab0: 28 64 62 2c 20 64 75 70 65 64 45 78 70 72 53 69  (db, dupedExprSi
9ac0: 7a 65 28 70 2c 20 64 75 70 46 6c 61 67 73 29 29  ze(p, dupFlags))
9ad0: 3b 0a 20 20 20 20 73 74 61 74 69 63 46 6c 61 67  ;.    staticFlag
9ae0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77   = 0;.  }.  pNew
9af0: 20 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c 6c 6f   = (Expr *)zAllo
9b00: 63 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77 20 29  c;..  if( pNew )
9b10: 7b 0a 20 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65  {.    /* Set nNe
9b20: 77 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a  wSize to the siz
9b30: 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
9b40: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70 6f  the structure po
9b50: 69 6e 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  inted to.    ** 
9b60: 62 79 20 70 4e 65 77 2e 20 54 68 69 73 20 69 73  by pNew. This is
9b70: 20 65 69 74 68 65 72 20 45 58 50 52 5f 46 55 4c   either EXPR_FUL
9b80: 4c 53 49 5a 45 2c 20 45 58 50 52 5f 52 45 44 55  LSIZE, EXPR_REDU
9b90: 43 45 44 53 49 5a 45 20 6f 72 0a 20 20 20 20 2a  CEDSIZE or.    *
9ba0: 2a 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59  * EXPR_TOKENONLY
9bb0: 53 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69 73 20  SIZE. nToken is 
9bc0: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
9bd0: 72 20 6f 66 20 62 79 74 65 73 20 63 6f 6e 73 75  r of bytes consu
9be0: 6d 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  med.    ** by th
9bf0: 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 2d  e copy of the p-
9c00: 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67  >u.zToken string
9c10: 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a   (if any)..    *
9c20: 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  /.    const unsi
9c30: 67 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a 65  gned nStructSize
9c40: 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75   = dupedExprStru
9c50: 63 74 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61  ctSize(p, dupFla
9c60: 67 73 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69  gs);.    const i
9c70: 6e 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53  nt nNewSize = nS
9c80: 74 72 75 63 74 53 69 7a 65 20 26 20 30 78 66 66  tructSize & 0xff
9c90: 66 3b 0a 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65  f;.    int nToke
9ca0: 6e 3b 0a 20 20 20 20 69 66 28 20 21 45 78 70 72  n;.    if( !Expr
9cb0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
9cc0: 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70  P_IntValue) && p
9cd0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20  ->u.zToken ){.  
9ce0: 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c      nToken = sql
9cf0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e  ite3Strlen30(p->
9d00: 75 2e 7a 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20  u.zToken) + 1;. 
9d10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9d20: 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 20 20  nToken = 0;.    
9d30: 7d 0a 20 20 20 20 69 66 28 20 64 75 70 46 6c 61  }.    if( dupFla
9d40: 67 73 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  gs ){.      asse
9d50: 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  rt( ExprHasPrope
9d60: 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65  rty(p, EP_Reduce
9d70: 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d  d)==0 );.      m
9d80: 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c  emcpy(zAlloc, p,
9d90: 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20   nNewSize);.    
9da0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32  }else{.      u32
9db0: 20 6e 53 69 7a 65 20 3d 20 28 75 33 32 29 65 78   nSize = (u32)ex
9dc0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 29 3b  prStructSize(p);
9dd0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41  .      memcpy(zA
9de0: 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a 65 29 3b  lloc, p, nSize);
9df0: 0a 20 20 20 20 20 20 69 66 28 20 6e 53 69 7a 65  .      if( nSize
9e00: 3c 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 20 29  <EXPR_FULLSIZE )
9e10: 7b 20 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  { .        memse
9e20: 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d  t(&zAlloc[nSize]
9e30: 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49  , 0, EXPR_FULLSI
9e40: 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20  ZE-nSize);.     
9e50: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
9e60: 20 53 65 74 20 74 68 65 20 45 50 5f 52 65 64 75   Set the EP_Redu
9e70: 63 65 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  ced, EP_TokenOnl
9e80: 79 2c 20 61 6e 64 20 45 50 5f 53 74 61 74 69 63  y, and EP_Static
9e90: 20 66 6c 61 67 73 20 61 70 70 72 6f 70 72 69 61   flags appropria
9ea0: 74 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 70 4e 65  tely. */.    pNe
9eb0: 77 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50  w->flags &= ~(EP
9ec0: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
9ed0: 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c  nOnly|EP_Static|
9ee0: 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20  EP_MemToken);.  
9ef0: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
9f00: 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20 28   nStructSize & (
9f10: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
9f20: 6b 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20 70 4e  kenOnly);.    pN
9f30: 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 73 74 61  ew->flags |= sta
9f40: 74 69 63 46 6c 61 67 3b 0a 0a 20 20 20 20 2f 2a  ticFlag;..    /*
9f50: 20 43 6f 70 79 20 74 68 65 20 70 2d 3e 75 2e 7a   Copy the p->u.z
9f60: 54 6f 6b 65 6e 20 73 74 72 69 6e 67 2c 20 69 66  Token string, if
9f70: 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28   any. */.    if(
9f80: 20 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20   nToken ){.     
9f90: 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20   char *zToken = 
9fa0: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d  pNew->u.zToken =
9fb0: 20 28 63 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b   (char*)&zAlloc[
9fc0: 6e 4e 65 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20  nNewSize];.     
9fd0: 20 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20   memcpy(zToken, 
9fe0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f  p->u.zToken, nTo
9ff0: 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ken);.    }..   
a000: 20 69 66 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61   if( 0==((p->fla
a010: 67 73 7c 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20  gs|pNew->flags) 
a020: 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  & EP_TokenOnly) 
a030: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c  ){.      /* Fill
a040: 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e   in the pNew->x.
a050: 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d  pSelect or pNew-
a060: 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e  >x.pList member.
a070: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78   */.      if( Ex
a080: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
a090: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
a0a0: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
a0b0: 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  x.pSelect = sqli
a0c0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
a0d0: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 64   p->x.pSelect, d
a0e0: 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  upFlags);.      
a0f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
a100: 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73  New->x.pList = s
a110: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
a120: 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74  p(db, p->x.pList
a130: 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20  , dupFlags);.   
a140: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
a150: 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d  /* Fill in pNew-
a160: 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65 77 2d  >pLeft and pNew-
a170: 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  >pRight. */.    
a180: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
a190: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64  rty(pNew, EP_Red
a1a0: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
a1b0: 79 29 20 29 7b 0a 20 20 20 20 20 20 7a 41 6c 6c  y) ){.      zAll
a1c0: 6f 63 20 2b 3d 20 64 75 70 65 64 45 78 70 72 4e  oc += dupedExprN
a1d0: 6f 64 65 53 69 7a 65 28 70 2c 20 64 75 70 46 6c  odeSize(p, dupFl
a1e0: 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ags);.      if( 
a1f0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a200: 70 4e 65 77 2c 20 45 50 5f 52 65 64 75 63 65 64  pNew, EP_Reduced
a210: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) ){.        pNe
a220: 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c  w->pLeft = p->pL
a230: 65 66 74 20 3f 0a 20 20 20 20 20 20 20 20 20 20  eft ?.          
a240: 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70 72              expr
a250: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74  Dup(db, p->pLeft
a260: 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
a270: 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a  , &zAlloc) : 0;.
a280: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52          pNew->pR
a290: 69 67 68 74 20 3d 20 70 2d 3e 70 52 69 67 68 74  ight = p->pRight
a2a0: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
a2b0: 20 20 20 20 20 20 20 20 20 20 65 78 70 72 44 75            exprDu
a2c0: 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c  p(db, p->pRight,
a2d0: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c   EXPRDUP_REDUCE,
a2e0: 20 26 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20   &zAlloc) : 0;. 
a2f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
a300: 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20   pzBuffer ){.   
a310: 20 20 20 20 20 2a 70 7a 42 75 66 66 65 72 20 3d       *pzBuffer =
a320: 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 7d   zAlloc;.      }
a330: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a340: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
a350: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
a360: 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  enOnly) ){.     
a370: 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6f 70 3d     if( pNew->op=
a380: 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d  =TK_SELECT_COLUM
a390: 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  N ){.          p
a3a0: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d 3e  New->pLeft = p->
a3b0: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 7d  pLeft;.        }
a3c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
a3d0: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71  pNew->pLeft = sq
a3e0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
a3f0: 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20   p->pLeft, 0);. 
a400: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a410: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20   pNew->pRight = 
a420: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
a430: 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 30 29  b, p->pRight, 0)
a440: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a450: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
a460: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  w;.}../*.** Crea
a470: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
a480: 64 65 65 70 20 63 6f 70 79 20 6f 66 20 74 68 65  deep copy of the
a490: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
a4a0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  s the second .**
a4b0: 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 61 6e   argument. If an
a4c0: 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 69   OOM condition i
a4d0: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 4e  s encountered, N
a4e0: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ULL is returned.
a4f0: 2a 2a 20 61 6e 64 20 74 68 65 20 64 62 2d 3e 6d  ** and the db->m
a500: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
a510: 20 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66   set..*/.#ifndef
a520: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
a530: 0a 73 74 61 74 69 63 20 57 69 74 68 20 2a 77 69  .static With *wi
a540: 74 68 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  thDup(sqlite3 *d
a550: 62 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20 20 57  b, With *p){.  W
a560: 69 74 68 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20  ith *pRet = 0;. 
a570: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e   if( p ){.    in
a580: 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66  t nByte = sizeof
a590: 28 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28 70 2d  (*p) + sizeof(p-
a5a0: 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 43 74  >a[0]) * (p->nCt
a5b0: 65 2d 31 29 3b 0a 20 20 20 20 70 52 65 74 20 3d  e-1);.    pRet =
a5c0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
a5d0: 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b  Zero(db, nByte);
a5e0: 0a 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b  .    if( pRet ){
a5f0: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
a600: 20 20 20 20 70 52 65 74 2d 3e 6e 43 74 65 20 3d      pRet->nCte =
a610: 20 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20 20 20   p->nCte;.      
a620: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
a630: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  te; i++){.      
a640: 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 53 65    pRet->a[i].pSe
a650: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
a660: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 61  lectDup(db, p->a
a670: 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b  [i].pSelect, 0);
a680: 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61  .        pRet->a
a690: 5b 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71 6c 69  [i].pCols = sqli
a6a0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
a6b0: 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73  b, p->a[i].pCols
a6c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52  , 0);.        pR
a6d0: 65 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  et->a[i].zName =
a6e0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
a6f0: 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61  (db, p->a[i].zNa
a700: 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
a710: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
a720: 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  pRet;.}.#else.# 
a730: 64 65 66 69 6e 65 20 77 69 74 68 44 75 70 28 78  define withDup(x
a740: 2c 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,y) 0.#endif../*
a750: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
a760: 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69  g group of routi
a770: 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f  nes make deep co
a780: 70 69 65 73 20 6f 66 20 65 78 70 72 65 73 73 69  pies of expressi
a790: 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69  ons,.** expressi
a7a0: 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73  on lists, ID lis
a7b0: 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73  ts, and select s
a7c0: 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20  tatements.  The 
a7d0: 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65  copies can.** be
a7e0: 20 64 65 6c 65 74 65 64 20 28 62 79 20 62 65 69   deleted (by bei
a7f0: 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  ng passed to the
a800: 69 72 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e  ir respective ..
a810: 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e  .Delete() routin
a820: 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65  es).** without e
a830: 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69  ffecting the ori
a840: 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ginals..**.** Th
a850: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
a860: 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63  t, ID, and sourc
a870: 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62  e lists return b
a880: 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  y sqlite3ExprLis
a890: 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74  tDup(),.** sqlit
a8a0: 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61  e3IdListDup(), a
a8b0: 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  nd sqlite3SrcLis
a8c0: 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62  tDup() can not b
a8d0: 65 20 66 75 72 74 68 65 72 20 65 78 70 61 6e 64  e further expand
a8e0: 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71  ed .** by subseq
a8f0: 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71  uent calls to sq
a900: 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28  lite*ListAppend(
a910: 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a  ) routines..**.*
a920: 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61  * Any tables tha
a930: 74 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69  t the SrcList mi
a940: 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65  ght point to are
a950: 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e   not duplicated.
a960: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73  .**.** The flags
a970: 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61   parameter conta
a980: 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f  ins a combinatio
a990: 6e 20 6f 66 20 74 68 65 20 45 58 50 52 44 55 50  n of the EXPRDUP
a9a0: 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20 49  _XXX flags..** I
a9b0: 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52 45  f the EXPRDUP_RE
a9c0: 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65 74  DUCE flag is set
a9d0: 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72 75 63  , then the struc
a9e0: 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 69 73  ture returned is
a9f0: 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64 20   a.** truncated 
aa00: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 75  version of the u
aa10: 73 75 61 6c 20 45 78 70 72 20 73 74 72 75 63 74  sual Expr struct
aa20: 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ure that will be
aa30: 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70 61   stored as.** pa
aa40: 72 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d  rt of the in-mem
aa50: 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
aa60: 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  on of the databa
aa70: 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78  se schema..*/.Ex
aa80: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44  pr *sqlite3ExprD
aa90: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
aaa0: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61  Expr *p, int fla
aab0: 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 66  gs){.  assert( f
aac0: 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73  lags==0 || flags
aad0: 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  ==EXPRDUP_REDUCE
aae0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 20 3f   );.  return p ?
aaf0: 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2c 20   exprDup(db, p, 
ab00: 66 6c 61 67 73 2c 20 30 29 20 3a 20 30 3b 0a 7d  flags, 0) : 0;.}
ab10: 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74  .ExprList *sqlit
ab20: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 73 71  e3ExprListDup(sq
ab30: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c  lite3 *db, ExprL
ab40: 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  ist *p, int flag
ab50: 73 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  s){.  ExprList *
ab60: 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45  pNew;.  struct E
ab70: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
ab80: 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a  tem, *pOldItem;.
ab90: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
aba0: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  t( db!=0 );.  if
abb0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
abc0: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
abd0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
abe0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
abf0: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
ac00: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
ac10: 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20    pNew->nExpr = 
ac20: 69 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20  i = p->nExpr;.  
ac30: 69 66 28 20 28 66 6c 61 67 73 20 26 20 45 58 50  if( (flags & EXP
ac40: 52 44 55 50 5f 52 45 44 55 43 45 29 3d 3d 30 20  RDUP_REDUCE)==0 
ac50: 29 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e  ) for(i=1; i<p->
ac60: 6e 45 78 70 72 3b 20 69 2b 3d 69 29 7b 7d 0a 20  nExpr; i+=i){}. 
ac70: 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d   pNew->a = pItem
ac80: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
ac90: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 20 69 2a 73  ocRawNN(db,  i*s
aca0: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29  izeof(p->a[0]) )
acb0: 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 3d 3d 30  ;.  if( pItem==0
acc0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
acd0: 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b  bFree(db, pNew);
ace0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
acf0: 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d   } .  pOldItem =
ad00: 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30   p->a;.  for(i=0
ad10: 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b  ; i<p->nExpr; i+
ad20: 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64  +, pItem++, pOld
ad30: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Item++){.    Exp
ad40: 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f  r *pOldExpr = pO
ad50: 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20  ldItem->pExpr;. 
ad60: 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
ad70: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
ad80: 28 64 62 2c 20 70 4f 6c 64 45 78 70 72 2c 20 66  (db, pOldExpr, f
ad90: 6c 61 67 73 29 3b 0a 20 20 20 20 70 49 74 65 6d  lags);.    pItem
ada0: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
adb0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
adc0: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
add0: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e      pItem->zSpan
ade0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
adf0: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
ae00: 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74  >zSpan);.    pIt
ae10: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20  em->sortOrder = 
ae20: 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72  pOldItem->sortOr
ae30: 64 65 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  der;.    pItem->
ae40: 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 49  done = 0;.    pI
ae50: 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 20  tem->bSpanIsTab 
ae60: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53 70 61  = pOldItem->bSpa
ae70: 6e 49 73 54 61 62 3b 0a 20 20 20 20 70 49 74 65  nIsTab;.    pIte
ae80: 6d 2d 3e 75 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  m->u = pOldItem-
ae90: 3e 75 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  >u;.  }.  return
aea0: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
aeb0: 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69 67  If cursors, trig
aec0: 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64 20  gers, views and 
aed0: 73 75 62 71 75 65 72 69 65 73 20 61 72 65 20 61  subqueries are a
aee0: 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 0a  ll omitted from.
aef0: 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74 68  ** the build, th
af00: 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 66  en none of the f
af10: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
af20: 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a 2a  s, except for .*
af30: 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  * sqlite3SelectD
af40: 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61 6c  up(), can be cal
af50: 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c 65  led. sqlite3Sele
af60: 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65 74  ctDup() is somet
af70: 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77  imes.** called w
af80: 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75 6d  ith a NULL argum
af90: 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ent..*/.#if !def
afa0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
afb0: 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
afc0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
afd0: 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21 64  RIGGER) \. || !d
afe0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
aff0: 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72 63  IT_SUBQUERY).Src
b000: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
b010: 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20  ListDup(sqlite3 
b020: 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c  *db, SrcList *p,
b030: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53   int flags){.  S
b040: 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  rcList *pNew;.  
b050: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79  int i;.  int nBy
b060: 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  te;.  assert( db
b070: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  !=0 );.  if( p==
b080: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
b090: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
b0a0: 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20  p) + (p->nSrc>0 
b0b0: 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  ? sizeof(p->a[0]
b0c0: 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20  ) * (p->nSrc-1) 
b0d0: 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  : 0);.  pNew = s
b0e0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
b0f0: 77 4e 4e 28 64 62 2c 20 6e 42 79 74 65 20 29 3b  wNN(db, nByte );
b100: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
b110: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
b120: 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e  w->nSrc = pNew->
b130: 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63  nAlloc = p->nSrc
b140: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
b150: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
b160: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
b170: 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20  _item *pNewItem 
b180: 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20  = &pNew->a[i];. 
b190: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
b1a0: 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d  t_item *pOldItem
b1b0: 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20   = &p->a[i];.   
b1c0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
b1d0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 63 68    pNewItem->pSch
b1e0: 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  ema = pOldItem->
b1f0: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70 4e 65  pSchema;.    pNe
b200: 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  wItem->zDatabase
b210: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
b220: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
b230: 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  >zDatabase);.   
b240: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pNewItem->zName
b250: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
b260: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
b270: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65  >zName);.    pNe
b280: 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20  wItem->zAlias = 
b290: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
b2a0: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41  db, pOldItem->zA
b2b0: 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49  lias);.    pNewI
b2c0: 74 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64 49 74  tem->fg = pOldIt
b2d0: 65 6d 2d 3e 66 67 3b 0a 20 20 20 20 70 4e 65 77  em->fg;.    pNew
b2e0: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20  Item->iCursor = 
b2f0: 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pOldItem->iCurso
b300: 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  r;.    pNewItem-
b310: 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 70  >addrFillSub = p
b320: 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  OldItem->addrFil
b330: 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65 77 49 74  lSub;.    pNewIt
b340: 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20  em->regReturn = 
b350: 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65 74  pOldItem->regRet
b360: 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  urn;.    if( pNe
b370: 77 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65  wItem->fg.isInde
b380: 78 65 64 42 79 20 29 7b 0a 20 20 20 20 20 20 70  xedBy ){.      p
b390: 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64  NewItem->u1.zInd
b3a0: 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74 65 33  exedBy = sqlite3
b3b0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
b3c0: 64 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78  dItem->u1.zIndex
b3d0: 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20  edBy);.    }.   
b3e0: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 42 49 6e   pNewItem->pIBIn
b3f0: 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  dex = pOldItem->
b400: 70 49 42 49 6e 64 65 78 3b 0a 20 20 20 20 69 66  pIBIndex;.    if
b410: 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69  ( pNewItem->fg.i
b420: 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20  sTabFunc ){.    
b430: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 70    pNewItem->u1.p
b440: 46 75 6e 63 41 72 67 20 3d 20 0a 20 20 20 20 20  FuncArg = .     
b450: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
b460: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64  ListDup(db, pOld
b470: 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72  Item->u1.pFuncAr
b480: 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d  g, flags);.    }
b490: 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65 77  .    pTab = pNew
b4a0: 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c  Item->pTab = pOl
b4b0: 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  dItem->pTab;.   
b4c0: 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
b4d0: 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b     pTab->nRef++;
b4e0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49  .    }.    pNewI
b4f0: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  tem->pSelect = s
b500: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
b510: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53  db, pOldItem->pS
b520: 65 6c 65 63 74 2c 20 66 6c 61 67 73 29 3b 0a 20  elect, flags);. 
b530: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e     pNewItem->pOn
b540: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
b550: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
b560: 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  pOn, flags);.   
b570: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e   pNewItem->pUsin
b580: 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73  g = sqlite3IdLis
b590: 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  tDup(db, pOldIte
b5a0: 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20  m->pUsing);.    
b5b0: 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  pNewItem->colUse
b5c0: 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f  d = pOldItem->co
b5d0: 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74  lUsed;.  }.  ret
b5e0: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69  urn pNew;.}.IdLi
b5f0: 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73  st *sqlite3IdLis
b600: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
b610: 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20  , IdList *p){.  
b620: 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  IdList *pNew;.  
b630: 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
b640: 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
b650: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
b660: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
b670: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
b680: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  b, sizeof(*pNew)
b690: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
b6a0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
b6b0: 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e  pNew->nId = p->n
b6c0: 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  Id;.  pNew->a = 
b6d0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
b6e0: 61 77 4e 4e 28 64 62 2c 20 70 2d 3e 6e 49 64 2a  awNN(db, p->nId*
b6f0: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
b700: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61  );.  if( pNew->a
b710: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
b720: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65  e3DbFree(db, pNe
b730: 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  w);.    return 0
b740: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20  ;.  }.  /* Note 
b750: 74 68 61 74 20 62 65 63 61 75 73 65 20 74 68 65  that because the
b760: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c   size of the all
b770: 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61  ocation for p->a
b780: 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e  [] is not.  ** n
b790: 65 63 65 73 73 61 72 69 6c 79 20 61 20 70 6f 77  ecessarily a pow
b7a0: 65 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74  er of two, sqlit
b7b0: 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 29  e3IdListAppend()
b7c0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c   may not be call
b7d0: 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64  ed.  ** on the d
b7e0: 75 70 6c 69 63 61 74 65 20 63 72 65 61 74 65 64  uplicate created
b7f0: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
b800: 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  n. */.  for(i=0;
b810: 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b   i<p->nId; i++){
b820: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
b830: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
b840: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
b850: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
b860: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
b870: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
b880: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
b890: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
b8a0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
b8b0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
b8c0: 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f  ewItem->idx = pO
b8d0: 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d  ldItem->idx;.  }
b8e0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
b8f0: 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65  }.Select *sqlite
b900: 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74  3SelectDup(sqlit
b910: 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a  e3 *db, Select *
b920: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
b930: 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 2c 20 2a   Select *pNew, *
b940: 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74  pPrior;.  assert
b950: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( db!=0 );.  if(
b960: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
b970: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
b980: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
b990: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  db, sizeof(*p) )
b9a0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
b9b0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
b9c0: 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c  ew->pEList = sql
b9d0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
b9e0: 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 66  db, p->pEList, f
b9f0: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lags);.  pNew->p
ba00: 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Src = sqlite3Src
ba10: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
ba20: 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  Src, flags);.  p
ba30: 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71  New->pWhere = sq
ba40: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
ba50: 20 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61 67   p->pWhere, flag
ba60: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f  s);.  pNew->pGro
ba70: 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  upBy = sqlite3Ex
ba80: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
ba90: 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c 61 67 73  >pGroupBy, flags
baa0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  );.  pNew->pHavi
bab0: 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ng = sqlite3Expr
bac0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 48 61 76 69  Dup(db, p->pHavi
bad0: 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  ng, flags);.  pN
bae0: 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73  ew->pOrderBy = s
baf0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
bb00: 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  p(db, p->pOrderB
bb10: 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  y, flags);.  pNe
bb20: 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20  w->op = p->op;. 
bb30: 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20   pNew->pPrior = 
bb40: 70 50 72 69 6f 72 20 3d 20 73 71 6c 69 74 65 33  pPrior = sqlite3
bb50: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d  SelectDup(db, p-
bb60: 3e 70 50 72 69 6f 72 2c 20 66 6c 61 67 73 29 3b  >pPrior, flags);
bb70: 0a 20 20 69 66 28 20 70 50 72 69 6f 72 20 29 20  .  if( pPrior ) 
bb80: 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20  pPrior->pNext = 
bb90: 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e  pNew;.  pNew->pN
bba0: 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ext = 0;.  pNew-
bbb0: 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65  >pLimit = sqlite
bbc0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
bbd0: 70 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a  pLimit, flags);.
bbe0: 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20    pNew->pOffset 
bbf0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
bc00: 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c  (db, p->pOffset,
bc10: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
bc20: 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70  >iLimit = 0;.  p
bc30: 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30  New->iOffset = 0
bc40: 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61  ;.  pNew->selFla
bc50: 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73  gs = p->selFlags
bc60: 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68 65 6d   & ~SF_UsesEphem
bc70: 65 72 61 6c 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  eral;.  pNew->ad
bc80: 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
bc90: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  -1;.  pNew->addr
bca0: 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31  OpenEphm[1] = -1
bcb0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63  ;.  pNew->nSelec
bcc0: 74 52 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c 65 63  tRow = p->nSelec
bcd0: 74 52 6f 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 57  tRow;.  pNew->pW
bce0: 69 74 68 20 3d 20 77 69 74 68 44 75 70 28 64 62  ith = withDup(db
bcf0: 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a 20 20 73  , p->pWith);.  s
bd00: 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e  qlite3SelectSetN
bd10: 61 6d 65 28 70 4e 65 77 2c 20 70 2d 3e 7a 53 65  ame(pNew, p->zSe
bd20: 6c 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  lName);.  return
bd30: 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53   pNew;.}.#else.S
bd40: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
bd50: 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20  lectDup(sqlite3 
bd60: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  *db, Select *p, 
bd70: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73  int flags){.  as
bd80: 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20  sert( p==0 );.  
bd90: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
bda0: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  if.../*.** Add a
bdb0: 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
bdc0: 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65 78  the end of an ex
bdd0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
bde0: 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69  If pList is.** i
bdf0: 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74  nitially NULL, t
be00: 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77  hen create a new
be10: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
be20: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
be30: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
be40: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
be50: 20 65 6e 74 69 72 65 20 6c 69 73 74 20 69 73 20   entire list is 
be60: 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c  freed and.** NUL
be70: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  L is returned.  
be80: 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72  If non-NULL is r
be90: 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 69 74  eturned, then it
bea0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a   is guaranteed.*
beb0: 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 65  * that the new e
bec0: 6e 74 72 79 20 77 61 73 20 73 75 63 63 65 73 73  ntry was success
bed0: 66 75 6c 6c 79 20 61 70 70 65 6e 64 65 64 2e 0a  fully appended..
bee0: 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c  */.ExprList *sql
bef0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
bf00: 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nd(.  Parse *pPa
bf10: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
bf20: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
bf30: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
bf40: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  pList,        /*
bf50: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
bf60: 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20  o append. Might 
bf70: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
bf80: 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20  r *pExpr        
bf90: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
bfa0: 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65  on to be appende
bfb0: 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  d. Might be NULL
bfc0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
bfd0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
bfe0: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  b;.  assert( db!
bff0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73  =0 );.  if( pLis
c000: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
c010: 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
c020: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
c030: 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b  eof(ExprList) );
c040: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
c050: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
c060: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  no_mem;.    }.  
c070: 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3d    pList->nExpr =
c080: 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61   0;.    pList->a
c090: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
c0a0: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
c0b0: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
c0c0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  ;.    if( pList-
c0d0: 3e 61 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f  >a==0 ) goto no_
c0e0: 6d 65 6d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  mem;.  }else if(
c0f0: 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26   (pList->nExpr &
c100: 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31   (pList->nExpr-1
c110: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72  ))==0 ){.    str
c120: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
c130: 6d 20 2a 61 3b 0a 20 20 20 20 61 73 73 65 72 74  m *a;.    assert
c140: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30  ( pList->nExpr>0
c150: 20 29 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69   );.    a = sqli
c160: 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
c170: 20 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74   pList->a, pList
c180: 2d 3e 6e 45 78 70 72 2a 32 2a 73 69 7a 65 6f 66  ->nExpr*2*sizeof
c190: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
c1a0: 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a      if( a==0 ){.
c1b0: 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65        goto no_me
c1c0: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  m;.    }.    pLi
c1d0: 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20  st->a = a;.  }. 
c1e0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
c1f0: 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 31 20  a!=0 );.  if( 1 
c200: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
c210: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
c220: 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
c230: 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a  List->nExpr++];.
c240: 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d      memset(pItem
c250: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74  , 0, sizeof(*pIt
c260: 65 6d 29 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  em));.    pItem-
c270: 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
c280: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69    }.  return pLi
c290: 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20  st;..no_mem:    
c2a0: 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61   .  /* Avoid lea
c2b0: 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d  king memory if m
c2c0: 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c 65 64  alloc has failed
c2d0: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78  . */.  sqlite3Ex
c2e0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
c2f0: 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  pr);.  sqlite3Ex
c300: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
c310: 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72   pList);.  retur
c320: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43  n 0;.}../*.** pC
c330: 6f 6c 75 6d 6e 73 20 61 6e 64 20 70 45 78 70 72  olumns and pExpr
c340: 20 66 6f 72 6d 20 61 20 76 65 63 74 6f 72 20 61   form a vector a
c350: 73 73 69 67 6e 6d 65 6e 74 20 77 68 69 63 68 20  ssignment which 
c360: 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 53  is part of the S
c370: 45 54 0a 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20  ET.** clause of 
c380: 61 6e 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  an UPDATE statem
c390: 65 6e 74 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a  ent.  Like this:
c3a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 28 61  .**.**        (a
c3b0: 2c 62 2c 63 29 20 3d 20 28 65 78 70 72 31 2c 65  ,b,c) = (expr1,e
c3c0: 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a 20 4f  xpr2,expr3).** O
c3d0: 72 3a 20 20 20 20 28 61 2c 62 2c 63 29 20 3d 20  r:    (a,b,c) = 
c3e0: 28 53 45 4c 45 43 54 20 78 2c 79 2c 7a 20 46 52  (SELECT x,y,z FR
c3f0: 4f 4d 20 2e 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 46  OM ....).**.** F
c400: 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6f 66 20  or each term of 
c410: 74 68 65 20 76 65 63 74 6f 72 20 61 73 73 69 67  the vector assig
c420: 6e 6d 65 6e 74 2c 20 61 70 70 65 6e 64 20 6e 65  nment, append ne
c430: 77 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65  w entries to the
c440: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
c450: 69 73 74 20 70 4c 69 73 74 2e 20 20 49 6e 20 74  ist pList.  In t
c460: 68 65 20 63 61 73 65 20 6f 66 20 61 20 73 75 62  he case of a sub
c470: 71 75 65 72 79 20 6f 6e 20 74 68 65 20 4c 48 53  query on the LHS
c480: 2c 20 61 70 70 65 6e 64 0a 2a 2a 20 54 4b 5f 53  , append.** TK_S
c490: 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 65 78 70  ELECT_COLUMN exp
c4a0: 72 65 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 45 78 70  ressions..*/.Exp
c4b0: 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78  rList *sqlite3Ex
c4c0: 70 72 4c 69 73 74 41 70 70 65 6e 64 56 65 63 74  prListAppendVect
c4d0: 6f 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  or(.  Parse *pPa
c4e0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
c4f0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
c500: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
c510: 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c  List,       /* L
c520: 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20  ist to which to 
c530: 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65  append. Might be
c540: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 49 64 4c 69 73   NULL */.  IdLis
c550: 74 20 2a 70 43 6f 6c 75 6d 6e 73 2c 20 20 20 20  t *pColumns,    
c560: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6e 61 6d    /* List of nam
c570: 65 73 20 6f 66 20 4c 48 53 20 6f 66 20 74 68 65  es of LHS of the
c580: 20 61 73 73 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20   assignment */. 
c590: 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20   Expr *pExpr    
c5a0: 20 20 20 20 20 20 20 20 2f 2a 20 56 65 63 74 6f          /* Vecto
c5b0: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  r expression to 
c5c0: 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69 67  be appended. Mig
c5d0: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  ht be NULL */.){
c5e0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
c5f0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
c600: 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  nt n;.  int i;. 
c610: 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20 70 4c   int iFirst = pL
c620: 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78  ist ? pList->nEx
c630: 70 72 20 3a 20 30 3b 0a 20 20 2f 2a 20 70 43 6f  pr : 0;.  /* pCo
c640: 6c 75 6d 6e 73 20 63 61 6e 20 6f 6e 6c 79 20 62  lumns can only b
c650: 65 20 4e 55 4c 4c 20 64 75 65 20 74 6f 20 61 6e  e NULL due to an
c660: 20 4f 4f 4d 20 62 75 74 20 61 6e 20 4f 4f 4d 20   OOM but an OOM 
c670: 77 69 6c 6c 20 63 61 75 73 65 20 61 6e 0a 20 20  will cause an.  
c680: 2a 2a 20 65 78 69 74 20 70 72 69 6f 72 20 74 6f  ** exit prior to
c690: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65   this routine be
c6a0: 69 6e 67 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20  ing invoked */. 
c6b0: 20 69 66 28 20 4e 45 56 45 52 28 70 43 6f 6c 75   if( NEVER(pColu
c6c0: 6d 6e 73 3d 3d 30 29 20 29 20 67 6f 74 6f 20 76  mns==0) ) goto v
c6d0: 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72  ector_append_err
c6e0: 6f 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d  or;.  if( pExpr=
c6f0: 3d 30 20 29 20 67 6f 74 6f 20 76 65 63 74 6f 72  =0 ) goto vector
c700: 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20  _append_error;. 
c710: 20 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   n = sqlite3Expr
c720: 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72  VectorSize(pExpr
c730: 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e  );.  if( pColumn
c740: 73 2d 3e 6e 49 64 21 3d 6e 20 29 7b 0a 20 20 20  s->nId!=n ){.   
c750: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
c760: 28 70 50 61 72 73 65 2c 20 22 25 64 20 63 6f 6c  (pParse, "%d col
c770: 75 6d 6e 73 20 61 73 73 69 67 6e 65 64 20 25 64  umns assigned %d
c780: 20 76 61 6c 75 65 73 22 2c 0a 20 20 20 20 20 20   values",.      
c790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
c7a0: 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 2c 20 6e 29 3b  olumns->nId, n);
c7b0: 0a 20 20 20 20 67 6f 74 6f 20 76 65 63 74 6f 72  .    goto vector
c7c0: 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20  _append_error;. 
c7d0: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
c7e0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  n; i++){.    Exp
c7f0: 72 20 2a 70 53 75 62 45 78 70 72 20 3d 20 73 71  r *pSubExpr = sq
c800: 6c 69 74 65 33 45 78 70 72 46 6f 72 56 65 63 74  lite3ExprForVect
c810: 6f 72 46 69 65 6c 64 28 70 50 61 72 73 65 2c 20  orField(pParse, 
c820: 70 45 78 70 72 2c 20 69 29 3b 0a 20 20 20 20 70  pExpr, i);.    p
c830: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
c840: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
c850: 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 53 75 62  rse, pList, pSub
c860: 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Expr);.    if( p
c870: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 61 73  List ){.      as
c880: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
c890: 70 72 3d 3d 69 46 69 72 73 74 2b 69 2b 31 20 29  pr==iFirst+i+1 )
c8a0: 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61  ;.      pList->a
c8b0: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d  [pList->nExpr-1]
c8c0: 2e 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c 75 6d 6e  .zName = pColumn
c8d0: 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  s->a[i].zName;. 
c8e0: 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61       pColumns->a
c8f0: 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  [i].zName = 0;. 
c900: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
c910: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
c920: 45 43 54 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ECT ){.    if( p
c930: 4c 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 61  List && pList->a
c940: 5b 69 46 69 72 73 74 5d 2e 70 45 78 70 72 20 29  [iFirst].pExpr )
c950: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
c960: 70 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 5d  pList->a[iFirst]
c970: 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53  .pExpr->op==TK_S
c980: 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  ELECT_COLUMN );.
c990: 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69        pList->a[i
c9a0: 46 69 72 73 74 5d 2e 70 45 78 70 72 2d 3e 70 52  First].pExpr->pR
c9b0: 69 67 68 74 20 3d 20 70 45 78 70 72 3b 0a 20 20  ight = pExpr;.  
c9c0: 20 20 20 20 70 45 78 70 72 20 3d 20 30 3b 0a 20      pExpr = 0;. 
c9d0: 20 20 20 7d 0a 20 20 7d 0a 0a 76 65 63 74 6f 72     }.  }..vector
c9e0: 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3a 0a 20  _append_error:. 
c9f0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
ca00: 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20  te(db, pExpr);. 
ca10: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
ca20: 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 75 6d 6e  lete(db, pColumn
ca30: 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69  s);.  return pLi
ca40: 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  st;.}../*.** Set
ca50: 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20   the sort order 
ca60: 66 6f 72 20 74 68 65 20 6c 61 73 74 20 65 6c 65  for the last ele
ca70: 6d 65 6e 74 20 6f 6e 20 74 68 65 20 67 69 76 65  ment on the give
ca80: 6e 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 76  n ExprList..*/.v
ca90: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
caa0: 69 73 74 53 65 74 53 6f 72 74 4f 72 64 65 72 28  istSetSortOrder(
cab0: 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74  ExprList *p, int
cac0: 20 69 53 6f 72 74 4f 72 64 65 72 29 7b 0a 20 20   iSortOrder){.  
cad0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
cae0: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  n;.  assert( SQL
caf0: 49 54 45 5f 53 4f 5f 55 4e 44 45 46 49 4e 45 44  ITE_SO_UNDEFINED
cb00: 3c 30 20 26 26 20 53 51 4c 49 54 45 5f 53 4f 5f  <0 && SQLITE_SO_
cb10: 41 53 43 3e 3d 30 20 26 26 20 53 51 4c 49 54 45  ASC>=0 && SQLITE
cb20: 5f 53 4f 5f 44 45 53 43 3e 30 20 29 3b 0a 20 20  _SO_DESC>0 );.  
cb30: 61 73 73 65 72 74 28 20 70 2d 3e 6e 45 78 70 72  assert( p->nExpr
cb40: 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 53 6f 72  >0 );.  if( iSor
cb50: 74 4f 72 64 65 72 3c 30 20 29 7b 0a 20 20 20 20  tOrder<0 ){.    
cb60: 61 73 73 65 72 74 28 20 70 2d 3e 61 5b 70 2d 3e  assert( p->a[p->
cb70: 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64  nExpr-1].sortOrd
cb80: 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53  er==SQLITE_SO_AS
cb90: 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  C );.    return;
cba0: 0a 20 20 7d 0a 20 20 70 2d 3e 61 5b 70 2d 3e 6e  .  }.  p->a[p->n
cbb0: 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65  Expr-1].sortOrde
cbc0: 72 20 3d 20 28 75 38 29 69 53 6f 72 74 4f 72 64  r = (u8)iSortOrd
cbd0: 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  er;.}../*.** Set
cbe0: 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b   the ExprList.a[
cbf0: 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20  ].zName element 
cc00: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
cc10: 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a  ntly added item.
cc20: 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ** on the expres
cc30: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
cc40: 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20   pList might be 
cc50: 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  NULL following a
cc60: 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75  n OOM error.  Bu
cc70: 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e  t pName should n
cc80: 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e  ever be.** NULL.
cc90: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
cca0: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20  location fails, 
ccb0: 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  the pParse->db->
ccc0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
ccd0: 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a  g.** is set..*/.
cce0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
ccf0: 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a 20 20 50  ListSetName(.  P
cd00: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
cd10: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
cd20: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
cd30: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
cd40: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
cd50: 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74  o which to add t
cd60: 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f  he span. */.  To
cd70: 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20  ken *pName,     
cd80: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f        /* Name to
cd90: 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69   be added */.  i
cda0: 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20  nt dequote      
cdb0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
cdc0: 6f 20 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65  o cause the name
cdd0: 20 74 6f 20 62 65 20 64 65 71 75 6f 74 65 64 20   to be dequoted 
cde0: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
cdf0: 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50 61 72  pList!=0 || pPar
ce00: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
ce10: 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28  iled!=0 );.  if(
ce20: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74   pList ){.    st
ce30: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
ce40: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61  em *pItem;.    a
ce50: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
ce60: 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 70 49 74  xpr>0 );.    pIt
ce70: 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
ce80: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  List->nExpr-1];.
ce90: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
cea0: 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20  m->zName==0 );. 
ceb0: 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20     pItem->zName 
cec0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
ced0: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
cee0: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
cef0: 6e 29 3b 0a 20 20 20 20 69 66 28 20 64 65 71 75  n);.    if( dequ
cf00: 6f 74 65 20 29 20 73 71 6c 69 74 65 33 44 65 71  ote ) sqlite3Deq
cf10: 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d  uote(pItem->zNam
cf20: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
cf30: 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73   Set the ExprLis
cf40: 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d  t.a[].zSpan elem
cf50: 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ent of the most 
cf60: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69  recently added i
cf70: 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78  tem.** on the ex
cf80: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
cf90: 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74  *.** pList might
cfa0: 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69   be NULL followi
cfb0: 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  ng an OOM error.
cfc0: 20 20 42 75 74 20 70 53 70 61 6e 20 73 68 6f 75    But pSpan shou
cfd0: 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e  ld never be.** N
cfe0: 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72  ULL.  If a memor
cff0: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
d000: 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e  ls, the pParse->
d010: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
d020: 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e   flag.** is set.
d030: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d040: 45 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e 28  ExprListSetSpan(
d050: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
d060: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
d070: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
d080: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
d090: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
d0a0: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
d0b0: 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a  dd the span. */.
d0c0: 20 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61    ExprSpan *pSpa
d0d0: 6e 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  n         /* The
d0e0: 20 73 70 61 6e 20 74 6f 20 62 65 20 61 64 64 65   span to be adde
d0f0: 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  d */.){.  sqlite
d100: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
d110: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  db;.  assert( pL
d120: 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  ist!=0 || db->ma
d130: 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b  llocFailed!=0 );
d140: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
d150: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
d160: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
d170: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
d180: 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20  t->nExpr-1];.   
d190: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
d1a0: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 61  nExpr>0 );.    a
d1b0: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
d1c0: 63 46 61 69 6c 65 64 20 7c 7c 20 70 49 74 65 6d  cFailed || pItem
d1d0: 2d 3e 70 45 78 70 72 3d 3d 70 53 70 61 6e 2d 3e  ->pExpr==pSpan->
d1e0: 70 45 78 70 72 20 29 3b 0a 20 20 20 20 73 71 6c  pExpr );.    sql
d1f0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
d200: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
d210: 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d    pItem->zSpan =
d220: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
d230: 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53 70  p(db, (char*)pSp
d240: 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20  an->zStart,.    
d250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d270: 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e  (int)(pSpan->zEn
d280: 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72  d - pSpan->zStar
d290: 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  t));.  }.}../*.*
d2a0: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
d2b0: 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20  ion list pEList 
d2c0: 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68  contains more th
d2d0: 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e  an iLimit elemen
d2e0: 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  ts,.** leave an 
d2f0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
d300: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64   pParse..*/.void
d310: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
d320: 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50  CheckLength(.  P
d330: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
d340: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
d350: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
d360: 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74  zObject.){.  int
d370: 20 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   mx = pParse->db
d380: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
d390: 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20  LIMIT_COLUMN];. 
d3a0: 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73   testcase( pELis
d3b0: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
d3c0: 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74  pr==mx );.  test
d3d0: 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20  case( pEList && 
d3e0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d  pEList->nExpr==m
d3f0: 78 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c  x+1 );.  if( pEL
d400: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
d410: 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73  Expr>mx ){.    s
d420: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
d430: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
d440: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c   columns in %s",
d450: 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d   zObject);.  }.}
d460: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
d470: 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73  n entire express
d480: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  ion list..*/.sta
d490: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
d4a0: 49 4e 45 20 76 6f 69 64 20 65 78 70 72 4c 69 73  INE void exprLis
d4b0: 74 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69 74 65  tDeleteNN(sqlite
d4c0: 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20  3 *db, ExprList 
d4d0: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
d4e0: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
d4f0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
d500: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
d510: 2d 3e 61 21 3d 30 20 7c 7c 20 70 4c 69 73 74 2d  ->a!=0 || pList-
d520: 3e 6e 45 78 70 72 3d 3d 30 20 29 3b 0a 20 20 66  >nExpr==0 );.  f
d530: 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
d540: 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  a, i=0; i<pList-
d550: 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
d560: 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  em++){.    sqlit
d570: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
d580: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
d590: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
d5a0: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61  e(db, pItem->zNa
d5b0: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
d5c0: 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
d5d0: 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 7d 0a 20 20  ->zSpan);.  }.  
d5e0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
d5f0: 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73  , pList->a);.  s
d600: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
d610: 20 70 4c 69 73 74 29 3b 0a 7d 0a 76 6f 69 64 20   pList);.}.void 
d620: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
d630: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
d640: 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  b, ExprList *pLi
d650: 73 74 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74  st){.  if( pList
d660: 20 29 20 65 78 70 72 4c 69 73 74 44 65 6c 65 74   ) exprListDelet
d670: 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  eNN(db, pList);.
d680: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
d690: 74 68 65 20 62 69 74 77 69 73 65 2d 4f 52 20 6f  the bitwise-OR o
d6a0: 66 20 61 6c 6c 20 45 78 70 72 2e 66 6c 61 67 73  f all Expr.flags
d6b0: 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 67   fields in the g
d6c0: 69 76 65 6e 0a 2a 2a 20 45 78 70 72 4c 69 73 74  iven.** ExprList
d6d0: 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
d6e0: 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 63 6f  ExprListFlags(co
d6f0: 6e 73 74 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  nst ExprList *pL
d700: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
d710: 20 75 33 32 20 6d 20 3d 20 30 3b 0a 20 20 69 66   u32 m = 0;.  if
d720: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
d730: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
d740: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
d750: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
d760: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70   = pList->a[i].p
d770: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 61 73 73  Expr;.       ass
d780: 65 72 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b  ert( pExpr!=0 );
d790: 0a 20 20 20 20 20 20 20 6d 20 7c 3d 20 70 45 78  .       m |= pEx
d7a0: 70 72 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d  pr->flags;.    }
d7b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b  .  }.  return m;
d7c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  .}../*.** These 
d7d0: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57 61 6c  routines are Wal
d7e0: 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 75 73  ker callbacks us
d7f0: 65 64 20 74 6f 20 63 68 65 63 6b 20 65 78 70 72  ed to check expr
d800: 65 73 73 69 6f 6e 73 20 74 6f 0a 2a 2a 20 73 65  essions to.** se
d810: 65 20 69 66 20 74 68 65 79 20 61 72 65 20 22 63  e if they are "c
d820: 6f 6e 73 74 61 6e 74 22 20 66 6f 72 20 73 6f 6d  onstant" for som
d830: 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20  e definition of 
d840: 63 6f 6e 73 74 61 6e 74 2e 20 20 54 68 65 0a 2a  constant.  The.*
d850: 2a 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76  * Walker.eCode v
d860: 61 6c 75 65 20 64 65 74 65 72 6d 69 6e 65 73 20  alue determines 
d870: 74 68 65 20 74 79 70 65 20 6f 66 20 22 63 6f 6e  the type of "con
d880: 73 74 61 6e 74 22 20 77 65 20 61 72 65 20 6c 6f  stant" we are lo
d890: 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72 2e 0a 2a 2a  oking.** for..**
d8a0: 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 62 61  .** These callba
d8b0: 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  ck routines are 
d8c0: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
d8d0: 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  t the following:
d8e0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  .**.**     sqlit
d8f0: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
d900: 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ()              
d910: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
d920: 64 65 3d 3d 31 0a 2a 2a 20 20 20 20 20 73 71 6c  de==1.**     sql
d930: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
d940: 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20 20 20 20 20  ntNotJoin()     
d950: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
d960: 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20 20 20 20 73  Code==2.**     s
d970: 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62 6c  qlite3ExprIsTabl
d980: 65 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20 20  eConstant()     
d990: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
d9a0: 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a 20 20 20 20  >eCode==3.**    
d9b0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
d9c0: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
d9d0: 28 29 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65  ()        pWalke
d9e0: 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35  r->eCode==4 or 5
d9f0: 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20 63 61  .**.** In all ca
da00: 73 65 73 2c 20 74 68 65 20 63 61 6c 6c 62 61 63  ses, the callbac
da10: 6b 73 20 73 65 74 20 57 61 6c 6b 65 72 2e 65 43  ks set Walker.eC
da20: 6f 64 65 3d 30 20 61 6e 64 20 61 62 6f 72 74 20  ode=0 and abort 
da30: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
da40: 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e 64 20 74 6f  n.** is found to
da50: 20 6e 6f 74 20 62 65 20 61 20 63 6f 6e 73 74 61   not be a consta
da60: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71  nt..**.** The sq
da70: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
da80: 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20  antOrFunction() 
da90: 69 73 20 75 73 65 64 20 66 6f 72 20 65 76 61 6c  is used for eval
daa0: 75 61 74 69 6e 67 20 65 78 70 72 65 73 73 69 6f  uating expressio
dab0: 6e 73 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54  ns.** in a CREAT
dac0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
dad0: 74 2e 20 20 54 68 65 20 57 61 6c 6b 65 72 2e 65  t.  The Walker.e
dae0: 43 6f 64 65 20 76 61 6c 75 65 20 69 73 20 35 20  Code value is 5 
daf0: 77 68 65 6e 20 70 61 72 73 69 6e 67 0a 2a 2a 20  when parsing.** 
db00: 61 6e 20 65 78 69 73 74 69 6e 67 20 73 63 68 65  an existing sche
db10: 6d 61 20 61 6e 64 20 34 20 77 68 65 6e 20 70 72  ma and 4 when pr
db20: 6f 63 65 73 73 69 6e 67 20 61 20 6e 65 77 20 73  ocessing a new s
db30: 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 62 6f 75  tatement.  A bou
db40: 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  nd.** parameter 
db50: 72 61 69 73 65 73 20 61 6e 20 65 72 72 6f 72 20  raises an error 
db60: 66 6f 72 20 6e 65 77 20 73 74 61 74 65 6d 65 6e  for new statemen
db70: 74 73 2c 20 62 75 74 20 69 73 20 73 69 6c 65 6e  ts, but is silen
db80: 74 6c 79 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a  tly converted.**
db90: 20 74 6f 20 4e 55 4c 4c 20 66 6f 72 20 65 78 69   to NULL for exi
dba0: 73 74 69 6e 67 20 73 63 68 65 6d 61 73 2e 20 20  sting schemas.  
dbb0: 54 68 69 73 20 61 6c 6c 6f 77 73 20 73 71 6c 69  This allows sqli
dbc0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73  te_master tables
dbd0: 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6e 74 61 69   that .** contai
dbe0: 6e 20 61 20 62 6f 75 6e 64 20 70 61 72 61 6d 65  n a bound parame
dbf0: 74 65 72 20 62 65 63 61 75 73 65 20 74 68 65 79  ter because they
dc00: 20 77 65 72 65 20 67 65 6e 65 72 61 74 65 64 20   were generated 
dc10: 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e  by older version
dc20: 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 74  s.** of SQLite t
dc30: 6f 20 62 65 20 70 61 72 73 65 64 20 62 79 20 6e  o be parsed by n
dc40: 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  ewer versions of
dc50: 20 53 51 4c 69 74 65 20 77 69 74 68 6f 75 74 20   SQLite without 
dc60: 72 61 69 73 69 6e 67 20 61 0a 2a 2a 20 6d 61 6c  raising a.** mal
dc70: 66 6f 72 6d 65 64 20 73 63 68 65 6d 61 20 65 72  formed schema er
dc80: 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ror..*/.static i
dc90: 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e  nt exprNodeIsCon
dca0: 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57  stant(Walker *pW
dcb0: 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
dcc0: 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70 57  pr){..  /* If pW
dcd0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 69 73 20  alker->eCode is 
dce0: 32 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d 20  2 then any term 
dcf0: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
dd00: 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72 6f  n that comes fro
dd10: 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72  m.  ** the ON or
dd20: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
dd30: 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 64 69  f a left join di
dd40: 73 71 75 61 6c 69 66 69 65 73 20 74 68 65 20 65  squalifies the e
dd50: 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66  xpression.  ** f
dd60: 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69 64  rom being consid
dd70: 65 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a  ered constant. *
dd80: 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d  /.  if( pWalker-
dd90: 3e 65 43 6f 64 65 3d 3d 32 20 26 26 20 45 78 70  >eCode==2 && Exp
dda0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
ddb0: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
ddc0: 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d   ){.    pWalker-
ddd0: 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  >eCode = 0;.    
dde0: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
ddf0: 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28  ;.  }..  switch(
de00: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
de10: 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66 75    /* Consider fu
de20: 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f  nctions to be co
de30: 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20 74 68  nstant if all th
de40: 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20 61 72  eir arguments ar
de50: 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a  e constant.    *
de60: 2a 20 61 6e 64 20 65 69 74 68 65 72 20 70 57 61  * and either pWa
de70: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f  lker->eCode==4 o
de80: 72 20 35 20 6f 72 20 74 68 65 20 66 75 6e 63 74  r 5 or the funct
de90: 69 6f 6e 20 68 61 73 20 74 68 65 0a 20 20 20 20  ion has the.    
dea0: 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43  ** SQLITE_FUNC_C
deb0: 4f 4e 53 54 20 66 6c 61 67 2e 20 2a 2f 0a 20 20  ONST flag. */.  
dec0: 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
ded0: 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57  ON:.      if( pW
dee0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3e 3d 34 20  alker->eCode>=4 
def0: 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  || ExprHasProper
df00: 74 79 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e 73  ty(pExpr,EP_Cons
df10: 74 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20  tFunc) ){.      
df20: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
df30: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c  tinue;.      }el
df40: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 57 61 6c  se{.        pWal
df50: 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a  ker->eCode = 0;.
df60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
df70: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
df80: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44  }.    case TK_ID
df90: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
dfa0: 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  LUMN:.    case T
dfb0: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a  K_AGG_FUNCTION:.
dfc0: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
dfd0: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 74 65  COLUMN:.      te
dfe0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
dff0: 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20  p==TK_ID );.    
e000: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
e010: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
e020: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
e030: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
e040: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
e050: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
e060: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
e070: 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  AGG_COLUMN );.  
e080: 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d      if( pWalker-
e090: 3e 65 43 6f 64 65 3d 3d 33 20 26 26 20 70 45 78  >eCode==3 && pEx
e0a0: 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61 6c  pr->iTable==pWal
e0b0: 6b 65 72 2d 3e 75 2e 69 43 75 72 20 29 7b 0a 20  ker->u.iCur ){. 
e0c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
e0d0: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  C_Continue;.    
e0e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e0f0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
e100: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
e110: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
e120: 20 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20       }.    case 
e130: 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20 20  TK_VARIABLE:.   
e140: 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
e150: 65 43 6f 64 65 3d 3d 35 20 29 7b 0a 20 20 20 20  eCode==5 ){.    
e160: 20 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20      /* Silently 
e170: 63 6f 6e 76 65 72 74 20 62 6f 75 6e 64 20 70 61  convert bound pa
e180: 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 61 70  rameters that ap
e190: 70 65 61 72 20 69 6e 73 69 64 65 20 6f 66 20 43  pear inside of C
e1a0: 52 45 41 54 45 0a 20 20 20 20 20 20 20 20 2a 2a  REATE.        **
e1b0: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 6f   statements into
e1c0: 20 61 20 4e 55 4c 4c 20 77 68 65 6e 20 70 61 72   a NULL when par
e1d0: 73 69 6e 67 20 74 68 65 20 43 52 45 41 54 45 20  sing the CREATE 
e1e0: 73 74 61 74 65 6d 65 6e 74 20 74 65 78 74 20 6f  statement text o
e1f0: 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ut.        ** of
e200: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
e210: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  er table */.    
e220: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
e230: 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d  TK_NULL;.      }
e240: 65 6c 73 65 20 69 66 28 20 70 57 61 6c 6b 65 72  else if( pWalker
e250: 2d 3e 65 43 6f 64 65 3d 3d 34 20 29 7b 0a 20 20  ->eCode==4 ){.  
e260: 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 75 6e 64        /* A bound
e270: 20 70 61 72 61 6d 65 74 65 72 20 69 6e 20 61 20   parameter in a 
e280: 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74  CREATE statement
e290: 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73   that originates
e2a0: 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a   from.        **
e2b0: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
e2c0: 28 29 20 63 61 75 73 65 73 20 61 6e 20 65 72 72  () causes an err
e2d0: 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 57  or */.        pW
e2e0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
e2f0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
e300: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
e310: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c    }.      /* Fal
e320: 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20  l through */.   
e330: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
e340: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
e350: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
e360: 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65 49  ; /* selectNodeI
e370: 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20 64  sConstant will d
e380: 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20  isallow */.     
e390: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
e3a0: 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20  ->op==TK_EXISTS 
e3b0: 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65  ); /* selectNode
e3c0: 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20  IsConstant will 
e3d0: 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20  disallow */.    
e3e0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
e3f0: 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61  tinue;.  }.}.sta
e400: 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 4e 6f  tic int selectNo
e410: 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c  deIsConstant(Wal
e420: 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
e430: 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 29 7b 0a  lect *NotUsed){.
e440: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
e450: 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 70  ER(NotUsed);.  p
e460: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
e470: 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  0;.  return WRC_
e480: 41 62 6f 72 74 3b 0a 7d 0a 73 74 61 74 69 63 20  Abort;.}.static 
e490: 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74 28  int exprIsConst(
e4a0: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e 69  Expr *p, int ini
e4b0: 74 46 6c 61 67 2c 20 69 6e 74 20 69 43 75 72 29  tFlag, int iCur)
e4c0: 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
e4d0: 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69  memset(&w, 0, si
e4e0: 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 65 43  zeof(w));.  w.eC
e4f0: 6f 64 65 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a  ode = initFlag;.
e500: 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
e510: 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  k = exprNodeIsCo
e520: 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c  nstant;.  w.xSel
e530: 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65  ectCallback = se
e540: 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61  lectNodeIsConsta
e550: 6e 74 3b 0a 20 20 77 2e 75 2e 69 43 75 72 20 3d  nt;.  w.u.iCur =
e560: 20 69 43 75 72 3b 0a 20 20 73 71 6c 69 74 65 33   iCur;.  sqlite3
e570: 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b  WalkExpr(&w, p);
e580: 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64  .  return w.eCod
e590: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  e;.}../*.** Walk
e5a0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
e5b0: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  ree.  Return non
e5c0: 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70  -zero if the exp
e5d0: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
e5e0: 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20  ant.** and 0 if 
e5f0: 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69  it involves vari
e600: 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f  ables or functio
e610: 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46  n calls..**.** F
e620: 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
e630: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
e640: 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  , a double-quote
e650: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61  d string (ex: "a
e660: 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  bc").** is consi
e670: 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65  dered a variable
e680: 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75   but a single-qu
e690: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
e6a0: 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20   'abc') is.** a 
e6b0: 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74  constant..*/.int
e6c0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
e6d0: 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29 7b  nstant(Expr *p){
e6e0: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
e6f0: 43 6f 6e 73 74 28 70 2c 20 31 2c 20 30 29 3b 0a  Const(p, 1, 0);.
e700: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
e710: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
e720: 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
e730: 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ro if the expres
e740: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
e750: 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  .** that does no
e760: 20 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d 20   originate from 
e770: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
e780: 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69  clauses of a joi
e790: 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69  n..** Return 0 i
e7a0: 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61  f it involves va
e7b0: 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74  riables or funct
e7c0: 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65 72  ion calls or ter
e7d0: 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e  ms from.** an ON
e7e0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
e7f0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
e800: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
e810: 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a  tJoin(Expr *p){.
e820: 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43    return exprIsC
e830: 6f 6e 73 74 28 70 2c 20 32 2c 20 30 29 3b 0a 7d  onst(p, 2, 0);.}
e840: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
e850: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
e860: 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72    Return non-zer
e870: 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  o if the express
e880: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
e890: 2a 2a 20 66 6f 72 20 61 6e 79 20 73 69 6e 67 6c  ** for any singl
e8a0: 65 20 72 6f 77 20 6f 66 20 74 68 65 20 74 61 62  e row of the tab
e8b0: 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 20 69  le with cursor i
e8c0: 43 75 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  Cur.  In other w
e8d0: 6f 72 64 73 2c 20 74 68 65 0a 2a 2a 20 65 78 70  ords, the.** exp
e8e0: 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 6e 6f 74  ression must not
e8f0: 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20 6e 6f   refer to any no
e900: 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20  n-deterministic 
e910: 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 20 61 6e 79  function nor any
e920: 0a 2a 2a 20 74 61 62 6c 65 20 6f 74 68 65 72 20  .** table other 
e930: 74 68 61 6e 20 69 43 75 72 2e 0a 2a 2f 0a 69 6e  than iCur..*/.in
e940: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54  t sqlite3ExprIsT
e950: 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 45 78 70  ableConstant(Exp
e960: 72 20 2a 70 2c 20 69 6e 74 20 69 43 75 72 29 7b  r *p, int iCur){
e970: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
e980: 43 6f 6e 73 74 28 70 2c 20 33 2c 20 69 43 75 72  Const(p, 3, iCur
e990: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  );.}../*.** Walk
e9a0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
e9b0: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  ree.  Return non
e9c0: 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70  -zero if the exp
e9d0: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
e9e0: 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63  ant.** or a func
e9f0: 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63  tion call with c
ea00: 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
ea10: 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30  s.  Return and 0
ea20: 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
ea30: 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a   any variables..
ea40: 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
ea50: 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66  rposes of this f
ea60: 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c  unction, a doubl
ea70: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
ea80: 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69  (ex: "abc").** i
ea90: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76  s considered a v
eaa0: 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69  ariable but a si
eab0: 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  ngle-quoted stri
eac0: 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69  ng (ex: 'abc') i
ead0: 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e  s.** a constant.
eae0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
eaf0: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46  xprIsConstantOrF
eb00: 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 2c  unction(Expr *p,
eb10: 20 75 38 20 69 73 49 6e 69 74 29 7b 0a 20 20 61   u8 isInit){.  a
eb20: 73 73 65 72 74 28 20 69 73 49 6e 69 74 3d 3d 30  ssert( isInit==0
eb30: 20 7c 7c 20 69 73 49 6e 69 74 3d 3d 31 20 29 3b   || isInit==1 );
eb40: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
eb50: 43 6f 6e 73 74 28 70 2c 20 34 2b 69 73 49 6e 69  Const(p, 4+isIni
eb60: 74 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 64 65 66  t, 0);.}..#ifdef
eb70: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
eb80: 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a  URSOR_HINTS./*.*
eb90: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
eba0: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
ebb0: 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72  rn 1 if the expr
ebc0: 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  ession contains 
ebd0: 61 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 6f 66  a.** subquery of
ebe0: 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 52 65 74   some kind.  Ret
ebf0: 75 72 6e 20 30 20 69 66 20 74 68 65 72 65 20 61  urn 0 if there a
ec00: 72 65 20 6e 6f 20 73 75 62 71 75 65 72 69 65 73  re no subqueries
ec10: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ec20: 45 78 70 72 43 6f 6e 74 61 69 6e 73 53 75 62 71  ExprContainsSubq
ec30: 75 65 72 79 28 45 78 70 72 20 2a 70 29 7b 0a 20  uery(Expr *p){. 
ec40: 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d   Walker w;.  mem
ec50: 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
ec60: 66 28 77 29 29 3b 0a 20 20 77 2e 65 43 6f 64 65  f(w));.  w.eCode
ec70: 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70 72 43   = 1;.  w.xExprC
ec80: 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65  allback = sqlite
ec90: 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20  3ExprWalkNoop;. 
eca0: 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
ecb0: 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49  ck = selectNodeI
ecc0: 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 73 71 6c  sConstant;.  sql
ecd0: 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
ece0: 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e   p);.  return w.
ecf0: 65 43 6f 64 65 3d 3d 30 3b 0a 7d 0a 23 65 6e 64  eCode==0;.}.#end
ed00: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
ed10: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f   expression p co
ed20: 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69  des a constant i
ed30: 6e 74 65 67 65 72 20 74 68 61 74 20 69 73 20 73  nteger that is s
ed40: 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74  mall enough.** t
ed50: 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69  o fit in a 32-bi
ed60: 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72  t integer, retur
ed70: 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68 65 20  n 1 and put the 
ed80: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74  value of the int
ed90: 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c  eger.** in *pVal
eda0: 75 65 2e 20 20 49 66 20 74 68 65 20 65 78 70 72  ue.  If the expr
edb0: 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e  ession is not an
edc0: 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69   integer or if i
edd0: 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20  t is too big.** 
ede0: 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e  to fit in a sign
edf0: 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65  ed 32-bit intege
ee00: 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20  r, return 0 and 
ee10: 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e  leave *pValue un
ee20: 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20  changed..*/.int 
ee30: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
ee40: 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e  eger(Expr *p, in
ee50: 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e  t *pValue){.  in
ee60: 74 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  t rc = 0;..  /* 
ee70: 49 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  If an expression
ee80: 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6c   is an integer l
ee90: 69 74 65 72 61 6c 20 74 68 61 74 20 66 69 74 73  iteral that fits
eea0: 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d   in a signed 32-
eeb0: 62 69 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72  bit.  ** integer
eec0: 2c 20 74 68 65 6e 20 74 68 65 20 45 50 5f 49 6e  , then the EP_In
eed0: 74 56 61 6c 75 65 20 66 6c 61 67 20 77 69 6c 6c  tValue flag will
eee0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
eef0: 65 6e 20 73 65 74 20 2a 2f 0a 20 20 61 73 73 65  en set */.  asse
ef00: 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e  rt( p->op!=TK_IN
ef10: 54 45 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c 61  TEGER || (p->fla
ef20: 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
ef30: 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
ef40: 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  || sqlite3GetInt
ef50: 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  32(p->u.zToken, 
ef60: 26 72 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  &rc)==0 );..  if
ef70: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ( p->flags & EP_
ef80: 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  IntValue ){.    
ef90: 2a 70 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69  *pValue = p->u.i
efa0: 56 61 6c 75 65 3b 0a 20 20 20 20 72 65 74 75 72  Value;.    retur
efb0: 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  n 1;.  }.  switc
efc0: 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
efd0: 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b  case TK_UPLUS: {
efe0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
eff0: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
f000: 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75  (p->pLeft, pValu
f010: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
f020: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
f030: 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
f040: 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20     int v;.      
f050: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
f060: 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66  sInteger(p->pLef
f070: 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20  t, &v) ){.      
f080: 20 20 61 73 73 65 72 74 28 20 76 21 3d 28 2d 32    assert( v!=(-2
f090: 31 34 37 34 38 33 36 34 37 2d 31 29 20 29 3b 0a  147483647-1) );.
f0a0: 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20          *pValue 
f0b0: 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 63  = -v;.        rc
f0c0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
f0d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f0e0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72  .    default: br
f0f0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
f100: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
f110: 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74  eturn FALSE if t
f120: 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63  here is no chanc
f130: 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65  e that the expre
f140: 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c  ssion can be NUL
f150: 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  L..**.** If the 
f160: 65 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74  expression might
f170: 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74   be NULL or if t
f180: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
f190: 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20   too complex.** 
f1a0: 74 6f 20 74 65 6c 6c 20 72 65 74 75 72 6e 20 54  to tell return T
f1b0: 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  RUE.  .**.** Thi
f1c0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
f1d0: 64 20 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  d as an optimiza
f1e0: 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50  tion, to skip OP
f1f0: 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a  _IsNull opcodes.
f200: 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20  ** when we know 
f210: 74 68 61 74 20 61 20 76 61 6c 75 65 20 63 61 6e  that a value can
f220: 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65  not be NULL.  He
f230: 6e 63 65 2c 20 61 20 66 61 6c 73 65 20 70 6f 73  nce, a false pos
f240: 69 74 69 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e  itive.** (return
f250: 69 6e 67 20 54 52 55 45 20 77 68 65 6e 20 69 6e  ing TRUE when in
f260: 20 66 61 63 74 20 74 68 65 20 65 78 70 72 65 73   fact the expres
f270: 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20 62  sion can never b
f280: 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a  e NULL) might.**
f290: 20 62 65 20 61 20 73 6d 61 6c 6c 20 70 65 72 66   be a small perf
f2a0: 6f 72 6d 61 6e 63 65 20 68 69 74 20 62 75 74 20  ormance hit but 
f2b0: 69 73 20 6f 74 68 65 72 77 69 73 65 20 68 61 72  is otherwise har
f2c0: 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f  mless.  On the o
f2d0: 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20  ther.** hand, a 
f2e0: 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 20 28  false negative (
f2f0: 72 65 74 75 72 6e 69 6e 67 20 46 41 4c 53 45 20  returning FALSE 
f300: 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  when the result 
f310: 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a  could be NULL).*
f320: 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65  * will likely re
f330: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72  sult in an incor
f340: 72 65 63 74 20 61 6e 73 77 65 72 2e 20 20 53 6f  rect answer.  So
f350: 20 77 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20   when in doubt, 
f360: 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a  return.** TRUE..
f370: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
f380: 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73  prCanBeNull(cons
f390: 74 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 75 38  t Expr *p){.  u8
f3a0: 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d   op;.  while( p-
f3b0: 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c  >op==TK_UPLUS ||
f3c0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55   p->op==TK_UMINU
f3d0: 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66  S ){ p = p->pLef
f3e0: 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f  t; }.  op = p->o
f3f0: 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  p;.  if( op==TK_
f400: 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20  REGISTER ) op = 
f410: 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68  p->op2;.  switch
f420: 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
f430: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20   TK_INTEGER:.   
f440: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
f450: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
f460: 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AT:.    case TK_
f470: 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75  BLOB:.      retu
f480: 72 6e 20 30 3b 0a 20 20 20 20 63 61 73 65 20 54  rn 0;.    case T
f490: 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20  K_COLUMN:.      
f4a0: 61 73 73 65 72 74 28 20 70 2d 3e 70 54 61 62 21  assert( p->pTab!
f4b0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  =0 );.      retu
f4c0: 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  rn ExprHasProper
f4d0: 74 79 28 70 2c 20 45 50 5f 43 61 6e 42 65 4e 75  ty(p, EP_CanBeNu
f4e0: 6c 6c 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ll) ||.         
f4f0: 20 20 20 20 28 70 2d 3e 69 43 6f 6c 75 6d 6e 3e      (p->iColumn>
f500: 3d 30 20 26 26 20 70 2d 3e 70 54 61 62 2d 3e 61  =0 && p->pTab->a
f510: 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  Col[p->iColumn].
f520: 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 3b 0a 20 20 20  notNull==0);.   
f530: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
f540: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a  return 1;.  }.}.
f550: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
f560: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
f570: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
f580: 63 6f 6e 73 74 61 6e 74 20 77 68 69 63 68 20 77  constant which w
f590: 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 6e 63 68 61  ould be.** uncha
f5a0: 6e 67 65 64 20 62 79 20 4f 50 5f 41 66 66 69 6e  nged by OP_Affin
f5b0: 69 74 79 20 77 69 74 68 20 74 68 65 20 61 66 66  ity with the aff
f5c0: 69 6e 69 74 79 20 67 69 76 65 6e 20 69 6e 20 74  inity given in t
f5d0: 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67  he second.** arg
f5e0: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ument..**.** Thi
f5f0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
f600: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
f610: 66 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74  f the OP_Affinit
f620: 79 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 63  y operation.** c
f630: 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e 20 20  an be omitted.  
f640: 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 20 72 65  When in doubt re
f650: 74 75 72 6e 20 46 41 4c 53 45 2e 20 20 41 20 66  turn FALSE.  A f
f660: 61 6c 73 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a  alse negative.**
f670: 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 20 20 41   is harmless.  A
f680: 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2c   false positive,
f690: 20 68 6f 77 65 76 65 72 2c 20 63 61 6e 20 72 65   however, can re
f6a0: 73 75 6c 74 20 69 6e 20 74 68 65 20 77 72 6f 6e  sult in the wron
f6b0: 67 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a  g.** answer..*/.
f6c0: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 4e  int sqlite3ExprN
f6d0: 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68  eedsNoAffinityCh
f6e0: 61 6e 67 65 28 63 6f 6e 73 74 20 45 78 70 72 20  ange(const Expr 
f6f0: 2a 70 2c 20 63 68 61 72 20 61 66 66 29 7b 0a 20  *p, char aff){. 
f700: 20 75 38 20 6f 70 3b 0a 20 20 69 66 28 20 61 66   u8 op;.  if( af
f710: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  f==SQLITE_AFF_BL
f720: 4f 42 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  OB ) return 1;. 
f730: 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54   while( p->op==T
f740: 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70  K_UPLUS || p->op
f750: 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70  ==TK_UMINUS ){ p
f760: 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20   = p->pLeft; }. 
f770: 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69   op = p->op;.  i
f780: 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  f( op==TK_REGIST
f790: 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32  ER ) op = p->op2
f7a0: 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
f7b0: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  {.    case TK_IN
f7c0: 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 72  TEGER: {.      r
f7d0: 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54  eturn aff==SQLIT
f7e0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c  E_AFF_INTEGER ||
f7f0: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
f800: 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a  _NUMERIC;.    }.
f810: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41      case TK_FLOA
f820: 54 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  T: {.      retur
f830: 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  n aff==SQLITE_AF
f840: 46 5f 52 45 41 4c 20 7c 7c 20 61 66 66 3d 3d 53  F_REAL || aff==S
f850: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
f860: 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  C;.    }.    cas
f870: 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20  e TK_STRING: {. 
f880: 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d       return aff=
f890: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
f8a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
f8b0: 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20   TK_BLOB: {.    
f8c0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
f8d0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
f8e0: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61 73  LUMN: {.      as
f8f0: 73 65 72 74 28 20 70 2d 3e 69 54 61 62 6c 65 3e  sert( p->iTable>
f900: 3d 30 20 29 3b 20 20 2f 2a 20 70 20 63 61 6e 6e  =0 );  /* p cann
f910: 6f 74 20 62 65 20 70 61 72 74 20 6f 66 20 61 20  ot be part of a 
f920: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
f930: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
f940: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20   p->iColumn<0.  
f950: 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d          && (aff=
f960: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45  =SQLITE_AFF_INTE
f970: 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  GER || aff==SQLI
f980: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 29 3b  TE_AFF_NUMERIC);
f990: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
f9a0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  lt: {.      retu
f9b0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
f9c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
f9d0: 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65  TRUE if the give
f9e0: 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f  n string is a ro
f9f0: 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  w-id column name
fa00: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
fa10: 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68  IsRowid(const ch
fa20: 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71  ar *z){.  if( sq
fa30: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
fa40: 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20  "_ROWID_")==0 ) 
fa50: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
fa60: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
fa70: 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20  , "ROWID")==0 ) 
fa80: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
fa90: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
faa0: 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65  , "OID")==0 ) re
fab0: 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
fac0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 58 20   0;.}../*.** pX 
fad0: 69 73 20 74 68 65 20 52 48 53 20 6f 66 20 61 6e  is the RHS of an
fae0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 49   IN operator.  I
faf0: 66 20 70 58 20 69 73 20 61 20 53 45 4c 45 43 54  f pX is a SELECT
fb00: 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 74   statement .** t
fb10: 68 61 74 20 63 61 6e 20 62 65 20 73 69 6d 70 6c  hat can be simpl
fb20: 69 66 69 65 64 20 74 6f 20 61 20 64 69 72 65 63  ified to a direc
fb30: 74 20 74 61 62 6c 65 20 61 63 63 65 73 73 2c 20  t table access, 
fb40: 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a 2a 20 61  then return.** a
fb50: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
fb60: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
fb70: 2e 20 20 49 66 20 70 58 20 69 73 20 6e 6f 74 20  .  If pX is not 
fb80: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
fb90: 6e 74 2c 0a 2a 2a 20 6f 72 20 69 66 20 74 68 65  nt,.** or if the
fba0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
fbb0: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6d 61  t needs to be ma
fbc0: 6e 69 66 65 73 74 65 64 20 69 6e 74 6f 20 61 20  nifested into a 
fbd0: 74 72 61 6e 73 69 65 6e 74 0a 2a 2a 20 74 61 62  transient.** tab
fbe0: 6c 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  le, then return 
fbf0: 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  NULL..*/.#ifndef
fc00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
fc10: 51 55 45 52 59 0a 73 74 61 74 69 63 20 53 65 6c  QUERY.static Sel
fc20: 65 63 74 20 2a 69 73 43 61 6e 64 69 64 61 74 65  ect *isCandidate
fc30: 46 6f 72 49 6e 4f 70 74 28 45 78 70 72 20 2a 70  ForInOpt(Expr *p
fc40: 58 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b  X){.  Select *p;
fc50: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
fc60: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
fc70: 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70  List;.  Table *p
fc80: 54 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Tab;.  int i;.  
fc90: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
fca0: 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53  erty(pX, EP_xIsS
fcb0: 65 6c 65 63 74 29 20 29 20 72 65 74 75 72 6e 20  elect) ) return 
fcc0: 30 3b 20 20 2f 2a 20 4e 6f 74 20 61 20 73 75 62  0;  /* Not a sub
fcd0: 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 45  query */.  if( E
fce0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
fcf0: 58 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29  X, EP_VarSelect)
fd00: 20 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f    ) return 0;  /
fd10: 2a 20 43 6f 72 72 65 6c 61 74 65 64 20 73 75 62  * Correlated sub
fd20: 71 20 2a 2f 0a 20 20 70 20 3d 20 70 58 2d 3e 78  q */.  p = pX->x
fd30: 2e 70 53 65 6c 65 63 74 3b 0a 20 20 69 66 28 20  .pSelect;.  if( 
fd40: 70 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74 75  p->pPrior ) retu
fd50: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
fd60: 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d 70     /* Not a comp
fd70: 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20  ound SELECT */. 
fd80: 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
fd90: 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
fda0: 53 46 5f 41 67 67 72 65 67 61 74 65 29 20 29 7b  SF_Aggregate) ){
fdb0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28  .    testcase( (
fdc0: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  p->selFlags & (S
fdd0: 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
fde0: 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69  gregate))==SF_Di
fdf0: 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 74 65  stinct );.    te
fe00: 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46  stcase( (p->selF
fe10: 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
fe20: 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
fe30: 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65  ))==SF_Aggregate
fe40: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   );.    return 0
fe50: 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49 4e 43 54  ; /* No DISTINCT
fe60: 20 6b 65 79 77 6f 72 64 20 61 6e 64 20 6e 6f 20   keyword and no 
fe70: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
fe80: 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73  ons */.  }.  ass
fe90: 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79  ert( p->pGroupBy
fea0: 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  ==0 );          
feb0: 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 47 52      /* Has no GR
fec0: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  OUP BY clause */
fed0: 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74  .  if( p->pLimit
fee0: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
fef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
ff00: 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73 65   no LIMIT clause
ff10: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
ff20: 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20  >pOffset==0 );  
ff30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ff40: 4e 6f 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 6e  No LIMIT means n
ff50: 6f 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69 66  o OFFSET */.  if
ff60: 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65  ( p->pWhere ) re
ff70: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
ff80: 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 57       /* Has no W
ff90: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
ffa0: 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
ffb0: 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21  .  assert( pSrc!
ffc0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 53 72 63  =0 );.  if( pSrc
ffd0: 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75  ->nSrc!=1 ) retu
ffe0: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f  rn 0;          /
fff0: 2a 20 53 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e  * Single term in
10000 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
10010 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d    if( pSrc->a[0]
10020 2e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75 72  .pSelect ) retur
10030 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  n 0;     /* FROM
10040 20 69 73 20 6e 6f 74 20 61 20 73 75 62 71 75 65   is not a subque
10050 72 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20  ry or view */.  
10060 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30  pTab = pSrc->a[0
10070 5d 2e 70 54 61 62 3b 0a 20 20 61 73 73 65 72 74  ].pTab;.  assert
10080 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61  ( pTab!=0 );.  a
10090 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70 53 65  ssert( pTab->pSe
100a0 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20 20 20 20  lect==0 );      
100b0 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c        /* FROM cl
100c0 61 75 73 65 20 69 73 20 6e 6f 74 20 61 20 76 69  ause is not a vi
100d0 65 77 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69  ew */.  if( IsVi
100e0 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65  rtual(pTab) ) re
100f0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 2f  turn 0;        /
10100 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e 6f  * FROM clause no
10110 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t a virtual tabl
10120 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20  e */.  pEList = 
10130 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73 73  p->pEList;.  ass
10140 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
10150 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 20 53 45 4c 45  ;..  /* All SELE
10160 43 54 20 72 65 73 75 6c 74 73 20 6d 75 73 74 20  CT results must 
10170 62 65 20 63 6f 6c 75 6d 6e 73 2e 20 2a 2f 0a 20  be columns. */. 
10180 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
10190 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
101a0 0a 20 20 20 20 45 78 70 72 20 2a 70 52 65 73 20  .    Expr *pRes 
101b0 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
101c0 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 52  Expr;.    if( pR
101d0 65 73 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  es->op!=TK_COLUM
101e0 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  N ) return 0;.  
101f0 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e    assert( pRes->
10200 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b  iTable==pSrc->a[
10210 30 5d 2e 69 43 75 72 73 6f 72 20 29 3b 20 20 2f  0].iCursor );  /
10220 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61 74  * Not a correlat
10230 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  ed subquery */. 
10240 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
10250 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
10260 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
10270 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61  */../*.** Code a
10280 6e 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75  n OP_Once instru
10290 63 74 69 6f 6e 20 61 6e 64 20 61 6c 6c 6f 63 61  ction and alloca
102a0 74 65 20 73 70 61 63 65 20 66 6f 72 20 69 74 73  te space for its
102b0 20 66 6c 61 67 2e 20 52 65 74 75 72 6e 20 74 68   flag. Return th
102c0 65 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f 66  e .** address of
102d0 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75 63   the new instruc
102e0 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
102f0 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 50 61 72  ite3CodeOnce(Par
10300 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56  se *pParse){.  V
10310 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
10320 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
10330 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c        /* Virtual
10340 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63   machine being c
10350 6f 64 65 64 20 2a 2f 0a 20 20 72 65 74 75 72 6e  oded */.  return
10360 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10370 70 31 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20 70  p1(v, OP_Once, p
10380 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 2b 2b 29 3b  Parse->nOnce++);
10390 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
103a0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
103b0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
103c0 63 6f 64 65 20 74 68 61 74 20 63 68 65 63 6b 73  code that checks
103d0 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63   the left-most c
103e0 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74  olumn of index t
103f0 61 62 6c 65 20 69 43 75 72 20 74 6f 20 73 65 65  able iCur to see
10400 20 69 66 0a 2a 2a 20 69 74 20 63 6f 6e 74 61 69   if.** it contai
10410 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 65 6e 74 72  ns any NULL entr
10420 69 65 73 2e 20 20 43 61 75 73 65 20 74 68 65 20  ies.  Cause the 
10430 72 65 67 69 73 74 65 72 20 61 74 20 72 65 67 48  register at regH
10440 61 73 4e 75 6c 6c 20 74 6f 20 62 65 20 73 65 74  asNull to be set
10450 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c  .** to a non-NUL
10460 4c 20 76 61 6c 75 65 20 69 66 20 69 43 75 72 20  L value if iCur 
10470 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c  contains no NULL
10480 73 2e 20 20 43 61 75 73 65 20 72 65 67 69 73 74  s.  Cause regist
10490 65 72 20 72 65 67 48 61 73 4e 75 6c 6c 0a 2a 2a  er regHasNull.**
104a0 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20 4e 55   to be set to NU
104b0 4c 4c 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61  LL if iCur conta
104c0 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
104d0 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a  NULL values..*/.
104e0 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
104f0 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61  te3SetHasNullFla
10500 67 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  g(Vdbe *v, int i
10510 43 75 72 2c 20 69 6e 74 20 72 65 67 48 61 73 4e  Cur, int regHasN
10520 75 6c 6c 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  ull){.  int addr
10530 31 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  1;.  sqlite3Vdbe
10540 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
10550 65 67 65 72 2c 20 30 2c 20 72 65 67 48 61 73 4e  eger, 0, regHasN
10560 75 6c 6c 29 3b 0a 20 20 61 64 64 72 31 20 3d 20  ull);.  addr1 = 
10570 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10580 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  1(v, OP_Rewind, 
10590 69 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72  iCur); VdbeCover
105a0 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
105b0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
105c0 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c 20  P_Column, iCur, 
105d0 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a  0, regHasNull);.
105e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
105f0 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
10600 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 56 64  TYPEOFARG);.  Vd
10610 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66  beComment((v, "f
10620 69 72 73 74 5f 65 6e 74 72 79 5f 69 6e 28 25 64  irst_entry_in(%d
10630 29 22 2c 20 69 43 75 72 29 29 3b 0a 20 20 73 71  )", iCur));.  sq
10640 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
10650 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 7d 0a 23  e(v, addr1);.}.#
10660 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20  endif...#ifndef 
10670 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
10680 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  UERY./*.** The a
10690 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 49 4e  rgument is an IN
106a0 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 61   operator with a
106b0 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75 62   list (not a sub
106c0 71 75 65 72 79 29 20 6f 6e 20 74 68 65 20 0a 2a  query) on the .*
106d0 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  * right-hand sid
106e0 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  e.  Return TRUE 
106f0 69 66 20 74 68 61 74 20 6c 69 73 74 20 69 73 20  if that list is 
10700 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 73 74 61  constant..*/.sta
10710 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 49  tic int sqlite3I
10720 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 45  nRhsIsConstant(E
10730 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 45 78 70  xpr *pIn){.  Exp
10740 72 20 2a 70 4c 48 53 3b 0a 20 20 69 6e 74 20 72  r *pLHS;.  int r
10750 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45  es;.  assert( !E
10760 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
10770 49 6e 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  In, EP_xIsSelect
10780 29 20 29 3b 0a 20 20 70 4c 48 53 20 3d 20 70 49  ) );.  pLHS = pI
10790 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20 70 49 6e 2d  n->pLeft;.  pIn-
107a0 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 72 65  >pLeft = 0;.  re
107b0 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49  s = sqlite3ExprI
107c0 73 43 6f 6e 73 74 61 6e 74 28 70 49 6e 29 3b 0a  sConstant(pIn);.
107d0 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 70    pIn->pLeft = p
107e0 4c 48 53 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  LHS;.  return re
107f0 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  s;.}.#endif../*.
10800 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
10810 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
10820 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
10830 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20 6f  f the IN (...) o
10840 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 54 68 65 20  perator..** The 
10850 70 58 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  pX parameter is 
10860 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  the expression o
10870 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  n the RHS of the
10880 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 68   IN operator, wh
10890 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20  ich.** might be 
108a0 65 69 74 68 65 72 20 61 20 6c 69 73 74 20 6f 66  either a list of
108b0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20   expressions or 
108c0 61 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  a subquery..**.*
108d0 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69  * The job of thi
108e0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20  s routine is to 
108f0 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61  find or create a
10900 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74   b-tree object t
10910 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73  hat can.** be us
10920 65 64 20 65 69 74 68 65 72 20 74 6f 20 74 65 73  ed either to tes
10930 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70  t for membership
10940 20 69 6e 20 74 68 65 20 52 48 53 20 73 65 74 20   in the RHS set 
10950 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  or to iterate th
10960 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65 6d  rough.** all mem
10970 62 65 72 73 20 6f 66 20 74 68 65 20 52 48 53 20  bers of the RHS 
10980 73 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 64 75  set, skipping du
10990 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  plicates..**.** 
109a0 41 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e  A cursor is open
109b0 65 64 20 6f 6e 20 74 68 65 20 62 2d 74 72 65 65  ed on the b-tree
109c0 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20   object that is 
109d0 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
109e0 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 61 6e  N operator.** an
109f0 64 20 70 58 2d 3e 69 54 61 62 6c 65 20 69 73 20  d pX->iTable is 
10a00 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78  set to the index
10a10 20 6f 66 20 74 68 61 74 20 63 75 72 73 6f 72 2e   of that cursor.
10a20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
10a30 6e 65 64 20 76 61 6c 75 65 20 6f 66 20 74 68 69  ned value of thi
10a40 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69 63  s function indic
10a50 61 74 65 73 20 74 68 65 20 62 2d 74 72 65 65 20  ates the b-tree 
10a60 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  type, as follows
10a70 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  :.**.**   IN_IND
10a80 45 58 5f 52 4f 57 49 44 20 20 20 20 20 20 2d 20  EX_ROWID      - 
10a90 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
10aa0 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62  pened on a datab
10ab0 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20  ase table..**   
10ac0 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41  IN_INDEX_INDEX_A
10ad0 53 43 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72  SC  - The cursor
10ae0 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
10af0 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65  n ascending inde
10b00 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  x..**   IN_INDEX
10b10 5f 49 4e 44 45 58 5f 44 45 53 43 20 2d 20 54 68  _INDEX_DESC - Th
10b20 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
10b30 6e 65 64 20 6f 6e 20 61 20 64 65 73 63 65 6e 64  ned on a descend
10b40 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20  ing index..**   
10b50 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20 20 20 20  IN_INDEX_EPH    
10b60 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72      - The cursor
10b70 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
10b80 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65 61 74   specially creat
10b90 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  ed and.**       
10ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bb0 20 20 70 6f 70 75 6c 61 74 65 64 20 65 70 68 65    populated ephe
10bc0 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20  remal table..** 
10bd0 20 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20    IN_INDEX_NOOP 
10be0 20 20 20 20 20 20 2d 20 4e 6f 20 63 75 72 73 6f        - No curso
10bf0 72 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 2e  r was allocated.
10c00 20 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74 6f    The IN operato
10c10 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 20 20 20  r must be.**    
10c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c30 20 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74 65 64       implemented
10c40 20 61 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f   as a sequence o
10c50 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 2a  f comparisons..*
10c60 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67  *.** An existing
10c70 20 62 2d 74 72 65 65 20 6d 69 67 68 74 20 62 65   b-tree might be
10c80 20 75 73 65 64 20 69 66 20 74 68 65 20 52 48 53   used if the RHS
10c90 20 65 78 70 72 65 73 73 69 6f 6e 20 70 58 20 69   expression pX i
10ca0 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 73 75  s a simple.** su
10cb0 62 71 75 65 72 79 20 73 75 63 68 20 61 73 3a 0a  bquery such as:.
10cc0 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
10cd0 20 3c 63 6f 6c 75 6d 6e 31 3e 2c 20 3c 63 6f 6c   <column1>, <col
10ce0 75 6d 6e 32 3e 2e 2e 2e 20 46 52 4f 4d 20 3c 74  umn2>... FROM <t
10cf0 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  able>.**.** If t
10d00 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
10d10 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c   operator is a l
10d20 69 73 74 20 6f 72 20 61 20 6d 6f 72 65 20 63 6f  ist or a more co
10d30 6d 70 6c 65 78 20 73 75 62 71 75 65 72 79 2c 20  mplex subquery, 
10d40 74 68 65 6e 0a 2a 2a 20 61 6e 20 65 70 68 65 6d  then.** an ephem
10d50 65 72 61 6c 20 74 61 62 6c 65 20 6d 69 67 68 74  eral table might
10d60 20 6e 65 65 64 20 74 6f 20 62 65 20 67 65 6e 65   need to be gene
10d70 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 52  rated from the R
10d80 48 53 20 61 6e 64 20 74 68 65 6e 0a 2a 2a 20 70  HS and then.** p
10d90 58 2d 3e 69 54 61 62 6c 65 20 6d 61 64 65 20 74  X->iTable made t
10da0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 65  o point to the e
10db0 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69  phemeral table i
10dc0 6e 73 74 65 61 64 20 6f 66 20 61 6e 0a 2a 2a 20  nstead of an.** 
10dd0 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 2e 0a  existing table..
10de0 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 46 6c 61 67  **.** The inFlag
10df0 73 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73 74  s parameter must
10e00 20 63 6f 6e 74 61 69 6e 20 65 78 61 63 74 6c 79   contain exactly
10e10 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 69 74 73   one of the bits
10e20 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d  .** IN_INDEX_MEM
10e30 42 45 52 53 48 49 50 20 6f 72 20 49 4e 5f 49 4e  BERSHIP or IN_IN
10e40 44 45 58 5f 4c 4f 4f 50 2e 20 20 49 66 20 69 6e  DEX_LOOP.  If in
10e50 46 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 0a 2a  Flags contains.*
10e60 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45  * IN_INDEX_MEMBE
10e70 52 53 48 49 50 2c 20 74 68 65 6e 20 74 68 65 20  RSHIP, then the 
10e80 67 65 6e 65 72 61 74 65 64 20 74 61 62 6c 65 20  generated table 
10e90 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72  will be used for
10ea0 20 61 0a 2a 2a 20 66 61 73 74 20 6d 65 6d 62 65   a.** fast membe
10eb0 72 73 68 69 70 20 74 65 73 74 2e 20 20 57 68 65  rship test.  Whe
10ec0 6e 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4c  n the IN_INDEX_L
10ed0 4f 4f 50 20 62 69 74 20 69 73 20 73 65 74 2c 20  OOP bit is set, 
10ee0 74 68 65 0a 2a 2a 20 49 4e 20 69 6e 64 65 78 20  the.** IN index 
10ef0 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
10f00 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 76 61  loop over all va
10f10 6c 75 65 73 20 6f 66 20 74 68 65 20 52 48 53 20  lues of the RHS 
10f20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 20 6f 70 65  of the.** IN ope
10f30 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  rator..**.** Whe
10f40 6e 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20  n IN_INDEX_LOOP 
10f50 69 73 20 75 73 65 64 20 28 61 6e 64 20 74 68 65  is used (and the
10f60 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20   b-tree will be 
10f70 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 0a  used to iterate.
10f80 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65 20 73  ** through the s
10f90 65 74 20 6d 65 6d 62 65 72 73 29 20 74 68 65 6e  et members) then
10fa0 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 73 74   the b-tree must
10fb0 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 64 75 70   not contain dup
10fc0 6c 69 63 61 74 65 73 2e 0a 2a 2a 20 41 6e 20 65  licates..** An e
10fd0 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d  pheremal table m
10fe0 75 73 74 20 62 65 20 75 73 65 64 20 75 6e 6c 65  ust be used unle
10ff0 73 73 20 74 68 65 20 73 65 6c 65 63 74 65 64 20  ss the selected 
11000 63 6f 6c 75 6d 6e 73 20 61 72 65 20 67 75 61 72  columns are guar
11010 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  anteed.** to be 
11020 75 6e 69 71 75 65 20 2d 20 65 69 74 68 65 72 20  unique - either 
11030 62 65 63 61 75 73 65 20 69 74 20 69 73 20 61 6e  because it is an
11040 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
11050 20 4b 45 59 20 6f 72 20 64 75 65 20 74 6f 0a 2a   KEY or due to.*
11060 2a 20 61 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  * a UNIQUE const
11070 72 61 69 6e 74 20 6f 72 20 69 6e 64 65 78 2e 0a  raint or index..
11080 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e  **.** When IN_IN
11090 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 69  DEX_MEMBERSHIP i
110a0 73 20 75 73 65 64 20 28 61 6e 64 20 74 68 65 20  s used (and the 
110b0 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75  b-tree will be u
110c0 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74  sed .** for fast
110d0 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20   set membership 
110e0 74 65 73 74 73 29 20 74 68 65 6e 20 61 6e 20 65  tests) then an e
110f0 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d  pheremal table m
11100 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64 20  ust .** be used 
11110 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 73 3e  unless <columns>
11120 20 69 73 20 61 20 73 69 6e 67 6c 65 20 49 4e 54   is a single INT
11130 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
11140 20 63 6f 6c 75 6d 6e 20 6f 72 20 61 6e 20 0a 2a   column or an .*
11150 2a 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 66  * index can be f
11160 6f 75 6e 64 20 77 69 74 68 20 74 68 65 20 73 70  ound with the sp
11170 65 63 69 66 69 65 64 20 3c 63 6f 6c 75 6d 6e 73  ecified <columns
11180 3e 20 61 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f  > as its left-mo
11190 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  st..**.** If the
111a0 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f   IN_INDEX_NOOP_O
111b0 4b 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4d  K and IN_INDEX_M
111c0 45 4d 42 45 52 53 48 49 50 20 61 72 65 20 62 6f  EMBERSHIP are bo
111d0 74 68 20 73 65 74 20 61 6e 64 0a 2a 2a 20 69 66  th set and.** if
111e0 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
111f0 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61  IN operator is a
11200 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75 62   list (not a sub
11210 71 75 65 72 79 29 20 74 68 65 6e 20 74 68 69 73  query) then this
11220 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  .** routine migh
11230 74 20 64 65 63 69 64 65 20 74 68 61 74 20 63 72  t decide that cr
11240 65 61 74 69 6e 67 20 61 6e 20 65 70 68 65 6d 65  eating an epheme
11250 72 61 6c 20 62 2d 74 72 65 65 20 66 6f 72 20 6d  ral b-tree for m
11260 65 6d 62 65 72 73 68 69 70 0a 2a 2a 20 74 65 73  embership.** tes
11270 74 69 6e 67 20 69 73 20 74 6f 6f 20 65 78 70 65  ting is too expe
11280 6e 73 69 76 65 20 61 6e 64 20 72 65 74 75 72 6e  nsive and return
11290 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 20   IN_INDEX_NOOP. 
112a0 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
112b0 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f  he.** calling ro
112c0 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 69 6d 70  utine should imp
112d0 6c 65 6d 65 6e 74 20 74 68 65 20 49 4e 20 6f 70  lement the IN op
112e0 65 72 61 74 6f 72 20 75 73 69 6e 67 20 61 20 73  erator using a s
112f0 65 71 75 65 6e 63 65 0a 2a 2a 20 6f 66 20 45 71  equence.** of Eq
11300 20 6f 72 20 4e 65 20 63 6f 6d 70 61 72 69 73 6f   or Ne compariso
11310 6e 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a  n operations..**
11320 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 62 2d 74  .** When the b-t
11330 72 65 65 20 69 73 20 62 65 69 6e 67 20 75 73 65  ree is being use
11340 64 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70  d for membership
11350 20 74 65 73 74 73 2c 20 74 68 65 20 63 61 6c 6c   tests, the call
11360 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ing function.** 
11370 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 6b 6e  might need to kn
11380 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ow whether or no
11390 74 20 74 68 65 20 52 48 53 20 73 69 64 65 20 6f  t the RHS side o
113a0 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
113b0 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20  r.** contains a 
113c0 4e 55 4c 4c 2e 20 20 49 66 20 70 72 52 68 73 48  NULL.  If prRhsH
113d0 61 73 4e 75 6c 6c 20 69 73 20 6e 6f 74 20 61 20  asNull is not a 
113e0 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61 6e 64  NULL pointer and
113f0 20 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73   .** if there is
11400 20 61 6e 79 20 63 68 61 6e 63 65 20 74 68 61 74   any chance that
11410 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68 74   the (...) might
11420 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20   contain a NULL 
11430 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74  value at.** runt
11440 69 6d 65 2c 20 74 68 65 6e 20 61 20 72 65 67 69  ime, then a regi
11450 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65  ster is allocate
11460 64 20 61 6e 64 20 74 68 65 20 72 65 67 69 73 74  d and the regist
11470 65 72 20 6e 75 6d 62 65 72 20 77 72 69 74 74 65  er number writte
11480 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52 68 73 48 61  n.** to *prRhsHa
11490 73 4e 75 6c 6c 2e 20 49 66 20 74 68 65 72 65 20  sNull. If there 
114a0 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61  is no chance tha
114b0 74 20 74 68 65 20 28 2e 2e 2e 29 20 63 6f 6e 74  t the (...) cont
114c0 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76  ains a.** NULL v
114d0 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72 52 68  alue, then *prRh
114e0 73 48 61 73 4e 75 6c 6c 20 69 73 20 6c 65 66 74  sHasNull is left
114f0 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a   unchanged..**.*
11500 2a 20 49 66 20 61 20 72 65 67 69 73 74 65 72 20  * If a register 
11510 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
11520 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20 73 74   its location st
11530 6f 72 65 64 20 69 6e 20 2a 70 72 52 68 73 48 61  ored in *prRhsHa
11540 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a 2a 2a 20 74  sNull, then.** t
11550 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 61 74  he value in that
11560 20 72 65 67 69 73 74 65 72 20 77 69 6c 6c 20 62   register will b
11570 65 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 62 2d  e NULL if the b-
11580 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  tree contains on
11590 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 4e 55 4c  e or more.** NUL
115a0 4c 20 76 61 6c 75 65 73 2c 20 61 6e 64 20 69 74  L values, and it
115b0 20 77 69 6c 6c 20 62 65 20 73 6f 6d 65 20 6e 6f   will be some no
115c0 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66 20  n-NULL value if 
115d0 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61  the b-tree conta
115e0 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55 4c 4c 20 76  ins no.** NULL v
115f0 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alues..**.** If 
11600 74 68 65 20 61 69 4d 61 70 20 70 61 72 61 6d 65  the aiMap parame
11610 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ter is not NULL,
11620 20 69 74 20 6d 75 73 74 20 70 6f 69 6e 74 20 74   it must point t
11630 6f 20 61 6e 20 61 72 72 61 79 20 63 6f 6e 74 61  o an array conta
11640 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65 6c 65  ining.** one ele
11650 6d 65 6e 74 20 66 6f 72 20 65 61 63 68 20 63 6f  ment for each co
11660 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64 20 62 79  lumn returned by
11670 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
11680 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 52 48 53  ement on the RHS
11690 0a 2a 2a 20 6f 66 20 74 68 65 20 49 4e 28 2e 2e  .** of the IN(..
116a0 2e 29 20 6f 70 65 72 61 74 6f 72 2e 20 54 68 65  .) operator. The
116b0 20 69 27 74 68 20 65 6e 74 72 79 20 6f 66 20 74   i'th entry of t
116c0 68 65 20 61 72 72 61 79 20 69 73 20 70 6f 70 75  he array is popu
116d0 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 2a  lated with the.*
116e0 2a 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20  * offset of the 
116f0 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68 61  index column tha
11700 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 69 27  t matches the i'
11710 74 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e  th column return
11720 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 53 45 4c  ed by the.** SEL
11730 45 43 54 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ECT. For example
11740 2c 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  , if the express
11750 69 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 65 64  ion and selected
11760 20 69 6e 64 65 78 20 61 72 65 3a 0a 2a 2a 0a 2a   index are:.**.*
11770 2a 20 20 20 28 3f 2c 3f 2c 3f 29 20 49 4e 20 28  *   (?,?,?) IN (
11780 53 45 4c 45 43 54 20 61 2c 20 62 2c 20 63 20 46  SELECT a, b, c F
11790 52 4f 4d 20 74 31 29 0a 2a 2a 20 20 20 43 52 45  ROM t1).**   CRE
117a0 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
117b0 74 31 28 62 2c 20 63 2c 20 61 29 3b 0a 2a 2a 0a  t1(b, c, a);.**.
117c0 2a 2a 20 74 68 65 6e 20 61 69 4d 61 70 5b 5d 20  ** then aiMap[] 
117d0 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
117e0 68 20 7b 32 2c 20 30 2c 20 31 7d 2e 0a 2a 2f 0a  h {2, 0, 1}..*/.
117f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11800 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74  MIT_SUBQUERY.int
11810 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
11820 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
11830 61 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70  arse, .  Expr *p
11840 58 2c 20 0a 20 20 75 33 32 20 69 6e 46 6c 61 67  X, .  u32 inFlag
11850 73 2c 20 0a 20 20 69 6e 74 20 2a 70 72 52 68 73  s, .  int *prRhs
11860 48 61 73 4e 75 6c 6c 2c 0a 20 20 69 6e 74 20 2a  HasNull,.  int *
11870 61 69 4d 61 70 0a 29 7b 0a 20 20 53 65 6c 65 63  aiMap.){.  Selec
11880 74 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  t *p;           
11890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118a0 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f 20 74 68   /* SELECT to th
118b0 65 20 72 69 67 68 74 20 6f 66 20 49 4e 20 6f 70  e right of IN op
118c0 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
118d0 65 54 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20  eType = 0;      
118e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118f0 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 52 48 53    /* Type of RHS
11900 20 74 61 62 6c 65 2e 20 49 4e 5f 49 4e 44 45 58   table. IN_INDEX
11910 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  _* */.  int iTab
11920 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
11930 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  +;            /*
11940 20 43 75 72 73 6f 72 20 6f 66 20 74 68 65 20 52   Cursor of the R
11950 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  HS table */.  in
11960 74 20 6d 75 73 74 42 65 55 6e 69 71 75 65 3b 20  t mustBeUnique; 
11970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11980 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 52      /* True if R
11990 48 53 20 6d 75 73 74 20 62 65 20 75 6e 69 71 75  HS must be uniqu
119a0 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  e */.  Vdbe *v =
119b0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
119c0 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20  pParse);     /* 
119d0 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  Virtual machine 
119e0 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 0a  being coded */..
119f0 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70    assert( pX->op
11a00 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 6d 75 73  ==TK_IN );.  mus
11a10 74 42 65 55 6e 69 71 75 65 20 3d 20 28 69 6e 46  tBeUnique = (inF
11a20 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f  lags & IN_INDEX_
11a30 4c 4f 4f 50 29 21 3d 30 3b 0a 0a 20 20 2f 2a 20  LOOP)!=0;..  /* 
11a40 49 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  If the RHS of th
11a50 69 73 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61  is IN(...) opera
11a60 74 6f 72 20 69 73 20 61 20 53 45 4c 45 43 54 2c  tor is a SELECT,
11a70 20 61 6e 64 20 69 66 20 69 74 20 6d 61 74 74 65   and if it matte
11a80 72 73 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72  rs .  ** whether
11a90 20 6f 72 20 6e 6f 74 20 74 68 65 20 53 45 4c 45   or not the SELE
11aa0 43 54 20 72 65 73 75 6c 74 20 63 6f 6e 74 61 69  CT result contai
11ab0 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20  ns NULL values, 
11ac0 63 68 65 63 6b 20 77 68 65 74 68 65 72 0a 20 20  check whether.  
11ad0 2a 2a 20 6f 72 20 6e 6f 74 20 4e 55 4c 4c 20 69  ** or not NULL i
11ae0 73 20 61 63 74 75 61 6c 6c 79 20 70 6f 73 73 69  s actually possi
11af0 62 6c 65 20 28 69 74 20 6d 61 79 20 6e 6f 74 20  ble (it may not 
11b00 62 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  be, for example,
11b10 20 64 75 65 20 0a 20 20 2a 2a 20 74 6f 20 4e 4f   due .  ** to NO
11b20 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e  T NULL constrain
11b30 74 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61  ts in the schema
11b40 29 2e 20 49 66 20 6e 6f 20 4e 55 4c 4c 20 76 61  ). If no NULL va
11b50 6c 75 65 73 20 61 72 65 20 70 6f 73 73 69 62 6c  lues are possibl
11b60 65 2c 0a 20 20 2a 2a 20 73 65 74 20 70 72 52 68  e,.  ** set prRh
11b70 73 48 61 73 4e 75 6c 6c 20 74 6f 20 30 20 62 65  sHasNull to 0 be
11b80 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e  fore continuing.
11b90 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 52 68 73    */.  if( prRhs
11ba0 48 61 73 4e 75 6c 6c 20 26 26 20 28 70 58 2d 3e  HasNull && (pX->
11bb0 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65  flags & EP_xIsSe
11bc0 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69 6e 74  lect) ){.    int
11bd0 20 69 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   i;.    ExprList
11be0 20 2a 70 45 4c 69 73 74 20 3d 20 70 58 2d 3e 78   *pEList = pX->x
11bf0 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
11c00 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
11c10 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
11c20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
11c30 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65  sqlite3ExprCanBe
11c40 4e 75 6c 6c 28 70 45 4c 69 73 74 2d 3e 61 5b 69  Null(pEList->a[i
11c50 5d 2e 70 45 78 70 72 29 20 29 20 62 72 65 61 6b  ].pExpr) ) break
11c60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11c70 69 3d 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  i==pEList->nExpr
11c80 20 29 7b 0a 20 20 20 20 20 20 70 72 52 68 73 48   ){.      prRhsH
11c90 61 73 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  asNull = 0;.    
11ca0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  }.  }..  /* Chec
11cb0 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 20 65  k to see if an e
11cc0 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72  xisting table or
11cd0 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73   index can be us
11ce0 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69 73  ed to.  ** satis
11cf0 66 79 20 74 68 65 20 71 75 65 72 79 2e 20 20 54  fy the query.  T
11d00 68 69 73 20 69 73 20 70 72 65 66 65 72 61 62 6c  his is preferabl
11d10 65 20 74 6f 20 67 65 6e 65 72 61 74 69 6e 67 20  e to generating 
11d20 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68 65  a new .  ** ephe
11d30 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 20 2a 2f  meral table.  */
11d40 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
11d50 45 72 72 3d 3d 30 20 26 26 20 28 70 20 3d 20 69  Err==0 && (p = i
11d60 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
11d70 70 74 28 70 58 29 29 21 3d 30 20 29 7b 0a 20 20  pt(pX))!=0 ){.  
11d80 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
11d90 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
11da0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
11db0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
11dc0 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  */.    Table *pT
11dd0 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
11de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11df0 20 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e 20   Table <table>. 
11e00 2a 2f 0a 20 20 20 20 69 31 36 20 69 44 62 3b 20  */.    i16 iDb; 
11e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11e30 20 44 61 74 61 62 61 73 65 20 69 64 78 20 66 6f   Database idx fo
11e40 72 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 45 78  r pTab */.    Ex
11e50 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
11e60 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20   p->pEList;.    
11e70 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 45 4c 69  int nExpr = pELi
11e80 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 20 20  st->nExpr;..    
11e90 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
11ea0 74 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  t!=0 );         
11eb0 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f      /* Because o
11ec0 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72  f isCandidateFor
11ed0 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20  InOpt(p) */.    
11ee0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
11ef0 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30  t->a[0].pExpr!=0
11f00 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 6f   ); /* Because o
11f10 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72  f isCandidateFor
11f20 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20  InOpt(p) */.    
11f30 61 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63 21  assert( p->pSrc!
11f40 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
11f50 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f      /* Because o
11f60 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72  f isCandidateFor
11f70 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20  InOpt(p) */.    
11f80 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  pTab = p->pSrc->
11f90 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 20 20  a[0].pTab;..    
11fa0 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54 72  /* Code an OP_Tr
11fb0 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 4f 50  ansaction and OP
11fc0 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c  _TableLock for <
11fd0 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69  table>. */.    i
11fe0 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
11ff0 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
12000 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
12010 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
12020 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
12030 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
12040 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
12050 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
12060 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
12070 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  Name);..    /* T
12080 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
12090 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d  only called from
120a0 20 74 77 6f 20 70 6c 61 63 65 73 2e 20 49 6e 20   two places. In 
120b0 62 6f 74 68 20 63 61 73 65 73 20 74 68 65 20 76  both cases the v
120c0 64 62 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 61  dbe.    ** has a
120d0 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
120e0 63 61 74 65 64 2e 20 53 6f 20 61 73 73 75 6d 65  cated. So assume
120f0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
12100 29 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20  ) is always.    
12110 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 68 65  ** successful he
12120 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  re..    */.    a
12130 73 73 65 72 74 28 76 29 3b 0a 20 20 20 20 69 66  ssert(v);.    if
12140 28 20 6e 45 78 70 72 3d 3d 31 20 26 26 20 70 45  ( nExpr==1 && pE
12150 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
12160 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
12170 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78 20 49       /* The "x I
12180 4e 20 28 53 45 4c 45 43 54 20 72 6f 77 69 64 20  N (SELECT rowid 
12190 46 52 4f 4d 20 74 61 62 6c 65 29 22 20 63 61 73  FROM table)" cas
121a0 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  e */.      int i
121b0 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f  Addr = sqlite3Co
121c0 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a  deOnce(pParse);.
121d0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
121e0 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 73 71  ge(v);..      sq
121f0 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
12200 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62  Parse, iTab, iDb
12210 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52  , pTab, OP_OpenR
12220 65 61 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70  ead);.      eTyp
12230 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  e = IN_INDEX_ROW
12240 49 44 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  ID;..      sqlit
12250 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
12260 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65  , iAddr);.    }e
12270 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  lse{.      Index
12280 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
12290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122a0 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
122b0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  able */.      in
122c0 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20  t affinity_ok = 
122d0 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  1;.      int i;.
122e0 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
122f0 74 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74  that the affinit
12300 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75  y that will be u
12310 73 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 65  sed to perform e
12320 61 63 68 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  ach .      ** co
12330 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20  mparison is the 
12340 73 61 6d 65 20 61 73 20 74 68 65 20 61 66 66 69  same as the affi
12350 6e 69 74 79 20 6f 66 20 65 61 63 68 20 63 6f 6c  nity of each col
12360 75 6d 6e 20 69 6e 20 74 61 62 6c 65 0a 20 20 20  umn in table.   
12370 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 52 48 53     ** on the RHS
12380 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
12390 74 6f 72 2e 20 20 49 66 20 69 74 20 6e 6f 74 2c  tor.  If it not,
123a0 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
123b0 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ble to.      ** 
123c0 75 73 65 20 61 6e 79 20 69 6e 64 65 78 20 6f 66  use any index of
123d0 20 74 68 65 20 52 48 53 20 74 61 62 6c 65 2e 20   the RHS table. 
123e0 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   */.      for(i=
123f0 30 3b 20 69 3c 6e 45 78 70 72 20 26 26 20 61 66  0; i<nExpr && af
12400 66 69 6e 69 74 79 5f 6f 6b 3b 20 69 2b 2b 29 7b  finity_ok; i++){
12410 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
12420 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 56 65 63  Lhs = sqlite3Vec
12430 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
12440 70 58 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20  pX->pLeft, i);. 
12450 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20         int iCol 
12460 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
12470 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
12480 20 20 20 20 20 20 20 63 68 61 72 20 69 64 78 61         char idxa
12490 66 66 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ff = pTab->aCol[
124a0 69 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 3b 20  iCol].affinity; 
124b0 20 2f 2a 20 52 48 53 20 74 61 62 6c 65 20 61 66   /* RHS table af
124c0 66 69 6e 69 74 79 20 2a 2f 0a 20 20 20 20 20 20  finity */.      
124d0 20 20 63 68 61 72 20 63 6d 70 61 66 66 20 3d 20    char cmpaff = 
124e0 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
124f0 66 69 6e 69 74 79 28 70 4c 68 73 2c 20 69 64 78  finity(pLhs, idx
12500 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 74 65  aff);.        te
12510 73 74 63 61 73 65 28 20 63 6d 70 61 66 66 3d 3d  stcase( cmpaff==
12520 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
12530 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
12540 61 73 65 28 20 63 6d 70 61 66 66 3d 3d 53 51 4c  ase( cmpaff==SQL
12550 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a  ITE_AFF_TEXT );.
12560 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20          switch( 
12570 63 6d 70 61 66 66 20 29 7b 0a 20 20 20 20 20 20  cmpaff ){.      
12580 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
12590 41 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20  AFF_BLOB:.      
125a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
125b0 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
125c0 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20  TE_AFF_TEXT:.   
125d0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
125e0 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
125f0 74 79 28 29 20 6f 6e 6c 79 20 72 65 74 75 72 6e  ty() only return
12600 73 20 54 45 58 54 20 69 66 20 6f 6e 65 20 73 69  s TEXT if one si
12610 64 65 20 6f 72 20 74 68 65 0a 20 20 20 20 20 20  de or the.      
12620 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 68        ** other h
12630 61 73 20 6e 6f 20 61 66 66 69 6e 69 74 79 20 61  as no affinity a
12640 6e 64 20 74 68 65 20 6f 74 68 65 72 20 73 69 64  nd the other sid
12650 65 20 69 73 20 54 45 58 54 2e 20 20 48 65 6e 63  e is TEXT.  Henc
12660 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  e,.            *
12670 2a 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 66  * the only way f
12680 6f 72 20 63 6d 70 61 66 66 20 74 6f 20 62 65 20  or cmpaff to be 
12690 54 45 58 54 20 69 73 20 66 6f 72 20 69 64 78 61  TEXT is for idxa
126a0 66 66 20 74 6f 20 62 65 20 54 45 58 54 0a 20 20  ff to be TEXT.  
126b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64            ** and
126c0 20 66 6f 72 20 74 68 65 20 74 65 72 6d 20 6f 6e   for the term on
126d0 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   the LHS of the 
126e0 49 4e 20 74 6f 20 68 61 76 65 20 6e 6f 20 61 66  IN to have no af
126f0 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 20  finity. */.     
12700 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
12710 64 78 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  dxaff==SQLITE_AF
12720 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 20 20  F_TEXT );.      
12730 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12740 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a         default:.
12750 20 20 20 20 20 20 20 20 20 20 20 20 61 66 66 69              affi
12760 6e 69 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65  nity_ok = sqlite
12770 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
12780 74 79 28 69 64 78 61 66 66 29 3b 0a 20 20 20 20  ty(idxaff);.    
12790 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
127a0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c       /* The coll
127b0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75  ation sequence u
127c0 73 65 64 20 62 79 20 74 68 65 20 63 6f 6d 70 61  sed by the compa
127d0 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20 69 6e 64  rison. If an ind
127e0 65 78 20 69 73 20 74 6f 0a 20 20 20 20 20 20 2a  ex is to.      *
127f0 2a 20 62 65 20 75 73 65 64 20 69 6e 20 70 6c 61  * be used in pla
12800 63 65 20 6f 66 20 61 20 74 65 6d 70 2d 74 61 62  ce of a temp-tab
12810 6c 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20 6f  le, it must be o
12820 72 64 65 72 65 64 20 61 63 63 6f 72 64 69 6e 67  rdered according
12830 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 69  .      ** to thi
12840 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  s collation sequ
12850 65 6e 63 65 2e 20 20 2a 2f 0a 0a 20 20 20 20 20  ence.  */..     
12860 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
12870 70 49 6e 64 65 78 3b 20 70 49 64 78 20 26 26 20  pIndex; pIdx && 
12880 65 54 79 70 65 3d 3d 30 20 26 26 20 61 66 66 69  eType==0 && affi
12890 6e 69 74 79 5f 6f 6b 3b 20 70 49 64 78 3d 70 49  nity_ok; pIdx=pI
128a0 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
128b0 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b      if( pIdx->nK
128c0 65 79 43 6f 6c 3c 6e 45 78 70 72 20 29 20 63 6f  eyCol<nExpr ) co
128d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
128e0 69 66 28 20 6d 75 73 74 42 65 55 6e 69 71 75 65  if( mustBeUnique
128f0 20 26 26 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43   && (pIdx->nKeyC
12900 6f 6c 21 3d 6e 45 78 70 72 20 7c 7c 20 21 49 73  ol!=nExpr || !Is
12910 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78  UniqueIndex(pIdx
12920 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  )) ){.          
12930 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
12940 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 66 6f 72    }..        for
12950 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
12960 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  ++){.          E
12970 78 70 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69  xpr *pLhs = sqli
12980 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
12990 62 65 78 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c  bexpr(pX->pLeft,
129a0 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 45   i);.          E
129b0 78 70 72 20 2a 70 52 68 73 20 3d 20 70 45 4c 69  xpr *pRhs = pELi
129c0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
129d0 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65            CollSe
129e0 71 20 2a 70 52 65 71 20 3d 20 73 71 6c 69 74 65  q *pReq = sqlite
129f0 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
12a00 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
12a10 68 73 2c 20 70 52 68 73 29 3b 0a 20 20 20 20 20  hs, pRhs);.     
12a20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 20       int j;..   
12a30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
12a40 52 65 71 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  Req || pParse->n
12a50 45 72 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Err );.         
12a60 20 69 66 28 20 70 52 65 71 3d 3d 30 20 29 20 62   if( pReq==0 ) b
12a70 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 20  reak;..         
12a80 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 78 70   for(j=0; j<nExp
12a90 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; j++){.       
12aa0 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
12ab0 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70 52 68 73  iColumn[j]!=pRhs
12ac0 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74  ->iColumn ) cont
12ad0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
12ae0 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
12af0 61 7a 43 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20 20 20  azColl[j] );.   
12b00 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
12b10 69 74 65 33 53 74 72 49 43 6d 70 28 70 52 65 71  ite3StrICmp(pReq
12b20 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61  ->zName, pIdx->a
12b30 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63  zColl[j])!=0 ) c
12b40 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
12b50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
12b60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12b70 20 20 69 66 28 20 6a 3d 3d 6e 45 78 70 72 20 29    if( j==nExpr )
12b80 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
12b90 20 20 69 66 28 20 61 69 4d 61 70 20 29 20 61 69    if( aiMap ) ai
12ba0 4d 61 70 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20  Map[i] = j;.    
12bb0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
12bc0 66 28 20 69 3d 3d 6e 45 78 70 72 20 29 7b 0a 20  f( i==nExpr ){. 
12bd0 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64           int iAd
12be0 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  dr = sqlite3Code
12bf0 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56 64  Once(pParse); Vd
12c00 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
12c10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
12c20 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
12c30 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54 61 62 2c  _OpenRead, iTab,
12c40 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62   pIdx->tnum, iDb
12c50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
12c60 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
12c70 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  Info(pParse, pId
12c80 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64  x);.          Vd
12c90 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
12ca0 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  s", pIdx->zName)
12cb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
12cc0 65 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  ert( IN_INDEX_IN
12cd0 44 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e 5f 49  DEX_DESC == IN_I
12ce0 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 2b 31  NDEX_INDEX_ASC+1
12cf0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 54   );.          eT
12d00 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49  ype = IN_INDEX_I
12d10 4e 44 45 58 5f 41 53 43 20 2b 20 70 49 64 78 2d  NDEX_ASC + pIdx-
12d20 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 3b 0a  >aSortOrder[0];.
12d30 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
12d40 72 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 20  rRhsHasNull ){. 
12d50 20 20 20 20 20 20 20 20 20 20 20 2a 70 72 52 68             *prRh
12d60 73 48 61 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61  sHasNull = ++pPa
12d70 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 23 69 66 64 65  rse->nMem;.#ifde
12d80 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
12d90 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b  COLUMN_USED_MASK
12da0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 36 34  .            i64
12db0 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 6e 45 78 70   mask = (1<<nExp
12dc0 72 29 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  r)-1;.          
12dd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12de0 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f  Op4Dup8(v, OP_Co
12df0 6c 75 6d 6e 73 55 73 65 64 2c 20 0a 20 20 20 20  lumnsUsed, .    
12e00 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62              iTab
12e10 2c 20 30 2c 20 30 2c 20 28 75 38 2a 29 26 6d 61  , 0, 0, (u8*)&ma
12e20 73 6b 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23  sk, P4_INT64);.#
12e30 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
12e40 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 29    if( nExpr==1 )
12e50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
12e60 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c  sqlite3SetHasNul
12e70 6c 46 6c 61 67 28 76 2c 20 69 54 61 62 2c 20 2a  lFlag(v, iTab, *
12e80 70 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20  prRhsHasNull);. 
12e90 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
12ea0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12eb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
12ec0 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29  mpHere(v, iAddr)
12ed0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12ee0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
12ef0 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65 65 78 69   /* If no preexi
12f00 73 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 61  sting index is a
12f10 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65  vailable for the
12f20 20 49 4e 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20   IN clause.  ** 
12f30 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  and IN_INDEX_NOO
12f40 50 20 69 73 20 61 6e 20 61 6c 6c 6f 77 65 64 20  P is an allowed 
12f50 72 65 70 6c 79 0a 20 20 2a 2a 20 61 6e 64 20 74  reply.  ** and t
12f60 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
12f70 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c   operator is a l
12f80 69 73 74 2c 20 6e 6f 74 20 61 20 73 75 62 71 75  ist, not a subqu
12f90 65 72 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ery.  ** and the
12fa0 20 52 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 73   RHS is not cons
12fb0 74 61 6e 74 20 6f 72 20 68 61 73 20 74 77 6f 20  tant or has two 
12fc0 6f 72 20 66 65 77 65 72 20 74 65 72 6d 73 2c 0a  or fewer terms,.
12fd0 20 20 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20    ** then it is 
12fe0 6e 6f 74 20 77 6f 72 74 68 20 63 72 65 61 74 69  not worth creati
12ff0 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  ng an ephemeral 
13000 74 61 62 6c 65 20 74 6f 20 65 76 61 6c 75 61 74  table to evaluat
13010 65 0a 20 20 2a 2a 20 74 68 65 20 49 4e 20 6f 70  e.  ** the IN op
13020 65 72 61 74 6f 72 20 73 6f 20 72 65 74 75 72 6e  erator so return
13030 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a   IN_INDEX_NOOP..
13040 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
13050 3d 3d 30 0a 20 20 20 26 26 20 28 69 6e 46 6c 61  ==0.   && (inFla
13060 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  gs & IN_INDEX_NO
13070 4f 50 5f 4f 4b 29 0a 20 20 20 26 26 20 21 45 78  OP_OK).   && !Ex
13080 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
13090 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 0a  , EP_xIsSelect).
130a0 20 20 20 26 26 20 28 21 73 71 6c 69 74 65 33 49     && (!sqlite3I
130b0 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 70  nRhsIsConstant(p
130c0 58 29 20 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69 73  X) || pX->x.pLis
130d0 74 2d 3e 6e 45 78 70 72 3c 3d 32 29 0a 20 20 29  t->nExpr<=2).  )
130e0 7b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e  {.    eType = IN
130f0 5f 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d  _INDEX_NOOP;.  }
13100 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30  ..  if( eType==0
13110 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64   ){.    /* Could
13120 20 6e 6f 74 20 66 69 6e 64 20 61 6e 20 65 78 69   not find an exi
13130 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69  sting table or i
13140 6e 64 65 78 20 74 6f 20 75 73 65 20 61 73 20 74  ndex to use as t
13150 68 65 20 52 48 53 20 62 2d 74 72 65 65 2e 0a 20  he RHS b-tree.. 
13160 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61     ** We will ha
13170 76 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ve to generate a
13180 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
13190 65 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e  e to do the job.
131a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 33 32 20  .    */.    u32 
131b0 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20  savedNQueryLoop 
131c0 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79  = pParse->nQuery
131d0 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 72 4d  Loop;.    int rM
131e0 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a  ayHaveNull = 0;.
131f0 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
13200 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20 20 69 66  NDEX_EPH;.    if
13210 28 20 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49  ( inFlags & IN_I
13220 4e 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20  NDEX_LOOP ){.   
13230 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
13240 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20  yLoop = 0;.     
13250 20 69 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e   if( pX->pLeft->
13260 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78  iColumn<0 && !Ex
13270 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
13280 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
13290 29 7b 0a 20 20 20 20 20 20 20 20 65 54 79 70 65  ){.        eType
132a0 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49   = IN_INDEX_ROWI
132b0 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  D;.      }.    }
132c0 65 6c 73 65 20 69 66 28 20 70 72 52 68 73 48 61  else if( prRhsHa
132d0 73 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2a  sNull ){.      *
132e0 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 72  prRhsHasNull = r
132f0 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b  MayHaveNull = ++
13300 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
13310 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43    }.    sqlite3C
13320 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
13330 72 73 65 2c 20 70 58 2c 20 72 4d 61 79 48 61 76  rse, pX, rMayHav
13340 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e  eNull, eType==IN
13350 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20  _INDEX_ROWID);. 
13360 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
13370 79 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e 51 75  yLoop = savedNQu
13380 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65  eryLoop;.  }else
13390 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61 62 6c 65  {.    pX->iTable
133a0 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 0a 20 20   = iTab;.  }..  
133b0 69 66 28 20 61 69 4d 61 70 20 26 26 20 65 54 79  if( aiMap && eTy
133c0 70 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  pe!=IN_INDEX_IND
133d0 45 58 5f 41 53 43 20 26 26 20 65 54 79 70 65 21  EX_ASC && eType!
133e0 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f  =IN_INDEX_INDEX_
133f0 44 45 53 43 20 29 7b 0a 20 20 20 20 69 6e 74 20  DESC ){.    int 
13400 69 2c 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 73 71  i, n;.    n = sq
13410 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
13420 69 7a 65 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a  ize(pX->pLeft);.
13430 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
13440 3b 20 69 2b 2b 29 20 61 69 4d 61 70 5b 69 5d 20  ; i++) aiMap[i] 
13450 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = i;.  }.  retur
13460 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69  n eType;.}.#endi
13470 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
13480 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
13490 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  /*.** Argument p
134a0 45 78 70 72 20 69 73 20 61 6e 20 28 3f 2c 20 3f  Expr is an (?, ?
134b0 2e 2e 2e 29 20 49 4e 28 2e 2e 2e 29 20 65 78 70  ...) IN(...) exp
134c0 72 65 73 73 69 6f 6e 2e 20 54 68 69 73 20 0a 2a  ression. This .*
134d0 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  * function alloc
134e0 61 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73  ates and returns
134f0 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
13500 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  d string contain
13510 69 6e 67 20 0a 2a 2a 20 74 68 65 20 61 66 66 69  ing .** the affi
13520 6e 69 74 69 65 73 20 74 6f 20 62 65 20 75 73 65  nities to be use
13530 64 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  d for each colum
13540 6e 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  n of the compari
13550 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  son..**.** It is
13560 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
13570 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
13580 72 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  r to ensure that
13590 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a   the returned.**
135a0 20 73 74 72 69 6e 67 20 69 73 20 65 76 65 6e 74   string is event
135b0 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e  ually freed usin
135c0 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  g sqlite3DbFree(
135d0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  )..*/.static cha
135e0 72 20 2a 65 78 70 72 49 4e 41 66 66 69 6e 69 74  r *exprINAffinit
135f0 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
13600 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
13610 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
13620 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69  Expr->pLeft;.  i
13630 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65  nt nVal = sqlite
13640 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
13650 70 4c 65 66 74 29 3b 0a 20 20 53 65 6c 65 63 74  pLeft);.  Select
13660 20 2a 70 53 65 6c 65 63 74 20 3d 20 28 70 45 78   *pSelect = (pEx
13670 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78  pr->flags & EP_x
13680 49 73 53 65 6c 65 63 74 29 20 3f 20 70 45 78 70  IsSelect) ? pExp
13690 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3a 20 30  r->x.pSelect : 0
136a0 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a  ;.  char *zRet;.
136b0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
136c0 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op==TK_IN );. 
136d0 20 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44   zRet = sqlite3D
136e0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
136f0 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2b 31 29 3b  se->db, nVal+1);
13700 0a 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0a 20  .  if( zRet ){. 
13710 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
13720 72 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69  r(i=0; i<nVal; i
13730 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
13740 2a 70 41 20 3d 20 73 71 6c 69 74 65 33 56 65 63  *pA = sqlite3Vec
13750 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
13760 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20  pLeft, i);.     
13770 20 63 68 61 72 20 61 20 3d 20 73 71 6c 69 74 65   char a = sqlite
13780 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 41  3ExprAffinity(pA
13790 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  );.      if( pSe
137a0 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
137b0 7a 52 65 74 5b 69 5d 20 3d 20 73 71 6c 69 74 65  zRet[i] = sqlite
137c0 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
137d0 28 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  (pSelect->pEList
137e0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 61 29  ->a[i].pExpr, a)
137f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13800 20 20 20 20 20 20 20 7a 52 65 74 5b 69 5d 20 3d         zRet[i] =
13810 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   a;.      }.    
13820 7d 0a 20 20 20 20 7a 52 65 74 5b 6e 56 61 6c 5d  }.    zRet[nVal]
13830 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 72   = '\0';.  }.  r
13840 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65  eturn zRet;.}.#e
13850 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
13860 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
13870 52 59 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68  RY./*.** Load th
13880 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 70  e Parse object p
13890 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
138a0 73 74 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68  st argument with
138b0 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65   an error .** me
138c0 73 73 61 67 65 20 6f 66 20 74 68 65 20 66 6f 72  ssage of the for
138d0 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d  m:.**.**   "sub-
138e0 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20 4e  select returns N
138f0 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63   columns - expec
13900 74 65 64 20 4d 22 0a 2a 2f 20 20 20 0a 76 6f 69  ted M".*/   .voi
13910 64 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65  d sqlite3Subsele
13920 63 74 45 72 72 6f 72 28 50 61 72 73 65 20 2a 70  ctError(Parse *p
13930 50 61 72 73 65 2c 20 69 6e 74 20 6e 41 63 74 75  Parse, int nActu
13940 61 6c 2c 20 69 6e 74 20 6e 45 78 70 65 63 74 29  al, int nExpect)
13950 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
13960 7a 46 6d 74 20 3d 20 22 73 75 62 2d 73 65 6c 65  zFmt = "sub-sele
13970 63 74 20 72 65 74 75 72 6e 73 20 25 64 20 63 6f  ct returns %d co
13980 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64  lumns - expected
13990 20 25 64 22 3b 0a 20 20 73 71 6c 69 74 65 33 45   %d";.  sqlite3E
139a0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
139b0 7a 46 6d 74 2c 20 6e 41 63 74 75 61 6c 2c 20 6e  zFmt, nActual, n
139c0 45 78 70 65 63 74 29 3b 0a 7d 0a 23 65 6e 64 69  Expect);.}.#endi
139d0 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  f../*.** Generat
139e0 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61  e code for scala
139f0 72 20 73 75 62 71 75 65 72 69 65 73 20 75 73 65  r subqueries use
13a00 64 20 61 73 20 61 20 73 75 62 71 75 65 72 79 20  d as a subquery 
13a10 65 78 70 72 65 73 73 69 6f 6e 2c 20 45 58 49 53  expression, EXIS
13a20 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70 65  TS,.** or IN ope
13a30 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65  rators.  Example
13a40 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45  s:.**.**     (SE
13a50 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
13a60 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75          -- subqu
13a70 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54  ery.**     EXIST
13a80 53 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  S (SELECT a FROM
13a90 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20   b)   -- EXISTS 
13aa0 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20  subquery.**     
13ab0 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20  x IN (4,5,11)   
13ac0 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e             -- IN
13ad0 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c   operator with l
13ae0 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e  ist on right-han
13af0 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20  d side.**     x 
13b00 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f  IN (SELECT a FRO
13b10 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f  M b)     -- IN o
13b20 70 65 72 61 74 6f 72 20 77 69 74 68 20 73 75 62  perator with sub
13b30 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67  query on the rig
13b40 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78  ht.**.** The pEx
13b50 70 72 20 70 61 72 61 6d 65 74 65 72 20 64 65 73  pr parameter des
13b60 63 72 69 62 65 73 20 74 68 65 20 65 78 70 72 65  cribes the expre
13b70 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61  ssion that conta
13b80 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70  ins the IN.** op
13b90 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71 75 65  erator or subque
13ba0 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ry..**.** If par
13bb0 61 6d 65 74 65 72 20 69 73 52 6f 77 69 64 20 69  ameter isRowid i
13bc0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
13bd0 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
13be0 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a  r is guaranteed.
13bf0 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74 68 65 20  ** to be of the 
13c00 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e  form "<rowid> IN
13c10 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65   (?, ?, ?)", whe
13c20 72 65 20 3c 72 6f 77 69 64 3e 20 69 73 20 61 20  re <rowid> is a 
13c30 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20  reference.** to 
13c40 73 6f 6d 65 20 69 6e 74 65 67 65 72 20 6b 65 79  some integer key
13c50 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62   column of a tab
13c60 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e 20 74 68  le B-Tree. In th
13c70 69 73 20 63 61 73 65 2c 20 75 73 65 20 61 6e 0a  is case, use an.
13c80 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65  ** intkey B-Tree
13c90 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65   to store the se
13ca0 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c  t of IN(...) val
13cb0 75 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20 74  ues instead of t
13cc0 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f  he usual.** (slo
13cd0 77 65 72 29 20 76 61 72 69 61 62 6c 65 20 6c 65  wer) variable le
13ce0 6e 67 74 68 20 6b 65 79 73 20 42 2d 54 72 65 65  ngth keys B-Tree
13cf0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48  ..**.** If rMayH
13d00 61 76 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a  aveNull is non-z
13d10 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ero, that means 
13d20 74 68 61 74 20 74 68 65 20 6f 70 65 72 61 74 69  that the operati
13d30 6f 6e 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28  on is an IN.** (
13d40 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 6f 72 20  not a SELECT or 
13d50 45 58 49 53 54 53 29 20 61 6e 64 20 74 68 61 74  EXISTS) and that
13d60 20 74 68 65 20 52 48 53 20 6d 69 67 68 74 20 63   the RHS might c
13d70 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a  ontains NULLs..*
13d80 2a 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69  * All this routi
13d90 6e 65 20 64 6f 65 73 20 69 73 20 69 6e 69 74 69  ne does is initi
13da0 61 6c 69 7a 65 20 74 68 65 20 72 65 67 69 73 74  alize the regist
13db0 65 72 20 67 69 76 65 6e 20 62 79 20 72 4d 61 79  er given by rMay
13dc0 48 61 76 65 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 4e  HaveNull.** to N
13dd0 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67 20 72 6f  ULL.  Calling ro
13de0 75 74 69 6e 65 73 20 77 69 6c 6c 20 74 61 6b 65  utines will take
13df0 20 63 61 72 65 20 6f 66 20 63 68 61 6e 67 69 6e   care of changin
13e00 67 20 74 68 69 73 20 72 65 67 69 73 74 65 72 0a  g this register.
13e10 2a 2a 20 76 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d  ** value to non-
13e20 4e 55 4c 4c 20 69 66 20 74 68 65 20 52 48 53 20  NULL if the RHS 
13e30 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a  is NULL-free..**
13e40 0a 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54  .** For a SELECT
13e50 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61   or EXISTS opera
13e60 74 6f 72 2c 20 72 65 74 75 72 6e 20 74 68 65 20  tor, return the 
13e70 72 65 67 69 73 74 65 72 20 74 68 61 74 20 68 6f  register that ho
13e80 6c 64 73 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  lds the.** resul
13e90 74 2e 20 20 46 6f 72 20 61 20 6d 75 6c 74 69 2d  t.  For a multi-
13ea0 63 6f 6c 75 6d 6e 20 53 45 4c 45 43 54 2c 20 74  column SELECT, t
13eb0 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f  he result is sto
13ec0 72 65 64 20 69 6e 20 61 20 63 6f 6e 74 69 67 75  red in a contigu
13ed0 6f 75 73 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20  ous.** array of 
13ee0 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68  registers and th
13ef0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
13f00 73 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6f  s the register o
13f10 66 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a  f the left-most.
13f20 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  ** result column
13f30 2e 20 20 52 65 74 75 72 6e 20 30 20 66 6f 72 20  .  Return 0 for 
13f40 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f 72 20  IN operators or 
13f50 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
13f60 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  rs..*/.#ifndef S
13f70 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
13f80 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  ERY.int sqlite3C
13f90 6f 64 65 53 75 62 73 65 6c 65 63 74 28 0a 20 20  odeSubselect(.  
13fa0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
13fb0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
13fc0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
13fd0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
13fe0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49          /* The I
13ff0 4e 2c 20 53 45 4c 45 43 54 2c 20 6f 72 20 45 58  N, SELECT, or EX
14000 49 53 54 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f  ISTS operator */
14010 0a 20 20 69 6e 74 20 72 48 61 73 4e 75 6c 6c 46  .  int rHasNullF
14020 6c 61 67 2c 20 20 20 20 20 20 20 2f 2a 20 52 65  lag,       /* Re
14030 67 69 73 74 65 72 20 74 68 61 74 20 72 65 63 6f  gister that reco
14040 72 64 73 20 77 68 65 74 68 65 72 20 4e 55 4c 4c  rds whether NULL
14050 73 20 65 78 69 73 74 20 69 6e 20 52 48 53 20 2a  s exist in RHS *
14060 2f 0a 20 20 69 6e 74 20 69 73 52 6f 77 69 64 20  /.  int isRowid 
14070 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
14080 66 20 74 72 75 65 2c 20 4c 48 53 20 6f 66 20 49  f true, LHS of I
14090 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20  N operator is a 
140a0 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  rowid */.){.  in
140b0 74 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d  t jmpIfDynamic =
140c0 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   -1;            
140d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
140e0 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64 72 65  -time test addre
140f0 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67  ss */.  int rReg
14100 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
14110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14120 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74 6f 72  /* Register stor
14130 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f  ing resulting */
14140 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
14150 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
14160 73 65 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  se);.  if( NEVER
14170 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20  (v==0) ) return 
14180 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  0;.  sqlite3Expr
14190 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
141a0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 65 76 61  );..  /* The eva
141b0 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49  luation of the I
141c0 4e 2f 45 58 49 53 54 53 2f 53 45 4c 45 43 54 20  N/EXISTS/SELECT 
141d0 6d 75 73 74 20 62 65 20 72 65 70 65 61 74 65 64  must be repeated
141e0 20 65 76 65 72 79 20 74 69 6d 65 20 69 74 0a 20   every time it. 
141f0 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   ** is encounter
14200 65 64 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  ed if any of the
14210 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72   following is tr
14220 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ue:.  **.  **   
14230 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61   *  The right-ha
14240 6e 64 20 73 69 64 65 20 69 73 20 61 20 63 6f 72  nd side is a cor
14250 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79  related subquery
14260 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  .  **    *  The 
14270 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
14280 69 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  is an expression
14290 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67   list containing
142a0 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20   variables.  ** 
142b0 20 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73     *  We are ins
142c0 69 64 65 20 61 20 74 72 69 67 67 65 72 0a 20 20  ide a trigger.  
142d0 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f  **.  ** If all o
142e0 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20  f the above are 
142f0 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63  false, then we c
14300 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65  an run this code
14310 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20   just once.  ** 
14320 73 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 73  save the results
14330 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68 65 20  , and reuse the 
14340 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73  same result on s
14350 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61  ubsequent invoca
14360 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
14370 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
14380 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72  ty(pExpr, EP_Var
14390 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6a  Select) ){.    j
143a0 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 73 71  mpIfDynamic = sq
143b0 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50  lite3CodeOnce(pP
143c0 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72  arse); VdbeCover
143d0 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 23 69 66  age(v);.  }..#if
143e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
143f0 5f 45 58 50 4c 41 49 4e 0a 20 20 69 66 28 20 70  _EXPLAIN.  if( p
14400 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
14410 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  2 ){.    char *z
14420 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
14430 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c  intf(pParse->db,
14440 20 22 45 58 45 43 55 54 45 20 25 73 25 73 20 53   "EXECUTE %s%s S
14450 55 42 51 55 45 52 59 20 25 64 22 2c 0a 20 20 20  UBQUERY %d",.   
14460 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69       jmpIfDynami
14470 63 3e 3d 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41  c>=0?"":"CORRELA
14480 54 45 44 20 22 2c 0a 20 20 20 20 20 20 20 20 70  TED ",.        p
14490 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f  Expr->op==TK_IN?
144a0 22 4c 49 53 54 22 3a 22 53 43 41 4c 41 52 22 2c  "LIST":"SCALAR",
144b0 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
144c0 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 0a 20  >iNextSelectId. 
144d0 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
144e0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
144f0 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73  P_Explain, pPars
14500 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c  e->iSelectId, 0,
14510 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e   0, zMsg, P4_DYN
14520 41 4d 49 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  AMIC);.  }.#endi
14530 66 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  f..  switch( pEx
14540 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
14550 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
14560 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20    int addr;     
14570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14580 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f   Address of OP_O
14590 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
145a0 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  truction */.    
145b0 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
145c0 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a  pExpr->pLeft; /*
145d0 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   the LHS of the 
145e0 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
145f0 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
14600 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20  eyInfo = 0;     
14610 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74   /* Key informat
14620 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ion */.      int
14630 20 6e 56 61 6c 3b 20 20 20 20 20 20 20 20 20 20   nVal;          
14640 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
14650 20 6f 66 20 76 65 63 74 6f 72 20 70 4c 65 66 74   of vector pLeft
14660 20 2a 2f 0a 20 20 20 20 20 20 0a 20 20 20 20 20   */.      .     
14670 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 45   nVal = sqlite3E
14680 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c  xprVectorSize(pL
14690 65 66 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  eft);.      asse
146a0 72 74 28 20 21 69 73 52 6f 77 69 64 20 7c 7c 20  rt( !isRowid || 
146b0 6e 56 61 6c 3d 3d 31 20 29 3b 0a 0a 20 20 20 20  nVal==1 );..    
146c0 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69    /* Whether thi
146d0 73 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45  s is an 'x IN(SE
146e0 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20  LECT...)' or an 
146f0 27 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e  'x IN(<exprlist>
14700 29 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72  )'.      ** expr
14710 65 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e  ession it is han
14720 64 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77 61  dled the same wa
14730 79 2e 20 20 41 6e 20 65 70 68 65 6d 65 72 61 6c  y.  An ephemeral
14740 20 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20   table is .     
14750 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20   ** filled with 
14760 69 6e 64 65 78 20 6b 65 79 73 20 72 65 70 72 65  index keys repre
14770 73 65 6e 74 69 6e 67 20 74 68 65 20 72 65 73 75  senting the resu
14780 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  lts from the .  
14790 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 6f 72      ** SELECT or
147a0 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e   the <exprlist>.
147b0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
147c0 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20 65 78  ** If the 'x' ex
147d0 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
147e0 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74  lumn value, or t
147f0 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20  he SELECT....   
14800 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
14810 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e  returns a column
14820 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65   value, then the
14830 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61   affinity of tha
14840 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  t.      ** colum
14850 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62 75 69  n is used to bui
14860 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79  ld the index key
14870 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27 20 61  s. If both 'x' a
14880 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  nd the.      ** 
14890 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d  SELECT... statem
148a0 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c  ent are columns,
148b0 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66   then numeric af
148c0 66 69 6e 69 74 79 20 69 73 20 75 73 65 64 0a 20  finity is used. 
148d0 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74 68 65       ** if eithe
148e0 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d  r column has NUM
148f0 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45 52 20  ERIC or INTEGER 
14900 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e 65 69  affinity. If nei
14910 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 27 78  ther.      ** 'x
14920 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43 54  ' nor the SELECT
14930 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72  ... statement ar
14940 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  e columns, then 
14950 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
14960 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73 65  .      ** is use
14970 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
14980 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
14990 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
149a0 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
149b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
149c0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
149d0 65 72 61 6c 2c 20 0a 20 20 20 20 20 20 20 20 20  eral, .         
149e0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
149f0 28 69 73 52 6f 77 69 64 3f 30 3a 6e 56 61 6c 29  (isRowid?0:nVal)
14a00 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66  );.      pKeyInf
14a10 6f 20 3d 20 69 73 52 6f 77 69 64 20 3f 20 30 20  o = isRowid ? 0 
14a20 3a 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  : sqlite3KeyInfo
14a30 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
14a40 2c 20 6e 56 61 6c 2c 20 31 29 3b 0a 0a 20 20 20  , nVal, 1);..   
14a50 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
14a60 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
14a70 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
14a80 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31         /* Case 1
14a90 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53  :     expr IN (S
14aa0 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20  ELECT ...).     
14ab0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
14ac0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
14ad0 6f 20 77 72 69 74 65 20 74 68 65 20 72 65 73 75  o write the resu
14ae0 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  lts of the selec
14af0 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f  t into the tempo
14b00 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  rary.        ** 
14b10 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20  table allocated 
14b20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f 76 65  and opened above
14b30 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
14b40 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
14b50 6c 65 63 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  lect = pExpr->x.
14b60 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20  pSelect;.       
14b70 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
14b80 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  t = pSelect->pEL
14b90 69 73 74 3b 0a 0a 20 20 20 20 20 20 20 20 61 73  ist;..        as
14ba0 73 65 72 74 28 20 21 69 73 52 6f 77 69 64 20 29  sert( !isRowid )
14bb0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  ;.        if( pE
14bc0 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 6e 56 61  List->nExpr!=nVa
14bd0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  l ){.          s
14be0 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45  qlite3SubselectE
14bf0 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 45 4c  rror(pParse, pEL
14c00 69 73 74 2d 3e 6e 45 78 70 72 2c 20 6e 56 61 6c  ist->nExpr, nVal
14c10 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
14c20 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65  {.          Sele
14c30 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20  ctDest dest;.   
14c40 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
14c50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
14c60 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
14c70 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45  est, SRT_Set, pE
14c80 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  xpr->iTable);.  
14c90 20 20 20 20 20 20 20 20 64 65 73 74 2e 7a 41 66          dest.zAf
14ca0 66 53 64 73 74 20 3d 20 65 78 70 72 49 4e 41 66  fSdst = exprINAf
14cb0 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 70  finity(pParse, p
14cc0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
14cd0 20 61 73 73 65 72 74 28 20 28 70 45 78 70 72 2d   assert( (pExpr-
14ce0 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30 46 46  >iTable&0x0000FF
14cf0 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  FF)==pExpr->iTab
14d00 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  le );.          
14d10 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20  pSelect->iLimit 
14d20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 74  = 0;.          t
14d30 65 73 74 63 61 73 65 28 20 70 53 65 6c 65 63 74  estcase( pSelect
14d40 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
14d50 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
14d60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14d70 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f  pKeyInfo==0 ); /
14d80 2a 20 43 61 75 73 65 64 20 62 79 20 4f 4f 4d 20  * Caused by OOM 
14d90 69 6e 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  in sqlite3KeyInf
14da0 6f 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20  oAlloc() */.    
14db0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
14dc0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
14dd0 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 20  pSelect, &dest) 
14de0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
14df0 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
14e00 72 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41  rse->db, dest.zA
14e10 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20  ffSdst);.       
14e20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49       sqlite3KeyI
14e30 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66  nfoUnref(pKeyInf
14e40 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  o);.            
14e50 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
14e60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
14e70 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
14e80 61 72 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a  arse->db, dest.z
14e90 41 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20  AffSdst);.      
14ea0 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79      assert( pKey
14eb0 49 6e 66 6f 21 3d 30 20 29 3b 20 2f 2a 20 4f 4f  Info!=0 ); /* OO
14ec0 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 65 78 69  M will cause exi
14ed0 74 20 61 66 74 65 72 20 73 71 6c 69 74 65 33 53  t after sqlite3S
14ee0 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20 20 20 20  elect() */.     
14ef0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c       assert( pEL
14f00 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist!=0 );.      
14f10 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
14f20 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
14f30 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
14f40 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
14f50 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49  sWriteable(pKeyI
14f60 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20  nfo) );.        
14f70 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61    for(i=0; i<nVa
14f80 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
14f90 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 28       Expr *p = (
14fa0 6e 56 61 6c 3e 31 29 20 3f 20 73 71 6c 69 74 65  nVal>1) ? sqlite
14fb0 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65  3VectorFieldSube
14fc0 78 70 72 28 70 4c 65 66 74 2c 20 69 29 20 3a 20  xpr(pLeft, i) : 
14fd0 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20  pLeft;.         
14fe0 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f     pKeyInfo->aCo
14ff0 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 42  ll[i] = sqlite3B
15000 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
15010 53 65 71 28 0a 20 20 20 20 20 20 20 20 20 20 20  Seq(.           
15020 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 2c 20       pParse, p, 
15030 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
15040 70 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  pr.            )
15050 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
15060 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
15070 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70  lse if( ALWAYS(p
15080 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30  Expr->x.pList!=0
15090 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
150a0 43 61 73 65 20 32 3a 20 20 20 20 20 65 78 70 72  Case 2:     expr
150b0 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20   IN (exprlist). 
150c0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
150d0 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78    ** For each ex
150e0 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20  pression, build 
150f0 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f  an index key fro
15100 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e  m the evaluation
15110 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
15120 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20  store it in the 
15130 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
15140 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20   If <expr> is a 
15150 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65  column, then use
15160 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
15170 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74   columns affinit
15180 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20  y when building 
15190 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c  index keys. If <
151a0 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20  expr> is not.   
151b0 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e       ** a column
151c0 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66  , use numeric af
151d0 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20  finity..        
151e0 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  */.        char 
151f0 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20 20  affinity;       
15200 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
15210 20 6f 66 20 74 68 65 20 4c 48 53 20 6f 66 20 74   of the LHS of t
15220 68 65 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20  he IN */.       
15230 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
15240 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
15250 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
15260 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  ;.        struct
15270 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
15280 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 69  pItem;.        i
15290 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 0a  nt r1, r2, r3;..
152a0 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79          affinity
152b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
152c0 66 69 6e 69 74 79 28 70 4c 65 66 74 29 3b 0a 20  finity(pLeft);. 
152d0 20 20 20 20 20 20 20 69 66 28 20 21 61 66 66 69         if( !affi
152e0 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20  nity ){.        
152f0 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c    affinity = SQL
15300 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20  ITE_AFF_BLOB;.  
15310 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15320 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  if( pKeyInfo ){.
15330 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
15340 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  ( sqlite3KeyInfo
15350 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79  IsWriteable(pKey
15360 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20  Info) );.       
15370 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f     pKeyInfo->aCo
15380 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 45  ll[0] = sqlite3E
15390 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
153a0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
153b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
153c0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72       /* Loop thr
153d0 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73  ough each expres
153e0 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73  sion in <exprlis
153f0 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  t>. */.        r
15400 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
15410 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
15420 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69         r2 = sqli
15430 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
15440 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69  arse);.        i
15450 66 28 20 69 73 52 6f 77 69 64 20 29 20 73 71 6c  f( isRowid ) sql
15460 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15470 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32  , OP_Null, 0, r2
15480 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
15490 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  =pList->nExpr, p
154a0 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
154b0 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
154c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
154d0 72 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e  r *pE2 = pItem->
154e0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
154f0 20 69 6e 74 20 69 56 61 6c 54 6f 49 6e 73 3b 0a   int iValToIns;.
15500 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
15510 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
15520 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20  is not constant 
15530 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65  then we will nee
15540 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a  d to.          *
15550 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65  * disable the te
15560 73 74 20 74 68 61 74 20 77 61 73 20 67 65 6e 65  st that was gene
15570 72 61 74 65 64 20 61 62 6f 76 65 20 74 68 61 74  rated above that
15580 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20   makes sure.    
15590 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f        ** this co
155a0 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73  de only executes
155b0 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20   once.  Because 
155c0 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61  for a non-consta
155d0 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nt.          ** 
155e0 65 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65  expression we ne
155f0 65 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73  ed to rerun this
15600 20 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e   code each time.
15610 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
15620 20 20 20 20 20 20 20 20 69 66 28 20 6a 6d 70 49          if( jmpI
15630 66 44 79 6e 61 6d 69 63 3e 3d 30 20 26 26 20 21  fDynamic>=0 && !
15640 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
15650 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20  stant(pE2) ){.  
15660 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15670 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
15680 70 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69  p(v, jmpIfDynami
15690 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  c);.            
156a0 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d  jmpIfDynamic = -
156b0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  1;.          }..
156c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61            /* Eva
156d0 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65 73  luate the expres
156e0 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20  sion and insert 
156f0 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70  it into the temp
15700 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
15710 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20      if( isRowid 
15720 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
15730 49 6e 74 65 67 65 72 28 70 45 32 2c 20 26 69 56  Integer(pE2, &iV
15740 61 6c 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20  alToIns) ){.    
15750 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15760 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
15770 49 6e 73 65 72 74 49 6e 74 2c 20 70 45 78 70 72  InsertInt, pExpr
15780 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 69 56  ->iTable, r2, iV
15790 61 6c 54 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20  alToIns);.      
157a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
157b0 20 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69         r3 = sqli
157c0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
157d0 74 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20 72  t(pParse, pE2, r
157e0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
157f0 69 66 28 20 69 73 52 6f 77 69 64 20 29 7b 0a 20  if( isRowid ){. 
15800 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
15810 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15820 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
15830 72 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r3,.            
15840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15850 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
15860 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29  urrentAddr(v)+2)
15870 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
15880 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
15890 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
158a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
158b0 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70  (v, OP_Insert, p
158c0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32  Expr->iTable, r2
158d0 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20 20  , r3);.         
158e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
158f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15900 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
15910 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20  MakeRecord, r3, 
15920 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79  1, r2, &affinity
15930 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
15940 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
15950 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
15960 67 65 28 70 50 61 72 73 65 2c 20 72 33 2c 20 31  ge(pParse, r3, 1
15970 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
15980 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15990 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
159a0 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  rt, pExpr->iTabl
159b0 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20  e, r2);.        
159c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
159d0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
159e0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
159f0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
15a00 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , r1);.        s
15a10 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
15a20 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29  pReg(pParse, r2)
15a30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15a40 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  if( pKeyInfo ){.
15a50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15a60 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61  dbeChangeP4(v, a
15a70 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65  ddr, (void *)pKe
15a80 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
15a90 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  O);.      }.    
15aa0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
15ab0 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53      case TK_EXIS
15ac0 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  TS:.    case TK_
15ad0 53 45 4c 45 43 54 3a 0a 20 20 20 20 64 65 66 61  SELECT:.    defa
15ae0 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ult: {.      /* 
15af0 43 61 73 65 20 33 3a 20 20 20 20 28 53 45 4c 45  Case 3:    (SELE
15b00 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29  CT ... FROM ...)
15b10 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 6f 72  .      **     or
15b20 3a 20 20 20 20 45 58 49 53 54 53 28 53 45 4c 45  :    EXISTS(SELE
15b30 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29  CT ... FROM ...)
15b40 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
15b50 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54 2c  ** For a SELECT,
15b60 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   generate code t
15b70 6f 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 73  o put the values
15b80 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73   for all columns
15b90 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   of.      ** the
15ba0 20 66 69 72 73 74 20 72 6f 77 20 69 6e 74 6f 20   first row into 
15bb0 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69  an array of regi
15bc0 73 74 65 72 73 20 61 6e 64 20 72 65 74 75 72 6e  sters and return
15bd0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 20 20   the index of.  
15be0 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74      ** the first
15bf0 20 72 65 67 69 73 74 65 72 2e 0a 20 20 20 20 20   register..     
15c00 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
15c10 74 68 69 73 20 69 73 20 61 6e 20 45 58 49 53 54  this is an EXIST
15c20 53 2c 20 77 72 69 74 65 20 61 6e 20 69 6e 74 65  S, write an inte
15c30 67 65 72 20 30 20 28 6e 6f 74 20 65 78 69 73 74  ger 0 (not exist
15c40 73 29 20 6f 72 20 31 20 28 65 78 69 73 74 73 29  s) or 1 (exists)
15c50 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61  .      ** into a
15c60 20 72 65 67 69 73 74 65 72 20 61 6e 64 20 72 65   register and re
15c70 74 75 72 6e 20 74 68 61 74 20 72 65 67 69 73 74  turn that regist
15c80 65 72 20 6e 75 6d 62 65 72 2e 0a 20 20 20 20 20  er number..     
15c90 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20   **.      ** In 
15ca0 62 6f 74 68 20 63 61 73 65 73 2c 20 74 68 65 20  both cases, the 
15cb0 71 75 65 72 79 20 69 73 20 61 75 67 6d 65 6e 74  query is augment
15cc0 65 64 20 77 69 74 68 20 22 4c 49 4d 49 54 20 31  ed with "LIMIT 1
15cd0 22 2e 20 20 41 6e 79 20 0a 20 20 20 20 20 20 2a  ".  Any .      *
15ce0 2a 20 70 72 65 65 78 69 73 74 69 6e 67 20 6c 69  * preexisting li
15cf0 6d 69 74 20 69 73 20 64 69 73 63 61 72 64 65 64  mit is discarded
15d00 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65   in place of the
15d10 20 6e 65 77 20 4c 49 4d 49 54 20 31 2e 0a 20 20   new LIMIT 1..  
15d20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c      */.      Sel
15d30 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 20  ect *pSel;      
15d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d50 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61     /* SELECT sta
15d60 74 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65  tement to encode
15d70 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74   */.      Select
15d80 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20  Dest dest;      
15d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15da0 2f 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c 20 77  /* How to deal w
15db0 69 74 68 20 53 45 4c 45 43 54 20 72 65 73 75 6c  ith SELECT resul
15dc0 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  t */.      int n
15dd0 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Reg;            
15de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15df0 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 74 6f   /* Registers to
15e00 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20 20   allocate */..  
15e10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
15e20 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53  xpr->op==TK_EXIS
15e30 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  TS );.      test
15e40 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
15e50 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20  =TK_SELECT );.  
15e60 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
15e70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  r->op==TK_EXISTS
15e80 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
15e90 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20  K_SELECT );.    
15ea0 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61    assert( ExprHa
15eb0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
15ec0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
15ed0 3b 0a 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20  ;..      pSel = 
15ee0 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
15ef0 3b 0a 20 20 20 20 20 20 6e 52 65 67 20 3d 20 70  ;.      nReg = p
15f00 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
15f10 45 43 54 20 3f 20 70 53 65 6c 2d 3e 70 45 4c 69  ECT ? pSel->pELi
15f20 73 74 2d 3e 6e 45 78 70 72 20 3a 20 31 3b 0a 20  st->nExpr : 1;. 
15f30 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
15f40 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
15f50 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65  , 0, pParse->nMe
15f60 6d 2b 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72  m+1);.      pPar
15f70 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67  se->nMem += nReg
15f80 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
15f90 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
15fa0 20 29 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74   ){.        dest
15fb0 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d  .eDest = SRT_Mem
15fc0 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 69  ;.        dest.i
15fd0 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53 44 50  Sdst = dest.iSDP
15fe0 61 72 6d 3b 0a 20 20 20 20 20 20 20 20 64 65 73  arm;.        des
15ff0 74 2e 6e 53 64 73 74 20 3d 20 6e 52 65 67 3b 0a  t.nSdst = nReg;.
16000 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16010 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
16020 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 53  Null, 0, dest.iS
16030 44 50 61 72 6d 2c 20 64 65 73 74 2e 69 53 44 50  DParm, dest.iSDP
16040 61 72 6d 2b 6e 52 65 67 2d 31 29 3b 0a 20 20 20  arm+nReg-1);.   
16050 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
16060 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62 71 75  ((v, "Init subqu
16070 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20  ery result"));. 
16080 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16090 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d      dest.eDest =
160a0 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20   SRT_Exists;.   
160b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
160c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
160d0 65 67 65 72 2c 20 30 2c 20 64 65 73 74 2e 69 53  eger, 0, dest.iS
160e0 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  DParm);.        
160f0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
16100 22 49 6e 69 74 20 45 58 49 53 54 53 20 72 65 73  "Init EXISTS res
16110 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a  ult"));.      }.
16120 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
16130 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
16140 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74  db, pSel->pLimit
16150 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 70  );.      pSel->p
16160 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50  Limit = sqlite3P
16170 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
16180 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c 0a 20  INTEGER, 0, 0,. 
16190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161b0 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65   &sqlite3IntToke
161c0 6e 73 5b 31 5d 29 3b 0a 20 20 20 20 20 20 70 53  ns[1]);.      pS
161d0 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  el->iLimit = 0;.
161e0 20 20 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46        pSel->selF
161f0 6c 61 67 73 20 26 3d 20 7e 53 46 5f 4d 75 6c 74  lags &= ~SF_Mult
16200 69 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 69 66  iValue;.      if
16210 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  ( sqlite3Select(
16220 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 26 64  pParse, pSel, &d
16230 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  est) ){.        
16240 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
16250 7d 0a 20 20 20 20 20 20 72 52 65 67 20 3d 20 64  }.      rReg = d
16260 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20  est.iSDParm;.   
16270 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f     ExprSetVVAPro
16280 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
16290 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20  NoReduce);.     
162a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
162b0 7d 0a 0a 20 20 69 66 28 20 72 48 61 73 4e 75 6c  }..  if( rHasNul
162c0 6c 46 6c 61 67 20 29 7b 0a 20 20 20 20 73 71 6c  lFlag ){.    sql
162d0 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c  ite3SetHasNullFl
162e0 61 67 28 76 2c 20 70 45 78 70 72 2d 3e 69 54 61  ag(v, pExpr->iTa
162f0 62 6c 65 2c 20 72 48 61 73 4e 75 6c 6c 46 6c 61  ble, rHasNullFla
16300 67 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6a  g);.  }..  if( j
16310 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20 29  mpIfDynamic>=0 )
16320 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
16330 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70  eJumpHere(v, jmp
16340 49 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20 7d 0a  IfDynamic);.  }.
16350 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
16360 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 0a  hePop(pParse);..
16370 20 20 72 65 74 75 72 6e 20 72 52 65 67 3b 0a 7d    return rReg;.}
16380 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
16390 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
163a0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
163b0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
163c0 0a 2f 2a 0a 2a 2a 20 45 78 70 72 20 70 49 6e 20  ./*.** Expr pIn 
163d0 69 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 65 78  is an IN(...) ex
163e0 70 72 65 73 73 69 6f 6e 2e 20 54 68 69 73 20 66  pression. This f
163f0 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 74  unction checks t
16400 68 61 74 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d  hat the .** sub-
16410 73 65 6c 65 63 74 20 6f 6e 20 74 68 65 20 52 48  select on the RH
16420 53 20 6f 66 20 74 68 65 20 49 4e 28 29 20 6f 70  S of the IN() op
16430 65 72 61 74 6f 72 20 68 61 73 20 74 68 65 20 73  erator has the s
16440 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a  ame number of .*
16450 2a 20 63 6f 6c 75 6d 6e 73 20 61 73 20 74 68 65  * columns as the
16460 20 76 65 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c   vector on the L
16470 48 53 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 52  HS. Or, if the R
16480 48 53 20 6f 66 20 74 68 65 20 49 4e 28 29 20 69  HS of the IN() i
16490 73 20 6e 6f 74 20 0a 2a 2a 20 61 20 73 75 62 2d  s not .** a sub-
164a0 71 75 65 72 79 2c 20 74 68 61 74 20 74 68 65 20  query, that the 
164b0 4c 48 53 20 69 73 20 61 20 76 65 63 74 6f 72 20  LHS is a vector 
164c0 6f 66 20 73 69 7a 65 20 31 2e 0a 2a 2f 0a 69 6e  of size 1..*/.in
164d0 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65  t sqlite3ExprChe
164e0 63 6b 49 4e 28 50 61 72 73 65 20 2a 70 50 61 72  ckIN(Parse *pPar
164f0 73 65 2c 20 45 78 70 72 20 2a 70 49 6e 29 7b 0a  se, Expr *pIn){.
16500 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 20 3d 20    int nVector = 
16510 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
16520 72 53 69 7a 65 28 70 49 6e 2d 3e 70 4c 65 66 74  rSize(pIn->pLeft
16530 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 2d 3e 66  );.  if( (pIn->f
16540 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c  lags & EP_xIsSel
16550 65 63 74 29 20 29 7b 0a 20 20 20 20 69 66 28 20  ect) ){.    if( 
16560 6e 56 65 63 74 6f 72 21 3d 70 49 6e 2d 3e 78 2e  nVector!=pIn->x.
16570 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
16580 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
16590 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74  sqlite3Subselect
165a0 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 49  Error(pParse, pI
165b0 6e 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  n->x.pSelect->pE
165c0 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 6e 56 65  List->nExpr, nVe
165d0 63 74 6f 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ctor);.      ret
165e0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
165f0 65 6c 73 65 20 69 66 28 20 6e 56 65 63 74 6f 72  else if( nVector
16600 21 3d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 28  !=1 ){.    if( (
16610 70 49 6e 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  pIn->pLeft->flag
16620 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
16630 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
16640 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72  e3SubselectError
16650 28 70 50 61 72 73 65 2c 20 6e 56 65 63 74 6f 72  (pParse, nVector
16660 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 1);.    }else{
16670 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
16680 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
16690 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65  row value misuse
166a0 64 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  d");.    }.    r
166b0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
166c0 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
166d0 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
166e0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
166f0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
16700 6f 64 65 20 66 6f 72 20 61 6e 20 49 4e 20 65 78  ode for an IN ex
16710 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
16720 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43       x IN (SELEC
16730 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20 20 20 78  T ...).**      x
16740 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75   IN (value, valu
16750 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  e, ...).**.** Th
16760 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65  e left-hand side
16770 20 28 4c 48 53 29 20 69 73 20 61 20 73 63 61 6c   (LHS) is a scal
16780 61 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ar expression.  
16790 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
167a0 69 64 65 20 28 52 48 53 29 0a 2a 2a 20 69 73 20  ide (RHS).** is 
167b0 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65 72 6f  an array of zero
167c0 20 6f 72 20 6d 6f 72 65 20 76 61 6c 75 65 73 2e   or more values.
167d0 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e    The expression
167e0 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
167f0 4c 48 53 20 69 73 0a 2a 2a 20 63 6f 6e 74 61 69  LHS is.** contai
16800 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52  ned within the R
16810 48 53 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6f  HS.  The value o
16820 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
16830 20 69 73 20 75 6e 6b 6e 6f 77 6e 20 28 4e 55 4c   is unknown (NUL
16840 4c 29 0a 2a 2a 20 69 66 20 74 68 65 20 4c 48 53  L).** if the LHS
16850 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74   is NULL or if t
16860 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f  he LHS is not co
16870 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74  ntained within t
16880 68 65 20 52 48 53 20 61 6e 64 20 74 68 65 0a 2a  he RHS and the.*
16890 2a 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 6f  * RHS contains o
168a0 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20  ne or more NULL 
168b0 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  values..**.** Th
168c0 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
168d0 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 6a  ates code that j
168e0 75 6d 70 73 20 74 6f 20 64 65 73 74 49 66 46 61  umps to destIfFa
168f0 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53 20 69  lse if the LHS i
16900 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61 69  s not .** contai
16910 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52  ned within the R
16920 48 53 2e 20 20 49 66 20 64 75 65 20 74 6f 20 4e  HS.  If due to N
16930 55 4c 4c 73 20 77 65 20 63 61 6e 6e 6f 74 20 64  ULLs we cannot d
16940 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
16950 4c 48 53 0a 2a 2a 20 69 73 20 63 6f 6e 74 61 69  LHS.** is contai
16960 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 20 74  ned in the RHS t
16970 68 65 6e 20 6a 75 6d 70 20 74 6f 20 64 65 73 74  hen jump to dest
16980 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 20  IfNull.  If the 
16990 4c 48 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  LHS is contained
169a0 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 52  .** within the R
169b0 48 53 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72  HS then fall thr
169c0 6f 75 67 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ough..*/.static 
169d0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
169e0 43 6f 64 65 49 4e 28 0a 20 20 50 61 72 73 65 20  CodeIN(.  Parse 
169f0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
16a00 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
16a10 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
16a20 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
16a30 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
16a40 20 20 2f 2a 20 54 68 65 20 49 4e 20 65 78 70 72    /* The IN expr
16a50 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
16a60 64 65 73 74 49 66 46 61 6c 73 65 2c 20 20 20 20  destIfFalse,    
16a70 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
16a80 66 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e  f LHS is not con
16a90 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48  tained in the RH
16aa0 53 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49  S */.  int destI
16ab0 66 4e 75 6c 6c 20 20 20 20 20 20 20 20 2f 2a 20  fNull        /* 
16ac0 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65  Jump here if the
16ad0 20 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e 6b   results are unk
16ae0 6e 6f 77 6e 20 64 75 65 20 74 6f 20 4e 55 4c 4c  nown due to NULL
16af0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 52  s */.){.  int rR
16b00 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 20 20  hsHasNull = 0;  
16b10 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 61 74  /* Register that
16b20 20 69 73 20 74 72 75 65 20 69 66 20 52 48 53 20   is true if RHS 
16b30 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61  contains NULL va
16b40 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 65 54  lues */.  int eT
16b50 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ype;            
16b60 2f 2a 20 54 79 70 65 20 6f 66 20 74 68 65 20 52  /* Type of the R
16b70 48 53 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20  HS */.  int r1, 
16b80 72 32 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r2;           /*
16b90 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72   Temporary use r
16ba0 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 56 64  egisters */.  Vd
16bb0 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
16bc0 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74      /* Statement
16bd0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
16be0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69  ion */.  int *ai
16bf0 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  Map = 0;       /
16c00 2a 20 4d 61 70 20 66 72 6f 6d 20 76 65 63 74 6f  * Map from vecto
16c10 72 20 66 69 65 6c 64 20 74 6f 20 69 6e 64 65 78  r field to index
16c20 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61   column */.  cha
16c30 72 20 2a 7a 41 66 66 20 3d 20 30 3b 20 20 20 20  r *zAff = 0;    
16c40 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 73     /* Affinity s
16c50 74 72 69 6e 67 20 66 6f 72 20 63 6f 6d 70 61 72  tring for compar
16c60 69 73 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  isons */.  int n
16c70 56 65 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20  Vector;         
16c80 20 2f 2a 20 53 69 7a 65 20 6f 66 20 76 65 63 74   /* Size of vect
16c90 6f 72 73 20 66 6f 72 20 74 68 69 73 20 49 4e 28  ors for this IN(
16ca0 2e 2e 2e 29 20 6f 70 20 2a 2f 0a 20 20 69 6e 74  ...) op */.  int
16cb0 20 69 44 75 6d 6d 79 3b 20 20 20 20 20 20 20 20   iDummy;        
16cc0 20 20 20 2f 2a 20 44 75 6d 6d 79 20 70 61 72 61     /* Dummy para
16cd0 6d 65 74 65 72 20 74 6f 20 65 78 70 72 43 6f 64  meter to exprCod
16ce0 65 56 65 63 74 6f 72 28 29 20 2a 2f 0a 20 20 45  eVector() */.  E
16cf0 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
16d00 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69 6e 74  pr->pLeft;.  int
16d10 20 69 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74   i;..  if( sqlit
16d20 65 33 45 78 70 72 43 68 65 63 6b 49 4e 28 70 50  e3ExprCheckIN(pP
16d30 61 72 73 65 2c 20 70 45 78 70 72 29 20 29 20 72  arse, pExpr) ) r
16d40 65 74 75 72 6e 3b 0a 20 20 7a 41 66 66 20 3d 20  eturn;.  zAff = 
16d50 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28 70  exprINAffinity(p
16d60 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
16d70 20 69 66 28 20 7a 41 66 66 3d 3d 30 20 29 20 72   if( zAff==0 ) r
16d80 65 74 75 72 6e 3b 0a 20 20 6e 56 65 63 74 6f 72  eturn;.  nVector
16d90 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
16da0 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d 3e  ctorSize(pExpr->
16db0 70 4c 65 66 74 29 3b 0a 20 20 61 69 4d 61 70 20  pLeft);.  aiMap 
16dc0 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 44  = (int*)sqlite3D
16dd0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20  bMallocZero(.   
16de0 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e     pParse->db, n
16df0 56 65 63 74 6f 72 2a 28 73 69 7a 65 6f 66 28 69  Vector*(sizeof(i
16e00 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28 63 68 61  nt) + sizeof(cha
16e10 72 29 29 20 2b 20 31 0a 20 20 29 3b 0a 20 20 69  r)) + 1.  );.  i
16e20 66 28 20 61 69 4d 61 70 3d 3d 30 20 29 7b 0a 20  f( aiMap==0 ){. 
16e30 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
16e40 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 41 66  (pParse->db, zAf
16e50 66 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  f);.    return;.
16e60 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 74 65 6d 70    }..  /* Attemp
16e70 74 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  t to compute the
16e80 20 52 48 53 2e 20 41 66 74 65 72 20 74 68 69 73   RHS. After this
16e90 20 73 74 65 70 2c 20 69 66 20 61 6e 79 74 68 69   step, if anythi
16ea0 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 0a 20 20  ng other than.  
16eb0 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  ** IN_INDEX_NOOP
16ec0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
16ed0 65 20 74 61 62 6c 65 20 6f 70 65 6e 65 64 20 69  e table opened i
16ee0 74 68 20 63 75 72 73 6f 72 20 70 45 78 70 72 2d  th cursor pExpr-
16ef0 3e 69 54 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f  >iTable .  ** co
16f00 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65  ntains the value
16f10 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74  s that make up t
16f20 68 65 20 52 48 53 2e 20 49 66 20 49 4e 5f 49 4e  he RHS. If IN_IN
16f30 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72 65 74 75  DEX_NOOP is retu
16f40 72 6e 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 52  rned,.  ** the R
16f50 48 53 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  HS has not yet b
16f60 65 65 6e 20 63 6f 64 65 64 2e 20 20 2a 2f 0a 20  een coded.  */. 
16f70 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
16f80 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  be;.  assert( v!
16f90 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f  =0 );       /* O
16fa0 4f 4d 20 64 65 74 65 63 74 65 64 20 70 72 69 6f  OM detected prio
16fb0 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  r to this routin
16fc0 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43  e */.  VdbeNoopC
16fd0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69  omment((v, "begi
16fe0 6e 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 20 20  n IN expr"));.  
16ff0 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46  eType = sqlite3F
17000 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73  indInIndex(pPars
17010 65 2c 20 70 45 78 70 72 2c 0a 20 20 20 20 20 20  e, pExpr,.      
17020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17030 20 20 20 20 20 20 20 49 4e 5f 49 4e 44 45 58 5f         IN_INDEX_
17040 4d 45 4d 42 45 52 53 48 49 50 20 7c 20 49 4e 5f  MEMBERSHIP | IN_
17050 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a 20  INDEX_NOOP_OK,. 
17060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17070 20 20 20 20 20 20 20 20 20 20 20 20 64 65 73 74              dest
17080 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e  IfFalse==destIfN
17090 75 6c 6c 20 3f 20 30 20 3a 20 26 72 52 68 73 48  ull ? 0 : &rRhsH
170a0 61 73 4e 75 6c 6c 2c 20 61 69 4d 61 70 29 3b 0a  asNull, aiMap);.
170b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
170c0 65 2d 3e 6e 45 72 72 20 7c 7c 20 6e 56 65 63 74  e->nErr || nVect
170d0 6f 72 3d 3d 31 20 7c 7c 20 65 54 79 70 65 3d 3d  or==1 || eType==
170e0 49 4e 5f 49 4e 44 45 58 5f 45 50 48 0a 20 20 20  IN_INDEX_EPH.   
170f0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e      || eType==IN
17100 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43  _INDEX_INDEX_ASC
17110 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e   || eType==IN_IN
17120 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 0a  DEX_INDEX_DESC .
17130 20 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 64 65 20    );..  /* Code 
17140 74 68 65 20 4c 48 53 2c 20 74 68 65 20 3c 65 78  the LHS, the <ex
17150 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e  pr> from "<expr>
17160 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 49 66 20 74   IN (...)". If t
17170 68 65 20 4c 48 53 20 69 73 20 61 20 0a 20 20 2a  he LHS is a .  *
17180 2a 20 76 65 63 74 6f 72 2c 20 74 68 65 6e 20 69  * vector, then i
17190 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  t is stored in a
171a0 6e 20 61 72 72 61 79 20 6f 66 20 6e 56 65 63 74  n array of nVect
171b0 6f 72 20 72 65 67 69 73 74 65 72 73 20 73 74 61  or registers sta
171c0 72 74 69 6e 67 20 0a 20 20 2a 2a 20 61 74 20 72  rting .  ** at r
171d0 31 2e 0a 20 20 2a 2f 0a 20 20 72 31 20 3d 20 73  1..  */.  r1 = s
171e0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
171f0 67 65 28 70 50 61 72 73 65 2c 20 6e 56 65 63 74  ge(pParse, nVect
17200 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  or);.  sqlite3Ex
17210 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
17220 73 65 29 3b 0a 20 20 72 32 20 3d 20 65 78 70 72  se);.  r2 = expr
17230 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72 73  CodeVector(pPars
17240 65 2c 20 70 4c 65 66 74 2c 20 26 69 44 75 6d 6d  e, pLeft, &iDumm
17250 79 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  y);.  for(i=0; i
17260 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a  <nVector; i++){.
17270 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17280 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp3(v, OP_Copy
17290 2c 20 72 32 2b 69 2c 20 72 31 2b 61 69 4d 61 70  , r2+i, r1+aiMap
172a0 5b 69 5d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  [i], 0);.  }..  
172b0 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 46 69 6e  /* If sqlite3Fin
172c0 64 49 6e 49 6e 64 65 78 28 29 20 64 69 64 20 6e  dInIndex() did n
172d0 6f 74 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74  ot find or creat
172e0 65 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  e an index that 
172f0 69 73 0a 20 20 2a 2a 20 73 75 69 74 61 62 6c 65  is.  ** suitable
17300 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20   for evaluating 
17310 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c  the IN operator,
17320 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20 75   then evaluate u
17330 73 69 6e 67 20 61 0a 20 20 2a 2a 20 73 65 71 75  sing a.  ** sequ
17340 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73  ence of comparis
17350 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
17360 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
17370 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 45 78 70 72  NOOP ){.    Expr
17380 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
17390 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
173a0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
173b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
173c0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
173d0 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
173e0 20 69 6e 74 20 6c 61 62 65 6c 4f 6b 20 3d 20 73   int labelOk = s
173f0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
17400 62 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74 20  bel(v);.    int 
17410 72 32 2c 20 72 65 67 54 6f 46 72 65 65 3b 0a 20  r2, regToFree;. 
17420 20 20 20 69 6e 74 20 72 65 67 43 6b 4e 75 6c 6c     int regCkNull
17430 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 69   = 0;.    int ii
17440 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
17450 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
17460 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
17470 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 64  ct) );.    if( d
17480 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49  estIfNull!=destI
17490 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20  fFalse ){.      
174a0 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c 69  regCkNull = sqli
174b0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
174c0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
174d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
174e0 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 31 2c  , OP_BitAnd, r1,
174f0 20 72 31 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b   r1, regCkNull);
17500 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
17510 69 3d 30 3b 20 69 69 3c 70 4c 69 73 74 2d 3e 6e  i=0; ii<pList->n
17520 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Expr; ii++){.   
17530 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
17540 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
17550 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 69 5d  se, pList->a[ii]
17560 2e 70 45 78 70 72 2c 20 26 72 65 67 54 6f 46 72  .pExpr, &regToFr
17570 65 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ee);.      if( r
17580 65 67 43 6b 4e 75 6c 6c 20 26 26 20 73 71 6c 69  egCkNull && sqli
17590 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
175a0 28 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45  (pList->a[ii].pE
175b0 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
175c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
175d0 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20  3(v, OP_BitAnd, 
175e0 72 65 67 43 6b 4e 75 6c 6c 2c 20 72 32 2c 20 72  regCkNull, r2, r
175f0 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  egCkNull);.     
17600 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 69 3c   }.      if( ii<
17610 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 7c  pList->nExpr-1 |
17620 7c 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65  | destIfNull!=de
17630 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20  stIfFalse ){.   
17640 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17650 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 71 2c  AddOp4(v, OP_Eq,
17660 20 72 31 2c 20 6c 61 62 65 6c 4f 6b 2c 20 72 32   r1, labelOk, r2
17670 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17680 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
17690 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c  d*)pColl, P4_COL
176a0 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 56  LSEQ);.        V
176b0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
176c0 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72   ii<pList->nExpr
176d0 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  -1);.        Vdb
176e0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 69  eCoverageIf(v, i
176f0 69 3d 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  i==pList->nExpr-
17700 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
17710 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
17720 76 2c 20 7a 41 66 66 5b 30 5d 29 3b 0a 20 20 20  v, zAff[0]);.   
17730 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17740 20 20 61 73 73 65 72 74 28 20 64 65 73 74 49 66    assert( destIf
17750 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73  Null==destIfFals
17760 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e );.        sql
17770 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
17780 2c 20 4f 50 5f 4e 65 2c 20 72 31 2c 20 64 65 73  , OP_Ne, r1, des
17790 74 49 66 46 61 6c 73 65 2c 20 72 32 2c 0a 20 20  tIfFalse, r2,.  
177a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
177b0 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
177c0 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
177d0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
177e0 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
177f0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
17800 76 2c 20 7a 41 66 66 5b 30 5d 20 7c 20 53 51 4c  v, zAff[0] | SQL
17810 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
17820 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
17830 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
17840 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
17850 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20  ToFree);.    }. 
17860 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c     if( regCkNull
17870 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
17880 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17890 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 43 6b 4e  P_IsNull, regCkN
178a0 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  ull, destIfNull)
178b0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
178c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
178d0 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74  VdbeGoto(v, dest
178e0 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 7d 0a  IfFalse);.    }.
178f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
17900 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
17910 61 62 65 6c 4f 6b 29 3b 0a 20 20 20 20 73 71 6c  abelOk);.    sql
17920 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
17930 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 43 6b  eg(pParse, regCk
17940 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Null);.  }else{.
17950 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79    .    /* If any
17960 20 76 61 6c 75 65 20 6f 6e 20 74 68 65 20 4c 48   value on the LH
17970 53 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72  S is NULL, the r
17980 65 73 75 6c 74 20 6f 66 20 74 68 65 20 49 4e 28  esult of the IN(
17990 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 0a 20 20  ...) operator.  
179a0 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74    ** must be eit
179b0 68 65 72 20 66 61 6c 73 65 20 6f 72 20 4e 55 4c  her false or NUL
179c0 4c 2e 20 49 66 20 74 68 65 73 65 20 74 77 6f 20  L. If these two 
179d0 61 72 65 20 68 61 6e 64 6c 65 64 20 69 64 65 6e  are handled iden
179e0 74 69 63 61 6c 6c 79 2c 0a 20 20 20 20 2a 2a 20  tically,.    ** 
179f0 74 65 73 74 20 74 68 65 20 4c 48 53 20 66 6f 72  test the LHS for
17a00 20 4e 55 4c 4c 73 20 61 6e 64 20 6a 75 6d 70 20   NULLs and jump 
17a10 64 69 72 65 63 74 6c 79 20 74 6f 20 64 65 73 74  directly to dest
17a20 49 66 4e 75 6c 6c 20 69 66 20 61 6e 79 20 61 72  IfNull if any ar
17a30 65 0a 20 20 20 20 2a 2a 20 66 6f 75 6e 64 2e 20  e.    ** found. 
17a40 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f  .    **.    ** O
17a50 74 68 65 72 77 69 73 65 2c 20 69 66 20 4e 55 4c  therwise, if NUL
17a60 4c 20 61 6e 64 20 66 61 6c 73 65 20 61 72 65 20  L and false are 
17a70 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e  handled differen
17a80 74 6c 79 2c 20 61 6e 64 20 74 68 65 0a 20 20 20  tly, and the.   
17a90 20 2a 2a 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72   ** IN(...) oper
17aa0 61 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61 20 76  ation is not a v
17ab0 65 63 74 6f 72 20 6f 70 65 72 61 74 69 6f 6e 2c  ector operation,
17ac0 20 61 6e 64 20 74 68 65 20 4c 48 53 20 6f 66 20   and the LHS of 
17ad0 74 68 65 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  the.    ** opera
17ae0 74 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  tor is NULL, the
17af0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  n the result is 
17b00 66 61 6c 73 65 20 69 66 20 74 68 65 20 69 6e 64  false if the ind
17b10 65 78 20 69 73 20 0a 20 20 20 20 2a 2a 20 63 6f  ex is .    ** co
17b20 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2c 20  mpletely empty, 
17b30 6f 72 20 4e 55 4c 4c 20 6f 74 68 65 72 77 69 73  or NULL otherwis
17b40 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64  e.  */.    if( d
17b50 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49  estIfNull==destI
17b60 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20  fFalse ){.      
17b70 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74  for(i=0; i<nVect
17b80 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  or; i++){.      
17b90 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
17ba0 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
17bb0 62 65 78 70 72 28 70 45 78 70 72 2d 3e 70 4c 65  bexpr(pExpr->pLe
17bc0 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  ft, i);.        
17bd0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
17be0 61 6e 42 65 4e 75 6c 6c 28 70 29 20 29 7b 0a 20  anBeNull(p) ){. 
17bf0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17c00 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17c10 5f 49 73 4e 75 6c 6c 2c 20 72 31 2b 61 69 4d 61  _IsNull, r1+aiMa
17c20 70 5b 69 5d 2c 20 64 65 73 74 49 66 4e 75 6c 6c  p[i], destIfNull
17c30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
17c40 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
17c50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
17c60 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56      }else if( nV
17c70 65 63 74 6f 72 3d 3d 31 20 26 26 20 73 71 6c 69  ector==1 && sqli
17c80 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
17c90 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29  (pExpr->pLeft) )
17ca0 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
17cb0 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
17cc0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e  ddOp1(v, OP_NotN
17cd0 75 6c 6c 2c 20 72 31 29 3b 20 56 64 62 65 43 6f  ull, r1); VdbeCo
17ce0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
17cf0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17d00 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
17d10 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
17d20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
17d30 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
17d40 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
17d50 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65  e3VdbeGoto(v, de
17d60 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
17d70 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
17d80 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
17d90 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
17da0 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
17db0 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20  _ROWID ){.      
17dc0 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  /* In this case,
17dd0 20 74 68 65 20 52 48 53 20 69 73 20 74 68 65 20   the RHS is the 
17de0 52 4f 57 49 44 20 6f 66 20 74 61 62 6c 65 20 62  ROWID of table b
17df0 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 73  -tree */.      s
17e00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
17e10 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64  (v, OP_SeekRowid
17e20 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
17e30 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31   destIfFalse, r1
17e40 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
17e50 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 65  erage(v);.    }e
17e60 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  lse{.      /* In
17e70 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20   this case, the 
17e80 52 48 53 20 69 73 20 61 6e 20 69 6e 64 65 78 20  RHS is an index 
17e90 62 2d 74 72 65 65 2e 20 41 70 70 6c 79 20 74 68  b-tree. Apply th
17ea0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20  e comparison.   
17eb0 20 20 20 2a 2a 20 61 66 66 69 6e 69 74 69 65 73     ** affinities
17ec0 20 74 6f 20 65 61 63 68 20 76 61 6c 75 65 20 6f   to each value o
17ed0 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65  n the LHS of the
17ee0 20 6f 70 65 72 61 74 6f 72 2e 20 20 2a 2f 0a 20   operator.  */. 
17ef0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17f00 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66  AddOp4(v, OP_Aff
17f10 69 6e 69 74 79 2c 20 72 31 2c 20 6e 56 65 63 74  inity, r1, nVect
17f20 6f 72 2c 20 30 2c 20 7a 41 66 66 2c 20 6e 56 65  or, 0, zAff, nVe
17f30 63 74 6f 72 29 3b 0a 20 20 20 20 20 20 0a 20 20  ctor);.      .  
17f40 20 20 20 20 69 66 28 20 6e 56 65 63 74 6f 72 3e      if( nVector>
17f50 31 20 26 26 20 64 65 73 74 49 66 4e 75 6c 6c 21  1 && destIfNull!
17f60 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a  =destIfFalse ){.
17f70 20 20 20 20 20 20 20 20 69 6e 74 20 69 49 64 78          int iIdx
17f80 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
17f90 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  ;.        int ad
17fa0 64 72 54 6f 70 3b 0a 20 20 20 20 20 20 20 20 69  drTop;.        i
17fb0 6e 74 20 61 64 64 72 4e 65 78 74 3b 0a 20 20 20  nt addrNext;.   
17fc0 20 20 20 20 20 69 6e 74 20 61 64 64 72 46 6f 75       int addrFou
17fd0 6e 64 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  nd;..        /* 
17fe0 53 65 61 72 63 68 20 74 68 65 20 69 6e 64 65 78  Search the index
17ff0 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 2a 2f   for the key. */
18000 0a 20 20 20 20 20 20 20 20 61 64 64 72 46 6f 75  .        addrFou
18010 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
18020 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
18030 46 6f 75 6e 64 2c 20 69 49 64 78 2c 20 30 2c 20  Found, iIdx, 0, 
18040 72 31 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20  r1, nVector);.  
18050 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
18060 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 20 20  ge(v);..        
18070 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
18080 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6b   the specified k
18090 65 79 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e  ey is not presen
180a0 74 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20  t in the index, 
180b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74  .        ** so t
180c0 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
180d0 20 49 4e 28 2e 2e 29 20 6f 70 65 72 61 74 6f 72   IN(..) operator
180e0 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
180f0 4e 55 4c 4c 20 6f 72 0a 20 20 20 20 20 20 20 20  NULL or.        
18100 2a 2a 20 30 2e 20 54 68 65 20 76 64 62 65 20 63  ** 0. The vdbe c
18110 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 65  ode generated be
18120 6c 6f 77 20 66 69 67 75 72 65 73 20 6f 75 74 20  low figures out 
18130 77 68 69 63 68 2e 20 20 2a 2f 0a 20 20 20 20 20  which.  */.     
18140 20 20 20 61 64 64 72 54 6f 70 20 3d 20 31 2b 73     addrTop = 1+s
18150 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18160 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
18170 49 64 78 2c 20 64 65 73 74 49 66 46 61 6c 73 65  Idx, destIfFalse
18180 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
18190 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
181a0 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73      addrNext = s
181b0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
181c0 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 20 20 20  bel(v);..       
181d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63   for(i=0; i<nVec
181e0 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  tor; i++){.     
181f0 20 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20       Expr *p;.  
18200 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
18210 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  *pColl;.        
18220 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74    int r2 = sqlit
18230 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
18240 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rse);.          
18250 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f  p = sqlite3Vecto
18260 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 4c  rFieldSubexpr(pL
18270 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  eft, i);.       
18280 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
18290 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
182a0 61 72 73 65 2c 20 70 29 3b 0a 0a 20 20 20 20 20  arse, p);..     
182b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
182c0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
182d0 75 6d 6e 2c 20 69 49 64 78 2c 20 69 2c 20 72 32  umn, iIdx, i, r2
182e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
182f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
18300 2c 20 4f 50 5f 4e 65 2c 20 72 31 2b 69 2c 20 61  , OP_Ne, r1+i, a
18310 64 64 72 4e 65 78 74 2c 20 72 32 2c 0a 20 20 20  ddrNext, r2,.   
18320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18330 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
18340 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
18350 51 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64  Q);.          Vd
18360 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
18370 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
18380 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
18390 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20  Parse, r2);.    
183a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
183b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
183c0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64  v, OP_Goto, 0, d
183d0 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
183e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
183f0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
18400 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20 20  ddrNext);.      
18410 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18420 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
18430 69 49 64 78 2c 20 61 64 64 72 54 6f 70 29 3b 0a  iIdx, addrTop);.
18440 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
18450 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
18460 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18470 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
18480 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
18490 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
184a0 6b 65 79 20 77 61 73 20 66 6f 75 6e 64 20 69 6e  key was found in
184b0 20 74 68 65 20 69 6e 64 65 78 2e 20 49 66 20 69   the index. If i
184c0 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e  t contains any N
184d0 55 4c 4c 20 76 61 6c 75 65 73 2c 0a 20 20 20 20  ULL values,.    
184e0 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
184f0 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 49 4e  result of the IN
18500 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20 69  (...) operator i
18510 73 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73  s NULL. Otherwis
18520 65 2c 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  e, the.        *
18530 2a 20 72 65 73 75 6c 74 20 69 73 20 31 2e 20 20  * result is 1.  
18540 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
18550 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
18560 2c 20 61 64 64 72 46 6f 75 6e 64 29 3b 0a 20 20  , addrFound);.  
18570 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
18580 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a  <nVector; i++){.
18590 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
185a0 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f  p = sqlite3Vecto
185b0 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 45  rFieldSubexpr(pE
185c0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a  xpr->pLeft, i);.
185d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
185e0 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75  lite3ExprCanBeNu
185f0 6c 6c 28 70 29 20 29 7b 0a 20 20 20 20 20 20 20  ll(p) ){.       
18600 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18610 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
18620 75 6c 6c 2c 20 72 31 2b 61 69 4d 61 70 5b 69 5d  ull, r1+aiMap[i]
18630 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
18640 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43             VdbeC
18650 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
18660 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18670 7d 0a 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  }..      }else i
18680 66 28 20 72 52 68 73 48 61 73 4e 75 6c 6c 3d 3d  f( rRhsHasNull==
18690 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
186a0 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73  This branch runs
186b0 20 69 66 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20   if it is known 
186c0 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20  at compile time 
186d0 74 68 61 74 20 74 68 65 20 52 48 53 0a 20 20 20  that the RHS.   
186e0 20 20 20 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 63       ** cannot c
186f0 6f 6e 74 61 69 6e 20 4e 55 4c 4c 20 76 61 6c 75  ontain NULL valu
18700 65 73 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73  es. This happens
18710 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20   as a result.   
18720 20 20 20 20 20 2a 2a 20 6f 66 20 22 4e 4f 54 20       ** of "NOT 
18730 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74  NULL" constraint
18740 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
18750 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 20 20  e schema..      
18760 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
18770 41 6c 73 6f 20 72 75 6e 20 74 68 69 73 20 62 72  Also run this br
18780 61 6e 63 68 20 69 66 20 4e 55 4c 4c 20 69 73 20  anch if NULL is 
18790 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 46 41  equivalent to FA
187a0 4c 53 45 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  LSE.        ** f
187b0 6f 72 20 74 68 69 73 20 70 61 72 74 69 63 75 6c  or this particul
187c0 61 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20  ar IN operator. 
187d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
187e0 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
187f0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 2c  (.            v,
18800 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70 45   OP_NotFound, pE
18810 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73  xpr->iTable, des
18820 74 49 66 46 61 6c 73 65 2c 20 72 31 2c 20 6e 56  tIfFalse, r1, nV
18830 65 63 74 6f 72 0a 20 20 20 20 20 20 20 20 29 3b  ector.        );
18840 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
18850 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
18860 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
18870 2a 20 49 6e 20 74 68 69 73 20 62 72 61 6e 63 68  * In this branch
18880 2c 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  , the RHS of the
18890 20 49 4e 20 6d 69 67 68 74 20 63 6f 6e 74 61 69   IN might contai
188a0 6e 20 61 20 4e 55 4c 4c 20 61 6e 64 0a 20 20 20  n a NULL and.   
188b0 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 65 73       ** the pres
188c0 65 6e 63 65 20 6f 66 20 61 20 4e 55 4c 4c 20 6f  ence of a NULL o
188d0 6e 20 74 68 65 20 52 48 53 20 6d 61 6b 65 73 20  n the RHS makes 
188e0 61 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20  a difference in 
188f0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  the.        ** o
18900 75 74 63 6f 6d 65 2e 0a 20 20 20 20 20 20 20 20  utcome..        
18910 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  */.        int a
18920 64 64 72 31 3b 0a 0a 20 20 20 20 20 20 20 20 2f  ddr1;..        /
18930 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f  * First check to
18940 20 73 65 65 20 69 66 20 74 68 65 20 4c 48 53 20   see if the LHS 
18950 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  is contained in 
18960 74 68 65 20 52 48 53 2e 20 20 49 66 20 73 6f 2c  the RHS.  If so,
18970 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
18980 20 74 68 65 20 61 6e 73 77 65 72 20 69 73 20 54   the answer is T
18990 52 55 45 20 74 68 65 20 70 72 65 73 65 6e 63 65  RUE the presence
189a0 20 6f 66 20 4e 55 4c 4c 73 20 69 6e 20 74 68 65   of NULLs in the
189b0 20 52 48 53 20 64 6f 65 73 0a 20 20 20 20 20 20   RHS does.      
189c0 20 20 2a 2a 20 6e 6f 74 20 6d 61 74 74 65 72 2e    ** not matter.
189d0 20 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20    If the LHS is 
189e0 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
189f0 20 74 68 65 20 52 48 53 2c 20 74 68 65 6e 20 74   the RHS, then t
18a00 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  he.        ** an
18a10 73 77 65 72 20 69 73 20 4e 55 4c 4c 20 69 66 20  swer is NULL if 
18a20 74 68 65 20 52 48 53 20 63 6f 6e 74 61 69 6e 73  the RHS contains
18a30 20 4e 55 4c 4c 73 20 61 6e 64 20 74 68 65 20 61   NULLs and the a
18a40 6e 73 77 65 72 20 69 73 0a 20 20 20 20 20 20 20  nswer is.       
18a50 20 2a 2a 20 46 41 4c 53 45 20 69 66 20 74 68 65   ** FALSE if the
18a60 20 52 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72 65   RHS is NULL-fre
18a70 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
18a80 20 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71        addr1 = sq
18a90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
18aa0 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
18ab0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30  pExpr->iTable, 0
18ac0 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  , r1, 1);.      
18ad0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
18ae0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
18af0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18b00 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 52 68 73 48  OP_IsNull, rRhsH
18b10 61 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75  asNull, destIfNu
18b20 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  ll);.        Vdb
18b30 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
18b40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18b50 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46  eGoto(v, destIfF
18b60 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  alse);.        s
18b70 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
18b80 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
18b90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
18ba0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
18bb0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
18bc0 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  r1);.  sqlite3Ex
18bd0 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
18be0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
18bf0 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
18c00 61 69 4d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65  aiMap);.  sqlite
18c10 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e  3DbFree(pParse->
18c20 64 62 2c 20 7a 41 66 66 29 3b 0a 20 20 56 64 62  db, zAff);.  Vdb
18c30 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e  eComment((v, "en
18c40 64 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 7d 0a  d IN expr"));.}.
18c50 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
18c60 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
18c70 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
18c80 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
18c90 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  POINT./*.** Gene
18ca0 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74  rate an instruct
18cb0 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75  ion that will pu
18cc0 74 20 74 68 65 20 66 6c 6f 61 74 69 6e 67 20 70  t the floating p
18cd0 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65  oint.** value de
18ce0 73 63 72 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e  scribed by z[0..
18cf0 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74  n-1] into regist
18d00 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54  er iMem..**.** T
18d10 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69  he z[] string wi
18d20 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20  ll probably not 
18d30 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74  be zero-terminat
18d40 65 64 2e 20 20 42 75 74 20 74 68 65 20 0a 2a 2a  ed.  But the .**
18d50 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65 72 20   z[n] character 
18d60 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
18d70 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68   be something th
18d80 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b  at does not look
18d90 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e  .** like the con
18da0 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65  tinuation of the
18db0 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74   number..*/.stat
18dc0 69 63 20 76 6f 69 64 20 63 6f 64 65 52 65 61 6c  ic void codeReal
18dd0 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20  (Vdbe *v, const 
18de0 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 65 67  char *z, int neg
18df0 61 74 65 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65  ateFlag, int iMe
18e00 6d 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  m){.  if( ALWAYS
18e10 28 7a 21 3d 30 29 20 29 7b 0a 20 20 20 20 64 6f  (z!=0) ){.    do
18e20 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20 20 20  uble value;.    
18e30 73 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20 26  sqlite3AtoF(z, &
18e40 76 61 6c 75 65 2c 20 73 71 6c 69 74 65 33 53 74  value, sqlite3St
18e50 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54  rlen30(z), SQLIT
18e60 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 61 73 73  E_UTF8);.    ass
18e70 65 72 74 28 20 21 73 71 6c 69 74 65 33 49 73 4e  ert( !sqlite3IsN
18e80 61 4e 28 76 61 6c 75 65 29 20 29 3b 20 2f 2a 20  aN(value) ); /* 
18e90 54 68 65 20 6e 65 77 20 41 74 6f 46 20 6e 65 76  The new AtoF nev
18ea0 65 72 20 72 65 74 75 72 6e 73 20 4e 61 4e 20 2a  er returns NaN *
18eb0 2f 0a 20 20 20 20 69 66 28 20 6e 65 67 61 74 65  /.    if( negate
18ec0 46 6c 61 67 20 29 20 76 61 6c 75 65 20 3d 20 2d  Flag ) value = -
18ed0 76 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69 74  value;.    sqlit
18ee0 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38  e3VdbeAddOp4Dup8
18ef0 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20  (v, OP_Real, 0, 
18f00 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76  iMem, 0, (u8*)&v
18f10 61 6c 75 65 2c 20 50 34 5f 52 45 41 4c 29 3b 0a  alue, P4_REAL);.
18f20 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
18f30 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
18f40 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
18f50 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 69  t will put the i
18f60 6e 74 65 67 65 72 20 64 65 73 63 72 69 62 65 20  nteger describe 
18f70 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e  by.** text z[0..
18f80 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74  n-1] into regist
18f90 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45  er iMem..**.** E
18fa0 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 69 73 20  xpr.u.zToken is 
18fb0 61 6c 77 61 79 73 20 55 54 46 38 20 61 6e 64 20  always UTF8 and 
18fc0 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e  zero-terminated.
18fd0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
18fe0 63 6f 64 65 49 6e 74 65 67 65 72 28 50 61 72 73  codeInteger(Pars
18ff0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
19000 2a 70 45 78 70 72 2c 20 69 6e 74 20 6e 65 67 46  *pExpr, int negF
19010 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a  lag, int iMem){.
19020 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
19030 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28  se->pVdbe;.  if(
19040 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20   pExpr->flags & 
19050 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20  EP_IntValue ){. 
19060 20 20 20 69 6e 74 20 69 20 3d 20 70 45 78 70 72     int i = pExpr
19070 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20  ->u.iValue;.    
19080 61 73 73 65 72 74 28 20 69 3e 3d 30 20 29 3b 0a  assert( i>=0 );.
19090 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20      if( negFlag 
190a0 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20 73 71  ) i = -i;.    sq
190b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
190c0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
190d0 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65  , iMem);.  }else
190e0 7b 0a 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20  {.    int c;.   
190f0 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20 20 20   i64 value;.    
19100 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
19110 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
19120 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d  .    assert( z!=
19130 30 20 29 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c  0 );.    c = sql
19140 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36  ite3DecOrHexToI6
19150 34 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20  4(z, &value);.  
19160 20 20 69 66 28 20 63 3d 3d 30 20 7c 7c 20 28 63    if( c==0 || (c
19170 3d 3d 32 20 26 26 20 6e 65 67 46 6c 61 67 29 20  ==2 && negFlag) 
19180 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67  ){.      if( neg
19190 46 6c 61 67 20 29 7b 20 76 61 6c 75 65 20 3d 20  Flag ){ value = 
191a0 63 3d 3d 32 20 3f 20 53 4d 41 4c 4c 45 53 54 5f  c==2 ? SMALLEST_
191b0 49 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20  INT64 : -value; 
191c0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
191d0 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c  dbeAddOp4Dup8(v,
191e0 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d   OP_Int64, 0, iM
191f0 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c  em, 0, (u8*)&val
19200 75 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20  ue, P4_INT64);. 
19210 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66     }else{.#ifdef
19220 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
19230 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
19240 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
19250 67 28 70 50 61 72 73 65 2c 20 22 6f 76 65 72 73  g(pParse, "overs
19260 69 7a 65 64 20 69 6e 74 65 67 65 72 3a 20 25 73  ized integer: %s
19270 25 73 22 2c 20 6e 65 67 46 6c 61 67 20 3f 20 22  %s", negFlag ? "
19280 2d 22 20 3a 20 22 22 2c 20 7a 29 3b 0a 23 65 6c  -" : "", z);.#el
19290 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  se.#ifndef SQLIT
192a0 45 5f 4f 4d 49 54 5f 48 45 58 5f 49 4e 54 45 47  E_OMIT_HEX_INTEG
192b0 45 52 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ER.      if( sql
192c0 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 2c  ite3_strnicmp(z,
192d0 22 30 78 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20  "0x",2)==0 ){.  
192e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
192f0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 68  orMsg(pParse, "h
19300 65 78 20 6c 69 74 65 72 61 6c 20 74 6f 6f 20 62  ex literal too b
19310 69 67 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20  ig: %s", z);.   
19320 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
19330 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
19340 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e  codeReal(v, z, n
19350 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 20  egFlag, iMem);. 
19360 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
19370 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64    }.  }.}..#if d
19380 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
19390 42 55 47 29 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66  BUG)./*.** Verif
193a0 79 20 74 68 65 20 63 6f 6e 73 69 73 74 65 6e 63  y the consistenc
193b0 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  y of the column 
193c0 63 61 63 68 65 0a 2a 2f 0a 73 74 61 74 69 63 20  cache.*/.static 
193d0 69 6e 74 20 63 61 63 68 65 49 73 56 61 6c 69 64  int cacheIsValid
193e0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
193f0 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 66  .  int i, n;.  f
19400 6f 72 28 69 3d 6e 3d 30 3b 20 69 3c 53 51 4c 49  or(i=n=0; i<SQLI
19410 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
19420 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ++){.    if( pPa
19430 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69  rse->aColCache[i
19440 5d 2e 69 52 65 67 3e 30 20 29 20 6e 2b 2b 3b 0a  ].iReg>0 ) n++;.
19450 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3d 3d    }.  return n==
19460 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
19470 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e;.}.#endif../*.
19480 2a 2a 20 43 6c 65 61 72 20 61 20 63 61 63 68 65  ** Clear a cache
19490 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61 74 69   entry..*/.stati
194a0 63 20 76 6f 69 64 20 63 61 63 68 65 45 6e 74 72  c void cacheEntr
194b0 79 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50  yClear(Parse *pP
194c0 61 72 73 65 2c 20 73 74 72 75 63 74 20 79 43 6f  arse, struct yCo
194d0 6c 43 61 63 68 65 20 2a 70 29 7b 0a 20 20 69 66  lCache *p){.  if
194e0 28 20 70 2d 3e 74 65 6d 70 52 65 67 20 29 7b 0a  ( p->tempReg ){.
194f0 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
19500 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69  nTempReg<ArraySi
19510 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  ze(pParse->aTemp
19520 52 65 67 29 20 29 7b 0a 20 20 20 20 20 20 70 50  Reg) ){.      pP
19530 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70  arse->aTempReg[p
19540 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b  Parse->nTempReg+
19550 2b 5d 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20  +] = p->iReg;.  
19560 20 20 7d 0a 20 20 20 20 70 2d 3e 74 65 6d 70 52    }.    p->tempR
19570 65 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 2d  eg = 0;.  }.  p-
19580 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 70 50 61  >iReg = 0;.  pPa
19590 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 2d 2d  rse->nColCache--
195a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
195b0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
195c0 69 6c 65 64 20 7c 7c 20 63 61 63 68 65 49 73 56  iled || cacheIsV
195d0 61 6c 69 64 28 70 50 61 72 73 65 29 20 29 3b 0a  alid(pParse) );.
195e0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64  }.../*.** Record
195f0 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   in the column c
19600 61 63 68 65 20 74 68 61 74 20 61 20 70 61 72 74  ache that a part
19610 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20 66 72  icular column fr
19620 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69 63 75 6c  om a.** particul
19630 61 72 20 74 61 62 6c 65 20 69 73 20 73 74 6f 72  ar table is stor
19640 65 64 20 69 6e 20 61 20 70 61 72 74 69 63 75 6c  ed in a particul
19650 61 72 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a  ar register..*/.
19660 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
19670 43 61 63 68 65 53 74 6f 72 65 28 50 61 72 73 65  CacheStore(Parse
19680 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54   *pParse, int iT
19690 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e  ab, int iCol, in
196a0 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t iReg){.  int i
196b0 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72 75 3b 0a  ;.  int minLru;.
196c0 20 20 69 6e 74 20 69 64 78 4c 72 75 3b 0a 20 20    int idxLru;.  
196d0 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
196e0 20 2a 70 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73   *p;..  /* Unles
196f0 73 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f  s an error has o
19700 63 63 75 72 72 65 64 2c 20 72 65 67 69 73 74 65  ccurred, registe
19710 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c  r numbers are al
19720 77 61 79 73 20 70 6f 73 69 74 69 76 65 2e 20 2a  ways positive. *
19730 2f 0a 20 20 61 73 73 65 72 74 28 20 69 52 65 67  /.  assert( iReg
19740 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  >0 || pParse->nE
19750 72 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  rr || pParse->db
19760 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
19770 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c  ;.  assert( iCol
19780 3e 3d 2d 31 20 26 26 20 69 43 6f 6c 3c 33 32 37  >=-1 && iCol<327
19790 36 38 20 29 3b 20 20 2f 2a 20 46 69 6e 69 74 65  68 );  /* Finite
197a0 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73 20   column numbers 
197b0 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c  */..  /* The SQL
197c0 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 20  ITE_ColumnCache 
197d0 66 6c 61 67 20 64 69 73 61 62 6c 65 73 20 74 68  flag disables th
197e0 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 20  e column cache. 
197f0 20 54 68 69 73 20 69 73 20 75 73 65 64 0a 20 20   This is used.  
19800 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 6f  ** for testing o
19810 6e 6c 79 20 2d 20 74 6f 20 76 65 72 69 66 79 20  nly - to verify 
19820 74 68 61 74 20 53 51 4c 69 74 65 20 61 6c 77 61  that SQLite alwa
19830 79 73 20 67 65 74 73 20 74 68 65 20 73 61 6d 65  ys gets the same
19840 20 61 6e 73 77 65 72 0a 20 20 2a 2a 20 77 69 74   answer.  ** wit
19850 68 20 61 6e 64 20 77 69 74 68 6f 75 74 20 74 68  h and without th
19860 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a  e column cache..
19870 20 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d    */.  if( Optim
19880 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28  izationDisabled(
19890 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49  pParse->db, SQLI
198a0 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 29 20  TE_ColumnCache) 
198b0 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
198c0 46 69 72 73 74 20 72 65 70 6c 61 63 65 20 61 6e  First replace an
198d0 79 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79  y existing entry
198e0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75  ..  **.  ** Actu
198f0 61 6c 6c 79 2c 20 74 68 65 20 77 61 79 20 74 68  ally, the way th
19900 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 69  e column cache i
19910 73 20 63 75 72 72 65 6e 74 6c 79 20 75 73 65 64  s currently used
19920 2c 20 77 65 20 61 72 65 20 67 75 61 72 61 6e 74  , we are guarant
19930 65 65 64 0a 20 20 2a 2a 20 74 68 61 74 20 74 68  eed.  ** that th
19940 65 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 6e 65  e object will ne
19950 76 65 72 20 61 6c 72 65 61 64 79 20 62 65 20 69  ver already be i
19960 6e 20 63 61 63 68 65 2e 20 20 56 65 72 69 66 79  n cache.  Verify
19970 20 74 68 69 73 20 67 75 61 72 61 6e 74 65 65 2e   this guarantee.
19980 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  .  */.#ifndef ND
19990 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30 2c 20  EBUG.  for(i=0, 
199a0 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
199b0 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
199c0 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
199d0 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
199e0 20 70 2d 3e 69 52 65 67 3d 3d 30 20 7c 7c 20 70   p->iReg==0 || p
199f0 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c  ->iTable!=iTab |
19a00 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43  | p->iColumn!=iC
19a10 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ol );.  }.#endif
19a20 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 6e 20 65  ..  /* Find an e
19a30 6d 70 74 79 20 73 6c 6f 74 20 61 6e 64 20 72 65  mpty slot and re
19a40 70 6c 61 63 65 20 69 74 20 2a 2f 0a 20 20 66 6f  place it */.  fo
19a50 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
19a60 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
19a70 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
19a80 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
19a90 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 30 20 29  if( p->iReg==0 )
19aa0 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 65 76 65  {.      p->iLeve
19ab0 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  l = pParse->iCac
19ac0 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20 70  heLevel;.      p
19ad0 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b  ->iTable = iTab;
19ae0 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d  .      p->iColum
19af0 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  n = iCol;.      
19b00 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a  p->iReg = iReg;.
19b10 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67        p->tempReg
19b20 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 6c   = 0;.      p->l
19b30 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  ru = pParse->iCa
19b40 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  cheCnt++;.      
19b50 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
19b60 65 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e++;.      asser
19b70 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  t( pParse->db->m
19b80 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 63  allocFailed || c
19b90 61 63 68 65 49 73 56 61 6c 69 64 28 70 50 61 72  acheIsValid(pPar
19ba0 73 65 29 20 29 3b 0a 20 20 20 20 20 20 72 65 74  se) );.      ret
19bb0 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  urn;.    }.  }..
19bc0 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68 65    /* Replace the
19bd0 20 6c 61 73 74 20 72 65 63 65 6e 74 6c 79 20 75   last recently u
19be0 73 65 64 20 2a 2f 0a 20 20 6d 69 6e 4c 72 75 20  sed */.  minLru 
19bf0 3d 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20  = 0x7fffffff;.  
19c00 69 64 78 4c 72 75 20 3d 20 2d 31 3b 0a 20 20 66  idxLru = -1;.  f
19c10 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
19c20 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
19c30 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
19c40 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
19c50 20 69 66 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c   if( p->lru<minL
19c60 72 75 20 29 7b 0a 20 20 20 20 20 20 69 64 78 4c  ru ){.      idxL
19c70 72 75 20 3d 20 69 3b 0a 20 20 20 20 20 20 6d 69  ru = i;.      mi
19c80 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72 75 3b 0a 20  nLru = p->lru;. 
19c90 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 41     }.  }.  if( A
19ca0 4c 57 41 59 53 28 69 64 78 4c 72 75 3e 3d 30 29  LWAYS(idxLru>=0)
19cb0 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 50 61   ){.    p = &pPa
19cc0 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69  rse->aColCache[i
19cd0 64 78 4c 72 75 5d 3b 0a 20 20 20 20 70 2d 3e 69  dxLru];.    p->i
19ce0 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e  Level = pParse->
19cf0 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20  iCacheLevel;.   
19d00 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61   p->iTable = iTa
19d10 62 3b 0a 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d  b;.    p->iColum
19d20 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 2d  n = iCol;.    p-
19d30 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20  >iReg = iReg;.  
19d40 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30    p->tempReg = 0
19d50 3b 0a 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70  ;.    p->lru = p
19d60 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74  Parse->iCacheCnt
19d70 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ++;.    assert( 
19d80 63 61 63 68 65 49 73 56 61 6c 69 64 28 70 50 61  cacheIsValid(pPa
19d90 72 73 65 29 20 29 3b 0a 20 20 20 20 72 65 74 75  rse) );.    retu
19da0 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn;.  }.}../*.**
19db0 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 72   Indicate that r
19dc0 65 67 69 73 74 65 72 73 20 62 65 74 77 65 65 6e  egisters between
19dd0 20 69 52 65 67 2e 2e 69 52 65 67 2b 6e 52 65 67   iReg..iReg+nReg
19de0 2d 31 20 61 72 65 20 62 65 69 6e 67 20 6f 76 65  -1 are being ove
19df0 72 77 72 69 74 74 65 6e 2e 0a 2a 2a 20 50 75 72  rwritten..** Pur
19e00 67 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20  ge the range of 
19e10 72 65 67 69 73 74 65 72 73 20 66 72 6f 6d 20 74  registers from t
19e20 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
19e30 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
19e40 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
19e50 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
19e60 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65  nt iReg, int nRe
19e70 67 29 7b 0a 20 20 73 74 72 75 63 74 20 79 43 6f  g){.  struct yCo
19e80 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 69 66 28  lCache *p;.  if(
19e90 20 69 52 65 67 3c 3d 30 20 7c 7c 20 70 50 61 72   iReg<=0 || pPar
19ea0 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3d 3d 30  se->nColCache==0
19eb0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d   ) return;.  p =
19ec0 20 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61   &pParse->aColCa
19ed0 63 68 65 5b 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  che[SQLITE_N_COL
19ee0 43 41 43 48 45 2d 31 5d 3b 0a 20 20 77 68 69 6c  CACHE-1];.  whil
19ef0 65 28 31 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  e(1){.    if( p-
19f00 3e 69 52 65 67 20 3e 3d 20 69 52 65 67 20 26 26  >iReg >= iReg &&
19f10 20 70 2d 3e 69 52 65 67 20 3c 20 69 52 65 67 2b   p->iReg < iReg+
19f20 6e 52 65 67 20 29 20 63 61 63 68 65 45 6e 74 72  nReg ) cacheEntr
19f30 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70  yClear(pParse, p
19f40 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 70 50  );.    if( p==pP
19f50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 20  arse->aColCache 
19f60 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 2d 2d  ) break;.    p--
19f70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
19f80 65 6d 65 6d 62 65 72 20 74 68 65 20 63 75 72 72  emember the curr
19f90 65 6e 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  ent column cache
19fa0 20 63 6f 6e 74 65 78 74 2e 20 20 41 6e 79 20 6e   context.  Any n
19fb0 65 77 20 65 6e 74 72 69 65 73 20 61 64 64 65 64  ew entries added
19fc0 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65  .** added to the
19fd0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 66   column cache af
19fe0 74 65 72 20 74 68 69 73 20 63 61 6c 6c 20 61 72  ter this call ar
19ff0 65 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 20 74  e removed when t
1a000 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  he.** correspond
1a010 69 6e 67 20 70 6f 70 20 6f 63 63 75 72 73 2e 0a  ing pop occurs..
1a020 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1a030 78 70 72 43 61 63 68 65 50 75 73 68 28 50 61 72  xprCachePush(Par
1a040 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70  se *pParse){.  p
1a050 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
1a060 65 6c 2b 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c  el++;.#ifdef SQL
1a070 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
1a080 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
1a090 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41  s & SQLITE_VdbeA
1a0a0 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20  ddopTrace ){.   
1a0b0 20 70 72 69 6e 74 66 28 22 50 55 53 48 20 74 6f   printf("PUSH to
1a0c0 20 25 64 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e   %d\n", pParse->
1a0d0 69 43 61 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20  iCacheLevel);.  
1a0e0 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
1a0f0 2a 20 52 65 6d 6f 76 65 20 66 72 6f 6d 20 74 68  * Remove from th
1a100 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61  e column cache a
1a110 6e 79 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  ny entries that 
1a120 77 65 72 65 20 61 64 64 65 64 20 73 69 6e 63 65  were added since
1a130 20 74 68 65 0a 2a 2a 20 74 68 65 20 70 72 65 76   the.** the prev
1a140 69 6f 75 73 20 73 71 6c 69 74 65 33 45 78 70 72  ious sqlite3Expr
1a150 43 61 63 68 65 50 75 73 68 20 6f 70 65 72 61 74  CachePush operat
1a160 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ion.  In other w
1a170 6f 72 64 73 2c 20 72 65 73 74 6f 72 65 0a 2a 2a  ords, restore.**
1a180 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 74 68   the cache to th
1a190 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69  e state it was i
1a1a0 6e 20 70 72 69 6f 72 20 74 68 65 20 6d 6f 73 74  n prior the most
1a1b0 20 72 65 63 65 6e 74 20 50 75 73 68 2e 0a 2a 2f   recent Push..*/
1a1c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1a1d0 72 43 61 63 68 65 50 6f 70 28 50 61 72 73 65 20  rCachePop(Parse 
1a1e0 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20  *pParse){.  int 
1a1f0 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
1a200 43 61 63 68 65 20 2a 70 3b 0a 20 20 61 73 73 65  Cache *p;.  asse
1a210 72 74 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63  rt( pParse->iCac
1a220 68 65 4c 65 76 65 6c 3e 3d 31 20 29 3b 0a 20 20  heLevel>=1 );.  
1a230 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1a240 76 65 6c 2d 2d 3b 0a 23 69 66 64 65 66 20 53 51  vel--;.#ifdef SQ
1a250 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
1a260 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
1a270 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
1a280 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
1a290 20 20 70 72 69 6e 74 66 28 22 50 4f 50 20 20 74    printf("POP  t
1a2a0 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72 73 65 2d  o %d\n", pParse-
1a2b0 3e 69 43 61 63 68 65 4c 65 76 65 6c 29 3b 0a 20  >iCacheLevel);. 
1a2c0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28   }.#endif.  for(
1a2d0 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
1a2e0 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
1a2f0 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
1a300 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
1a310 28 20 70 2d 3e 69 52 65 67 20 26 26 20 70 2d 3e  ( p->iReg && p->
1a320 69 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e 69  iLevel>pParse->i
1a330 43 61 63 68 65 4c 65 76 65 6c 20 29 7b 0a 20 20  CacheLevel ){.  
1a340 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c      cacheEntryCl
1a350 65 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ear(pParse, p);.
1a360 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1a370 2a 2a 20 57 68 65 6e 20 61 20 63 61 63 68 65 64  ** When a cached
1a380 20 63 6f 6c 75 6d 6e 20 69 73 20 72 65 75 73 65   column is reuse
1a390 64 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  d, make sure tha
1a3a0 74 20 69 74 73 20 72 65 67 69 73 74 65 72 20 69  t its register i
1a3b0 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20 61  s.** no longer a
1a3c0 76 61 69 6c 61 62 6c 65 20 61 73 20 61 20 74 65  vailable as a te
1a3d0 6d 70 20 72 65 67 69 73 74 65 72 2e 20 20 74 69  mp register.  ti
1a3e0 63 6b 65 74 20 23 33 38 37 39 3a 20 20 74 68 61  cket #3879:  tha
1a3f0 74 20 73 61 6d 65 0a 2a 2a 20 72 65 67 69 73 74  t same.** regist
1a400 65 72 20 6d 69 67 68 74 20 62 65 20 69 6e 20 74  er might be in t
1a410 68 65 20 63 61 63 68 65 20 69 6e 20 6d 75 6c 74  he cache in mult
1a420 69 70 6c 65 20 70 6c 61 63 65 73 2c 20 73 6f 20  iple places, so 
1a430 62 65 20 73 75 72 65 20 74 6f 0a 2a 2a 20 67 65  be sure to.** ge
1a440 74 20 74 68 65 6d 20 61 6c 6c 2e 0a 2a 2f 0a 73  t them all..*/.s
1a450 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
1a460 65 33 45 78 70 72 43 61 63 68 65 50 69 6e 52 65  e3ExprCachePinRe
1a470 67 69 73 74 65 72 28 50 61 72 73 65 20 2a 70 50  gister(Parse *pP
1a480 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b  arse, int iReg){
1a490 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
1a4a0 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
1a4b0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
1a4c0 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
1a4d0 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
1a4e0 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
1a4f0 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67  .    if( p->iReg
1a500 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20  ==iReg ){.      
1a510 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a  p->tempReg = 0;.
1a520 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20      }.  }.}../* 
1a530 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
1a540 61 74 20 77 69 6c 6c 20 6c 6f 61 64 20 69 6e 74  at will load int
1a550 6f 20 72 65 67 69 73 74 65 72 20 72 65 67 4f 75  o register regOu
1a560 74 20 61 20 76 61 6c 75 65 20 74 68 61 74 20 69  t a value that i
1a570 73 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65  s.** appropriate
1a580 20 66 6f 72 20 74 68 65 20 69 49 64 78 43 6f 6c   for the iIdxCol
1a590 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e  -th column of in
1a5a0 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 76 6f 69  dex pIdx..*/.voi
1a5b0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
1a5c0 65 4c 6f 61 64 49 6e 64 65 78 43 6f 6c 75 6d 6e  eLoadIndexColumn
1a5d0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1a5e0 65 2c 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69  e,  /* The parsi
1a5f0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1a600 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20  Index *pIdx,    
1a610 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 68 6f  /* The index who
1a620 73 65 20 63 6f 6c 75 6d 6e 20 69 73 20 74 6f 20  se column is to 
1a630 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69  be loaded */.  i
1a640 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20 20 2f  nt iTabCur,    /
1a650 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  * Cursor pointin
1a660 67 20 74 6f 20 61 20 74 61 62 6c 65 20 72 6f 77  g to a table row
1a670 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 6f   */.  int iIdxCo
1a680 6c 2c 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c  l,    /* The col
1a690 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
1a6a0 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f   to be loaded */
1a6b0 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20 20 20  .  int regOut   
1a6c0 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
1a6d0 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 76 61 6c  index column val
1a6e0 75 65 20 69 6e 20 74 68 69 73 20 72 65 67 69 73  ue in this regis
1a6f0 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 31 36 20  ter */.){.  i16 
1a700 69 54 61 62 43 6f 6c 20 3d 20 70 49 64 78 2d 3e  iTabCol = pIdx->
1a710 61 69 43 6f 6c 75 6d 6e 5b 69 49 64 78 43 6f 6c  aiColumn[iIdxCol
1a720 5d 3b 0a 20 20 69 66 28 20 69 54 61 62 43 6f 6c  ];.  if( iTabCol
1a730 3d 3d 58 4e 5f 45 58 50 52 20 29 7b 0a 20 20 20  ==XN_EXPR ){.   
1a740 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
1a750 43 6f 6c 45 78 70 72 20 29 3b 0a 20 20 20 20 61  ColExpr );.    a
1a760 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 43 6f  ssert( pIdx->aCo
1a770 6c 45 78 70 72 2d 3e 6e 45 78 70 72 3e 69 49 64  lExpr->nExpr>iId
1a780 78 43 6f 6c 20 29 3b 0a 20 20 20 20 70 50 61 72  xCol );.    pPar
1a790 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20 69  se->iSelfTab = i
1a7a0 54 61 62 43 75 72 3b 0a 20 20 20 20 73 71 6c 69  TabCur;.    sqli
1a7b0 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28  te3ExprCodeCopy(
1a7c0 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 61 43  pParse, pIdx->aC
1a7d0 6f 6c 45 78 70 72 2d 3e 61 5b 69 49 64 78 43 6f  olExpr->a[iIdxCo
1a7e0 6c 5d 2e 70 45 78 70 72 2c 20 72 65 67 4f 75 74  l].pExpr, regOut
1a7f0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1a800 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1a810 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28  etColumnOfTable(
1a820 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70  pParse->pVdbe, p
1a830 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20 69 54 61  Idx->pTable, iTa
1a840 62 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20  bCur,.          
1a850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a860 20 20 20 20 20 20 20 20 20 20 69 54 61 62 43 6f            iTabCo
1a870 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a  l, regOut);.  }.
1a880 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1a890 65 20 63 6f 64 65 20 74 6f 20 65 78 74 72 61 63  e code to extrac
1a8a0 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
1a8b0 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d  he iCol-th colum
1a8c0 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a 2a 2f  n of a table..*/
1a8d0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1a8e0 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66  rCodeGetColumnOf
1a8f0 54 61 62 6c 65 28 0a 20 20 56 64 62 65 20 2a 76  Table(.  Vdbe *v
1a900 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
1a910 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74  VDBE under const
1a920 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 61 62  ruction */.  Tab
1a930 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 2f 2a 20  le *pTab,    /* 
1a940 54 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  The table contai
1a950 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 2a  ning the value *
1a960 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c  /.  int iTabCur,
1a970 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
1a980 20 63 75 72 73 6f 72 2e 20 20 4f 72 20 74 68 65   cursor.  Or the
1a990 20 50 4b 20 63 75 72 73 6f 72 20 66 6f 72 20 57   PK cursor for W
1a9a0 49 54 48 4f 55 54 20 52 4f 57 49 44 20 2a 2f 0a  ITHOUT ROWID */.
1a9b0 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20    int iCol,     
1a9c0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
1a9d0 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72  e column to extr
1a9e0 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  act */.  int reg
1a9f0 4f 75 74 20 20 20 20 20 20 2f 2a 20 45 78 74 72  Out      /* Extr
1aa00 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e  act the value in
1aa10 74 6f 20 74 68 69 73 20 72 65 67 69 73 74 65 72  to this register
1aa20 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 43 6f   */.){.  if( iCo
1aa30 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61  l<0 || iCol==pTa
1aa40 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20  b->iPKey ){.    
1aa50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1aa60 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69  2(v, OP_Rowid, i
1aa70 54 61 62 43 75 72 2c 20 72 65 67 4f 75 74 29 3b  TabCur, regOut);
1aa80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1aa90 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75 61 6c  t op = IsVirtual
1aaa0 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c  (pTab) ? OP_VCol
1aab0 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b  umn : OP_Column;
1aac0 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 69 43 6f  .    int x = iCo
1aad0 6c 3b 0a 20 20 20 20 69 66 28 20 21 48 61 73 52  l;.    if( !HasR
1aae0 6f 77 69 64 28 70 54 61 62 29 20 26 26 20 21 49  owid(pTab) && !I
1aaf0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
1ab00 7b 0a 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69  {.      x = sqli
1ab10 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
1ab20 28 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b  (sqlite3PrimaryK
1ab30 65 79 49 6e 64 65 78 28 70 54 61 62 29 2c 20 69  eyIndex(pTab), i
1ab40 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Col);.    }.    
1ab50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ab60 33 28 76 2c 20 6f 70 2c 20 69 54 61 62 43 75 72  3(v, op, iTabCur
1ab70 2c 20 78 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  , x, regOut);.  
1ab80 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20  }.  if( iCol>=0 
1ab90 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  ){.    sqlite3Co
1aba0 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70  lumnDefault(v, p
1abb0 54 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75  Tab, iCol, regOu
1abc0 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
1abd0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1abe0 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74  hat will extract
1abf0 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20   the iColumn-th 
1ac00 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74  column from.** t
1ac10 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74  able pTab and st
1ac20 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76  ore the column v
1ac30 61 6c 75 65 20 69 6e 20 61 20 72 65 67 69 73 74  alue in a regist
1ac40 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 66  er. .**.** An ef
1ac50 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20  fort is made to 
1ac60 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e  store the column
1ac70 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
1ac80 65 72 20 69 52 65 67 2e 20 20 54 68 69 73 0a 2a  er iReg.  This.*
1ac90 2a 20 69 73 20 6e 6f 74 20 67 61 72 61 6e 74 65  * is not garante
1aca0 65 65 64 20 66 6f 72 20 47 65 74 43 6f 6c 75 6d  eed for GetColum
1acb0 6e 28 29 20 2d 20 74 68 65 20 72 65 73 75 6c 74  n() - the result
1acc0 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64 20 69   can be stored i
1acd0 6e 0a 2a 2a 20 61 6e 79 20 72 65 67 69 73 74 65  n.** any registe
1ace0 72 2e 20 20 42 75 74 20 74 68 65 20 72 65 73 75  r.  But the resu
1acf0 6c 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  lt is guaranteed
1ad00 20 74 6f 20 6c 61 6e 64 20 69 6e 20 72 65 67 69   to land in regi
1ad10 73 74 65 72 20 69 52 65 67 0a 2a 2a 20 66 6f 72  ster iReg.** for
1ad20 20 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28   GetColumnToReg(
1ad30 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d  )..**.** There m
1ad40 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63  ust be an open c
1ad50 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e  ursor to pTab in
1ad60 20 69 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69   iTable when thi
1ad70 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
1ad80 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c  called.  If iCol
1ad90 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20  umn<0 then code 
1ada0 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 68 61  is generated tha
1adb0 74 20 65 78 74 72 61 63 74 73 20 74 68 65 20 72  t extracts the r
1adc0 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  owid..*/.int sql
1add0 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
1ade0 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a  olumn(.  Parse *
1adf0 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72  pParse,   /* Par
1ae00 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
1ae10 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
1ae20 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
1ae30 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69  b,     /* Descri
1ae40 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62  ption of the tab
1ae50 6c 65 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  le we are readin
1ae60 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  g from */.  int 
1ae70 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20  iColumn,     /* 
1ae80 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62  Index of the tab
1ae90 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69  le column */.  i
1aea0 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
1aeb0 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f  /* The cursor po
1aec0 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61  inting to the ta
1aed0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ble */.  int iRe
1aee0 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f  g,        /* Sto
1aef0 72 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  re results here 
1af00 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20 20  */.  u8 p5      
1af10 20 20 20 20 20 20 2f 2a 20 50 35 20 76 61 6c 75        /* P5 valu
1af20 65 20 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20  e for OP_Column 
1af30 2b 20 46 4c 41 47 53 20 2a 2f 0a 29 7b 0a 20 20  + FLAGS */.){.  
1af40 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1af50 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
1af60 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
1af70 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28  ache *p;..  for(
1af80 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
1af90 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
1afa0 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
1afb0 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
1afc0 28 20 70 2d 3e 69 52 65 67 3e 30 20 26 26 20 70  ( p->iReg>0 && p
1afd0 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65  ->iTable==iTable
1afe0 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d   && p->iColumn==
1aff0 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
1b000 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65   p->lru = pParse
1b010 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20  ->iCacheCnt++;. 
1b020 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1b030 43 61 63 68 65 50 69 6e 52 65 67 69 73 74 65 72  CachePinRegister
1b040 28 70 50 61 72 73 65 2c 20 70 2d 3e 69 52 65 67  (pParse, p->iReg
1b050 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1b060 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20  p->iReg;.    }. 
1b070 20 7d 20 20 0a 20 20 61 73 73 65 72 74 28 20 76   }  .  assert( v
1b080 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
1b090 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
1b0a0 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62  nOfTable(v, pTab
1b0b0 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d  , iTable, iColum
1b0c0 6e 2c 20 69 52 65 67 29 3b 0a 20 20 69 66 28 20  n, iReg);.  if( 
1b0d0 70 35 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  p5 ){.    sqlite
1b0e0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
1b0f0 20 70 35 29 3b 0a 20 20 7d 65 6c 73 65 7b 20 20   p5);.  }else{  
1b100 20 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70   .    sqlite3Exp
1b110 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72  rCacheStore(pPar
1b120 73 65 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c  se, iTable, iCol
1b130 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 7d 0a  umn, iReg);.  }.
1b140 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d    return iReg;.}
1b150 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1b160 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 54 6f  rCodeGetColumnTo
1b170 52 65 67 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Reg(.  Parse *pP
1b180 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69  arse,   /* Parsi
1b190 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
1b1a0 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
1b1b0 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
1b1c0 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
1b1d0 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ion of the table
1b1e0 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
1b1f0 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43  from */.  int iC
1b200 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e  olumn,     /* In
1b210 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65  dex of the table
1b220 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74   column */.  int
1b230 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a   iTable,      /*
1b240 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   The cursor poin
1b250 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c  ting to the tabl
1b260 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 20  e */.  int iReg 
1b270 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
1b280 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
1b290 0a 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73  .){.  int r1 = s
1b2a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
1b2b0 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  tColumn(pParse, 
1b2c0 70 54 61 62 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69  pTab, iColumn, i
1b2d0 54 61 62 6c 65 2c 20 69 52 65 67 2c 20 30 29 3b  Table, iReg, 0);
1b2e0 0a 20 20 69 66 28 20 72 31 21 3d 69 52 65 67 20  .  if( r1!=iReg 
1b2f0 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  ) sqlite3VdbeAdd
1b300 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op2(pParse->pVdb
1b310 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c  e, OP_SCopy, r1,
1b320 20 69 52 65 67 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   iReg);.}.../*.*
1b330 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6c 75  * Clear all colu
1b340 6d 6e 20 63 61 63 68 65 20 65 6e 74 72 69 65 73  mn cache entries
1b350 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1b360 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
1b370 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
1b380 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
1b390 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
1b3a0 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55  .#if SQLITE_DEBU
1b3b0 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  G.  if( pParse->
1b3c0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1b3d0 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
1b3e0 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  e ){.    printf(
1b3f0 22 43 4c 45 41 52 5c 6e 22 29 3b 0a 20 20 7d 0a  "CLEAR\n");.  }.
1b400 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 30  #endif.  for(i=0
1b410 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
1b420 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
1b430 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
1b440 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
1b450 2d 3e 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20  ->iReg ){.      
1b460 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28  cacheEntryClear(
1b470 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
1b480 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  }.  }.}../*.** R
1b490 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
1b4a0 68 61 74 20 61 6e 20 61 66 66 69 6e 69 74 79 20  hat an affinity 
1b4b0 63 68 61 6e 67 65 20 68 61 73 20 6f 63 63 75 72  change has occur
1b4c0 72 65 64 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a 2a  red on iCount.**
1b4d0 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74   registers start
1b4e0 69 6e 67 20 77 69 74 68 20 69 53 74 61 72 74 2e  ing with iStart.
1b4f0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1b500 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
1b510 79 43 68 61 6e 67 65 28 50 61 72 73 65 20 2a 70  yChange(Parse *p
1b520 50 61 72 73 65 2c 20 69 6e 74 20 69 53 74 61 72  Parse, int iStar
1b530 74 2c 20 69 6e 74 20 69 43 6f 75 6e 74 29 7b 0a  t, int iCount){.
1b540 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1b550 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c  heRemove(pParse,
1b560 20 69 53 74 61 72 74 2c 20 69 43 6f 75 6e 74 29   iStart, iCount)
1b570 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
1b580 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76 65  ate code to move
1b590 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65   content from re
1b5a0 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e  gisters iFrom...
1b5b0 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20  iFrom+nReg-1.** 
1b5c0 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f  over to iTo..iTo
1b5d0 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70 20 74 68  +nReg-1. Keep th
1b5e0 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 75  e column cache u
1b5f0 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76 6f  p-to-date..*/.vo
1b600 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
1b610 64 65 4d 6f 76 65 28 50 61 72 73 65 20 2a 70 50  deMove(Parse *pP
1b620 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c  arse, int iFrom,
1b630 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52   int iTo, int nR
1b640 65 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  eg){.  assert( i
1b650 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52 65 67 20 7c  From>=iTo+nReg |
1b660 7c 20 69 46 72 6f 6d 2b 6e 52 65 67 3c 3d 69 54  | iFrom+nReg<=iT
1b670 6f 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  o );.  sqlite3Vd
1b680 62 65 41 64 64 4f 70 33 28 70 50 61 72 73 65 2d  beAddOp3(pParse-
1b690 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c  >pVdbe, OP_Move,
1b6a0 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65   iFrom, iTo, nRe
1b6b0 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  g);.  sqlite3Exp
1b6c0 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61  rCacheRemove(pPa
1b6d0 72 73 65 2c 20 69 46 72 6f 6d 2c 20 6e 52 65 67  rse, iFrom, nReg
1b6e0 29 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  );.}..#if define
1b6f0 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
1b700 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
1b710 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54 29  E_COVERAGE_TEST)
1b720 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
1b730 75 65 20 69 66 20 61 6e 79 20 72 65 67 69 73 74  ue if any regist
1b740 65 72 20 69 6e 20 74 68 65 20 72 61 6e 67 65 20  er in the range 
1b750 69 46 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c  iFrom..iTo (incl
1b760 75 73 69 76 65 29 0a 2a 2a 20 69 73 20 75 73 65  usive).** is use
1b770 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
1b780 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a   column cache..*
1b790 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1b7a0 65 20 69 73 20 75 73 65 64 20 77 69 74 68 69 6e  e is used within
1b7b0 20 61 73 73 65 72 74 28 29 20 61 6e 64 20 74 65   assert() and te
1b7c0 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 73 20  stcase() macros 
1b7d0 6f 6e 6c 79 0a 2a 2a 20 61 6e 64 20 64 6f 65 73  only.** and does
1b7e0 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e 20 61   not appear in a
1b7f0 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 2e 0a 2a   normal build..*
1b800 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 73 65  /.static int use
1b810 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 50  dAsColumnCache(P
1b820 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1b830 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f  t iFrom, int iTo
1b840 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
1b850 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
1b860 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  p;.  for(i=0, p=
1b870 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
1b880 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
1b890 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
1b8a0 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20 70  ){.    int r = p
1b8b0 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20  ->iReg;.    if( 
1b8c0 72 3e 3d 69 46 72 6f 6d 20 26 26 20 72 3c 3d 69  r>=iFrom && r<=i
1b8d0 54 6f 20 29 20 72 65 74 75 72 6e 20 31 3b 20 20  To ) return 1;  
1b8e0 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20    /*NO_TEST*/.  
1b8f0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1b900 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1b910 5f 44 45 42 55 47 20 7c 7c 20 53 51 4c 49 54 45  _DEBUG || SQLITE
1b920 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54 20 2a  _COVERAGE_TEST *
1b930 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  /.../*.** Conver
1b940 74 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65  t a scalar expre
1b950 73 73 69 6f 6e 20 6e 6f 64 65 20 74 6f 20 61 20  ssion node to a 
1b960 54 4b 5f 52 45 47 49 53 54 45 52 20 72 65 66 65  TK_REGISTER refe
1b970 72 65 6e 63 69 6e 67 0a 2a 2a 20 72 65 67 69 73  rencing.** regis
1b980 74 65 72 20 69 52 65 67 2e 20 20 54 68 65 20 63  ter iReg.  The c
1b990 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72  aller must ensur
1b9a0 65 20 74 68 61 74 20 69 52 65 67 20 61 6c 72 65  e that iReg alre
1b9b0 61 64 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  ady contains.** 
1b9c0 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75  the correct valu
1b9d0 65 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73  e for the expres
1b9e0 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sion..*/.static 
1b9f0 76 6f 69 64 20 65 78 70 72 54 6f 52 65 67 69 73  void exprToRegis
1ba00 74 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ter(Expr *p, int
1ba10 20 69 52 65 67 29 7b 0a 20 20 70 2d 3e 6f 70 32   iReg){.  p->op2
1ba20 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 2d 3e 6f   = p->op;.  p->o
1ba30 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b  p = TK_REGISTER;
1ba40 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69  .  p->iTable = i
1ba50 52 65 67 3b 0a 20 20 45 78 70 72 43 6c 65 61 72  Reg;.  ExprClear
1ba60 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53  Property(p, EP_S
1ba70 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  kip);.}../*.** E
1ba80 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65  valuate an expre
1ba90 73 73 69 6f 6e 20 28 65 69 74 68 65 72 20 61 20  ssion (either a 
1baa0 76 65 63 74 6f 72 20 6f 72 20 61 20 73 63 61 6c  vector or a scal
1bab0 61 72 20 65 78 70 72 65 73 73 69 6f 6e 29 20 61  ar expression) a
1bac0 6e 64 20 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20  nd store.** the 
1bad0 72 65 73 75 6c 74 20 69 6e 20 63 6f 6e 74 69 6e  result in contin
1bae0 67 75 6f 75 73 20 74 65 6d 70 6f 72 61 72 79 20  guous temporary 
1baf0 72 65 67 69 73 74 65 72 73 2e 20 20 52 65 74 75  registers.  Retu
1bb00 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a  rn the index of.
1bb10 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72 65 67  ** the first reg
1bb20 69 73 74 65 72 20 75 73 65 64 20 74 6f 20 73 74  ister used to st
1bb30 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 2e 0a  ore the result..
1bb40 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 74  **.** If the ret
1bb50 75 72 6e 65 64 20 72 65 73 75 6c 74 20 72 65 67  urned result reg
1bb60 69 73 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f  ister is a tempo
1bb70 72 61 72 79 20 73 63 61 6c 61 72 2c 20 74 68 65  rary scalar, the
1bb80 6e 20 61 6c 73 6f 20 77 72 69 74 65 0a 2a 2a 20  n also write.** 
1bb90 74 68 61 74 20 72 65 67 69 73 74 65 72 20 6e 75  that register nu
1bba0 6d 62 65 72 20 69 6e 74 6f 20 2a 70 69 46 72 65  mber into *piFre
1bbb0 65 61 62 6c 65 2e 20 20 49 66 20 74 68 65 20 72  eable.  If the r
1bbc0 65 74 75 72 6e 65 64 20 72 65 73 75 6c 74 20 72  eturned result r
1bbd0 65 67 69 73 74 65 72 0a 2a 2a 20 69 73 20 6e 6f  egister.** is no
1bbe0 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  t a temporary or
1bbf0 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
1bc00 6f 6e 20 69 73 20 61 20 76 65 63 74 6f 72 20 73  on is a vector s
1bc10 65 74 20 2a 70 69 46 72 65 65 61 62 6c 65 0a 2a  et *piFreeable.*
1bc20 2a 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  * to 0..*/.stati
1bc30 63 20 69 6e 74 20 65 78 70 72 43 6f 64 65 56 65  c int exprCodeVe
1bc40 63 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  ctor(Parse *pPar
1bc50 73 65 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74  se, Expr *p, int
1bc60 20 2a 70 69 46 72 65 65 61 62 6c 65 29 7b 0a 20   *piFreeable){. 
1bc70 20 69 6e 74 20 69 52 65 73 75 6c 74 3b 0a 20 20   int iResult;.  
1bc80 69 6e 74 20 6e 52 65 73 75 6c 74 20 3d 20 73 71  int nResult = sq
1bc90 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
1bca0 69 7a 65 28 70 29 3b 0a 20 20 69 66 28 20 6e 52  ize(p);.  if( nR
1bcb0 65 73 75 6c 74 3d 3d 31 20 29 7b 0a 20 20 20 20  esult==1 ){.    
1bcc0 69 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65  iResult = sqlite
1bcd0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1bce0 61 72 73 65 2c 20 70 2c 20 70 69 46 72 65 65 61  arse, p, piFreea
1bcf0 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ble);.  }else{. 
1bd00 20 20 20 2a 70 69 46 72 65 65 61 62 6c 65 20 3d     *piFreeable =
1bd10 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f   0;.    if( p->o
1bd20 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
1bd30 20 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20        iResult = 
1bd40 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
1bd50 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
1bd60 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  0, 0);.    }else
1bd70 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
1bd80 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 70       iResult = p
1bd90 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
1bda0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
1bdb0 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 3b 0a 20 20  m += nResult;.  
1bdc0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1bdd0 52 65 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20  Result; i++){.  
1bde0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1bdf0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d  rCode(pParse, p-
1be00 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  >x.pList->a[i].p
1be10 45 78 70 72 2c 20 69 2b 69 52 65 73 75 6c 74 29  Expr, i+iResult)
1be20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1be30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65    }.  return iRe
1be40 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  sult;.}.../*.** 
1be50 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
1be60 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56  to the current V
1be70 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  dbe to evaluate 
1be80 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70  the given.** exp
1be90 72 65 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70  ression.  Attemp
1bea0 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72  t to store the r
1beb0 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74  esults in regist
1bec0 65 72 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20  er "target"..** 
1bed0 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  Return the regis
1bee0 74 65 72 20 77 68 65 72 65 20 72 65 73 75 6c 74  ter where result
1bef0 73 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a  s are stored..**
1bf00 0a 2a 2a 20 57 69 74 68 20 74 68 69 73 20 72 6f  .** With this ro
1bf10 75 74 69 6e 65 2c 20 74 68 65 72 65 20 69 73 20  utine, there is 
1bf20 6e 6f 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  no guarantee tha
1bf30 74 20 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a  t results will.*
1bf40 2a 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  * be stored in t
1bf50 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75  arget.  The resu
1bf60 6c 74 20 6d 69 67 68 74 20 62 65 20 73 74 6f 72  lt might be stor
1bf70 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72  ed in some other
1bf80 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 66 20  .** register if 
1bf90 69 74 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74  it is convenient
1bfa0 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65 20   to do so.  The 
1bfb0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
1bfc0 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b 20 74  .** must check t
1bfd0 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61  he return code a
1bfe0 6e 64 20 6d 6f 76 65 20 74 68 65 20 72 65 73 75  nd move the resu
1bff0 6c 74 73 20 74 6f 20 74 68 65 20 64 65 73 69 72  lts to the desir
1c000 65 64 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a  ed.** register..
1c010 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
1c020 70 72 43 6f 64 65 54 61 72 67 65 74 28 50 61 72  prCodeTarget(Par
1c030 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1c040 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
1c050 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  get){.  Vdbe *v 
1c060 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1c070 20 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64 65    /* The VM unde
1c080 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
1c090 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
1c0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c0b0 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e   The opcode bein
1c0c0 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  g coded */.  int
1c0d0 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
1c0e0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
1c0f0 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69  s stored in regi
1c100 73 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20  ster inReg */.  
1c110 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
1c120 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ;         /* If 
1c130 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68  non-zero free th
1c140 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  is temporary reg
1c150 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  ister */.  int r
1c160 65 67 46 72 65 65 32 20 3d 20 30 3b 20 20 20 20  egFree2 = 0;    
1c170 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a       /* If non-z
1c180 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65  ero free this te
1c190 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
1c1a0 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   */.  int r1, r2
1c1b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c1c0 2f 2a 20 56 61 72 69 6f 75 73 20 72 65 67 69 73  /* Various regis
1c1d0 74 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20  ter numbers */. 
1c1e0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1c1f0 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68  Parse->db; /* Th
1c200 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
1c210 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20  ction */.  Expr 
1c220 74 65 6d 70 58 3b 20 20 20 20 20 20 20 20 20 20  tempX;          
1c230 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
1c240 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  y expression nod
1c250 65 20 2a 2f 0a 20 20 69 6e 74 20 70 35 20 3d 20  e */.  int p5 = 
1c260 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61  0;..  assert( ta
1c270 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74  rget>0 && target
1c280 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29  <=pParse->nMem )
1c290 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a  ;.  if( v==0 ){.
1c2a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1c2b0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
1c2c0 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75  iled );.    retu
1c2d0 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  rn 0;.  }..  if(
1c2e0 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20   pExpr==0 ){.   
1c2f0 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20   op = TK_NULL;. 
1c300 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d   }else{.    op =
1c310 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a   pExpr->op;.  }.
1c320 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
1c330 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
1c340 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
1c350 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
1c360 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49  o = pExpr->pAggI
1c370 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63  nfo;.      struc
1c380 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
1c390 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  Col = &pAggInfo-
1c3a0 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67  >aCol[pExpr->iAg
1c3b0 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  g];.      if( !p
1c3c0 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
1c3d0 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ode ){.        a
1c3e0 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65  ssert( pCol->iMe
1c3f0 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  m>0 );.        i
1c400 6e 52 65 67 20 3d 20 70 43 6f 6c 2d 3e 69 4d 65  nReg = pCol->iMe
1c410 6d 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  m;.        break
1c420 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1c430 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53  ( pAggInfo->useS
1c440 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20  ortingIdx ){.   
1c450 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1c460 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
1c470 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73  umn, pAggInfo->s
1c480 6f 72 74 69 6e 67 49 64 78 50 54 61 62 2c 0a 20  ortingIdxPTab,. 
1c490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
1c4b0 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
1c4c0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1c4d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1c4e0 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72  }.      /* Other
1c4f0 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20  wise, fall thru 
1c500 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55  into the TK_COLU
1c510 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d  MN case */.    }
1c520 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
1c530 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  UMN: {.      int
1c540 20 69 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 69   iTab = pExpr->i
1c550 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 69 66 28  Table;.      if(
1c560 20 69 54 61 62 3c 30 20 29 7b 0a 20 20 20 20 20   iTab<0 ){.     
1c570 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63     if( pParse->c
1c580 6b 42 61 73 65 3e 30 20 29 7b 0a 20 20 20 20 20  kBase>0 ){.     
1c590 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 69       /* Generati
1c5a0 6e 67 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  ng CHECK constra
1c5b0 69 6e 74 73 20 6f 72 20 69 6e 73 65 72 74 69 6e  ints or insertin
1c5c0 67 20 69 6e 74 6f 20 70 61 72 74 69 61 6c 20 69  g into partial i
1c5d0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20  ndex */.        
1c5e0 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d    inReg = pExpr-
1c5f0 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70 50 61 72 73  >iColumn + pPars
1c600 65 2d 3e 63 6b 42 61 73 65 3b 0a 20 20 20 20 20  e->ckBase;.     
1c610 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c620 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c630 20 20 20 20 20 2f 2a 20 43 6f 64 69 6e 67 20 61       /* Coding a
1c640 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  n expression tha
1c650 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
1c660 69 6e 64 65 78 20 77 68 65 72 65 20 63 6f 6c 75  index where colu
1c670 6d 6e 20 6e 61 6d 65 73 0a 20 20 20 20 20 20 20  mn names.       
1c680 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64     ** in the ind
1c690 65 78 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  ex refer to the 
1c6a0 74 61 62 6c 65 20 74 6f 20 77 68 69 63 68 20 74  table to which t
1c6b0 68 65 20 69 6e 64 65 78 20 62 65 6c 6f 6e 67 73  he index belongs
1c6c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 54   */.          iT
1c6d0 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65  ab = pParse->iSe
1c6e0 6c 66 54 61 62 3b 0a 20 20 20 20 20 20 20 20 7d  lfTab;.        }
1c6f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1c700 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
1c710 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
1c720 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1c730 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Tab,.           
1c740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c750 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
1c760 6d 6e 2c 20 69 54 61 62 2c 20 74 61 72 67 65 74  mn, iTab, target
1c770 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c790 20 70 45 78 70 72 2d 3e 6f 70 32 29 3b 0a 20 20   pExpr->op2);.  
1c7a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c7b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
1c7c0 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f  EGER: {.      co
1c7d0 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  deInteger(pParse
1c7e0 2c 20 70 45 78 70 72 2c 20 30 2c 20 74 61 72 67  , pExpr, 0, targ
1c7f0 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  et);.      break
1c800 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1c810 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
1c820 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63  TING_POINT.    c
1c830 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a  ase TK_FLOAT: {.
1c840 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1c850 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1c860 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
1c870 65 29 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  e) );.      code
1c880 52 65 61 6c 28 76 2c 20 70 45 78 70 72 2d 3e 75  Real(v, pExpr->u
1c890 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74 61 72 67  .zToken, 0, targ
1c8a0 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  et);.      break
1c8b0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1c8c0 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
1c8d0 47 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  G: {.      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 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64   sqlite3VdbeLoad
1c920 53 74 72 69 6e 67 28 76 2c 20 74 61 72 67 65 74  String(v, target
1c930 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1c940 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
1c950 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1c960 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  TK_NULL: {.     
1c970 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c980 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
1c990 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1c9a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
1c9b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c9c0 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20  T_BLOB_LITERAL. 
1c9d0 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a     case TK_BLOB:
1c9e0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a   {.      int n;.
1c9f0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1ca00 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61 72 20   *z;.      char 
1ca10 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73  *zBlob;.      as
1ca20 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1ca30 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1ca40 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1ca50 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1ca60 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  r->u.zToken[0]==
1ca70 27 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e  'x' || pExpr->u.
1ca80 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29  zToken[0]=='X' )
1ca90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1caa0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1cab0 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20  1]=='\'' );.    
1cac0 20 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e    z = &pExpr->u.
1cad0 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20 20  zToken[2];.     
1cae0 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
1caf0 65 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20 20 20  en30(z) - 1;.   
1cb00 20 20 20 61 73 73 65 72 74 28 20 7a 5b 6e 5d 3d     assert( z[n]=
1cb10 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a  ='\'' );.      z
1cb20 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 48 65  Blob = sqlite3He
1cb30 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33 56  xToBlob(sqlite3V
1cb40 64 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b  dbeDb(v), z, n);
1cb50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1cb60 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42  beAddOp4(v, OP_B
1cb70 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74  lob, n/2, target
1cb80 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44  , 0, zBlob, P4_D
1cb90 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 62  YNAMIC);.      b
1cba0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
1cbb0 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56  if.    case TK_V
1cbc0 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20  ARIABLE: {.     
1cbd0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1cbe0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1cbf0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
1cc00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1cc10 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d  Expr->u.zToken!=
1cc20 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
1cc30 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
1cc40 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20  en[0]!=0 );.    
1cc50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1cc60 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72 69 61 62  Op2(v, OP_Variab
1cc70 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  le, pExpr->iColu
1cc80 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  mn, target);.   
1cc90 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 75 2e     if( pExpr->u.
1cca0 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a  zToken[1]!=0 ){.
1ccb0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1ccc0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1ccd0 30 5d 3d 3d 27 3f 27 20 0a 20 20 20 20 20 20 20  0]=='?' .       
1cce0 20 20 20 20 20 20 7c 7c 20 73 74 72 63 6d 70 28        || strcmp(
1ccf0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
1cd00 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 70   pParse->azVar[p
1cd10 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d  Expr->iColumn-1]
1cd20 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
1cd30 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1cd40 65 50 34 28 76 2c 20 2d 31 2c 20 70 50 61 72 73  eP4(v, -1, pPars
1cd50 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72 2d 3e  e->azVar[pExpr->
1cd60 69 43 6f 6c 75 6d 6e 2d 31 5d 2c 20 50 34 5f 53  iColumn-1], P4_S
1cd70 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a  TATIC);.      }.
1cd80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1cd90 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52   }.    case TK_R
1cda0 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20  EGISTER: {.     
1cdb0 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e   inReg = pExpr->
1cdc0 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 62 72  iTable;.      br
1cdd0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
1cde0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
1cdf0 41 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AST.    case TK_
1ce00 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  CAST: {.      /*
1ce10 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   Expressions of 
1ce20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54  the form:   CAST
1ce30 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29  (pLeft AS token)
1ce40 20 2a 2f 0a 20 20 20 20 20 20 69 6e 52 65 67 20   */.      inReg 
1ce50 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1ce60 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
1ce70 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61  pExpr->pLeft, ta
1ce80 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28  rget);.      if(
1ce90 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 29   inReg!=target )
1cea0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1ceb0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1cec0 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20  P_SCopy, inReg, 
1ced0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1cee0 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
1cef0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1cf00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1cf10 28 76 2c 20 4f 50 5f 43 61 73 74 2c 20 74 61 72  (v, OP_Cast, tar
1cf20 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  get,.           
1cf30 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
1cf40 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
1cf50 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
1cf60 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 74 65 73  , 0));.      tes
1cf70 74 63 61 73 65 28 20 75 73 65 64 41 73 43 6f 6c  tcase( usedAsCol
1cf80 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c  umnCache(pParse,
1cf90 20 69 6e 52 65 67 2c 20 69 6e 52 65 67 29 20 29   inReg, inReg) )
1cfa0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1cfb0 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
1cfc0 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69  Change(pParse, i
1cfd0 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 20 20  nReg, 1);.      
1cfe0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
1cff0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1d000 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63  IT_CAST */.    c
1d010 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63  ase TK_IS:.    c
1d020 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20  ase TK_ISNOT:.  
1d030 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b      op = (op==TK
1d040 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54  _IS) ? TK_EQ : T
1d050 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 70 35 20 3d  K_NE;.      p5 =
1d060 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a   SQLITE_NULLEQ;.
1d070 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 2d 74 68        /* fall-th
1d080 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73  rough */.    cas
1d090 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
1d0a0 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
1d0b0 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
1d0c0 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
1d0d0 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
1d0e0 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
1d0f0 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
1d100 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
1d110 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
1d120 70 72 49 73 56 65 63 74 6f 72 28 70 4c 65 66 74  prIsVector(pLeft
1d130 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  ) ){.        cod
1d140 65 56 65 63 74 6f 72 43 6f 6d 70 61 72 65 28 70  eVectorCompare(p
1d150 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
1d160 72 67 65 74 2c 20 6f 70 2c 20 70 35 29 3b 0a 20  rget, op, p5);. 
1d170 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1d180 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1d190 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1d1a0 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 72 65 67  rse, pLeft, &reg
1d1b0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Free1);.        
1d1c0 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
1d1d0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1d1e0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1d1f0 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
1d200 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
1d210 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
1d220 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
1d230 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 31  ,.            r1
1d240 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c  , r2, inReg, SQL
1d250 49 54 45 5f 53 54 4f 52 45 50 32 20 7c 20 70 35  ITE_STOREP2 | p5
1d260 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1d270 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b  t(TK_LT==OP_Lt);
1d280 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1d290 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Lt); VdbeCovera
1d2a0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74  geIf(v,op==OP_Lt
1d2b0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1d2c0 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b  t(TK_LE==OP_Le);
1d2d0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1d2e0 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Le); VdbeCovera
1d2f0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65  geIf(v,op==OP_Le
1d300 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1d310 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b  t(TK_GT==OP_Gt);
1d320 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1d330 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Gt); VdbeCovera
1d340 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74  geIf(v,op==OP_Gt
1d350 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1d360 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b  t(TK_GE==OP_Ge);
1d370 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1d380 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ge); VdbeCovera
1d390 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65  geIf(v,op==OP_Ge
1d3a0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1d3b0 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b  t(TK_EQ==OP_Eq);
1d3c0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1d3d0 5f 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Eq); VdbeCovera
1d3e0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71  geIf(v,op==OP_Eq
1d3f0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1d400 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b  t(TK_NE==OP_Ne);
1d410 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1d420 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ne); VdbeCovera
1d430 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65  geIf(v,op==OP_Ne
1d440 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1d450 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1d460 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
1d470 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
1d480 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
1d490 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1d4a0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
1d4b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
1d4c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55  .    case TK_PLU
1d4d0 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
1d4e0 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  TAR:.    case TK
1d4f0 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65  _MINUS:.    case
1d500 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73   TK_REM:.    cas
1d510 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20  e TK_BITAND:.   
1d520 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a   case TK_BITOR:.
1d530 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53      case TK_SLAS
1d540 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  H:.    case TK_L
1d550 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20  SHIFT:.    case 
1d560 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20  TK_RSHIFT: .    
1d570 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20  case TK_CONCAT: 
1d580 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1d590 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29  TK_AND==OP_And )
1d5a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ;            tes
1d5b0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e  tcase( op==TK_AN
1d5c0 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  D );.      asser
1d5d0 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20  t( TK_OR==OP_Or 
1d5e0 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
1d5f0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1d600 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OR );.      ass
1d610 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50  ert( TK_PLUS==OP
1d620 5f 41 64 64 20 29 3b 20 20 20 20 20 20 20 20 20  _Add );         
1d630 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1d640 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20 20  TK_PLUS );.     
1d650 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55   assert( TK_MINU
1d660 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29  S==OP_Subtract )
1d670 3b 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;     testcase( 
1d680 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a  op==TK_MINUS );.
1d690 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1d6a0 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64  _REM==OP_Remaind
1d6b0 65 72 20 29 3b 20 20 20 20 20 20 74 65 73 74 63  er );      testc
1d6c0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20  ase( op==TK_REM 
1d6d0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1d6e0 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42   TK_BITAND==OP_B
1d6f0 69 74 41 6e 64 20 29 3b 20 20 20 20 20 20 74 65  itAnd );      te
1d700 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42  stcase( op==TK_B
1d710 49 54 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61  ITAND );.      a
1d720 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d  ssert( TK_BITOR=
1d730 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 20 20 20 20  =OP_BitOr );    
1d740 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1d750 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20  ==TK_BITOR );.  
1d760 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53      assert( TK_S
1d770 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20  LASH==OP_Divide 
1d780 29 3b 20 20 20 20 20 20 20 74 65 73 74 63 61 73  );       testcas
1d790 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20  e( op==TK_SLASH 
1d7a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1d7b0 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53   TK_LSHIFT==OP_S
1d7c0 68 69 66 74 4c 65 66 74 20 29 3b 20 20 20 74 65  hiftLeft );   te
1d7d0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c  stcase( op==TK_L
1d7e0 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61  SHIFT );.      a
1d7f0 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54  ssert( TK_RSHIFT
1d800 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20  ==OP_ShiftRight 
1d810 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  );  testcase( op
1d820 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20  ==TK_RSHIFT );. 
1d830 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1d840 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61  CONCAT==OP_Conca
1d850 74 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61  t );      testca
1d860 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41  se( op==TK_CONCA
1d870 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  T );.      r1 = 
1d880 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1d890 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1d8a0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
1d8b0 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
1d8c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1d8d0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1d8e0 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
1d8f0 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 73 71  Free2);.      sq
1d900 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1d910 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74  v, op, r2, r1, t
1d920 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65  arget);.      te
1d930 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1d940 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
1d950 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
1d960 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
1d970 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1d980 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20  e TK_UMINUS: {. 
1d990 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
1d9a0 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
1d9b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1d9c0 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66  Left );.      if
1d9d0 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
1d9e0 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20  INTEGER ){.     
1d9f0 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70     codeInteger(p
1da00 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 31 2c  Parse, pLeft, 1,
1da10 20 74 61 72 67 65 74 29 3b 0a 23 69 66 6e 64 65   target);.#ifnde
1da20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
1da30 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
1da40 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65     }else if( pLe
1da50 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54  ft->op==TK_FLOAT
1da60 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1da70 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1da80 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
1da90 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
1daa0 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20      codeReal(v, 
1dab0 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pLeft->u.zToken,
1dac0 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 23 65 6e   1, target);.#en
1dad0 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  dif.      }else{
1dae0 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 6f  .        tempX.o
1daf0 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45 52 3b 0a  p = TK_INTEGER;.
1db00 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 66 6c          tempX.fl
1db10 61 67 73 20 3d 20 45 50 5f 49 6e 74 56 61 6c 75  ags = EP_IntValu
1db20 65 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a  e|EP_TokenOnly;.
1db30 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 75 2e          tempX.u.
1db40 69 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20  iValue = 0;.    
1db50 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1db60 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1db70 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72 65  rse, &tempX, &re
1db80 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20  gFree1);.       
1db90 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1dba0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1dbb0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1dbc0 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
1dbd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1dbe0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74  ddOp3(v, OP_Subt
1dbf0 72 61 63 74 2c 20 72 32 2c 20 72 31 2c 20 74 61  ract, r2, r1, ta
1dc00 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 74  rget);.        t
1dc10 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1dc20 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  2==0 );.      }.
1dc30 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61        inReg = ta
1dc40 72 67 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61  rget;.      brea
1dc50 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1dc60 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20  e TK_BITNOT:.   
1dc70 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
1dc80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1dc90 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e  _BITNOT==OP_BitN
1dca0 6f 74 20 29 3b 20 20 20 74 65 73 74 63 61 73 65  ot );   testcase
1dcb0 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20  ( op==TK_BITNOT 
1dcc0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1dcd0 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20   TK_NOT==OP_Not 
1dce0 29 3b 20 20 20 20 20 20 20 20 20 74 65 73 74 63  );         testc
1dcf0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20  ase( op==TK_NOT 
1dd00 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
1dd10 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1dd20 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1dd30 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1dd40 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
1dd50 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1dd60 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d  );.      inReg =
1dd70 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 73   target;.      s
1dd80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1dd90 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52 65  (v, op, r1, inRe
1dda0 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
1ddb0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1ddc0 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
1ddd0 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
1dde0 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
1ddf0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1de00 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73  TK_ISNULL==OP_Is
1de10 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63 61  Null );   testca
1de20 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  se( op==TK_ISNUL
1de30 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  L );.      asser
1de40 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f  t( TK_NOTNULL==O
1de50 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73  P_NotNull ); tes
1de60 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
1de70 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73  TNULL );.      s
1de80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1de90 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1dea0 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
1deb0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1dec0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1ded0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1dee0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1def0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1df00 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1df10 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
1df20 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 6f 70  VdbeAddOp1(v, op
1df30 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62  , r1);.      Vdb
1df40 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
1df50 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20  p==TK_ISNULL);. 
1df60 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1df70 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f  eIf(v, op==TK_NO
1df80 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71  TNULL);.      sq
1df90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1dfa0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
1dfb0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1dfc0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
1dfd0 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
1dfe0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1dff0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  }.    case TK_AG
1e000 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  G_FUNCTION: {.  
1e010 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e      AggInfo *pIn
1e020 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67  fo = pExpr->pAgg
1e030 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  Info;.      if( 
1e040 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  pInfo==0 ){.    
1e050 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1e060 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1e070 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1e080 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
1e090 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1e0a0 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61  se, "misuse of a
1e0b0 67 67 72 65 67 61 74 65 3a 20 25 73 28 29 22 2c  ggregate: %s()",
1e0c0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1e0d0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1e0e0 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20          inReg = 
1e0f0 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78  pInfo->aFunc[pEx
1e100 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a  pr->iAgg].iMem;.
1e110 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
1e120 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1e130 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
1e140 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73   {.      ExprLis
1e150 74 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20  t *pFarg;       
1e160 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74  /* List of funct
1e170 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
1e180 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 61 72 67  .      int nFarg
1e190 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1e1a0 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6e 63 74   Number of funct
1e1b0 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
1e1c0 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
1e1d0 70 44 65 66 3b 20 20 20 20 20 20 20 20 20 2f 2a  pDef;         /*
1e1e0 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 65   The function de
1e1f0 66 69 6e 69 74 69 6f 6e 20 6f 62 6a 65 63 74 20  finition object 
1e200 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  */.      const c
1e210 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20  har *zId;       
1e220 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  /* The function 
1e230 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 75 33  name */.      u3
1e240 32 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b  2 constMask = 0;
1e250 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1e260 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
1e270 74 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e 73  ts that are cons
1e280 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tant */.      in
1e290 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
1e2a0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1e2b0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 38  nter */.      u8
1e2c0 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 20   enc = ENC(db); 
1e2d0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74       /* The text
1e2e0 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64 20 62   encoding used b
1e2f0 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  y this database 
1e300 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  */.      CollSeq
1e310 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20   *pColl = 0;    
1e320 2f 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73  /* A collating s
1e330 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20  equence */..    
1e340 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1e350 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1e360 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1e370 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  );.      if( Exp
1e380 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1e390 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
1e3a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61  ) ){.        pFa
1e3b0 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  rg = 0;.      }e
1e3c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61  lse{.        pFa
1e3d0 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  rg = pExpr->x.pL
1e3e0 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ist;.      }.   
1e3f0 20 20 20 6e 46 61 72 67 20 3d 20 70 46 61 72 67     nFarg = pFarg
1e400 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70 72 20   ? pFarg->nExpr 
1e410 3a 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  : 0;.      asser
1e420 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1e430 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1e440 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1e450 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e   zId = pExpr->u.
1e460 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 70 44  zToken;.      pD
1e470 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ef = sqlite3Find
1e480 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64  Function(db, zId
1e490 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29  , nFarg, enc, 0)
1e4a0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1e4b0 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f 53  ENABLE_UNKNOWN_S
1e4c0 51 4c 5f 46 55 4e 43 54 49 4f 4e 0a 20 20 20 20  QL_FUNCTION.    
1e4d0 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 26 26    if( pDef==0 &&
1e4e0 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
1e4f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
1e500 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
1e510 6e 63 74 69 6f 6e 28 64 62 2c 20 22 75 6e 6b 6e  nction(db, "unkn
1e520 6f 77 6e 22 2c 20 6e 46 61 72 67 2c 20 65 6e 63  own", nFarg, enc
1e530 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  , 0);.      }.#e
1e540 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70  ndif.      if( p
1e550 44 65 66 3d 3d 30 20 7c 7c 20 70 44 65 66 2d 3e  Def==0 || pDef->
1e560 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b 0a  xFinalize!=0 ){.
1e570 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1e580 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1e590 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69 6f  "unknown functio
1e5a0 6e 3a 20 25 73 28 29 22 2c 20 7a 49 64 29 3b 0a  n: %s()", zId);.
1e5b0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1e5c0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
1e5d0 20 41 74 74 65 6d 70 74 20 61 20 64 69 72 65 63   Attempt a direc
1e5e0 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
1e5f0 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69 6e   of the built-in
1e600 20 43 4f 41 4c 45 53 43 45 28 29 20 61 6e 64 0a   COALESCE() and.
1e610 20 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c 28        ** IFNULL(
1e620 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68  ) functions.  Th
1e630 69 73 20 61 76 6f 69 64 73 20 75 6e 6e 65 63 65  is avoids unnece
1e640 73 73 61 72 79 20 65 76 61 6c 75 61 74 69 6f 6e  ssary evaluation
1e650 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61 72 67   of.      ** arg
1e660 75 6d 65 6e 74 73 20 70 61 73 74 20 74 68 65 20  uments past the 
1e670 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61  first non-NULL a
1e680 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a  rgument..      *
1e690 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  /.      if( pDef
1e6a0 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
1e6b0 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53  LITE_FUNC_COALES
1e6c0 43 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  CE ){.        in
1e6d0 74 20 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20  t endCoalesce = 
1e6e0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1e6f0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
1e700 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d   assert( nFarg>=
1e710 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  2 );.        sql
1e720 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
1e730 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d  rse, pFarg->a[0]
1e740 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
1e750 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31  .        for(i=1
1e760 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b  ; i<nFarg; i++){
1e770 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1e780 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1e790 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67  OP_NotNull, targ
1e7a0 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29  et, endCoalesce)
1e7b0 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
1e7c0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1e7d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1e7e0 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
1e7f0 61 72 73 65 2c 20 74 61 72 67 65 74 2c 20 31 29  arse, target, 1)
1e800 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1e810 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
1e820 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1e830 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1e840 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61 72  ode(pParse, pFar
1e850 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 74  g->a[i].pExpr, t
1e860 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1e870 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1e880 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
1e890 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e8a0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1e8b0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43  lveLabel(v, endC
1e8c0 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20  oalesce);.      
1e8d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1e8e0 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55  ..      /* The U
1e8f0 4e 4c 49 4b 45 4c 59 28 29 20 66 75 6e 63 74 69  NLIKELY() functi
1e900 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  on is a no-op.  
1e910 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 74 68  The result is th
1e920 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a  e value.      **
1e930 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 61 72   of the first ar
1e940 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  gument..      */
1e950 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
1e960 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
1e970 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c  ITE_FUNC_UNLIKEL
1e980 59 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  Y ){.        ass
1e990 65 72 74 28 20 6e 46 61 72 67 3e 3d 31 20 29 3b  ert( nFarg>=1 );
1e9a0 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
1e9b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1e9c0 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
1e9d0 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
1e9e0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1e9f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1ea00 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  }..      for(i=0
1ea10 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b  ; i<nFarg; i++){
1ea20 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 33  .        if( i<3
1ea30 32 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  2 && sqlite3Expr
1ea40 49 73 43 6f 6e 73 74 61 6e 74 28 70 46 61 72 67  IsConstant(pFarg
1ea50 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
1ea60 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
1ea70 61 73 65 28 20 69 3d 3d 33 31 20 29 3b 0a 20 20  ase( i==31 );.  
1ea80 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73          constMas
1ea90 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 33 32 28 69  k |= MASKBIT32(i
1eaa0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1eab0 20 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e       if( (pDef->
1eac0 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
1ead0 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
1eae0 29 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20 29  )!=0 && !pColl )
1eaf0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  {.          pCol
1eb00 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
1eb10 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
1eb20 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  Farg->a[i].pExpr
1eb30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1eb40 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
1eb50 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Farg ){.        
1eb60 69 66 28 20 63 6f 6e 73 74 4d 61 73 6b 20 29 7b  if( constMask ){
1eb70 0a 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20  .          r1 = 
1eb80 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
1eb90 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
1eba0 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 46 61 72 67 3b  ->nMem += nFarg;
1ebb0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1ebc0 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 73            r1 = s
1ebd0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
1ebe0 67 65 28 70 50 61 72 73 65 2c 20 6e 46 61 72 67  ge(pParse, nFarg
1ebf0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
1ec00 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 65 6e        /* For len
1ec10 67 74 68 28 29 20 61 6e 64 20 74 79 70 65 6f 66  gth() and typeof
1ec20 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 77 69 74  () functions wit
1ec30 68 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67 75 6d  h a column argum
1ec40 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  ent,.        ** 
1ec50 73 65 74 20 74 68 65 20 50 35 20 70 61 72 61 6d  set the P5 param
1ec60 65 74 65 72 20 74 6f 20 74 68 65 20 4f 50 5f 43  eter to the OP_C
1ec70 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74 6f 20  olumn opcode to 
1ec80 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
1ec90 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 4f  .        ** or O
1eca0 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20  PFLAG_TYPEOFARG 
1ecb0 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20 74 6f  respectively, to
1ecc0 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61   avoid unnecessa
1ecd0 72 79 20 64 61 74 61 0a 20 20 20 20 20 20 20 20  ry data.        
1ece0 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20 20 20  ** loading..    
1ecf0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
1ed00 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c  f( (pDef->funcFl
1ed10 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 46 55  ags & (SQLITE_FU
1ed20 4e 43 5f 4c 45 4e 47 54 48 7c 53 51 4c 49 54 45  NC_LENGTH|SQLITE
1ed30 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29 29 21 3d  _FUNC_TYPEOF))!=
1ed40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
1ed50 38 20 65 78 70 72 4f 70 3b 0a 20 20 20 20 20 20  8 exprOp;.      
1ed60 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72      assert( nFar
1ed70 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  g==1 );.        
1ed80 20 20 61 73 73 65 72 74 28 20 70 46 61 72 67 2d    assert( pFarg-
1ed90 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29  >a[0].pExpr!=0 )
1eda0 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 72  ;.          expr
1edb0 4f 70 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d  Op = pFarg->a[0]
1edc0 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20  .pExpr->op;.    
1edd0 20 20 20 20 20 20 69 66 28 20 65 78 70 72 4f 70        if( exprOp
1ede0 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65  ==TK_COLUMN || e
1edf0 78 70 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  xprOp==TK_AGG_CO
1ee00 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  LUMN ){.        
1ee10 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49      assert( SQLI
1ee20 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d  TE_FUNC_LENGTH==
1ee30 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
1ee40 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
1ee50 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46  assert( SQLITE_F
1ee60 55 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f 50 46 4c  UNC_TYPEOF==OPFL
1ee70 41 47 5f 54 59 50 45 4f 46 41 52 47 20 29 3b 0a  AG_TYPEOFARG );.
1ee80 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
1ee90 63 61 73 65 28 20 70 44 65 66 2d 3e 66 75 6e 63  case( pDef->func
1eea0 46 6c 61 67 73 20 26 20 4f 50 46 4c 41 47 5f 4c  Flags & OPFLAG_L
1eeb0 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20  ENGTHARG );.    
1eec0 20 20 20 20 20 20 20 20 70 46 61 72 67 2d 3e 61          pFarg->a
1eed0 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 32 20 3d  [0].pExpr->op2 =
1eee0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1eef0 20 20 20 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c      pDef->funcFl
1ef00 61 67 73 20 26 20 28 4f 50 46 4c 41 47 5f 4c 45  ags & (OPFLAG_LE
1ef10 4e 47 54 48 41 52 47 7c 4f 50 46 4c 41 47 5f 54  NGTHARG|OPFLAG_T
1ef20 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20 20  YPEOFARG);.     
1ef30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1ef40 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ..        sqlite
1ef50 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
1ef60 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 54  Parse);     /* T
1ef70 69 63 6b 65 74 20 32 65 61 32 34 32 35 64 33 34  icket 2ea2425d34
1ef80 62 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  be */.        sq
1ef90 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
1efa0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 46  rList(pParse, pF
1efb0 61 72 67 2c 20 72 31 2c 20 30 2c 0a 20 20 20 20  arg, r1, 0,.    
1efc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efd0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
1efe0 54 45 5f 45 43 45 4c 5f 44 55 50 7c 53 51 4c 49  TE_ECEL_DUP|SQLI
1eff0 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 3b  TE_ECEL_FACTOR);
1f000 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f010 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
1f020 72 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 54 69  rse);      /* Ti
1f030 63 6b 65 74 20 32 65 61 32 34 32 35 64 33 34 62  cket 2ea2425d34b
1f040 65 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65  e */.      }else
1f050 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 30  {.        r1 = 0
1f060 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
1f070 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
1f080 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
1f090 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65   /* Possibly ove
1f0a0 72 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69  rload the functi
1f0b0 6f 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 20  on if the first 
1f0c0 61 72 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20  argument is.    
1f0d0 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74    ** a virtual t
1f0e0 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20  able column..   
1f0f0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46     **.      ** F
1f100 6f 72 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f  or infix functio
1f110 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20  ns (LIKE, GLOB, 
1f120 52 45 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43  REGEXP, and MATC
1f130 48 29 20 75 73 65 20 74 68 65 0a 20 20 20 20 20  H) use the.     
1f140 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d   ** second argum
1f150 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72  ent, not the fir
1f160 73 74 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d  st, as the argum
1f170 65 6e 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20  ent to test to. 
1f180 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69       ** see if i
1f190 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  t is a column in
1f1a0 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
1f1b0 2e 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  .  This is done 
1f1c0 62 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a  because.      **
1f1d0 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e   the left operan
1f1e0 64 20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74  d of infix funct
1f1f0 69 6f 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e  ions (the operan
1f200 64 20 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20  d we want to.   
1f210 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76     ** control ov
1f220 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20  erloading) ends 
1f230 75 70 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  up as the second
1f240 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
1f250 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  .      ** functi
1f260 6f 6e 2e 20 20 54 68 65 20 65 78 70 72 65 73 73  on.  The express
1f270 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69  ion "A glob B" i
1f280 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
1f290 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28  .      ** "glob(
1f2a0 42 2c 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74  B,A).  We want t
1f2b0 6f 20 75 73 65 20 74 68 65 20 41 20 69 6e 20 22  o use the A in "
1f2c0 41 20 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73  A glob B" to tes
1f2d0 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66  t.      ** for f
1f2e0 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64  unction overload
1f2f0 69 6e 67 2e 20 20 42 75 74 20 77 65 20 75 73 65  ing.  But we use
1f300 20 74 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22   the B term in "
1f310 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20  glob(B,A)"..    
1f320 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e    */.      if( n
1f330 46 61 72 67 3e 3d 32 20 26 26 20 28 70 45 78 70  Farg>=2 && (pExp
1f340 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  r->flags & EP_In
1f350 66 69 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20  fixFunc) ){.    
1f360 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
1f370 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75  e3VtabOverloadFu
1f380 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c  nction(db, pDef,
1f390 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61   nFarg, pFarg->a
1f3a0 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [1].pExpr);.    
1f3b0 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 61 72    }else if( nFar
1f3c0 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  g>0 ){.        p
1f3d0 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61  Def = sqlite3Vta
1f3e0 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f  bOverloadFunctio
1f3f0 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72  n(db, pDef, nFar
1f400 67 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  g, pFarg->a[0].p
1f410 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23  Expr);.      }.#
1f420 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
1f430 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
1f440 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45  & SQLITE_FUNC_NE
1f450 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20  EDCOLL ){.      
1f460 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
1f470 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
1f480 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73  Coll; .        s
1f490 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1f4a0 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
1f4b0 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a  0, 0, 0, (char *
1f4c0 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
1f4d0 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  EQ);.      }.   
1f4e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f4f0 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74  dOp4(v, OP_Funct
1f500 69 6f 6e 30 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c  ion0, constMask,
1f510 20 72 31 2c 20 74 61 72 67 65 74 2c 0a 20 20 20   r1, target,.   
1f520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f530 20 20 20 20 20 28 63 68 61 72 2a 29 70 44 65 66       (char*)pDef
1f540 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
1f550 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f560 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29  ChangeP5(v, (u8)
1f570 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 69 66  nFarg);.      if
1f580 28 20 6e 46 61 72 67 20 26 26 20 63 6f 6e 73 74  ( nFarg && const
1f590 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Mask==0 ){.     
1f5a0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
1f5b0 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
1f5c0 65 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20  e, r1, nFarg);. 
1f5d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
1f5e0 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
1f5f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
1f600 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
1f610 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63  TK_EXISTS:.    c
1f620 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
1f630 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b  .      int nCol;
1f640 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1f650 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29   op==TK_EXISTS )
1f660 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1f670 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
1f680 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d  );.      if( op=
1f690 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 28 6e  =TK_SELECT && (n
1f6a0 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  Col = pExpr->x.p
1f6b0 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
1f6c0 6e 45 78 70 72 29 21 3d 31 20 29 7b 0a 20 20 20  nExpr)!=1 ){.   
1f6d0 20 20 20 20 20 73 71 6c 69 74 65 33 53 75 62 73       sqlite3Subs
1f6e0 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73  electError(pPars
1f6f0 65 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20  e, nCol, 1);.   
1f700 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f710 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
1f720 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
1f730 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c  Parse, pExpr, 0,
1f740 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
1f750 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f760 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
1f770 43 54 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  CT_COLUMN: {.   
1f780 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c     if( pExpr->pL
1f790 65 66 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29  eft->iTable==0 )
1f7a0 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  {.        pExpr-
1f7b0 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20 3d  >pLeft->iTable =
1f7c0 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
1f7d0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
1f7e0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 2c 20 30  xpr->pLeft, 0, 0
1f7f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1f800 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e   inReg = pExpr->
1f810 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20 2b 20  pLeft->iTable + 
1f820 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
1f830 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f840 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
1f850 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  N: {.      int d
1f860 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c  estIfFalse = sql
1f870 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1f880 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  l(v);.      int 
1f890 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c  destIfNull = sql
1f8a0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1f8b0 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  l(v);.      sqli
1f8c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1f8d0 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72   OP_Null, 0, tar
1f8e0 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  get);.      sqli
1f8f0 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50  te3ExprCodeIN(pP
1f900 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
1f910 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66  tIfFalse, destIf
1f920 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
1f930 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1f940 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
1f950 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1f960 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1f970 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49  veLabel(v, destI
1f980 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 73  fFalse);.      s
1f990 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1f9a0 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74  (v, OP_AddImm, t
1f9b0 61 72 67 65 74 2c 20 30 29 3b 0a 20 20 20 20 20  arget, 0);.     
1f9c0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1f9d0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
1f9e0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
1f9f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
1fa00 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1fa10 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a  T_SUBQUERY */...
1fa20 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20      /*.    **   
1fa30 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44   x BETWEEN y AND
1fa40 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a   z.    **.    **
1fa50 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61 6c   This is equival
1fa60 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20  ent to.    **.  
1fa70 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44    **    x>=y AND
1fa80 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20   x<=z.    **.   
1fa90 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20   ** X is stored 
1faa0 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e  in pExpr->pLeft.
1fab0 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f  .    ** Y is sto
1fac0 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
1fad0 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e  ist->a[0].pExpr.
1fae0 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f  .    ** Z is sto
1faf0 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
1fb00 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e  ist->a[1].pExpr.
1fb10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1fb20 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
1fb30 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74       exprCodeBet
1fb40 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78  ween(pParse, pEx
1fb50 70 72 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 30  pr, target, 0, 0
1fb60 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1fb70 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1fb80 4b 5f 53 50 41 4e 3a 0a 20 20 20 20 63 61 73 65  K_SPAN:.    case
1fb90 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20 0a 20 20   TK_COLLATE: .  
1fba0 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
1fbb0 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   {.      inReg =
1fbc0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1fbd0 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
1fbe0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72  Expr->pLeft, tar
1fbf0 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  get);.      brea
1fc00 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
1fc10 73 65 20 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b  se TK_TRIGGER: {
1fc20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
1fc30 20 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f 54 52   opcode is TK_TR
1fc40 49 47 47 45 52 2c 20 74 68 65 6e 20 74 68 65 20  IGGER, then the 
1fc50 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
1fc60 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20  reference.      
1fc70 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69  ** to a column i
1fc80 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f  n the new.* or o
1fc90 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ld.* pseudo-tabl
1fca0 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a  es available to.
1fcb0 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72        ** trigger
1fcc0 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68   programs. In th
1fcd0 69 73 20 63 61 73 65 20 45 78 70 72 2e 69 54 61  is case Expr.iTa
1fce0 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 31 20  ble is set to 1 
1fcf0 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  for the.      **
1fd00 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61   new.* pseudo-ta
1fd10 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20 74 68  ble, or 0 for th
1fd20 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  e old.* pseudo-t
1fd30 61 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75  able. Expr.iColu
1fd40 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  mn.      ** is s
1fd50 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e  et to the column
1fd60 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d 74   of the pseudo-t
1fd70 61 62 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f 72  able to read, or
1fd80 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20 20   to -1 to.      
1fd90 2a 2a 20 72 65 61 64 20 74 68 65 20 72 6f 77 69  ** read the rowi
1fda0 64 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a  d field..      *
1fdb0 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65  *.      ** The e
1fdc0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69 6d 70  xpression is imp
1fdd0 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 61  lemented using a
1fde0 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70 63 6f 64  n OP_Param opcod
1fdf0 65 2e 20 54 68 65 20 70 31 0a 20 20 20 20 20 20  e. The p1.      
1fe00 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
1fe10 73 65 74 20 74 6f 20 30 20 66 6f 72 20 61 6e 20  set to 0 for an 
1fe20 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66 65 72 65  old.rowid refere
1fe30 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69 2b 31 29  nce, or to (i+1)
1fe40 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 66  .      ** to ref
1fe50 65 72 65 6e 63 65 20 61 6e 6f 74 68 65 72 20 63  erence another c
1fe60 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6f 6c 64  olumn of the old
1fe70 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c  .* pseudo-table,
1fe80 20 77 68 65 72 65 20 0a 20 20 20 20 20 20 2a 2a   where .      **
1fe90 20 69 20 69 73 20 74 68 65 20 69 6e 64 65 78 20   i is the index 
1fea0 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 46  of the column. F
1feb0 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69 64 20 72  or a new.rowid r
1fec0 65 66 65 72 65 6e 63 65 2c 20 70 31 20 69 73 0a  eference, p1 is.
1fed0 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20        ** set to 
1fee0 28 6e 2b 31 29 2c 20 77 68 65 72 65 20 6e 20 69  (n+1), where n i
1fef0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1ff00 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61 63 68 20  columns in each 
1ff10 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 20 20  pseudo-table..  
1ff20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 72 65 66      ** For a ref
1ff30 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 6f 74  erence to any ot
1ff40 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  her column in th
1ff50 65 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74  e new.* pseudo-t
1ff60 61 62 6c 65 2c 20 70 31 0a 20 20 20 20 20 20 2a  able, p1.      *
1ff70 2a 20 69 73 20 73 65 74 20 74 6f 20 28 6e 2b 32  * is set to (n+2
1ff80 2b 69 29 2c 20 77 68 65 72 65 20 6e 20 61 6e 64  +i), where n and
1ff90 20 69 20 61 72 65 20 61 73 20 64 65 66 69 6e 65   i are as define
1ffa0 64 20 70 72 65 76 69 6f 75 73 6c 79 2e 20 46 6f  d previously. Fo
1ffb0 72 0a 20 20 20 20 20 20 2a 2a 20 65 78 61 6d 70  r.      ** examp
1ffc0 6c 65 2c 20 69 66 20 74 68 65 20 74 61 62 6c 65  le, if the table
1ffd0 20 6f 6e 20 77 68 69 63 68 20 74 72 69 67 67 65   on which trigge
1ffe0 72 73 20 61 72 65 20 62 65 69 6e 67 20 66 69 72  rs are being fir
1fff0 65 64 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  ed is.      ** d
20000 65 63 6c 61 72 65 64 20 61 73 3a 0a 20 20 20 20  eclared as:.    
20010 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
20020 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
20030 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 2a 2a 0a  a, b);.      **.
20040 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 70 31        ** Then p1
20050 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
20060 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
20070 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
20080 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20 20 6f 6c  p1==0   ->    ol
20090 64 2e 72 6f 77 69 64 20 20 20 20 20 70 31 3d 3d  d.rowid     p1==
200a0 33 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 72 6f  3   ->    new.ro
200b0 77 69 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 70  wid.      **   p
200c0 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20 6f 6c 64  1==1   ->    old
200d0 2e 61 20 20 20 20 20 20 20 20 20 70 31 3d 3d 34  .a         p1==4
200e0 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 61 0a 20     ->    new.a. 
200f0 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 32 20       **   p1==2 
20100 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62 20 20 20    ->    old.b   
20110 20 20 20 20 20 20 70 31 3d 3d 35 20 20 20 2d 3e        p1==5   ->
20120 20 20 20 20 6e 65 77 2e 62 20 20 20 20 20 20 20      new.b       
20130 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
20140 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 45  Table *pTab = pE
20150 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
20160 20 69 6e 74 20 70 31 20 3d 20 70 45 78 70 72 2d   int p1 = pExpr-
20170 3e 69 54 61 62 6c 65 20 2a 20 28 70 54 61 62 2d  >iTable * (pTab-
20180 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20 2b 20 70  >nCol+1) + 1 + p
20190 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a  Expr->iColumn;..
201a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
201b0 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c  xpr->iTable==0 |
201c0 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  | pExpr->iTable=
201d0 3d 31 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =1 );.      asse
201e0 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  rt( pExpr->iColu
201f0 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78 70 72 2d  mn>=-1 && pExpr-
20200 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e  >iColumn<pTab->n
20210 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Col );.      ass
20220 65 72 74 28 20 70 54 61 62 2d 3e 69 50 4b 65 79  ert( pTab->iPKey
20230 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 43 6f  <0 || pExpr->iCo
20240 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69 50 4b 65  lumn!=pTab->iPKe
20250 79 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  y );.      asser
20260 74 28 20 70 31 3e 3d 30 20 26 26 20 70 31 3c 28  t( p1>=0 && p1<(
20270 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20  pTab->nCol*2+2) 
20280 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
20290 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
202a0 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20 74 61 72  P_Param, p1, tar
202b0 67 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  get);.      Vdbe
202c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 2e  Comment((v, "%s.
202d0 25 73 20 2d 3e 20 24 25 64 22 2c 0a 20 20 20 20  %s -> $%d",.    
202e0 20 20 20 20 28 70 45 78 70 72 2d 3e 69 54 61 62      (pExpr->iTab
202f0 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c  le ? "new" : "ol
20300 64 22 29 2c 0a 20 20 20 20 20 20 20 20 28 70 45  d"),.        (pE
20310 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f  xpr->iColumn<0 ?
20320 20 22 72 6f 77 69 64 22 20 3a 20 70 45 78 70 72   "rowid" : pExpr
20330 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78  ->pTab->aCol[pEx
20340 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61  pr->iColumn].zNa
20350 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 74 61 72  me),.        tar
20360 67 65 74 0a 20 20 20 20 20 20 29 29 3b 0a 0a 23  get.      ));..#
20370 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
20380 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
20390 54 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  T.      /* If th
203a0 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 52 45 41  e column has REA
203b0 4c 20 61 66 66 69 6e 69 74 79 2c 20 69 74 20 6d  L affinity, it m
203c0 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20  ay currently be 
203d0 73 74 6f 72 65 64 20 61 73 20 61 6e 0a 20 20 20  stored as an.   
203e0 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 55     ** integer. U
203f0 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69  se OP_RealAffini
20400 74 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ty to make sure 
20410 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65 61  it is really rea
20420 6c 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  l..      **.    
20430 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    ** EVIDENCE-OF
20440 3a 20 52 2d 36 30 39 38 35 2d 35 37 36 36 32 20  : R-60985-57662 
20450 53 51 4c 69 74 65 20 77 69 6c 6c 20 63 6f 6e 76  SQLite will conv
20460 65 72 74 20 74 68 65 20 76 61 6c 75 65 20 62 61  ert the value ba
20470 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 66  ck to.      ** f
20480 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 77 68  loating point wh
20490 65 6e 20 65 78 74 72 61 63 74 69 6e 67 20 69 74  en extracting it
204a0 20 66 72 6f 6d 20 74 68 65 20 72 65 63 6f 72 64   from the record
204b0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
204c0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pExpr->iColumn>=
204d0 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 54 61  0 .       && pTa
204e0 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  b->aCol[pExpr->i
204f0 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79  Column].affinity
20500 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
20510 4c 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  L.      ){.     
20520 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20530 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41  dOp1(v, OP_RealA
20540 66 66 69 6e 69 74 79 2c 20 74 61 72 67 65 74 29  ffinity, target)
20550 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
20560 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
20570 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
20580 5f 56 45 43 54 4f 52 3a 20 7b 0a 20 20 20 20 20  _VECTOR: {.     
20590 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
205a0 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76 61  (pParse, "row va
205b0 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a 20  lue misused");. 
205c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
205d0 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
205e0 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20   Form A:.    ** 
205f0 20 20 43 41 53 45 20 78 20 57 48 45 4e 20 65 31    CASE x WHEN e1
20600 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32   THEN r1 WHEN e2
20610 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45   THEN r2 ... WHE
20620 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53  N eN THEN rN ELS
20630 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20  E y END.    **. 
20640 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20     ** Form B:.  
20650 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e    **   CASE WHEN
20660 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e   e1 THEN r1 WHEN
20670 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20   e2 THEN r2 ... 
20680 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20  WHEN eN THEN rN 
20690 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a  ELSE y END.    *
206a0 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20  *.    ** Form A 
206b0 69 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66  is can be transf
206c0 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65  ormed into the e
206d0 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42  quivalent form B
206e0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
206f0 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20   **   CASE WHEN 
20700 78 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  x=e1 THEN r1 WHE
20710 4e 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e  N x=e2 THEN r2 .
20720 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ...    **       
20730 20 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20   WHEN x=eN THEN 
20740 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20  rN ELSE y END.  
20750 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69    **.    ** X (i
20760 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20  f it exists) is 
20770 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e  in pExpr->pLeft.
20780 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20  .    ** Y is in 
20790 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74  the last element
207a0 20 6f 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69   of pExpr->x.pLi
207b0 73 74 20 69 66 20 70 45 78 70 72 2d 3e 78 2e 70  st if pExpr->x.p
207c0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 69 73 0a 20  List->nExpr is. 
207d0 20 20 20 2a 2a 20 6f 64 64 2e 20 20 54 68 65 20     ** odd.  The 
207e0 59 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e  Y is also option
207f0 61 6c 2e 20 20 49 66 20 74 68 65 20 6e 75 6d 62  al.  If the numb
20800 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
20810 6e 20 78 2e 70 4c 69 73 74 0a 20 20 20 20 2a 2a  n x.pList.    **
20820 20 69 73 20 65 76 65 6e 2c 20 74 68 65 6e 20 59   is even, then Y
20830 20 69 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 20   is omitted and 
20840 74 68 65 20 22 6f 74 68 65 72 77 69 73 65 22 20  the "otherwise" 
20850 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a  result is NULL..
20860 20 20 20 20 2a 2a 20 45 69 20 69 73 20 69 6e 20      ** Ei is in 
20870 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
20880 69 2a 32 5d 20 61 6e 64 20 52 69 20 69 73 20 70  i*2] and Ri is p
20890 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
208a0 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20  *2+1]..    **.  
208b0 20 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20    ** The result 
208c0 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
208d0 6e 20 69 73 20 74 68 65 20 52 69 20 66 6f 72 20  n is the Ri for 
208e0 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69  the first matchi
208f0 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72  ng Ei,.    ** or
20900 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
20910 6d 61 74 63 68 69 6e 67 20 45 69 2c 20 74 68 65  matching Ei, the
20920 20 45 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f 72   ELSE term Y, or
20930 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 20   if there is.   
20940 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d   ** no ELSE term
20950 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20  , NULL..    */. 
20960 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65     default: asse
20970 72 74 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45 20  rt( op==TK_CASE 
20980 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  ); {.      int e
20990 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20  ndLabel;        
209a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
209b0 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65  GOTO label for e
209c0 6e 64 20 6f 66 20 43 41 53 45 20 73 74 6d 74 20  nd of CASE stmt 
209d0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 78  */.      int nex
209e0 74 43 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  tCase;          
209f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f             /* GO
20a00 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78  TO label for nex
20a10 74 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f  t WHEN clause */
20a20 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72  .      int nExpr
20a30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20a40 20 20 20 20 20 20 20 20 20 2f 2a 20 32 78 20 6e           /* 2x n
20a50 75 6d 62 65 72 20 6f 66 20 57 48 45 4e 20 74 65  umber of WHEN te
20a60 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  rms */.      int
20a70 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
20a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20a90 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
20aa0 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
20ab0 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20   *pEList;       
20ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
20ad0 74 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20  t of WHEN terms 
20ae0 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
20af0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
20b00 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72  Listelem;  /* Ar
20b10 72 61 79 20 6f 66 20 57 48 45 4e 20 74 65 72 6d  ray of WHEN term
20b20 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  s */.      Expr 
20b30 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20 20 20 20  opCompare;      
20b40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20b50 54 68 65 20 58 3d 3d 45 69 20 65 78 70 72 65 73  The X==Ei expres
20b60 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78  sion */.      Ex
20b70 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  pr *pX;         
20b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b90 2f 2a 20 54 68 65 20 58 20 65 78 70 72 65 73 73  /* The X express
20ba0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
20bb0 72 20 2a 70 54 65 73 74 20 3d 20 30 3b 20 20 20  r *pTest = 0;   
20bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20bd0 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29  * X==Ei (form A)
20be0 20 6f 72 20 6a 75 73 74 20 45 69 20 28 66 6f 72   or just Ei (for
20bf0 6d 20 42 29 20 2a 2f 0a 20 20 20 20 20 20 56 56  m B) */.      VV
20c00 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 69 43 61 63  A_ONLY( int iCac
20c10 68 65 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65  heLevel = pParse
20c20 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 20 29  ->iCacheLevel; )
20c30 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
20c40 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
20c50 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
20c60 6c 65 63 74 29 20 26 26 20 70 45 78 70 72 2d 3e  lect) && pExpr->
20c70 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  x.pList );.     
20c80 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 78   assert(pExpr->x
20c90 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20  .pList->nExpr > 
20ca0 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74  0);.      pEList
20cb0 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
20cc0 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c  t;.      aListel
20cd0 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  em = pEList->a;.
20ce0 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45        nExpr = pE
20cf0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
20d00 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73 71     endLabel = sq
20d10 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
20d20 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28  el(v);.      if(
20d30 20 28 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c   (pX = pExpr->pL
20d40 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eft)!=0 ){.     
20d50 20 20 20 74 65 6d 70 58 20 3d 20 2a 70 58 3b 0a     tempX = *pX;.
20d60 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
20d70 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pX->op==TK_COL
20d80 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 65  UMN );.        e
20d90 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 26 74  xprToRegister(&t
20da0 65 6d 70 58 2c 20 65 78 70 72 43 6f 64 65 56 65  empX, exprCodeVe
20db0 63 74 6f 72 28 70 50 61 72 73 65 2c 20 26 74 65  ctor(pParse, &te
20dc0 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31 29 29  mpX, &regFree1))
20dd0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
20de0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
20df0 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  );.        memse
20e00 74 28 26 6f 70 43 6f 6d 70 61 72 65 2c 20 30 2c  t(&opCompare, 0,
20e10 20 73 69 7a 65 6f 66 28 6f 70 43 6f 6d 70 61 72   sizeof(opCompar
20e20 65 29 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 43  e));.        opC
20e30 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45  ompare.op = TK_E
20e40 51 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d  Q;.        opCom
20e50 70 61 72 65 2e 70 4c 65 66 74 20 3d 20 26 74 65  pare.pLeft = &te
20e60 6d 70 58 3b 0a 20 20 20 20 20 20 20 20 70 54 65  mpX;.        pTe
20e70 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b  st = &opCompare;
20e80 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 69 63 6b  .        /* Tick
20e90 65 74 20 62 33 35 31 64 39 35 66 39 63 64 35 65  et b351d95f9cd5e
20ea0 66 31 37 65 39 64 39 64 62 61 65 31 38 66 35 63  f17e9d9dbae18f5c
20eb0 61 38 36 31 31 31 39 30 30 30 31 3a 0a 20 20 20  a8611190001:.   
20ec0 20 20 20 20 20 2a 2a 20 54 68 65 20 76 61 6c 75       ** The valu
20ed0 65 20 69 6e 20 72 65 67 46 72 65 65 31 20 6d 69  e in regFree1 mi
20ee0 67 68 74 20 67 65 74 20 53 43 6f 70 79 2d 65 64  ght get SCopy-ed
20ef0 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 72   into the file r
20f00 65 73 75 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a  esult..        *
20f10 2a 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  * So make sure t
20f20 68 61 74 20 74 68 65 20 72 65 67 46 72 65 65 31  hat the regFree1
20f30 20 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74   register is not
20f40 20 72 65 75 73 65 64 20 66 6f 72 20 6f 74 68 65   reused for othe
20f50 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 75 72  r.        ** pur
20f60 70 6f 73 65 73 20 61 6e 64 20 70 6f 73 73 69 62  poses and possib
20f70 6c 79 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20  ly overwritten. 
20f80 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 46   */.        regF
20f90 72 65 65 31 20 3d 20 30 3b 0a 20 20 20 20 20 20  ree1 = 0;.      
20fa0 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
20fb0 20 69 3c 6e 45 78 70 72 2d 31 3b 20 69 3d 69 2b   i<nExpr-1; i=i+
20fc0 32 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2){.        sqli
20fd0 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
20fe0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
20ff0 20 20 69 66 28 20 70 58 20 29 7b 0a 20 20 20 20    if( pX ){.    
21000 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
21010 65 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  est!=0 );.      
21020 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 52      opCompare.pR
21030 69 67 68 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d  ight = aListelem
21040 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
21050 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21060 20 20 20 20 70 54 65 73 74 20 3d 20 61 4c 69 73      pTest = aLis
21070 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a  telem[i].pExpr;.
21080 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21090 20 20 6e 65 78 74 43 61 73 65 20 3d 20 73 71 6c    nextCase = sql
210a0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
210b0 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65  l(v);.        te
210c0 73 74 63 61 73 65 28 20 70 54 65 73 74 2d 3e 6f  stcase( pTest->o
210d0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
210e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
210f0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
21100 65 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43 61  e, pTest, nextCa
21110 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  se, SQLITE_JUMPI
21120 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20  FNULL);.        
21130 74 65 73 74 63 61 73 65 28 20 61 4c 69 73 74 65  testcase( aListe
21140 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e  lem[i+1].pExpr->
21150 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
21160 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21170 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
21180 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e   aListelem[i+1].
21190 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
211a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
211b0 64 62 65 47 6f 74 6f 28 76 2c 20 65 6e 64 4c 61  dbeGoto(v, endLa
211c0 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  bel);.        sq
211d0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
211e0 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
211f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
21200 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65  solveLabel(v, ne
21210 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20 7d  xtCase);.      }
21220 0a 20 20 20 20 20 20 69 66 28 20 28 6e 45 78 70  .      if( (nExp
21230 72 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  r&1)!=0 ){.     
21240 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
21250 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
21260 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21270 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
21280 20 70 45 4c 69 73 74 2d 3e 61 5b 6e 45 78 70 72   pEList->a[nExpr
21290 2d 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  -1].pExpr, targe
212a0 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
212b0 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
212c0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d  pParse);.      }
212d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
212e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
212f0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
21300 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  arget);.      }.
21310 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
21320 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
21330 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  | pParse->nErr>0
21340 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
21350 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
21360 76 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76 65 6c  vel==iCacheLevel
21370 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
21380 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
21390 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a  l(v, endLabel);.
213a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
213b0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
213c0 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20  E_OMIT_TRIGGER. 
213d0 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45     case TK_RAISE
213e0 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
213f0 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  ( pExpr->affinit
21400 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a  y==OE_Rollback .
21410 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45             || pE
21420 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
21430 45 5f 41 62 6f 72 74 0a 20 20 20 20 20 20 20 20  E_Abort.        
21440 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66     || pExpr->aff
21450 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20  inity==OE_Fail. 
21460 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78            || pEx
21470 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
21480 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20 20 29 3b  _Ignore.      );
21490 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72  .      if( !pPar
214a0 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20  se->pTriggerTab 
214b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
214c0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
214d0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
214e0 20 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45            "RAISE
214f0 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75  () may only be u
21500 73 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69  sed within a tri
21510 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a  gger-program");.
21520 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
21530 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21540 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  if( pExpr->affin
21550 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b  ity==OE_Abort ){
21560 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21570 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
21580 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21590 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
215a0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
215b0 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
215c0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
215d0 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67  >affinity==OE_Ig
215e0 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20  nore ){.        
215f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21600 34 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 76  4(.            v
21610 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54  , OP_Halt, SQLIT
21620 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c  E_OK, OE_Ignore,
21630 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f   0, pExpr->u.zTo
21640 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  ken,0);.        
21650 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
21660 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
21670 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c        sqlite3Hal
21680 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  tConstraint(pPar
21690 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  se, SQLITE_CONST
216a0 52 41 49 4e 54 5f 54 52 49 47 47 45 52 2c 0a 20  RAINT_TRIGGER,. 
216b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
216d0 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20 70 45  pr->affinity, pE
216e0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30  xpr->u.zToken, 0
216f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 0);.      }.. 
21700 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
21710 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73  }.#endif.  }.  s
21720 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
21730 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
21740 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65  Free1);.  sqlite
21750 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
21760 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
21770 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65  );.  return inRe
21780 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61 63 74  g;.}../*.** Fact
21790 6f 72 20 6f 75 74 20 74 68 65 20 63 6f 64 65 20  or out the code 
217a0 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  of the given exp
217b0 72 65 73 73 69 6f 6e 20 74 6f 20 69 6e 69 74 69  ression to initi
217c0 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a  alization time..
217d0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
217e0 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 0a 20  xprCodeAtInit(. 
217f0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
21800 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
21810 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
21820 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20  *pExpr,      /* 
21830 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
21840 6f 20 63 6f 64 65 20 77 68 65 6e 20 74 68 65 20  o code when the 
21850 56 44 42 45 20 69 6e 69 74 69 61 6c 69 7a 65 73  VDBE initializes
21860 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 65 73   */.  int regDes
21870 74 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65  t,      /* Store
21880 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68   the value in th
21890 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  is register */. 
218a0 20 75 38 20 72 65 75 73 61 62 6c 65 20 20 20 20   u8 reusable    
218b0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
218c0 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  is expression is
218d0 20 72 65 75 73 61 62 6c 65 20 2a 2f 0a 29 7b 0a   reusable */.){.
218e0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 3b 0a 20    ExprList *p;. 
218f0 20 61 73 73 65 72 74 28 20 43 6f 6e 73 74 46 61   assert( ConstFa
21900 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29  ctorOk(pParse) )
21910 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
21920 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 70 45  pConstExpr;.  pE
21930 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
21940 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
21950 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 70 20   pExpr, 0);.  p 
21960 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
21970 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
21980 70 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28  p, pExpr);.  if(
21990 20 70 20 29 7b 0a 20 20 20 20 20 73 74 72 75 63   p ){.     struc
219a0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
219b0 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70  *pItem = &p->a[p
219c0 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20  ->nExpr-1];.    
219d0 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74   pItem->u.iConst
219e0 45 78 70 72 52 65 67 20 3d 20 72 65 67 44 65 73  ExprReg = regDes
219f0 74 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  t;.     pItem->r
21a00 65 75 73 61 62 6c 65 20 3d 20 72 65 75 73 61 62  eusable = reusab
21a10 6c 65 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65  le;.  }.  pParse
21a20 2d 3e 70 43 6f 6e 73 74 45 78 70 72 20 3d 20 70  ->pConstExpr = p
21a30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
21a40 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c  ate code to eval
21a50 75 61 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  uate an expressi
21a60 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  on and store the
21a70 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f   results.** into
21a80 20 61 20 72 65 67 69 73 74 65 72 2e 20 20 52 65   a register.  Re
21a90 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65  turn the registe
21aa0 72 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74  r number where t
21ab0 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72  he results.** ar
21ac0 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  e stored..**.** 
21ad0 49 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20  If the register 
21ae0 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72  is a temporary r
21af0 65 67 69 73 74 65 72 20 74 68 61 74 20 63 61 6e  egister that can
21b00 20 62 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c   be deallocated,
21b10 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 69  .** then write i
21b20 74 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a  ts number into *
21b30 70 52 65 67 2e 20 20 49 66 20 74 68 65 20 72 65  pReg.  If the re
21b40 73 75 6c 74 20 72 65 67 69 73 74 65 72 20 69 73  sult register is
21b50 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72   not.** a tempor
21b60 61 72 79 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  ary, then set *p
21b70 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a  Reg to zero..**.
21b80 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61  ** If pExpr is a
21b90 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20   constant, then 
21ba0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
21bb0 68 74 20 67 65 6e 65 72 61 74 65 20 74 68 69 73  ht generate this
21bc0 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 66 69 6c 6c  .** code to fill
21bd0 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69 6e   the register in
21be0 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
21bf0 69 6f 6e 20 73 65 63 74 69 6f 6e 20 6f 66 20 74  ion section of t
21c00 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67 72  he.** VDBE progr
21c10 61 6d 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  am, in order to 
21c20 66 61 63 74 6f 72 20 69 74 20 6f 75 74 20 6f 66  factor it out of
21c30 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   the evaluation 
21c40 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  loop..*/.int sql
21c50 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
21c60 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
21c70 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
21c80 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74 20 72   *pReg){.  int r
21c90 32 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c  2;.  pExpr = sql
21ca0 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
21cb0 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20 69 66  ate(pExpr);.  if
21cc0 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28  ( ConstFactorOk(
21cd0 70 50 61 72 73 65 29 0a 20 20 20 26 26 20 70 45  pParse).   && pE
21ce0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49  xpr->op!=TK_REGI
21cf0 53 54 45 52 0a 20 20 20 26 26 20 73 71 6c 69 74  STER.   && sqlit
21d00 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
21d10 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 0a 20  NotJoin(pExpr). 
21d20 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   ){.    ExprList
21d30 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 43   *p = pParse->pC
21d40 6f 6e 73 74 45 78 70 72 3b 0a 20 20 20 20 69 6e  onstExpr;.    in
21d50 74 20 69 3b 0a 20 20 20 20 2a 70 52 65 67 20 20  t i;.    *pReg  
21d60 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 20 29  = 0;.    if( p )
21d70 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  {.      struct E
21d80 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
21d90 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  tem;.      for(p
21da0 49 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d 70 2d 3e  Item=p->a, i=p->
21db0 6e 45 78 70 72 3b 20 69 3e 30 3b 20 70 49 74 65  nExpr; i>0; pIte
21dc0 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20 20 20 20  m++, i--){.     
21dd0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 72 65     if( pItem->re
21de0 75 73 61 62 6c 65 20 26 26 20 73 71 6c 69 74 65  usable && sqlite
21df0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 49 74  3ExprCompare(pIt
21e00 65 6d 2d 3e 70 45 78 70 72 2c 70 45 78 70 72 2c  em->pExpr,pExpr,
21e10 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -1)==0 ){.      
21e20 20 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 6d      return pItem
21e30 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65  ->u.iConstExprRe
21e40 67 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  g;.        }.   
21e50 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
21e60 32 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  2 = ++pParse->nM
21e70 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  em;.    sqlite3E
21e80 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50  xprCodeAtInit(pP
21e90 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 32 2c  arse, pExpr, r2,
21ea0 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   1);.  }else{.  
21eb0 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
21ec0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
21ed0 72 73 65 29 3b 0a 20 20 20 20 72 32 20 3d 20 73  rse);.    r2 = s
21ee0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
21ef0 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
21f00 70 72 2c 20 72 31 29 3b 0a 20 20 20 20 69 66 28  pr, r1);.    if(
21f10 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20 20   r2==r1 ){.     
21f20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20 20 20   *pReg = r1;.   
21f30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
21f40 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
21f50 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
21f60 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d 20 30  .      *pReg = 0
21f70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
21f80 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn r2;.}../*.*
21f90 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
21fa0 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61  that will evalua
21fb0 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  te expression pE
21fc0 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68  xpr and store th
21fd0 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20  e.** results in 
21fe0 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
21ff0 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72    The results ar
22000 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  e guaranteed to 
22010 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67  appear.** in reg
22020 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f  ister target..*/
22030 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
22040 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61  rCode(Parse *pPa
22050 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
22060 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
22070 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61   int inReg;..  a
22080 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
22090 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73  && target<=pPars
220a0 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28  e->nMem );.  if(
220b0 20 70 45 78 70 72 20 26 26 20 70 45 78 70 72 2d   pExpr && pExpr-
220c0 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op==TK_REGISTER
220d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
220e0 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65  dbeAddOp2(pParse
220f0 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79  ->pVdbe, OP_Copy
22100 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
22110 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73   target);.  }els
22120 65 7b 0a 20 20 20 20 69 6e 52 65 67 20 3d 20 73  e{.    inReg = s
22130 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
22140 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
22150 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
22160 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
22170 3e 70 56 64 62 65 21 3d 30 20 7c 7c 20 70 50 61  >pVdbe!=0 || pPa
22180 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
22190 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28  ailed );.    if(
221a0 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 26   inReg!=target &
221b0 26 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20  & pParse->pVdbe 
221c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
221d0 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73  VdbeAddOp2(pPars
221e0 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f  e->pVdbe, OP_SCo
221f0 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65  py, inReg, targe
22200 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
22210 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 72  ./*.** Make a tr
22220 61 6e 73 69 65 6e 74 20 63 6f 70 79 20 6f 66 20  ansient copy of 
22230 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
22240 20 61 6e 64 20 74 68 65 6e 20 63 6f 64 65 20 69   and then code i
22250 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  t using.** sqlit
22260 65 33 45 78 70 72 43 6f 64 65 28 29 2e 20 20 54  e3ExprCode().  T
22270 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
22280 73 20 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c 69  s just like sqli
22290 74 65 33 45 78 70 72 43 6f 64 65 28 29 0a 2a 2a  te3ExprCode().**
222a0 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65   except that the
222b0 20 69 6e 70 75 74 20 65 78 70 72 65 73 73 69 6f   input expressio
222c0 6e 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  n is guaranteed 
222d0 74 6f 20 62 65 20 75 6e 63 68 61 6e 67 65 64 2e  to be unchanged.
222e0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
222f0 45 78 70 72 43 6f 64 65 43 6f 70 79 28 50 61 72  ExprCodeCopy(Par
22300 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
22310 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
22320 67 65 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  get){.  sqlite3 
22330 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
22340 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69  ;.  pExpr = sqli
22350 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
22360 45 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20  Expr, 0);.  if( 
22370 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
22380 64 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 43  d ) sqlite3ExprC
22390 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
223a0 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 73 71  r, target);.  sq
223b0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
223c0 64 62 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f  db, pExpr);.}../
223d0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
223e0 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61  de that will eva
223f0 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  luate expression
22400 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65   pExpr and store
22410 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20   the.** results 
22420 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
22430 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73  et.  The results
22440 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
22450 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20  to appear.** in 
22460 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
22470 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73    If the express
22480 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c  ion is constant,
22490 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
224a0 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 63 68 6f 6f  ne.** might choo
224b0 73 65 20 74 6f 20 63 6f 64 65 20 74 68 65 20 65  se to code the e
224c0 78 70 72 65 73 73 69 6f 6e 20 61 74 20 69 6e 69  xpression at ini
224d0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65  tialization time
224e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
224f0 33 45 78 70 72 43 6f 64 65 46 61 63 74 6f 72 61  3ExprCodeFactora
22500 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
22510 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
22520 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69  int target){.  i
22530 66 28 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e  f( pParse->okCon
22540 73 74 46 61 63 74 6f 72 20 26 26 20 73 71 6c 69  stFactor && sqli
22550 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
22560 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  t(pExpr) ){.    
22570 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
22580 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45  tInit(pParse, pE
22590 78 70 72 2c 20 74 61 72 67 65 74 2c 20 30 29 3b  xpr, target, 0);
225a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
225b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
225c0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
225d0 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  get);.  }.}../*.
225e0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
225f0 20 74 68 61 74 20 65 76 61 6c 75 61 74 65 73 20   that evaluates 
22600 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
22610 73 69 6f 6e 20 61 6e 64 20 70 75 74 73 20 74 68  sion and puts th
22620 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72  e result.** in r
22630 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a  egister target..
22640 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20  **.** Also make 
22650 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78  a copy of the ex
22660 70 72 65 73 73 69 6f 6e 20 72 65 73 75 6c 74 73  pression results
22670 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22 63   into another "c
22680 61 63 68 65 22 20 72 65 67 69 73 74 65 72 0a 2a  ache" register.*
22690 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65  * and modify the
226a0 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f 20 74   expression so t
226b0 68 61 74 20 74 68 65 20 6e 65 78 74 20 74 69 6d  hat the next tim
226c0 65 20 69 74 20 69 73 20 65 76 61 6c 75 61 74 65  e it is evaluate
226d0 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  d,.** the result
226e0 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68   is a copy of th
226f0 65 20 63 61 63 68 65 20 72 65 67 69 73 74 65 72  e cache register
22700 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
22710 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
22720 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
22730 74 20 61 72 65 20 75 73 65 64 20 6d 75 6c 74 69  t are used multi
22740 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20  ple .** times.  
22750 54 68 65 79 20 61 72 65 20 65 76 61 6c 75 61 74  They are evaluat
22760 65 64 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20  ed once and the 
22770 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 65  results of the e
22780 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65  xpression.** are
22790 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64   reused..*/.void
227a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
227b0 41 6e 64 43 61 63 68 65 28 50 61 72 73 65 20 2a  AndCache(Parse *
227c0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
227d0 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
227e0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
227f0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
22800 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20 61 73 73 65  nt iMem;..  asse
22810 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a  rt( target>0 );.
22820 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
22830 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op!=TK_REGISTER
22840 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
22850 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
22860 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
22870 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
22880 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  >nMem;.  sqlite3
22890 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
228a0 5f 43 6f 70 79 2c 20 74 61 72 67 65 74 2c 20 69  _Copy, target, i
228b0 4d 65 6d 29 3b 0a 20 20 65 78 70 72 54 6f 52 65  Mem);.  exprToRe
228c0 67 69 73 74 65 72 28 70 45 78 70 72 2c 20 69 4d  gister(pExpr, iM
228d0 65 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  em);.}../*.** Ge
228e0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
228f0 20 70 75 73 68 65 73 20 74 68 65 20 76 61 6c 75   pushes the valu
22900 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65  e of every eleme
22910 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a  nt of the given.
22920 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
22930 73 74 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e  st into a sequen
22940 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ce of registers 
22950 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72  beginning at tar
22960 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  get..**.** Retur
22970 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
22980 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74  elements evaluat
22990 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51  ed..**.** The SQ
229a0 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 20 66 6c  LITE_ECEL_DUP fl
229b0 61 67 20 70 72 65 76 65 6e 74 73 20 74 68 65 20  ag prevents the 
229c0 61 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20 62  arguments from b
229d0 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64 20 75  eing.** filled u
229e0 73 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2e 20 20  sing OP_SCopy.  
229f0 4f 50 5f 43 6f 70 79 20 6d 75 73 74 20 62 65 20  OP_Copy must be 
22a00 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  used instead..**
22a10 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45  .** The SQLITE_E
22a20 43 45 4c 5f 46 41 43 54 4f 52 20 61 72 67 75 6d  CEL_FACTOR argum
22a30 65 6e 74 20 61 6c 6c 6f 77 73 20 63 6f 6e 73 74  ent allows const
22a40 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  ant arguments to
22a50 20 62 65 0a 2a 2a 20 66 61 63 74 6f 72 65 64 20   be.** factored 
22a60 6f 75 74 20 69 6e 74 6f 20 69 6e 69 74 69 61 6c  out into initial
22a70 69 7a 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 2a 2a  ization code..**
22a80 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45  .** The SQLITE_E
22a90 43 45 4c 5f 52 45 46 20 66 6c 61 67 20 6d 65 61  CEL_REF flag mea
22aa0 6e 73 20 74 68 61 74 20 65 78 70 72 65 73 73 69  ns that expressi
22ab0 6f 6e 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  ons in the list 
22ac0 77 69 74 68 0a 2a 2a 20 45 78 70 72 4c 69 73 74  with.** ExprList
22ad0 2e 61 5b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  .a[].u.x.iOrderB
22ae0 79 43 6f 6c 3e 30 20 68 61 76 65 20 61 6c 72 65  yCol>0 have alre
22af0 61 64 79 20 62 65 65 6e 20 65 76 61 6c 75 61 74  ady been evaluat
22b00 65 64 20 61 6e 64 20 73 74 6f 72 65 64 0a 2a 2a  ed and stored.**
22b10 20 69 6e 20 72 65 67 69 73 74 65 72 73 20 61 74   in registers at
22b20 20 73 72 63 52 65 67 2c 20 61 6e 64 20 73 6f 20   srcReg, and so 
22b30 74 68 65 20 76 61 6c 75 65 20 63 61 6e 20 62 65  the value can be
22b40 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65   copied from the
22b50 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  re..*/.int sqlit
22b60 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
22b70 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
22b80 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73  rse,     /* Pars
22b90 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
22ba0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
22bb0 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65  ,   /* The expre
22bc0 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65  ssion list to be
22bd0 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
22be0 74 61 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f  target,        /
22bf0 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65  * Where to write
22c00 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
22c10 74 20 73 72 63 52 65 67 2c 20 20 20 20 20 20 20  t srcReg,       
22c20 20 2f 2a 20 53 6f 75 72 63 65 20 72 65 67 69 73   /* Source regis
22c30 74 65 72 73 20 69 66 20 53 51 4c 49 54 45 5f 45  ters if SQLITE_E
22c40 43 45 4c 5f 52 45 46 20 2a 2f 0a 20 20 75 38 20  CEL_REF */.  u8 
22c50 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
22c60 2f 2a 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 2a  /* SQLITE_ECEL_*
22c70 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 73   flags */.){.  s
22c80 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
22c90 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
22ca0 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 75 38 20  t i, j, n;.  u8 
22cb0 63 6f 70 79 4f 70 20 3d 20 28 66 6c 61 67 73 20  copyOp = (flags 
22cc0 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55  & SQLITE_ECEL_DU
22cd0 50 29 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20 4f  P) ? OP_Copy : O
22ce0 50 5f 53 43 6f 70 79 3b 0a 20 20 56 64 62 65 20  P_SCopy;.  Vdbe 
22cf0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
22d00 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  be;.  assert( pL
22d10 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ist!=0 );.  asse
22d20 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a  rt( target>0 );.
22d30 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
22d40 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b 20 20 2f  ->pVdbe!=0 );  /
22d50 2a 20 4e 65 76 65 72 20 67 65 74 73 20 74 68 69  * Never gets thi
22d60 73 20 66 61 72 20 6f 74 68 65 72 77 69 73 65 20  s far otherwise 
22d70 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e  */.  n = pList->
22d80 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 21 43 6f  nExpr;.  if( !Co
22d90 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72  nstFactorOk(pPar
22da0 73 65 29 20 29 20 66 6c 61 67 73 20 26 3d 20 7e  se) ) flags &= ~
22db0 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54  SQLITE_ECEL_FACT
22dc0 4f 52 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d  OR;.  for(pItem=
22dd0 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
22de0 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  <n; i++, pItem++
22df0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
22e00 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70  pr = pItem->pExp
22e10 72 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67  r;.    if( (flag
22e20 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  s & SQLITE_ECEL_
22e30 52 45 46 29 21 3d 30 20 26 26 20 28 6a 20 3d 20  REF)!=0 && (j = 
22e40 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 75 2e 78 2e  pList->a[i].u.x.
22e50 69 4f 72 64 65 72 42 79 43 6f 6c 29 3e 30 20 29  iOrderByCol)>0 )
22e60 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
22e70 64 62 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70  dbeAddOp2(v, cop
22e80 79 4f 70 2c 20 6a 2b 73 72 63 52 65 67 2d 31 2c  yOp, j+srcReg-1,
22e90 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20   target+i);.    
22ea0 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73  }else if( (flags
22eb0 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46   & SQLITE_ECEL_F
22ec0 41 43 54 4f 52 29 21 3d 30 20 26 26 20 73 71 6c  ACTOR)!=0 && sql
22ed0 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
22ee0 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  nt(pExpr) ){.   
22ef0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
22f00 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c  deAtInit(pParse,
22f10 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69   pExpr, target+i
22f20 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
22f30 0a 20 20 20 20 20 20 69 6e 74 20 69 6e 52 65 67  .      int inReg
22f40 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
22f50 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
22f60 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69   pExpr, target+i
22f70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52  );.      if( inR
22f80 65 67 21 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a  eg!=target+i ){.
22f90 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a          VdbeOp *
22fa0 70 4f 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pOp;.        if(
22fb0 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70 79   copyOp==OP_Copy
22fc0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 4f  .         && (pO
22fd0 70 3d 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  p=sqlite3VdbeGet
22fe0 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f 70 63 6f  Op(v, -1))->opco
22ff0 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20  de==OP_Copy.    
23000 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 31 2b       && pOp->p1+
23010 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65 67  pOp->p3+1==inReg
23020 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4f 70  .         && pOp
23030 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d  ->p2+pOp->p3+1==
23040 74 61 72 67 65 74 2b 69 0a 20 20 20 20 20 20 20  target+i.       
23050 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
23060 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20 20 20 20  p->p3++;.       
23070 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23080 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
23090 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20 69  Op2(v, copyOp, i
230a0 6e 52 65 67 2c 20 74 61 72 67 65 74 2b 69 29 3b  nReg, target+i);
230b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
230c0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
230d0 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
230e0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
230f0 66 6f 72 20 61 20 42 45 54 57 45 45 4e 20 6f 70  for a BETWEEN op
23100 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20  erator..**.**   
23110 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44   x BETWEEN y AND
23120 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f   z.**.** The abo
23130 76 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  ve is equivalent
23140 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e   to .**.**    x>
23150 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a  =y AND x<=z.**.*
23160 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73 75 63  * Code it as suc
23170 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74  h, taking care t
23180 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  o do the common 
23190 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  subexpression.**
231a0 20 65 6c 69 6d 69 6e 61 74 69 6f 6e 20 6f 66 20   elimination of 
231b0 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 78 4a 75  x..**.** The xJu
231c0 6d 70 49 66 20 70 61 72 61 6d 65 74 65 72 20 64  mpIf parameter d
231d0 65 74 65 72 6d 69 6e 65 73 20 64 65 74 61 69 6c  etermines detail
231e0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 55 4c 4c  s:.**.**    NULL
231f0 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
23200 20 20 20 20 53 74 6f 72 65 20 74 68 65 20 62 6f      Store the bo
23210 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 69 6e 20  olean result in 
23220 72 65 67 5b 64 65 73 74 5d 0a 2a 2a 20 20 20 20  reg[dest].**    
23230 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
23240 65 3a 20 20 20 20 20 20 4a 75 6d 70 20 74 6f 20  e:      Jump to 
23250 64 65 73 74 20 69 66 20 74 72 75 65 0a 2a 2a 20  dest if true.** 
23260 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
23270 46 61 6c 73 65 3a 20 20 20 20 20 4a 75 6d 70 20  False:     Jump 
23280 74 6f 20 64 65 73 74 20 69 66 20 66 61 6c 73 65  to dest if false
23290 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 75 6d 70 49  .**.** The jumpI
232a0 66 4e 75 6c 6c 20 70 61 72 61 6d 65 74 65 72 20  fNull parameter 
232b0 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20 78 4a  is ignored if xJ
232c0 75 6d 70 49 66 20 69 73 20 4e 55 4c 4c 2e 0a 2a  umpIf is NULL..*
232d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
232e0 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 0a 20  prCodeBetween(. 
232f0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
23300 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
23310 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
23320 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
23330 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
23340 20 2f 2a 20 54 68 65 20 42 45 54 57 45 45 4e 20   /* The BETWEEN 
23350 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
23360 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20 20  int dest,       
23370 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e    /* Jump destin
23380 61 74 69 6f 6e 20 6f 72 20 73 74 6f 72 61 67 65  ation or storage
23390 20 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 76   location */.  v
233a0 6f 69 64 20 28 2a 78 4a 75 6d 70 29 28 50 61 72  oid (*xJump)(Par
233b0 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 69 6e  se*,Expr*,int,in
233c0 74 29 2c 20 2f 2a 20 41 63 74 69 6f 6e 20 74 6f  t), /* Action to
233d0 20 74 61 6b 65 20 2a 2f 0a 20 20 69 6e 74 20 6a   take */.  int j
233e0 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20  umpIfNull    /* 
233f0 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  Take the jump if
23400 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 73 20   the BETWEEN is 
23410 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 45 78 70 72  NULL */.){. Expr
23420 20 65 78 70 72 41 6e 64 3b 20 20 20 20 20 2f 2a   exprAnd;     /*
23430 20 54 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f   The AND operato
23440 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20 78  r in  x>=y AND x
23450 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20 63  <=z  */.  Expr c
23460 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20 54  ompLeft;    /* T
23470 68 65 20 20 78 3e 3d 79 20 20 74 65 72 6d 20 2a  he  x>=y  term *
23480 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67  /.  Expr compRig
23490 68 74 3b 20 20 20 2f 2a 20 54 68 65 20 20 78 3c  ht;   /* The  x<
234a0 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78  =z  term */.  Ex
234b0 70 72 20 65 78 70 72 58 3b 20 20 20 20 20 20 20  pr exprX;       
234c0 2f 2a 20 54 68 65 20 20 78 20 20 73 75 62 65 78  /* The  x  subex
234d0 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
234e0 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20  t regFree1 = 0; 
234f0 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65  /* Temporary use
23500 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 0a 20   register */... 
23510 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 4c 65 66   memset(&compLef
23520 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70  t, 0, sizeof(Exp
23530 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 63  r));.  memset(&c
23540 6f 6d 70 52 69 67 68 74 2c 20 30 2c 20 73 69 7a  ompRight, 0, siz
23550 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 6d 65  eof(Expr));.  me
23560 6d 73 65 74 28 26 65 78 70 72 41 6e 64 2c 20 30  mset(&exprAnd, 0
23570 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b  , sizeof(Expr));
23580 0a 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  ..  assert( !Exp
23590 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
235a0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
235b0 29 20 29 3b 0a 20 20 65 78 70 72 58 20 3d 20 2a  ) );.  exprX = *
235c0 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
235d0 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f  exprAnd.op = TK_
235e0 41 4e 44 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70  AND;.  exprAnd.p
235f0 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74  Left = &compLeft
23600 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 52 69 67  ;.  exprAnd.pRig
23610 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b  ht = &compRight;
23620 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d  .  compLeft.op =
23630 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c 65   TK_GE;.  compLe
23640 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72  ft.pLeft = &expr
23650 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52  X;.  compLeft.pR
23660 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  ight = pExpr->x.
23670 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
23680 72 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f  r;.  compRight.o
23690 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d  p = TK_LE;.  com
236a0 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20 26  pRight.pLeft = &
236b0 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 52 69 67  exprX;.  compRig
236c0 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70  ht.pRight = pExp
236d0 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d  r->x.pList->a[1]
236e0 2e 70 45 78 70 72 3b 0a 20 20 65 78 70 72 54 6f  .pExpr;.  exprTo
236f0 52 65 67 69 73 74 65 72 28 26 65 78 70 72 58 2c  Register(&exprX,
23700 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28   exprCodeVector(
23710 70 50 61 72 73 65 2c 20 26 65 78 70 72 58 2c 20  pParse, &exprX, 
23720 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20 69  &regFree1));.  i
23730 66 28 20 78 4a 75 6d 70 20 29 7b 0a 20 20 20 20  f( xJump ){.    
23740 78 4a 75 6d 70 28 70 50 61 72 73 65 2c 20 26 65  xJump(pParse, &e
23750 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75  xprAnd, dest, ju
23760 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c  mpIfNull);.  }el
23770 73 65 7b 0a 20 20 20 20 65 78 70 72 58 2e 66 6c  se{.    exprX.fl
23780 61 67 73 20 7c 3d 20 45 50 5f 46 72 6f 6d 4a 6f  ags |= EP_FromJo
23790 69 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  in;.    sqlite3E
237a0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
237b0 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20  arse, &exprAnd, 
237c0 64 65 73 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  dest);.  }.  sql
237d0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
237e0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
237f0 65 65 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75  ee1);..  /* Ensu
23800 72 65 20 61 64 65 71 75 61 74 65 20 74 65 73 74  re adequate test
23810 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 74   coverage */.  t
23820 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
23830 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
23840 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  e  && jumpIfNull
23850 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  ==0 && regFree1=
23860 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
23870 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
23880 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20 6a  ExprIfTrue  && j
23890 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20  umpIfNull==0 && 
238a0 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20  regFree1!=0 );. 
238b0 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
238c0 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 54  ==sqlite3ExprIfT
238d0 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75  rue  && jumpIfNu
238e0 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll!=0 && regFree
238f0 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
23900 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74  se( xJump==sqlit
23910 65 33 45 78 70 72 49 66 54 72 75 65 20 20 26 26  e3ExprIfTrue  &&
23920 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26   jumpIfNull!=0 &
23930 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b  & regFree1!=0 );
23940 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
23950 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49  mp==sqlite3ExprI
23960 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66  fFalse && jumpIf
23970 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
23980 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1==0 );.  test
23990 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c  case( xJump==sql
239a0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 20  ite3ExprIfFalse 
239b0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
239c0 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20   && regFree1!=0 
239d0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  );.  testcase( x
239e0 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70  Jump==sqlite3Exp
239f0 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70  rIfFalse && jump
23a00 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67  IfNull!=0 && reg
23a10 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65  Free1==0 );.  te
23a20 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73  stcase( xJump==s
23a30 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
23a40 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  e && jumpIfNull!
23a50 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
23a60 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
23a70 20 78 4a 75 6d 70 3d 3d 30 20 29 3b 0a 7d 0a 0a   xJump==0 );.}..
23a80 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
23a90 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61  ode for a boolea
23aa0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63  n expression suc
23ab0 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73  h that a jump is
23ac0 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20   made.** to the 
23ad0 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20  label "dest" if 
23ae0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
23af0 73 20 74 72 75 65 20 62 75 74 20 65 78 65 63 75  s true but execu
23b00 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65  tion.** continue
23b10 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20  s straight thru 
23b20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
23b30 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a  n is false..**.*
23b40 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
23b50 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ion evaluates to
23b60 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74   NULL (neither t
23b70 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20  rue nor false), 
23b80 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65  then.** take the
23b90 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d   jump if the jum
23ba0 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20  pIfNull flag is 
23bb0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
23bc0 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f  L..**.** This co
23bd0 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  de depends on th
23be0 65 20 66 61 63 74 20 74 68 61 74 20 63 65 72 74  e fact that cert
23bf0 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73  ain token values
23c00 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20   (ex: TK_EQ).** 
23c10 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20  are the same as 
23c20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65  opcode values (e
23c30 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69  x: OP_Eq) that i
23c40 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72  mplement the cor
23c50 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70  responding.** op
23c60 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61  eration.  Specia
23c70 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64  l comments in vd
23c80 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f  be.c and the mko
23c90 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70  pcodeh.awk scrip
23ca0 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65  t in.** the make
23cb0 20 70 72 6f 63 65 73 73 20 63 61 75 73 65 20 74   process cause t
23cc0 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61  hese values to a
23cd0 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73  lign.  Assert()s
23ce0 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20   in the code.** 
23cf0 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61  below verify tha
23d00 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72  t the numbers ar
23d10 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63  e aligned correc
23d20 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tly..*/.void sql
23d30 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 50  ite3ExprIfTrue(P
23d40 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
23d50 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64  pr *pExpr, int d
23d60 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  est, int jumpIfN
23d70 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ull){.  Vdbe *v 
23d80 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
23d90 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20  .  int op = 0;. 
23da0 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
23db0 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
23dc0 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c  2 = 0;.  int r1,
23dd0 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   r2;..  assert( 
23de0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
23df0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c  TE_JUMPIFNULL ||
23e00 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
23e10 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d  ;.  if( NEVER(v=
23e20 3d 30 29 20 29 20 20 20 20 20 72 65 74 75 72 6e  =0) )     return
23e30 3b 20 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20  ;  /* Existence 
23e40 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20  of VDBE checked 
23e50 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69  by caller */.  i
23e60 66 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d  f( NEVER(pExpr==
23e70 30 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  0) ) return;  /*
23e80 20 4e 6f 20 77 61 79 20 74 68 69 73 20 63 61 6e   No way this can
23e90 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20   happen */.  op 
23ea0 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73  = pExpr->op;.  s
23eb0 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
23ec0 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a   case TK_AND: {.
23ed0 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
23ee0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
23ef0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65  bel(v);.      te
23f00 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
23f10 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
23f20 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
23f30 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
23f40 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49  >pLeft, d2,jumpI
23f50 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d  fNull^SQLITE_JUM
23f60 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
23f70 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
23f80 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
23f90 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
23fa0 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
23fb0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
23fc0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
23fd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
23fe0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
23ff0 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   d2);.      sqli
24000 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
24010 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62  pParse);.      b
24020 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
24030 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20  case TK_OR: {.  
24040 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
24050 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
24060 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
24070 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
24080 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
24090 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
240a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
240b0 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
240c0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
240d0 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
240e0 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
240f0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
24100 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
24110 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
24120 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62  pParse);.      b
24130 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
24140 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
24150 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
24160 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
24170 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
24180 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
24190 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
241a0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
241b0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
241c0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
241d0 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
241e0 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65  _ISNOT:.      te
241f0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
24200 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
24210 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  ase( op==TK_ISNO
24220 54 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20  T );.      op = 
24230 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b  (op==TK_IS) ? TK
24240 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20  _EQ : TK_NE;.   
24250 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20     jumpIfNull = 
24260 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20  SQLITE_NULLEQ;. 
24270 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
24280 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  u */.    case TK
24290 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
242a0 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
242b0 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
242c0 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
242d0 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
242e0 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  _EQ: {.      if(
242f0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65   sqlite3ExprIsVe
24300 63 74 6f 72 28 70 45 78 70 72 2d 3e 70 4c 65 66  ctor(pExpr->pLef
24310 74 29 20 29 20 67 6f 74 6f 20 64 65 66 61 75 6c  t) ) goto defaul
24320 74 5f 65 78 70 72 3b 0a 20 20 20 20 20 20 74 65  t_expr;.      te
24330 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
24340 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  ll==0 );.      r
24350 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
24360 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
24370 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
24380 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
24390 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
243a0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
243b0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
243c0 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
243d0 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
243e0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
243f0 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
24400 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
24410 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
24420 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
24430 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l);.      assert
24440 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20  (TK_LT==OP_Lt); 
24450 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
24460 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Lt); VdbeCoverag
24470 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29  eIf(v,op==OP_Lt)
24480 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
24490 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65  K_LE==OP_Le); te
244a0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65  stcase(op==OP_Le
244b0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
244c0 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a  f(v,op==OP_Le);.
244d0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
244e0 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74  GT==OP_Gt); test
244f0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b  case(op==OP_Gt);
24500 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
24510 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20  v,op==OP_Gt);.  
24520 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45      assert(TK_GE
24530 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61  ==OP_Ge); testca
24540 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56  se(op==OP_Ge); V
24550 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
24560 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20  op==OP_Ge);.    
24570 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d    assert(TK_EQ==
24580 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65  OP_Eq); testcase
24590 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20  (op==OP_Eq);.   
245a0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
245b0 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26  f(v, op==OP_Eq &
245c0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  & jumpIfNull==SQ
245d0 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
245e0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
245f0 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20  If(v, op==OP_Eq 
24600 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53  && jumpIfNull!=S
24610 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
24620 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e       assert(TK_N
24630 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63  E==OP_Ne); testc
24640 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a  ase(op==OP_Ne);.
24650 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
24660 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e  geIf(v, op==OP_N
24670 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  e && jumpIfNull=
24680 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
24690 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
246a0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
246b0 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Ne && jumpIfNull
246c0 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  !=SQLITE_NULLEQ)
246d0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
246e0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
246f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
24700 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
24710 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
24720 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
24730 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
24740 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
24750 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49      assert( TK_I
24760 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  SNULL==OP_IsNull
24770 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20   );   testcase( 
24780 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b  op==TK_ISNULL );
24790 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
247a0 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f  K_NOTNULL==OP_No
247b0 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73  tNull ); testcas
247c0 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
247d0 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  L );.      r1 = 
247e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
247f0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
24800 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
24810 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee1);.      sqli
24820 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
24830 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a   op, r1, dest);.
24840 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
24850 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49  geIf(v, op==TK_I
24860 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64  SNULL);.      Vd
24870 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
24880 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b  op==TK_NOTNULL);
24890 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
248a0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
248b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
248c0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
248d0 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
248e0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
248f0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
24900 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
24910 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
24920 64 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70  dest, sqlite3Exp
24930 72 49 66 54 72 75 65 2c 20 6a 75 6d 70 49 66 4e  rIfTrue, jumpIfN
24940 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
24950 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
24960 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
24970 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
24980 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_IN: {.      in
24990 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20  t destIfFalse = 
249a0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
249b0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
249c0 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20  nt destIfNull = 
249d0 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73  jumpIfNull ? des
249e0 74 20 3a 20 64 65 73 74 49 66 46 61 6c 73 65 3b  t : destIfFalse;
249f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
24a00 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
24a10 20 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61   pExpr, destIfFa
24a20 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  lse, destIfNull)
24a30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
24a40 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29  dbeGoto(v, dest)
24a50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
24a60 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
24a70 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
24a80 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
24a90 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64    }.#endif.    d
24aa0 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65  efault: {.    de
24ab0 66 61 75 6c 74 5f 65 78 70 72 3a 0a 20 20 20 20  fault_expr:.    
24ac0 20 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73    if( exprAlways
24ad0 54 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20  True(pExpr) ){. 
24ae0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
24af0 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b  beGoto(v, dest);
24b00 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
24b10 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65   exprAlwaysFalse
24b20 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  (pExpr) ){.     
24b30 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20     /* No-op */. 
24b40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
24b50 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
24b60 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
24b70 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67  rse, pExpr, &reg
24b80 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Free1);.        
24b90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
24ba0 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20  3(v, OP_If, r1, 
24bb0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
24bc0 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64  !=0);.        Vd
24bd0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
24be0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
24bf0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
24c00 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
24c10 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
24c20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
24c30 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
24c40 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
24c50 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
24c60 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73  , regFree1);.  s
24c70 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
24c80 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
24c90 46 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a  Free2);  .}../*.
24ca0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
24cb0 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65   for a boolean e
24cc0 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74  xpression such t
24cd0 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  hat a jump is ma
24ce0 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62  de.** to the lab
24cf0 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65  el "dest" if the
24d00 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
24d10 61 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69  alse but executi
24d20 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20  on.** continues 
24d30 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66  straight thru if
24d40 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
24d50 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  is true..**.** I
24d60 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
24d70 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
24d80 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65  LL (neither true
24d90 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e   nor false) then
24da0 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70  .** jump if jump
24db0 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45  IfNull is SQLITE
24dc0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66  _JUMPIFNULL or f
24dd0 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a  all through if j
24de0 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20  umpIfNull.** is 
24df0 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  0..*/.void sqlit
24e00 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 50 61  e3ExprIfFalse(Pa
24e10 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
24e20 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65  r *pExpr, int de
24e30 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  st, int jumpIfNu
24e40 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ll){.  Vdbe *v =
24e50 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
24e60 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20    int op = 0;.  
24e70 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
24e80 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32  ;.  int regFree2
24e90 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20   = 0;.  int r1, 
24ea0 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a  r2;..  assert( j
24eb0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
24ec0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20  E_JUMPIFNULL || 
24ed0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
24ee0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d  .  if( NEVER(v==
24ef0 30 29 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20  0) ) return; /* 
24f00 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42  Existence of VDB
24f10 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c  E checked by cal
24f20 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78  ler */.  if( pEx
24f30 70 72 3d 3d 30 20 29 20 20 20 20 72 65 74 75 72  pr==0 )    retur
24f40 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c  n;..  /* The val
24f50 75 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20  ue of pExpr->op 
24f60 61 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74  and op are relat
24f70 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  ed as follows:. 
24f80 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70   **.  **       p
24f90 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20  Expr->op        
24fa0 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20      op.  **     
24fb0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20    ---------     
24fc0 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a       ----------.
24fd0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53    **       TK_IS
24fe0 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50  NULL          OP
24ff0 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20  _NotNull.  **   
25000 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20      TK_NOTNULL  
25010 20 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c         OP_IsNull
25020 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e  .  **       TK_N
25030 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
25040 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Eq.  **       
25050 54 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20 20  TK_EQ           
25060 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20     OP_Ne.  **   
25070 20 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20      TK_GT       
25080 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a         OP_Le.  *
25090 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20  *       TK_LE   
250a0 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74             OP_Gt
250b0 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47  .  **       TK_G
250c0 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
250d0 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Lt.  **       
250e0 54 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20  TK_LT           
250f0 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20     OP_Ge.  **.  
25100 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c  ** For other val
25110 75 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70  ues of pExpr->op
25120 2c 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65  , op is undefine
25130 64 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20  d and unused..  
25140 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  ** The value of 
25150 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73  TK_ and OP_ cons
25160 74 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67  tants are arrang
25170 65 64 20 73 75 63 68 20 74 68 61 74 20 77 65 0a  ed such that we.
25180 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65    ** can compute
25190 20 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f   the mapping abo
251a0 76 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c  ve using the fol
251b0 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f  lowing expressio
251c0 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29  n..  ** Assert()
251d0 73 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  s verify that th
251e0 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73  e computation is
251f0 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20   correct..  */. 
25200 20 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f   op = ((pExpr->o
25210 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29  p+(TK_ISNULL&1))
25220 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31  ^1)-(TK_ISNULL&1
25230 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  );..  /* Verify 
25240 63 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e  correct alignmen
25250 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f  t of TK_ and OP_
25260 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a   constants.  */.
25270 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
25280 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c  >op!=TK_ISNULL |
25290 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  | op==OP_NotNull
252a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
252b0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e  xpr->op!=TK_NOTN
252c0 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73  ULL || op==OP_Is
252d0 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Null );.  assert
252e0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
252f0 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20  NE || op==OP_Eq 
25300 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
25310 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c  pr->op!=TK_EQ ||
25320 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20   op==OP_Ne );.  
25330 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
25340 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d  p!=TK_LT || op==
25350 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Ge );.  asser
25360 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
25370 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74  _LE || op==OP_Gt
25380 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
25390 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c  xpr->op!=TK_GT |
253a0 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20  | op==OP_Le );. 
253b0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
253c0 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d  op!=TK_GE || op=
253d0 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69  =OP_Lt );..  swi
253e0 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
253f0 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  {.    case TK_AN
25400 44 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  D: {.      testc
25410 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
25420 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
25430 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
25440 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
25450 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
25460 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
25470 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
25480 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
25490 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
254a0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
254b0 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
254c0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
254d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
254e0 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
254f0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
25500 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
25510 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _OR: {.      int
25520 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   d2 = sqlite3Vdb
25530 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
25540 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
25550 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
25560 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
25570 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
25580 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32  pExpr->pLeft, d2
25590 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c  , jumpIfNull^SQL
255a0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
255b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
255c0 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
255d0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
255e0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
255f0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
25600 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
25610 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
25620 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
25630 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20  Label(v, d2);.  
25640 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
25650 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
25660 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
25670 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
25680 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  NOT: {.      tes
25690 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
256a0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
256b0 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
256c0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
256d0 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
256e0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
256f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
25700 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20  case TK_IS:.    
25710 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20  case TK_ISNOT:. 
25720 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
25730 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
25740 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
25750 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
25760 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  _ISNOT );.      
25770 6f 70 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d  op = (pExpr->op=
25780 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20  =TK_IS) ? TK_NE 
25790 3a 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 6a  : TK_EQ;.      j
257a0 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49  umpIfNull = SQLI
257b0 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20  TE_NULLEQ;.     
257c0 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f   /* Fall thru */
257d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
257e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
257f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
25800 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
25810 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
25820 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
25830 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c   {.      if( sql
25840 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72  ite3ExprIsVector
25850 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29  (pExpr->pLeft) )
25860 20 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78   goto default_ex
25870 70 72 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  pr;.      testca
25880 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
25890 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  0 );.      r1 = 
258a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
258b0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
258c0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
258d0 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
258e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
258f0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
25900 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
25910 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f  Free2);.      co
25920 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
25930 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
25940 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
25950 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
25960 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73       r1, r2, des
25970 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
25980 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
25990 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74  LT==OP_Lt); test
259a0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  case(op==OP_Lt);
259b0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
259c0 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20  v,op==OP_Lt);.  
259d0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45      assert(TK_LE
259e0 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61  ==OP_Le); testca
259f0 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56  se(op==OP_Le); V
25a00 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
25a10 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20  op==OP_Le);.    
25a20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d    assert(TK_GT==
25a30 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Gt); testcase
25a40 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62  (op==OP_Gt); Vdb
25a50 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
25a60 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20  ==OP_Gt);.      
25a70 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50  assert(TK_GE==OP
25a80 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ge); testcase(o
25a90 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43  p==OP_Ge); VdbeC
25aa0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
25ab0 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73  OP_Ge);.      as
25ac0 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45  sert(TK_EQ==OP_E
25ad0 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  q); testcase(op=
25ae0 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56  =OP_Eq);.      V
25af0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
25b00 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75   op==OP_Eq && ju
25b10 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45  mpIfNull!=SQLITE
25b20 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
25b30 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
25b40 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a  , op==OP_Eq && j
25b50 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
25b60 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
25b70 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f   assert(TK_NE==O
25b80 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Ne); testcase(
25b90 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20  op==OP_Ne);.    
25ba0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
25bb0 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26  (v, op==OP_Ne &&
25bc0 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c   jumpIfNull!=SQL
25bd0 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
25be0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
25bf0 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26  f(v, op==OP_Ne &
25c00 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  & jumpIfNull==SQ
25c10 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
25c20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
25c30 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
25c40 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
25c50 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
25c60 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
25c70 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
25c80 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
25c90 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
25ca0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
25cb0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
25cc0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
25cd0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
25ce0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
25cf0 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65  p2(v, op, r1, de
25d00 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
25d10 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
25d20 4c 4c 20 29 3b 20 20 20 56 64 62 65 43 6f 76 65  LL );   VdbeCove
25d30 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
25d40 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  _ISNULL);.      
25d50 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
25d60 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 20 20 56 64 62  _NOTNULL );  Vdb
25d70 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
25d80 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a  p==TK_NOTNULL);.
25d90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
25da0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
25db0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
25dc0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  }.    case TK_BE
25dd0 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74  TWEEN: {.      t
25de0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
25df0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
25e00 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28  exprCodeBetween(
25e10 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
25e20 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70 72  est, sqlite3Expr
25e30 49 66 46 61 6c 73 65 2c 20 6a 75 6d 70 49 66 4e  IfFalse, jumpIfN
25e40 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
25e50 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
25e60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
25e70 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
25e80 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  K_IN: {.      if
25e90 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a  ( jumpIfNull ){.
25ea0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
25eb0 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65  xprCodeIN(pParse
25ec0 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64  , pExpr, dest, d
25ed0 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  est);.      }els
25ee0 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64  e{.        int d
25ef0 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69  estIfNull = sqli
25f00 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
25f10 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
25f20 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70  ite3ExprCodeIN(p
25f30 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
25f40 73 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  st, destIfNull);
25f50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
25f60 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
25f70 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  (v, destIfNull);
25f80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
25f90 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
25fa0 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  if.    default: 
25fb0 7b 0a 20 20 20 20 64 65 66 61 75 6c 74 5f 65 78  {.    default_ex
25fc0 70 72 3a 20 0a 20 20 20 20 20 20 69 66 28 20 65  pr: .      if( e
25fd0 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
25fe0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
25ff0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
26000 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  (v, dest);.     
26010 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72 41   }else if( exprA
26020 6c 77 61 79 73 54 72 75 65 28 70 45 78 70 72 29  lwaysTrue(pExpr)
26030 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e   ){.        /* n
26040 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65  o-op */.      }e
26050 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20  lse{.        r1 
26060 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
26070 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
26080 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b  xpr, &regFree1);
26090 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
260a0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
260b0 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74  _IfNot, r1, dest
260c0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29  , jumpIfNull!=0)
260d0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
260e0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
260f0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
26100 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
26110 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
26120 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
26130 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
26140 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
26150 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
26160 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
26170 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
26180 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
26190 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
261a0 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b  2);.}../*.** Lik
261b0 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  e sqlite3ExprIfF
261c0 61 6c 73 65 28 29 20 65 78 63 65 70 74 20 74 68  alse() except th
261d0 61 74 20 61 20 63 6f 70 79 20 69 73 20 6d 61 64  at a copy is mad
261e0 65 20 6f 66 20 70 45 78 70 72 20 62 65 66 6f 72  e of pExpr befor
261f0 65 0a 2a 2a 20 63 6f 64 65 20 67 65 6e 65 72 61  e.** code genera
26200 74 69 6f 6e 2c 20 61 6e 64 20 74 68 61 74 20 63  tion, and that c
26210 6f 70 79 20 69 73 20 64 65 6c 65 74 65 64 20 61  opy is deleted a
26220 66 74 65 72 20 63 6f 64 65 20 67 65 6e 65 72 61  fter code genera
26230 74 69 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20 65 6e  tion. This.** en
26240 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6f  sures that the o
26250 72 69 67 69 6e 61 6c 20 70 45 78 70 72 20 69 73  riginal pExpr is
26260 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76   unchanged..*/.v
26270 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49  oid sqlite3ExprI
26280 66 46 61 6c 73 65 44 75 70 28 50 61 72 73 65 20  fFalseDup(Parse 
26290 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
262a0 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 69  Expr, int dest,i
262b0 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
262c0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
262d0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78  pParse->db;.  Ex
262e0 70 72 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c 69  pr *pCopy = sqli
262f0 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
26300 45 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20  Expr, 0);.  if( 
26310 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
26320 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
26330 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
26340 61 72 73 65 2c 20 70 43 6f 70 79 2c 20 64 65 73  arse, pCopy, des
26350 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
26360 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
26370 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 70  rDelete(db, pCop
26380 79 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 6f  y);.}.../*.** Do
26390 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73   a deep comparis
263a0 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73  on of two expres
263b0 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74  sion trees.  Ret
263c0 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f  urn 0 if the two
263d0 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
263e0 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69  are completely i
263f0 64 65 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72  dentical.  Retur
26400 6e 20 31 20 69 66 20 74 68 65 79 20 64 69 66 66  n 1 if they diff
26410 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20  er only.** by a 
26420 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
26430 20 61 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65   at the top leve
26440 6c 2e 20 20 52 65 74 75 72 6e 20 32 20 69 66 20  l.  Return 2 if 
26450 74 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72  there are differ
26460 65 6e 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74  ences.** other t
26470 68 61 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65  han the top-leve
26480 6c 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  l COLLATE operat
26490 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  or..**.** If any
264a0 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70   subelement of p
264b0 42 20 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c  B has Expr.iTabl
264c0 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20  e==(-1) then it 
264d0 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f  is allowed.** to
264e0 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74   compare equal t
264f0 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20  o an equivalent 
26500 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69  element in pA wi
26510 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d  th Expr.iTable==
26520 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iTab..**.** The 
26530 70 41 20 73 69 64 65 20 6d 69 67 68 74 20 62 65  pA side might be
26540 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54   using TK_REGIST
26550 45 52 2e 20 20 49 66 20 74 68 61 74 20 69 73 20  ER.  If that is 
26560 74 68 65 20 63 61 73 65 20 61 6e 64 20 70 42 20  the case and pB 
26570 69 73 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20  is.** not using 
26580 54 4b 5f 52 45 47 49 53 54 45 52 20 62 75 74 20  TK_REGISTER but 
26590 69 73 20 6f 74 68 65 72 77 69 73 65 20 65 71 75  is otherwise equ
265a0 69 76 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74  ivalent, then st
265b0 69 6c 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a  ill return 0..**
265c0 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68  .** Sometimes th
265d0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
265e0 72 65 74 75 72 6e 20 32 20 65 76 65 6e 20 69 66  return 2 even if
265f0 20 74 68 65 20 74 77 6f 20 65 78 70 72 65 73 73   the two express
26600 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61  ions.** really a
26610 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20  re equivalent.  
26620 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f  If we cannot pro
26630 76 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72  ve that the expr
26640 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69  essions are.** i
26650 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74  dentical, we ret
26660 75 72 6e 20 32 20 6a 75 73 74 20 74 6f 20 62 65  urn 2 just to be
26670 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68   safe.  So if th
26680 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
26690 74 75 72 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f  turns 2, then yo
266a0 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20  u do not really 
266b0 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e  know for certain
266c0 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65   if the two.** e
266d0 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74  xpressions are t
266e0 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66  he same.  But if
266f0 20 79 6f 75 20 67 65 74 20 61 20 30 20 6f 72 20   you get a 0 or 
26700 31 20 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79  1 return, then y
26710 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72  ou.** can be sur
26720 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
26730 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20  s are the same. 
26740 20 49 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77   In the places w
26750 68 65 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  here.** this rou
26760 74 69 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74  tine is used, it
26770 20 64 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74   does not hurt t
26780 6f 20 67 65 74 20 61 6e 20 65 78 74 72 61 20 32  o get an extra 2
26790 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20   - that.** just 
267a0 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20  might result in 
267b0 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c  some slightly sl
267c0 6f 77 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20  ower code.  But 
267d0 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20  returning.** an 
267e0 69 6e 63 6f 72 72 65 63 74 20 30 20 6f 72 20 31  incorrect 0 or 1
267f0 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61   could lead to a
26800 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f   malfunction..*/
26810 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
26820 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41  Compare(Expr *pA
26830 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20  , Expr *pB, int 
26840 69 54 61 62 29 7b 0a 20 20 75 33 32 20 63 6f 6d  iTab){.  u32 com
26850 62 69 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69 66  binedFlags;.  if
26860 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30  ( pA==0 || pB==0
26870 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
26880 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20  B==pA ? 0 : 2;. 
26890 20 7d 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c 61   }.  combinedFla
268a0 67 73 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20 7c  gs = pA->flags |
268b0 20 70 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66   pB->flags;.  if
268c0 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20  ( combinedFlags 
268d0 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
268e0 0a 20 20 20 20 69 66 28 20 28 70 41 2d 3e 66 6c  .    if( (pA->fl
268f0 61 67 73 26 70 42 2d 3e 66 6c 61 67 73 26 45 50  ags&pB->flags&EP
26900 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 20 26 26  _IntValue)!=0 &&
26910 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d 70   pA->u.iValue==p
26920 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20  B->u.iValue ){. 
26930 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
26940 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
26950 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d  2;.  }.  if( pA-
26960 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20  >op!=pB->op ){. 
26970 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54     if( pA->op==T
26980 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c  K_COLLATE && sql
26990 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
269a0 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2c 20 69  pA->pLeft, pB, i
269b0 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20  Tab)<2 ){.      
269c0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
269d0 20 20 20 20 69 66 28 20 70 42 2d 3e 6f 70 3d 3d      if( pB->op==
269e0 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71  TK_COLLATE && sq
269f0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
26a00 28 70 41 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20  (pA, pB->pLeft, 
26a10 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20  iTab)<2 ){.     
26a20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
26a30 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20  .    return 2;. 
26a40 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21   }.  if( pA->op!
26a50 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41  =TK_COLUMN && pA
26a60 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op!=TK_AGG_COL
26a70 55 4d 4e 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f  UMN && pA->u.zTo
26a80 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ken ){.    if( p
26a90 41 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49  A->op==TK_FUNCTI
26aa0 4f 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ON ){.      if( 
26ab0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
26ac0 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e  A->u.zToken,pB->
26ad0 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20 72  u.zToken)!=0 ) r
26ae0 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 65 6c  eturn 2;.    }el
26af0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 70 41  se if( strcmp(pA
26b00 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75  ->u.zToken,pB->u
26b10 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20  .zToken)!=0 ){. 
26b20 20 20 20 20 20 72 65 74 75 72 6e 20 70 41 2d 3e       return pA->
26b30 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 3f  op==TK_COLLATE ?
26b40 20 31 20 3a 20 32 3b 0a 20 20 20 20 7d 0a 20 20   1 : 2;.    }.  
26b50 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61  }.  if( (pA->fla
26b60 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
26b70 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20  )!=(pB->flags & 
26b80 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72  EP_Distinct) ) r
26b90 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 41  eturn 2;.  if( A
26ba0 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e 65 64 46  LWAYS((combinedF
26bb0 6c 61 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f  lags & EP_TokenO
26bc0 6e 6c 79 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20  nly)==0) ){.    
26bd0 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67  if( combinedFlag
26be0 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
26bf0 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
26c00 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
26c10 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66  Compare(pA->pLef
26c20 74 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54  t, pB->pLeft, iT
26c30 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ab) ) return 2;.
26c40 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
26c50 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70  xprCompare(pA->p
26c60 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68  Right, pB->pRigh
26c70 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72  t, iTab) ) retur
26c80 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  n 2;.    if( sql
26c90 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
26ca0 61 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74 2c  are(pA->x.pList,
26cb0 20 70 42 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54   pB->x.pList, iT
26cc0 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ab) ) return 2;.
26cd0 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 28      if( ALWAYS((
26ce0 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20  combinedFlags & 
26cf0 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 29 20  EP_Reduced)==0) 
26d00 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54  && pA->op!=TK_ST
26d10 52 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 69 66  RING ){.      if
26d20 28 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70  ( pA->iColumn!=p
26d30 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74  B->iColumn ) ret
26d40 75 72 6e 20 32 3b 0a 20 20 20 20 20 20 69 66 28  urn 2;.      if(
26d50 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d   pA->iTable!=pB-
26d60 3e 69 54 61 62 6c 65 20 0a 20 20 20 20 20 20 20  >iTable .       
26d70 26 26 20 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d  && (pA->iTable!=
26d80 69 54 61 62 20 7c 7c 20 4e 45 56 45 52 28 70 42  iTab || NEVER(pB
26d90 2d 3e 69 54 61 62 6c 65 3e 3d 30 29 29 20 29 20  ->iTable>=0)) ) 
26da0 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a  return 2;.    }.
26db0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
26dc0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
26dd0 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62   two ExprList ob
26de0 6a 65 63 74 73 2e 20 20 52 65 74 75 72 6e 20 30  jects.  Return 0
26df0 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65   if they are ide
26e00 6e 74 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e  ntical and .** n
26e10 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 79 20  on-zero if they 
26e20 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61  differ in any wa
26e30 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  y..**.** If any 
26e40 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42  subelement of pB
26e50 20 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65   has Expr.iTable
26e60 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69  ==(-1) then it i
26e70 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
26e80 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f  compare equal to
26e90 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65   an equivalent e
26ea0 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74  lement in pA wit
26eb0 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69  h Expr.iTable==i
26ec0 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Tab..**.** This 
26ed0 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65  routine might re
26ee0 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f  turn non-zero fo
26ef0 72 20 65 71 75 69 76 61 6c 65 6e 74 20 45 78 70  r equivalent Exp
26f00 72 4c 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20  rLists.  The.** 
26f10 6f 6e 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63 65  only consequence
26f20 20 77 69 6c 6c 20 62 65 20 64 69 73 61 62 6c 65   will be disable
26f30 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e  d optimizations.
26f40 20 20 42 75 74 20 74 68 69 73 20 72 6f 75 74 69    But this routi
26f50 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72  ne.** must never
26f60 20 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   return 0 if the
26f70 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62   two ExprList ob
26f80 6a 65 63 74 73 20 61 72 65 20 64 69 66 66 65 72  jects are differ
26f90 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c  ent, or.** a mal
26fa0 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65  function will re
26fb0 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20  sult..**.** Two 
26fc0 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61 72  NULL pointers ar
26fd0 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  e considered to 
26fe0 62 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75  be the same.  Bu
26ff0 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  t a NULL pointer
27000 0a 2a 2a 20 61 6c 77 61 79 73 20 64 69 66 66 65  .** always diffe
27010 72 73 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55  rs from a non-NU
27020 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69  LL pointer..*/.i
27030 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  nt sqlite3ExprLi
27040 73 74 43 6f 6d 70 61 72 65 28 45 78 70 72 4c 69  stCompare(ExprLi
27050 73 74 20 2a 70 41 2c 20 45 78 70 72 4c 69 73 74  st *pA, ExprList
27060 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b   *pB, int iTab){
27070 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
27080 70 41 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20 29  pA==0 && pB==0 )
27090 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
270a0 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20   pA==0 || pB==0 
270b0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
270c0 28 20 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d  ( pA->nExpr!=pB-
270d0 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20  >nExpr ) return 
270e0 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  1;.  for(i=0; i<
270f0 70 41 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  pA->nExpr; i++){
27100 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
27110 41 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78  A = pA->a[i].pEx
27120 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  pr;.    Expr *pE
27130 78 70 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e  xprB = pB->a[i].
27140 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
27150 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  A->a[i].sortOrde
27160 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74  r!=pB->a[i].sort
27170 4f 72 64 65 72 20 29 20 72 65 74 75 72 6e 20 31  Order ) return 1
27180 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
27190 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78  3ExprCompare(pEx
271a0 70 72 41 2c 20 70 45 78 70 72 42 2c 20 69 54 61  prA, pExprB, iTa
271b0 62 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  b) ) return 1;. 
271c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
271d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
271e0 72 75 65 20 69 66 20 77 65 20 63 61 6e 20 70 72  rue if we can pr
271f0 6f 76 65 20 74 68 65 20 70 45 32 20 77 69 6c 6c  ove the pE2 will
27200 20 61 6c 77 61 79 73 20 62 65 20 74 72 75 65 20   always be true 
27210 69 66 20 70 45 31 20 69 73 0a 2a 2a 20 74 72 75  if pE1 is.** tru
27220 65 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65  e.  Return false
27230 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f   if we cannot co
27240 6d 70 6c 65 74 65 20 74 68 65 20 70 72 6f 6f 66  mplete the proof
27250 20 6f 72 20 69 66 20 70 45 32 20 6d 69 67 68 74   or if pE2 might
27260 0a 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 20 45  .** be false.  E
27270 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  xamples:.**.**  
27280 20 20 20 70 45 31 3a 20 78 3d 3d 35 20 20 20 20     pE1: x==5    
27290 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20     pE2: x==5    
272a0 20 20 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a           Result:
272b0 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31   true.**     pE1
272c0 3a 20 78 3e 30 20 20 20 20 20 20 20 20 70 45 32  : x>0        pE2
272d0 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20  : x==5          
272e0 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65     Result: false
272f0 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 32  .**     pE1: x=2
27300 31 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 32  1       pE2: x=2
27310 31 20 4f 52 20 79 3d 34 33 20 20 20 20 20 52 65  1 OR y=43     Re
27320 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20  sult: true.**   
27330 20 20 70 45 31 3a 20 78 21 3d 31 32 33 20 20 20    pE1: x!=123   
27340 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20    pE2: x IS NOT 
27350 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20  NULL    Result: 
27360 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  true.**     pE1:
27370 20 78 21 3d 3f 31 20 20 20 20 20 20 70 45 32 3a   x!=?1      pE2:
27380 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20   x IS NOT NULL  
27390 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a    Result: true.*
273a0 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49 53 20  *     pE1: x IS 
273b0 4e 55 4c 4c 20 20 70 45 32 3a 20 78 20 49 53 20  NULL  pE2: x IS 
273c0 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75  NOT NULL    Resu
273d0 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20  lt: false.**    
273e0 20 70 45 31 3a 20 78 20 49 53 20 3f 32 20 20 20   pE1: x IS ?2   
273f0 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e   pE2: x IS NOT N
27400 55 4c 4c 20 20 20 20 52 65 75 73 6c 74 3a 20 66  ULL    Reuslt: f
27410 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  alse.**.** When 
27420 63 6f 6d 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c  comparing TK_COL
27430 55 4d 4e 20 6e 6f 64 65 73 20 62 65 74 77 65 65  UMN nodes betwee
27440 6e 20 70 45 31 20 61 6e 64 20 70 45 32 2c 20 69  n pE1 and pE2, i
27450 66 20 70 45 32 20 68 61 73 0a 2a 2a 20 45 78 70  f pE2 has.** Exp
27460 72 2e 69 54 61 62 6c 65 3c 30 20 74 68 65 6e 20  r.iTable<0 then 
27470 61 73 73 75 6d 65 20 61 20 74 61 62 6c 65 20 6e  assume a table n
27480 75 6d 62 65 72 20 67 69 76 65 6e 20 62 79 20 69  umber given by i
27490 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  Tab..**.** When 
274a0 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e  in doubt, return
274b0 20 66 61 6c 73 65 2e 20 20 52 65 74 75 72 6e 69   false.  Returni
274c0 6e 67 20 74 72 75 65 20 6d 69 67 68 74 20 67 69  ng true might gi
274d0 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  ve a performance
274e0 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e  .** improvement.
274f0 20 20 52 65 74 75 72 6e 69 6e 67 20 66 61 6c 73    Returning fals
27500 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 61 20  e might cause a 
27510 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75  performance redu
27520 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69 74  ction, but.** it
27530 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 67 69 76   will always giv
27540 65 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e  e the correct an
27550 73 77 65 72 20 61 6e 64 20 69 73 20 68 65 6e 63  swer and is henc
27560 65 20 61 6c 77 61 79 73 20 73 61 66 65 2e 0a 2a  e always safe..*
27570 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
27580 72 49 6d 70 6c 69 65 73 45 78 70 72 28 45 78 70  rImpliesExpr(Exp
27590 72 20 2a 70 45 31 2c 20 45 78 70 72 20 2a 70 45  r *pE1, Expr *pE
275a0 32 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20  2, int iTab){.  
275b0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
275c0 6f 6d 70 61 72 65 28 70 45 31 2c 20 70 45 32 2c  ompare(pE1, pE2,
275d0 20 69 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20   iTab)==0 ){.   
275e0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
275f0 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b   if( pE2->op==TK
27600 5f 4f 52 0a 20 20 20 26 26 20 28 73 71 6c 69 74  _OR.   && (sqlit
27610 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70  e3ExprImpliesExp
27620 72 28 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66  r(pE1, pE2->pLef
27630 74 2c 20 69 54 61 62 29 0a 20 20 20 20 20 20 20  t, iTab).       
27640 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
27650 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
27660 70 45 31 2c 20 70 45 32 2d 3e 70 52 69 67 68 74  pE1, pE2->pRight
27670 2c 20 69 54 61 62 29 20 29 0a 20 20 29 7b 0a 20  , iTab) ).  ){. 
27680 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
27690 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d  .  if( pE2->op==
276a0 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26  TK_NOTNULL.   &&
276b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
276c0 61 72 65 28 70 45 31 2d 3e 70 4c 65 66 74 2c 20  are(pE1->pLeft, 
276d0 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  pE2->pLeft, iTab
276e0 29 3d 3d 30 0a 20 20 20 26 26 20 28 70 45 31 2d  )==0.   && (pE1-
276f0 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26  >op!=TK_ISNULL &
27700 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53  & pE1->op!=TK_IS
27710 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
27720 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
27730 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  n 0;.}../*.** An
27740 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
27750 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
27760 74 75 72 65 20 69 73 20 75 73 65 64 20 62 79 20  ture is used by 
27770 74 68 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a  the tree walker.
27780 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
27790 69 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  if an expression
277a0 20 63 61 6e 20 62 65 20 65 76 61 6c 75 61 74 65   can be evaluate
277b0 64 20 62 79 20 72 65 66 65 72 65 6e 63 65 20 74  d by reference t
277c0 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f  o the.** index o
277d0 6e 6c 79 2c 20 77 69 74 68 6f 75 74 20 68 61 76  nly, without hav
277e0 69 6e 67 20 74 6f 20 64 6f 20 61 20 73 65 61 72  ing to do a sear
277f0 63 68 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65  ch for the corre
27800 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 61 62 6c  sponding.** tabl
27810 65 20 65 6e 74 72 79 2e 20 20 54 68 65 20 49 64  e entry.  The Id
27820 78 43 6f 76 65 72 2e 70 49 64 78 20 66 69 65 6c  xCover.pIdx fiel
27830 64 20 69 73 20 74 68 65 20 69 6e 64 65 78 2e 20  d is the index. 
27840 20 49 64 78 43 6f 76 65 72 2e 69 43 75 72 0a 2a   IdxCover.iCur.*
27850 2a 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20  * is the cursor 
27860 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  for the table..*
27870 2f 0a 73 74 72 75 63 74 20 49 64 78 43 6f 76 65  /.struct IdxCove
27880 72 20 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  r {.  Index *pId
27890 78 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e  x;     /* The in
278a0 64 65 78 20 74 6f 20 62 65 20 74 65 73 74 65 64  dex to be tested
278b0 20 66 6f 72 20 63 6f 76 65 72 61 67 65 20 2a 2f   for coverage */
278c0 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20  .  int iCur;    
278d0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
278e0 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
278f0 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  le corresponding
27900 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   to the index */
27910 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  .};../*.** Check
27920 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
27930 20 61 72 65 20 72 65 66 65 72 65 6e 63 65 73 20   are references 
27940 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61  to columns in ta
27950 62 6c 65 20 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d  ble .** pWalker-
27960 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43  >u.pIdxCover->iC
27970 75 72 20 63 61 6e 20 62 65 20 73 61 74 69 73 66  ur can be satisf
27980 69 65 64 20 75 73 69 6e 67 20 74 68 65 20 69 6e  ied using the in
27990 64 65 78 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e  dex.** pWalker->
279a0 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 70 49 64  u.pIdxCover->pId
279b0 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  x..*/.static int
279c0 20 65 78 70 72 49 64 78 43 6f 76 65 72 28 57 61   exprIdxCover(Wa
279d0 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
279e0 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
279f0 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
27a00 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70 45  _COLUMN.   && pE
27a10 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61  xpr->iTable==pWa
27a20 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65  lker->u.pIdxCove
27a30 72 2d 3e 69 43 75 72 0a 20 20 20 26 26 20 73 71  r->iCur.   && sq
27a40 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64  lite3ColumnOfInd
27a50 65 78 28 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49  ex(pWalker->u.pI
27a60 64 78 43 6f 76 65 72 2d 3e 70 49 64 78 2c 20 70  dxCover->pIdx, p
27a70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3c 30  Expr->iColumn)<0
27a80 0a 20 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65  .  ){.    pWalke
27a90 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20  r->eCode = 1;.  
27aa0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
27ab0 72 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  rt;.  }.  return
27ac0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
27ad0 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
27ae0 65 20 69 66 20 61 6e 20 69 6e 64 65 78 20 70 49  e if an index pI
27af0 64 78 20 6f 6e 20 74 61 62 6c 65 20 77 69 74 68  dx on table with
27b00 20 63 75 72 73 6f 72 20 69 43 75 72 20 63 6f 6e   cursor iCur con
27b10 74 61 69 6e 73 20 77 69 6c 6c 0a 2a 2a 20 74 68  tains will.** th
27b20 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
27b30 70 72 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  pr.  Return true
27b40 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 64 6f   if the index do
27b50 65 73 20 63 6f 76 65 72 20 74 68 65 0a 2a 2a 20  es cover the.** 
27b60 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 66  expression and f
27b70 61 6c 73 65 20 69 66 20 74 68 65 20 70 45 78 70  alse if the pExp
27b80 72 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 66  r expression ref
27b90 65 72 65 6e 63 65 73 20 74 61 62 6c 65 20 63 6f  erences table co
27ba0 6c 75 6d 6e 73 0a 2a 2a 20 74 68 61 74 20 61 72  lumns.** that ar
27bb0 65 20 6e 6f 74 20 66 6f 75 6e 64 20 69 6e 20 74  e not found in t
27bc0 68 65 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  he index pIdx..*
27bd0 2a 0a 2a 2a 20 41 6e 20 69 6e 64 65 78 20 63 6f  *.** An index co
27be0 76 65 72 69 6e 67 20 61 6e 20 65 78 70 72 65 73  vering an expres
27bf0 73 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20  sion means that 
27c00 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63  the expression c
27c10 61 6e 20 62 65 0a 2a 2a 20 65 76 61 6c 75 61 74  an be.** evaluat
27c20 65 64 20 75 73 69 6e 67 20 6f 6e 6c 79 20 74 68  ed using only th
27c30 65 20 69 6e 64 65 78 20 61 6e 64 20 77 69 74 68  e index and with
27c40 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 6c 6f  out having to lo
27c50 6f 6b 75 70 20 74 68 65 0a 2a 2a 20 63 6f 72 72  okup the.** corr
27c60 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20  esponding table 
27c70 65 6e 74 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  entry..*/.int sq
27c80 6c 69 74 65 33 45 78 70 72 43 6f 76 65 72 65 64  lite3ExprCovered
27c90 42 79 49 6e 64 65 78 28 0a 20 20 45 78 70 72 20  ByIndex(.  Expr 
27ca0 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f  *pExpr,        /
27cb0 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62  * The index to b
27cc0 65 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e  e tested */.  in
27cd0 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
27ce0 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
27cf0 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 63  number for the c
27d00 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62  orresponding tab
27d10 6c 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  le */.  Index *p
27d20 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20 54  Idx         /* T
27d30 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 6d 69  he index that mi
27d40 67 68 74 20 62 65 20 75 73 65 64 20 66 6f 72 20  ght be used for 
27d50 63 6f 76 65 72 61 67 65 20 2a 2f 0a 29 7b 0a 20  coverage */.){. 
27d60 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72   Walker w;.  str
27d70 75 63 74 20 49 64 78 43 6f 76 65 72 20 78 63 6f  uct IdxCover xco
27d80 76 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  v;.  memset(&w, 
27d90 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
27da0 20 78 63 6f 76 2e 69 43 75 72 20 3d 20 69 43 75   xcov.iCur = iCu
27db0 72 3b 0a 20 20 78 63 6f 76 2e 70 49 64 78 20 3d  r;.  xcov.pIdx =
27dc0 20 70 49 64 78 3b 0a 20 20 77 2e 78 45 78 70 72   pIdx;.  w.xExpr
27dd0 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 49  Callback = exprI
27de0 64 78 43 6f 76 65 72 3b 0a 20 20 77 2e 75 2e 70  dxCover;.  w.u.p
27df0 49 64 78 43 6f 76 65 72 20 3d 20 26 78 63 6f 76  IdxCover = &xcov
27e00 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
27e10 78 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a  xpr(&w, pExpr);.
27e20 20 20 72 65 74 75 72 6e 20 21 77 2e 65 43 6f 64    return !w.eCod
27e30 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  e;.}.../*.** An 
27e40 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
27e50 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
27e60 75 72 65 20 69 73 20 75 73 65 64 20 62 79 20 74  ure is used by t
27e70 68 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a  he tree walker.*
27e80 2a 20 74 6f 20 63 6f 75 6e 74 20 72 65 66 65 72  * to count refer
27e90 65 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 20 63  ences to table c
27ea0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 61 72  olumns in the ar
27eb0 67 75 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a  guments of an .*
27ec0 2a 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  * aggregate func
27ed0 74 69 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74  tion, in order t
27ee0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a  o implement the.
27ef0 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69  ** sqlite3Functi
27f00 6f 6e 54 68 69 73 53 72 63 28 29 20 72 6f 75 74  onThisSrc() rout
27f10 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53  ine..*/.struct S
27f20 72 63 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c  rcCount {.  SrcL
27f30 69 73 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20  ist *pSrc;   /* 
27f40 4f 6e 65 20 70 61 72 74 69 63 75 6c 61 72 20 46  One particular F
27f50 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 61 20  ROM clause in a 
27f60 6e 65 73 74 65 64 20 71 75 65 72 79 20 2a 2f 0a  nested query */.
27f70 20 20 69 6e 74 20 6e 54 68 69 73 3b 20 20 20 20    int nThis;    
27f80 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
27f90 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f  references to co
27fa0 6c 75 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69 73  lumns in pSrcLis
27fb0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65  t */.  int nOthe
27fc0 72 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  r;      /* Numbe
27fd0 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
27fe0 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74  to columns in ot
27ff0 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 73  her FROM clauses
28000 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f   */.};../*.** Co
28010 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
28020 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
28030 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74  columns..*/.stat
28040 69 63 20 69 6e 74 20 65 78 70 72 53 72 63 43 6f  ic int exprSrcCo
28050 75 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  unt(Walker *pWal
28060 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
28070 29 7b 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56 45  ){.  /* The NEVE
28080 52 28 29 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e  R() on the secon
28090 64 20 74 65 72 6d 20 69 73 20 62 65 63 61 75 73  d term is becaus
280a0 65 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f  e sqlite3Functio
280b0 6e 55 73 65 73 54 68 69 73 53 72 63 28 29 0a 20  nUsesThisSrc(). 
280c0 20 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 63 61   ** is always ca
280d0 6c 6c 65 64 20 62 65 66 6f 72 65 20 73 71 6c 69  lled before sqli
280e0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
280f0 67 72 65 67 61 74 65 73 28 29 20 61 6e 64 20 73  gregates() and s
28100 6f 20 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f  o the.  ** TK_CO
28110 4c 55 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20 79  LUMNs have not y
28120 65 74 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65  et been converte
28130 64 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f  d into TK_AGG_CO
28140 4c 55 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73  LUMN.  If.  ** s
28150 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73  qlite3FunctionUs
28160 65 73 54 68 69 73 53 72 63 28 29 20 69 73 20 75  esThisSrc() is u
28170 73 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  sed differently 
28180 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74  in the future, t
28190 68 65 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29 20  he.  ** NEVER() 
281a0 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20  will need to be 
281b0 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66  removed. */.  if
281c0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
281d0 43 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28  COLUMN || NEVER(
281e0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
281f0 47 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20  G_COLUMN) ){.   
28200 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75   int i;.    stru
28210 63 74 20 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d  ct SrcCount *p =
28220 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63   pWalker->u.pSrc
28230 43 6f 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69  Count;.    SrcLi
28240 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53  st *pSrc = p->pS
28250 72 63 3b 0a 20 20 20 20 69 6e 74 20 6e 53 72 63  rc;.    int nSrc
28260 20 3d 20 70 53 72 63 20 3f 20 70 53 72 63 2d 3e   = pSrc ? pSrc->
28270 6e 53 72 63 20 3a 20 30 3b 0a 20 20 20 20 66 6f  nSrc : 0;.    fo
28280 72 28 69 3d 30 3b 20 69 3c 6e 53 72 63 3b 20 69  r(i=0; i<nSrc; i
28290 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
282a0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53  Expr->iTable==pS
282b0 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  rc->a[i].iCursor
282c0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
282d0 20 20 20 20 69 66 28 20 69 3c 6e 53 72 63 20 29      if( i<nSrc )
282e0 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 54 68 69 73  {.      p->nThis
282f0 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ++;.    }else{. 
28300 20 20 20 20 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b       p->nOther++
28310 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
28320 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
28330 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65  e;.}../*.** Dete
28340 72 6d 69 6e 65 20 69 66 20 61 6e 79 20 6f 66 20  rmine if any of 
28350 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  the arguments to
28360 20 74 68 65 20 70 45 78 70 72 20 46 75 6e 63 74   the pExpr Funct
28370 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a  ion reference.**
28380 20 70 53 72 63 4c 69 73 74 2e 20 20 52 65 74 75   pSrcList.  Retu
28390 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 79 20  rn true if they 
283a0 64 6f 2e 20 20 41 6c 73 6f 20 72 65 74 75 72 6e  do.  Also return
283b0 20 74 72 75 65 20 69 66 20 74 68 65 20 66 75 6e   true if the fun
283c0 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20  ction.** has no 
283d0 61 72 67 75 6d 65 6e 74 73 20 6f 72 20 68 61 73  arguments or has
283e0 20 6f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 61   only constant a
283f0 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72  rguments.  Retur
28400 6e 20 66 61 6c 73 65 20 69 66 20 70 45 78 70 72  n false if pExpr
28410 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 63  .** references c
28420 6f 6c 75 6d 6e 73 20 62 75 74 20 6e 6f 74 20 63  olumns but not c
28430 6f 6c 75 6d 6e 73 20 6f 66 20 74 61 62 6c 65 73  olumns of tables
28440 20 66 6f 75 6e 64 20 69 6e 20 70 53 72 63 4c 69   found in pSrcLi
28450 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  st..*/.int sqlit
28460 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68  e3FunctionUsesTh
28470 69 73 53 72 63 28 45 78 70 72 20 2a 70 45 78 70  isSrc(Expr *pExp
28480 72 2c 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  r, SrcList *pSrc
28490 4c 69 73 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20  List){.  Walker 
284a0 77 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 43  w;.  struct SrcC
284b0 6f 75 6e 74 20 63 6e 74 3b 0a 20 20 61 73 73 65  ount cnt;.  asse
284c0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
284d0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
284e0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30  ;.  memset(&w, 0
284f0 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
28500 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
28510 3d 20 65 78 70 72 53 72 63 43 6f 75 6e 74 3b 0a  = exprSrcCount;.
28520 20 20 77 2e 75 2e 70 53 72 63 43 6f 75 6e 74 20    w.u.pSrcCount 
28530 3d 20 26 63 6e 74 3b 0a 20 20 63 6e 74 2e 70 53  = &cnt;.  cnt.pS
28540 72 63 20 3d 20 70 53 72 63 4c 69 73 74 3b 0a 20  rc = pSrcList;. 
28550 20 63 6e 74 2e 6e 54 68 69 73 20 3d 20 30 3b 0a   cnt.nThis = 0;.
28560 20 20 63 6e 74 2e 6e 4f 74 68 65 72 20 3d 20 30    cnt.nOther = 0
28570 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
28580 78 70 72 4c 69 73 74 28 26 77 2c 20 70 45 78 70  xprList(&w, pExp
28590 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 72  r->x.pList);.  r
285a0 65 74 75 72 6e 20 63 6e 74 2e 6e 54 68 69 73 3e  eturn cnt.nThis>
285b0 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65 72 3d  0 || cnt.nOther=
285c0 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  =0;.}../*.** Add
285d0 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
285e0 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e  o the pAggInfo->
285f0 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52  aCol[] array.  R
28600 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
28610 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c  of.** the new el
28620 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61  ement.  Return a
28630 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
28640 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
28650 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
28660 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e  addAggInfoColumn
28670 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67  (sqlite3 *db, Ag
28680 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20  gInfo *pInfo){. 
28690 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d   int i;.  pInfo-
286a0 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41  >aCol = sqlite3A
286b0 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20  rrayAllocate(.  
286c0 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20       db,.       
286d0 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20  pInfo->aCol,.   
286e0 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f      sizeof(pInfo
286f0 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20  ->aCol[0]),.    
28700 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75     &pInfo->nColu
28710 6d 6e 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20  mn,.       &i.  
28720 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  );.  return i;.}
28730 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20      ../*.** Add 
28740 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
28750 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61   the pAggInfo->a
28760 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52  Func[] array.  R
28770 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
28780 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c  of.** the new el
28790 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61  ement.  Return a
287a0 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
287b0 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
287c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
287d0 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 73  addAggInfoFunc(s
287e0 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49  qlite3 *db, AggI
287f0 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69  nfo *pInfo){.  i
28800 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61  nt i;.  pInfo->a
28810 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41 72  Func = sqlite3Ar
28820 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20  rayAllocate(.   
28830 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20 20      db, .       
28840 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20  pInfo->aFunc,.  
28850 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66       sizeof(pInf
28860 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20  o->aFunc[0]),.  
28870 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75       &pInfo->nFu
28880 6e 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20  nc,.       &i.  
28890 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  );.  return i;.}
288a0 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73      ../*.** This
288b0 20 69 73 20 74 68 65 20 78 45 78 70 72 43 61 6c   is the xExprCal
288c0 6c 62 61 63 6b 20 66 6f 72 20 61 20 74 72 65 65  lback for a tree
288d0 20 77 61 6c 6b 65 72 2e 20 20 49 74 20 69 73 20   walker.  It is 
288e0 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65  used to.** imple
288f0 6d 65 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  ment sqlite3Expr
28900 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
28910 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65  s().  See sqlite
28920 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
28930 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64  egates.** for ad
28940 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
28950 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
28960 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  int analyzeAggre
28970 67 61 74 65 28 57 61 6c 6b 65 72 20 2a 70 57 61  gate(Walker *pWa
28980 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
28990 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e  r){.  int i;.  N
289a0 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20  ameContext *pNC 
289b0 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43  = pWalker->u.pNC
289c0 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
289d0 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
289e0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
289f0 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63  List = pNC->pSrc
28a00 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20  List;.  AggInfo 
28a10 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d  *pAggInfo = pNC-
28a20 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 73 77  >pAggInfo;..  sw
28a30 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
28a40 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
28a50 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63  GG_COLUMN:.    c
28a60 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
28a70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
28a80 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
28a90 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  GG_COLUMN );.   
28aa0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
28ab0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
28ac0 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68  N );.      /* Ch
28ad0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
28ae0 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f  e column is in o
28af0 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73  ne of the tables
28b00 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20   in the FROM.   
28b10 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20     ** clause of 
28b20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75  the aggregate qu
28b30 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ery */.      if(
28b40 20 41 4c 57 41 59 53 28 70 53 72 63 4c 69 73 74   ALWAYS(pSrcList
28b50 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
28b60 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
28b70 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72  tem *pItem = pSr
28b80 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  cList->a;.      
28b90 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
28ba0 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  cList->nSrc; i++
28bb0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
28bc0 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
28bd0 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a  Info_col *pCol;.
28be0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
28bf0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
28c00 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b  ty(pExpr, EP_Tok
28c10 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
28c20 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  d) );.          
28c30 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  if( pExpr->iTabl
28c40 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e==pItem->iCurso
28c50 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r ){.           
28c60 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
28c70 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d  this point, it m
28c80 65 61 6e 73 20 74 68 61 74 20 70 45 78 70 72 20  eans that pExpr 
28c90 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
28ca0 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
28cb0 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20   that is in the 
28cc0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
28cd0 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65  he aggregate que
28ce0 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20  ry.  .          
28cf0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20    **.           
28d00 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72   ** Make an entr
28d10 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  y for the column
28d20 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   in pAggInfo->aC
28d30 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20  ol[] if there.  
28d40 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20            ** is 
28d50 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65  not an entry the
28d60 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  re already..    
28d70 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
28d80 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20         int k;.  
28d90 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d            pCol =
28da0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b   pAggInfo->aCol;
28db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
28dc0 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f  (k=0; k<pAggInfo
28dd0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20  ->nColumn; k++, 
28de0 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  pCol++){.       
28df0 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
28e00 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e  >iTable==pExpr->
28e10 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20  iTable &&.      
28e20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
28e30 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72  ->iColumn==pExpr
28e40 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
28e50 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
28e60 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
28e70 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
28e80 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
28e90 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  ( (k>=pAggInfo->
28ea0 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20  nColumn).       
28eb0 20 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64        && (k = ad
28ec0 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70  dAggInfoColumn(p
28ed0 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49  Parse->db, pAggI
28ee0 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20  nfo))>=0 .      
28ef0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
28f00 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70         pCol = &p
28f10 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d  AggInfo->aCol[k]
28f20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
28f30 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78  pCol->pTab = pEx
28f40 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  pr->pTab;.      
28f50 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54          pCol->iT
28f60 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54  able = pExpr->iT
28f70 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20  able;.          
28f80 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d      pCol->iColum
28f90 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
28fa0 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  mn;.            
28fb0 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b    pCol->iMem = +
28fc0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
28fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
28fe0 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
28ff0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
29000 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72       pCol->pExpr
29010 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
29020 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67 67          if( pAgg
29030 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29  Info->pGroupBy )
29040 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
29050 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20    int j, n;.    
29060 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
29070 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67  List *pGB = pAgg
29080 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a  Info->pGroupBy;.
29090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290a0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
290b0 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47  item *pTerm = pG
290c0 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20  B->a;.          
290d0 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e        n = pGB->n
290e0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
290f0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
29100 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b  <n; j++, pTerm++
29110 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
29120 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
29130 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
29140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29150 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43  if( pE->op==TK_C
29160 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61  OLUMN && pE->iTa
29170 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  ble==pExpr->iTab
29180 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  le &&.          
29190 20 20 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e              pE->
291a0 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e  iColumn==pExpr->
291b0 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
291c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
291d0 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
291e0 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  mn = j;.        
291f0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
29200 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
29210 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
29220 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29230 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29240 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
29250 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30  >iSorterColumn<0
29260 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
29270 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
29280 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e  rColumn = pAggIn
29290 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  fo->nSortingColu
292a0 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  mn++;.          
292b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
292c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
292d0 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20  /* There is now 
292e0 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78  an entry for pEx
292f0 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e  pr in pAggInfo->
29300 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20  aCol[] (either. 
29310 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65             ** be
29320 63 61 75 73 65 20 69 74 20 77 61 73 20 74 68 65  cause it was the
29330 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63  re before or bec
29340 61 75 73 65 20 77 65 20 6a 75 73 74 20 63 72 65  ause we just cre
29350 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20  ated it)..      
29360 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74        ** Convert
29370 20 74 68 65 20 70 45 78 70 72 20 74 6f 20 62 65   the pExpr to be
29380 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e   a TK_AGG_COLUMN
29390 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68   referring to th
293a0 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  at.            *
293b0 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  * pAggInfo->aCol
293c0 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20  [] entry..      
293d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
293e0 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50       ExprSetVVAP
293f0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
29400 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20  P_NoReduce);.   
29410 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
29420 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49  pAggInfo = pAggI
29430 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nfo;.           
29440 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
29450 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20  AGG_COLUMN;.    
29460 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
29470 41 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20  Agg = (i16)k;.  
29480 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
29490 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20  .          } /* 
294a0 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54 61  endif pExpr->iTa
294b0 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72  ble==pItem->iCur
294c0 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  sor */.        }
294d0 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65   /* end loop ove
294e0 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  r pSrcList */.  
294f0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
29500 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
29510 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
29520 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a  AGG_FUNCTION: {.
29530 20 20 20 20 20 20 69 66 28 20 28 70 4e 43 2d 3e        if( (pNC->
29540 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e 41  ncFlags & NC_InA
29550 67 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20 20  ggFunc)==0.     
29560 20 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77 61    && pWalker->wa
29570 6c 6b 65 72 44 65 70 74 68 3d 3d 70 45 78 70 72  lkerDepth==pExpr
29580 2d 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a 20  ->op2.      ){. 
29590 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
295a0 74 6f 20 73 65 65 20 69 66 20 70 45 78 70 72 20  to see if pExpr 
295b0 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f  is a duplicate o
295c0 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67  f another aggreg
295d0 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ate .        ** 
295e0 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
295f0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
29600 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75  pAggInfo structu
29610 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  re.        */.  
29620 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
29630 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d  Info_func *pItem
29640 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75   = pAggInfo->aFu
29650 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  nc;.        for(
29660 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
29670 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74  >nFunc; i++, pIt
29680 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  em++){.         
29690 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
296a0 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70  Compare(pItem->p
296b0 45 78 70 72 2c 20 70 45 78 70 72 2c 20 2d 31 29  Expr, pExpr, -1)
296c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
296d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
296e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
296f0 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70          if( i>=p
29700 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29  AggInfo->nFunc )
29710 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70  {.          /* p
29720 45 78 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c  Expr is original
29730 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e  .  Make a new en
29740 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  try in pAggInfo-
29750 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20  >aFunc[].       
29760 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
29770 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61  u8 enc = ENC(pPa
29780 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20  rse->db);.      
29790 20 20 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e      i = addAggIn
297a0 66 6f 46 75 6e 63 28 70 50 61 72 73 65 2d 3e 64  foFunc(pParse->d
297b0 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20  b, pAggInfo);.  
297c0 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30          if( i>=0
297d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
297e0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
297f0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
29800 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
29810 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
29820 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  em = &pAggInfo->
29830 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20  aFunc[i];.      
29840 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78        pItem->pEx
29850 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
29860 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
29870 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
29880 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  nMem;.          
29890 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
298a0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
298b0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
298c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
298d0 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c  tem->pFunc = sql
298e0 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
298f0 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20  (pParse->db,.   
29900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29910 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
29920 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
29930 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c       pExpr->x.pL
29940 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70  ist ? pExpr->x.p
29950 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c  List->nExpr : 0,
29960 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
29970 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
29980 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
29990 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  inct ){.        
299a0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69        pItem->iDi
299b0 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  stinct = pParse-
299c0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
299d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
299e0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
299f0 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b  >iDistinct = -1;
29a00 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
29a10 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
29a20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
29a30 4d 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74  Make pExpr point
29a40 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69   to the appropri
29a50 61 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  ate pAggInfo->aF
29a60 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20  unc[] entry.    
29a70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
29a80 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
29a90 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
29aa0 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
29ab0 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20  educed) );.     
29ac0 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f     ExprSetVVAPro
29ad0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
29ae0 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20  NoReduce);.     
29af0 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
29b00 20 28 69 31 36 29 69 3b 0a 20 20 20 20 20 20 20   (i16)i;.       
29b10 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
29b20 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20   = pAggInfo;.   
29b30 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
29b40 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 65 6c  Prune;.      }el
29b50 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  se{.        retu
29b60 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
29b70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
29b80 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
29b90 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74  Continue;.}.stat
29ba0 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67  ic int analyzeAg
29bb0 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74  gregatesInSelect
29bc0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
29bd0 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
29be0 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
29bf0 41 4d 45 54 45 52 28 70 57 61 6c 6b 65 72 29 3b  AMETER(pWalker);
29c00 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
29c10 54 45 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  TER(pSelect);.  
29c20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
29c30 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  nue;.}../*.** An
29c40 61 6c 79 7a 65 20 74 68 65 20 70 45 78 70 72 20  alyze the pExpr 
29c50 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69  expression looki
29c60 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  ng for aggregate
29c70 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a   functions and.*
29c80 2a 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20  * for variables 
29c90 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
29ca0 61 64 64 65 64 20 74 6f 20 41 67 67 49 6e 66 6f  added to AggInfo
29cb0 20 6f 62 6a 65 63 74 20 74 68 61 74 20 70 4e 43   object that pNC
29cc0 2d 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f  ->pAggInfo.** po
29cd0 69 6e 74 73 20 74 6f 2e 20 20 41 64 64 69 74 69  ints to.  Additi
29ce0 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 61 72 65  onal entries are
29cf0 20 6d 61 64 65 20 6f 6e 20 74 68 65 20 41 67 67   made on the Agg
29d00 49 6e 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a 2a  Info object as.*
29d10 2a 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a  * necessary..**.
29d20 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
29d30 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
29d40 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20  alled after the 
29d50 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62  expression has b
29d60 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20  een.** analyzed 
29d70 62 79 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  by sqlite3Resolv
29d80 65 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f  eExprNames()..*/
29d90 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
29da0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
29db0 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  es(NameContext *
29dc0 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72  pNC, Expr *pExpr
29dd0 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
29de0 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
29df0 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78  izeof(w));.  w.x
29e00 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61  ExprCallback = a
29e10 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 3b  nalyzeAggregate;
29e20 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
29e30 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67  back = analyzeAg
29e40 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74  gregatesInSelect
29e50 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e  ;.  w.u.pNC = pN
29e60 43 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43  C;.  assert( pNC
29e70 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b  ->pSrcList!=0 );
29e80 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
29e90 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d  pr(&w, pExpr);.}
29ea0 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c  ../*.** Call sql
29eb0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
29ec0 67 67 72 65 67 61 74 65 73 28 29 20 66 6f 72 20  ggregates() for 
29ed0 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  every expression
29ee0 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73   in an.** expres
29ef0 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75  sion list.  Retu
29f00 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
29f10 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49   errors..**.** I
29f20 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f  f an error is fo
29f30 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69  und, the analysi
29f40 73 20 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a  s is cut short..
29f50 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
29f60 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
29f70 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70  t(NameContext *p
29f80 4e 43 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  NC, ExprList *pL
29f90 69 73 74 29 7b 0a 20 20 73 74 72 75 63 74 20 45  ist){.  struct E
29fa0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
29fb0 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tem;.  int i;.  
29fc0 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
29fd0 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
29fe0 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
29ff0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  t->nExpr; i++, p
2a000 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73  Item++){.      s
2a010 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
2a020 65 41 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c  eAggregates(pNC,
2a030 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
2a040 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
2a050 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 73 69  ** Allocate a si
2a060 6e 67 6c 65 20 6e 65 77 20 72 65 67 69 73 74 65  ngle new registe
2a070 72 20 66 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c  r for use to hol
2a080 64 20 73 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69  d some intermedi
2a090 61 74 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69  ate result..*/.i
2a0a0 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d  nt sqlite3GetTem
2a0b0 70 52 65 67 28 50 61 72 73 65 20 2a 70 50 61 72  pReg(Parse *pPar
2a0c0 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  se){.  if( pPars
2a0d0 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29  e->nTempReg==0 )
2a0e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 2b 70  {.    return ++p
2a0f0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d  Parse->nMem;.  }
2a100 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65  .  return pParse
2a110 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61  ->aTempReg[--pPa
2a120 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a  rse->nTempReg];.
2a130 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
2a140 61 74 65 20 61 20 72 65 67 69 73 74 65 72 2c 20  ate a register, 
2a150 6d 61 6b 69 6e 67 20 61 76 61 69 6c 61 62 6c 65  making available
2a160 20 66 6f 72 20 72 65 75 73 65 20 66 6f 72 20 73   for reuse for s
2a170 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72  ome other.** pur
2a180 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  pose..**.** If a
2a190 20 72 65 67 69 73 74 65 72 20 69 73 20 63 75 72   register is cur
2a1a0 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 75 73 65  rently being use
2a1b0 64 20 62 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d by the column 
2a1c0 63 61 63 68 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  cache, then.** t
2a1d0 68 65 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20  he deallocation 
2a1e0 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
2a1f0 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  l the column cac
2a200 68 65 20 6c 69 6e 65 20 74 68 61 74 20 75 73 65  he line that use
2a210 73 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65  s.** the registe
2a220 72 20 62 65 63 6f 6d 65 73 20 73 74 61 6c 65 2e  r becomes stale.
2a230 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2a240 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 50  ReleaseTempReg(P
2a250 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
2a260 74 20 69 52 65 67 29 7b 0a 20 20 69 66 28 20 69  t iReg){.  if( i
2a270 52 65 67 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  Reg && pParse->n
2a280 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a  TempReg<ArraySiz
2a290 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  e(pParse->aTempR
2a2a0 65 67 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  eg) ){.    int i
2a2b0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 79 43 6f  ;.    struct yCo
2a2c0 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 20 20 66  lCache *p;.    f
2a2d0 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
2a2e0 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
2a2f0 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
2a300 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
2a310 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d     if( p->iReg==
2a320 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20  iReg ){.        
2a330 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 31 3b 0a  p->tempReg = 1;.
2a340 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
2a350 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2a360 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52    pParse->aTempR
2a370 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  eg[pParse->nTemp
2a380 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20  Reg++] = iReg;. 
2a390 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
2a3a0 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61  cate or dealloca
2a3b0 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52  te a block of nR
2a3c0 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72  eg consecutive r
2a3d0 65 67 69 73 74 65 72 73 0a 2a 2f 0a 69 6e 74 20  egisters.*/.int 
2a3e0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
2a3f0 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
2a400 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  e, int nReg){.  
2a410 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 20 3d 20  int i, n;.  i = 
2a420 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
2a430 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d  g;.  n = pParse-
2a440 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20 69 66  >nRangeReg;.  if
2a450 28 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20  ( nReg<=n ){.   
2a460 20 61 73 73 65 72 74 28 20 21 75 73 65 64 41 73   assert( !usedAs
2a470 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72  ColumnCache(pPar
2a480 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29 3b  se, i, i+n-1) );
2a490 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61  .    pParse->iRa
2a4a0 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a  ngeReg += nReg;.
2a4b0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e      pParse->nRan
2a4c0 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20  geReg -= nReg;. 
2a4d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20   }else{.    i = 
2a4e0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
2a4f0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
2a500 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20   += nReg;.  }.  
2a510 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64  return i;.}.void
2a520 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
2a530 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a  empRange(Parse *
2a540 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
2a550 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 73  , int nReg){.  s
2a560 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52  qlite3ExprCacheR
2a570 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 52  emove(pParse, iR
2a580 65 67 2c 20 6e 52 65 67 29 3b 0a 20 20 69 66 28  eg, nReg);.  if(
2a590 20 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52   nReg>pParse->nR
2a5a0 61 6e 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70  angeReg ){.    p
2a5b0 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
2a5c0 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61   = nReg;.    pPa
2a5d0 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d  rse->iRangeReg =
2a5e0 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   iReg;.  }.}../*
2a5f0 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d  .** Mark all tem
2a600 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73  porary registers
2a610 20 61 73 20 62 65 69 6e 67 20 75 6e 61 76 61 69   as being unavai
2a620 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 2e  lable for reuse.
2a630 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2a640 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68  ClearTempRegCach
2a650 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
2a660 7b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d  {.  pParse->nTem
2a670 70 52 65 67 20 3d 20 30 3b 0a 20 20 70 50 61 72  pReg = 0;.  pPar
2a680 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20  se->nRangeReg = 
2a690 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69  0;.}../*.** Vali
2a6a0 64 61 74 65 20 74 68 61 74 20 6e 6f 20 74 65 6d  date that no tem
2a6b0 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
2a6c0 66 61 6c 6c 73 20 77 69 74 68 69 6e 20 74 68 65  falls within the
2a6d0 20 72 61 6e 67 65 20 6f 66 0a 2a 2a 20 69 46 69   range of.** iFi
2a6e0 72 73 74 2e 2e 69 4c 61 73 74 2c 20 69 6e 63 6c  rst..iLast, incl
2a6f0 75 73 69 76 65 2e 20 20 54 68 69 73 20 72 6f 75  usive.  This rou
2a700 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tine is only cal
2a710 6c 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 73  l from within as
2a720 73 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d  sert().** statem
2a730 65 6e 74 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ents..*/.#ifdef 
2a740 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74  SQLITE_DEBUG.int
2a750 20 73 71 6c 69 74 65 33 4e 6f 54 65 6d 70 73 49   sqlite3NoTempsI
2a760 6e 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  nRange(Parse *pP
2a770 61 72 73 65 2c 20 69 6e 74 20 69 46 69 72 73 74  arse, int iFirst
2a780 2c 20 69 6e 74 20 69 4c 61 73 74 29 7b 0a 20 20  , int iLast){.  
2a790 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 50 61  int i;.  if( pPa
2a7a0 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3e 30  rse->nRangeReg>0
2a7b0 0a 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69  .   && pParse->i
2a7c0 52 61 6e 67 65 52 65 67 2b 70 50 61 72 73 65 2d  RangeReg+pParse-
2a7d0 3e 6e 52 61 6e 67 65 52 65 67 3c 69 4c 61 73 74  >nRangeReg<iLast
2a7e0 0a 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69  .   && pParse->i
2a7f0 52 61 6e 67 65 52 65 67 3e 3d 69 46 69 72 73 74  RangeReg>=iFirst
2a800 0a 20 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  .  ){.     retur
2a810 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  n 0;.  }.  for(i
2a820 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54  =0; i<pParse->nT
2a830 65 6d 70 52 65 67 3b 20 69 2b 2b 29 7b 0a 20 20  empReg; i++){.  
2a840 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 54    if( pParse->aT
2a850 65 6d 70 52 65 67 5b 69 5d 3e 3d 69 46 69 72 73  empReg[i]>=iFirs
2a860 74 20 26 26 20 70 50 61 72 73 65 2d 3e 61 54 65  t && pParse->aTe
2a870 6d 70 52 65 67 5b 69 5d 3c 3d 69 4c 61 73 74 20  mpReg[i]<=iLast 
2a880 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2a890 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
2a8a0 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
2a8b0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
2a8c0 47 20 2a 2f 0a                                   G */.