/ Hex Artifact Content
Login

Artifact be8772ac5019400096eea179c1bfd5acc420bde9:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  t.h"../* Forward
0220: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   declarations */
0230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
0240: 72 43 6f 64 65 42 65 74 77 65 65 6e 28 50 61 72  rCodeBetween(Par
0250: 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 76 6f  se*,Expr*,int,vo
0260: 69 64 28 2a 29 28 50 61 72 73 65 2a 2c 45 78 70  id(*)(Parse*,Exp
0270: 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69 6e 74 29  r*,int,int),int)
0280: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  ;.static int exp
0290: 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
02a0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
02b0: 2a 70 2c 20 69 6e 74 20 2a 70 69 54 6f 46 72 65  *p, int *piToFre
02c0: 65 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e);.../*.** Retu
02d0: 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74 79  rn the 'affinity
02e0: 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  ' of the express
02f0: 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e 79  ion pExpr if any
0300: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
0310: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61 20   is a column, a 
0320: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 63  reference to a c
0330: 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41 53  olumn via an 'AS
0340: 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20 61  ' alias,.** or a
0350: 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74 68   sub-select with
0360: 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65   a column as the
0370: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 74   return value, t
0380: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66 69  hen the .** affi
0390: 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f 6c  nity of that col
03a0: 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  umn is returned.
03b0: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30 30   Otherwise, 0x00
03c0: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
03d0: 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 61   indicating no a
03e0: 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65 20  ffinity for the 
03f0: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
0400: 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52 45  * i.e. the WHERE
0410: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69   clause expressi
0420: 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ons in the follo
0430: 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
0440: 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20 61  all.** have an a
0450: 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20 43  ffinity:.**.** C
0460: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
0470: 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  );.** SELECT * F
0480: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b 0a  ROM t1 WHERE a;.
0490: 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20 62  ** SELECT a AS b
04a0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62   FROM t1 WHERE b
04b0: 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46 52  ;.** SELECT * FR
04c0: 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65 6c  OM t1 WHERE (sel
04d0: 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b 0a  ect a from t1);.
04e0: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 45  */.char sqlite3E
04f0: 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70 72  xprAffinity(Expr
0500: 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
0510: 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71  op;.  pExpr = sq
0520: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
0530: 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20 69  late(pExpr);.  i
0540: 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
0550: 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20 72  & EP_Generic ) r
0560: 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d 20  eturn 0;.  op = 
0570: 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28  pExpr->op;.  if(
0580: 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29   op==TK_SELECT )
0590: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
05a0: 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78 49  xpr->flags&EP_xI
05b0: 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20 72  sSelect );.    r
05c0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
05d0: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  rAffinity(pExpr-
05e0: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
05f0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
0600: 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54  .  }.  if( op==T
0610: 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20  K_REGISTER ) op 
0620: 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 23 69  = pExpr->op2;.#i
0630: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
0640: 54 5f 43 41 53 54 0a 20 20 69 66 28 20 6f 70 3d  T_CAST.  if( op=
0650: 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20 20 20  =TK_CAST ){.    
0660: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
0670: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
0680: 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
0690: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
06a0: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70  e3AffinityType(p
06b0: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
06c0: 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  0);.  }.#endif. 
06d0: 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47 47   if( (op==TK_AGG
06e0: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54  _COLUMN || op==T
06f0: 4b 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 45 78  K_COLUMN) && pEx
0700: 70 72 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20  pr->pTab!=0 ){. 
0710: 20 20 20 69 6e 74 20 6a 20 3d 20 70 45 78 70 72     int j = pExpr
0720: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69  ->iColumn;.    i
0730: 66 28 20 6a 3c 30 20 29 20 72 65 74 75 72 6e 20  f( j<0 ) return 
0740: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
0750: 45 52 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ER;.    assert( 
0760: 70 45 78 70 72 2d 3e 70 54 61 62 20 26 26 20 6a  pExpr->pTab && j
0770: 3c 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e 6e 43  <pExpr->pTab->nC
0780: 6f 6c 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ol );.    return
0790: 20 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43   pExpr->pTab->aC
07a0: 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  ol[j].affinity;.
07b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78    }.  return pEx
07c0: 70 72 2d 3e 61 66 66 69 6e 69 74 79 3b 0a 7d 0a  pr->affinity;.}.
07d0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63  ./*.** Set the c
07e0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
07f0: 65 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  e for expression
0800: 20 70 45 78 70 72 20 74 6f 20 62 65 20 74 68 65   pExpr to be the
0810: 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65   collating.** se
0820: 71 75 65 6e 63 65 20 6e 61 6d 65 64 20 62 79 20  quence named by 
0830: 70 54 6f 6b 65 6e 2e 20 20 20 52 65 74 75 72 6e  pToken.   Return
0840: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
0850: 6e 65 77 20 45 78 70 72 20 6e 6f 64 65 20 74 68  new Expr node th
0860: 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73  at.** implements
0870: 20 74 68 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65   the COLLATE ope
0880: 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rator..**.** If 
0890: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
08a0: 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ion error occurs
08b0: 2c 20 74 68 61 74 20 66 61 63 74 20 69 73 20 72  , that fact is r
08c0: 65 63 6f 72 64 65 64 20 69 6e 20 70 50 61 72 73  ecorded in pPars
08d0: 65 2d 3e 64 62 0a 2a 2a 20 61 6e 64 20 74 68 65  e->db.** and the
08e0: 20 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72   pExpr parameter
08f0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 75 6e 63   is returned unc
0900: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 45 78 70 72 20  hanged..*/.Expr 
0910: 2a 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43  *sqlite3ExprAddC
0920: 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 0a 20 20 50  ollateToken(.  P
0930: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
0940: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
0950: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
0960: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
0970: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
0980: 74 68 65 20 22 43 4f 4c 4c 41 54 45 22 20 63 6c  the "COLLATE" cl
0990: 61 75 73 65 20 74 6f 20 74 68 69 73 20 65 78 70  ause to this exp
09a0: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  ression */.  con
09b0: 73 74 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c 4e  st Token *pCollN
09c0: 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame,  /* Name of
09d0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
09e0: 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71  nce */.  int deq
09f0: 75 6f 74 65 20 20 20 20 20 20 20 20 20 20 20 20  uote            
0a00: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 71    /* True to deq
0a10: 75 6f 74 65 20 70 43 6f 6c 6c 4e 61 6d 65 20 2a  uote pCollName *
0a20: 2f 0a 29 7b 0a 20 20 69 66 28 20 70 43 6f 6c 6c  /.){.  if( pColl
0a30: 4e 61 6d 65 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20  Name->n>0 ){.   
0a40: 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71   Expr *pNew = sq
0a50: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70  lite3ExprAlloc(p
0a60: 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 43 4f  Parse->db, TK_CO
0a70: 4c 4c 41 54 45 2c 20 70 43 6f 6c 6c 4e 61 6d 65  LLATE, pCollName
0a80: 2c 20 64 65 71 75 6f 74 65 29 3b 0a 20 20 20 20  , dequote);.    
0a90: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
0aa0: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
0ab0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65  pExpr;.      pNe
0ac0: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43  w->flags |= EP_C
0ad0: 6f 6c 6c 61 74 65 7c 45 50 5f 53 6b 69 70 3b 0a  ollate|EP_Skip;.
0ae0: 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e        pExpr = pN
0af0: 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ew;.    }.  }.  
0b00: 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
0b10: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
0b20: 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e  rAddCollateStrin
0b30: 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  g(Parse *pParse,
0b40: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 6f   Expr *pExpr, co
0b50: 6e 73 74 20 63 68 61 72 20 2a 7a 43 29 7b 0a 20  nst char *zC){. 
0b60: 20 54 6f 6b 65 6e 20 73 3b 0a 20 20 61 73 73 65   Token s;.  asse
0b70: 72 74 28 20 7a 43 21 3d 30 20 29 3b 0a 20 20 73  rt( zC!=0 );.  s
0b80: 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28  qlite3TokenInit(
0b90: 26 73 2c 20 28 63 68 61 72 2a 29 7a 43 29 3b 0a  &s, (char*)zC);.
0ba0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
0bb0: 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f  ExprAddCollateTo
0bc0: 6b 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70  ken(pParse, pExp
0bd0: 72 2c 20 26 73 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  r, &s, 0);.}../*
0be0: 0a 2a 2a 20 53 6b 69 70 20 6f 76 65 72 20 61 6e  .** Skip over an
0bf0: 79 20 54 4b 5f 43 4f 4c 4c 41 54 45 20 6f 70 65  y TK_COLLATE ope
0c00: 72 61 74 6f 72 73 20 61 6e 64 20 61 6e 79 20 75  rators and any u
0c10: 6e 6c 69 6b 65 6c 79 28 29 0a 2a 2a 20 6f 72 20  nlikely().** or 
0c20: 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 66 75 6e  likelihood() fun
0c30: 63 74 69 6f 6e 20 61 74 20 74 68 65 20 72 6f 6f  ction at the roo
0c40: 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
0c50: 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  on..*/.Expr *sql
0c60: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
0c70: 61 74 65 28 45 78 70 72 20 2a 70 45 78 70 72 29  ate(Expr *pExpr)
0c80: 7b 0a 20 20 77 68 69 6c 65 28 20 70 45 78 70 72  {.  while( pExpr
0c90: 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65   && ExprHasPrope
0ca0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 6b  rty(pExpr, EP_Sk
0cb0: 69 70 29 20 29 7b 0a 20 20 20 20 69 66 28 20 45  ip) ){.    if( E
0cc0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
0cd0: 45 78 70 72 2c 20 45 50 5f 55 6e 6c 69 6b 65 6c  Expr, EP_Unlikel
0ce0: 79 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  y) ){.      asse
0cf0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
0d00: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
0d10: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
0d20: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
0d30: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
0d40: 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >0 );.      asse
0d50: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
0d60: 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  K_FUNCTION );.  
0d70: 20 20 20 20 70 45 78 70 72 20 3d 20 70 45 78 70      pExpr = pExp
0d80: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d  r->x.pList->a[0]
0d90: 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73  .pExpr;.    }els
0da0: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
0db0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
0dc0: 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20 20 20  OLLATE );.      
0dd0: 70 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 70  pExpr = pExpr->p
0de0: 4c 65 66 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  Left;.    }.  } 
0df0: 20 20 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70    .  return pExp
0e00: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  r;.}../*.** Retu
0e10: 72 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  rn the collation
0e20: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
0e30: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
0e40: 70 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20  pr. If.** there 
0e50: 69 73 20 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f  is no defined co
0e60: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
0e70: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  , return NULL..*
0e80: 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69  *.** The collati
0e90: 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 69 67 68  ng sequence migh
0ea0: 74 20 62 65 20 64 65 74 65 72 6d 69 6e 65 64 20  t be determined 
0eb0: 62 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65  by a COLLATE ope
0ec0: 72 61 74 6f 72 0a 2a 2a 20 6f 72 20 62 79 20 74  rator.** or by t
0ed0: 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 61  he presence of a
0ee0: 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 61 20 64   column with a d
0ef0: 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67  efined collating
0f00: 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 20 43 4f   sequence..** CO
0f10: 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73 20  LLATE operators 
0f20: 74 61 6b 65 20 66 69 72 73 74 20 70 72 65 63 65  take first prece
0f30: 64 65 6e 63 65 2e 20 20 4c 65 66 74 20 6f 70 65  dence.  Left ope
0f40: 72 61 6e 64 73 20 74 61 6b 65 0a 2a 2a 20 70 72  rands take.** pr
0f50: 65 63 65 64 65 6e 63 65 20 6f 76 65 72 20 72 69  ecedence over ri
0f60: 67 68 74 20 6f 70 65 72 61 6e 64 73 2e 0a 2a 2f  ght operands..*/
0f70: 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65  .CollSeq *sqlite
0f80: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 50 61 72  3ExprCollSeq(Par
0f90: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
0fa0: 20 2a 70 45 78 70 72 29 7b 0a 20 20 73 71 6c 69   *pExpr){.  sqli
0fb0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
0fc0: 2d 3e 64 62 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  ->db;.  CollSeq 
0fd0: 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 45 78  *pColl = 0;.  Ex
0fe0: 70 72 20 2a 70 20 3d 20 70 45 78 70 72 3b 0a 20  pr *p = pExpr;. 
0ff0: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
1000: 20 69 6e 74 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b   int op = p->op;
1010: 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  .    if( p->flag
1020: 73 20 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29  s & EP_Generic )
1030: 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
1040: 6f 70 3d 3d 54 4b 5f 43 41 53 54 20 7c 7c 20 6f  op==TK_CAST || o
1050: 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 7b 0a 20  p==TK_UPLUS ){. 
1060: 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66       p = p->pLef
1070: 74 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  t;.      continu
1080: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
1090: 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20   op==TK_COLLATE 
10a0: 7c 7c 20 28 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  || (op==TK_REGIS
10b0: 54 45 52 20 26 26 20 70 2d 3e 6f 70 32 3d 3d 54  TER && p->op2==T
10c0: 4b 5f 43 4f 4c 4c 41 54 45 29 20 29 7b 0a 20 20  K_COLLATE) ){.  
10d0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
10e0: 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50  te3GetCollSeq(pP
10f0: 61 72 73 65 2c 20 45 4e 43 28 64 62 29 2c 20 30  arse, ENC(db), 0
1100: 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  , p->u.zToken);.
1110: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1120: 20 7d 0a 20 20 20 20 69 66 28 20 28 6f 70 3d 3d   }.    if( (op==
1130: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c 7c  TK_AGG_COLUMN ||
1140: 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20   op==TK_COLUMN. 
1150: 20 20 20 20 20 20 20 20 20 7c 7c 20 6f 70 3d 3d           || op==
1160: 54 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f  TK_REGISTER || o
1170: 70 3d 3d 54 4b 5f 54 52 49 47 47 45 52 29 0a 20  p==TK_TRIGGER). 
1180: 20 20 20 20 26 26 20 70 2d 3e 70 54 61 62 21 3d      && p->pTab!=
1190: 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  0.    ){.      /
11a0: 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  * op==TK_REGISTE
11b0: 52 20 26 26 20 70 2d 3e 70 54 61 62 21 3d 30 20  R && p->pTab!=0 
11c0: 68 61 70 70 65 6e 73 20 77 68 65 6e 20 70 45 78  happens when pEx
11d0: 70 72 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c  pr was originall
11e0: 79 0a 20 20 20 20 20 20 2a 2a 20 61 20 54 4b 5f  y.      ** a TK_
11f0: 43 4f 4c 55 4d 4e 20 62 75 74 20 77 61 73 20 70  COLUMN but was p
1200: 72 65 76 69 6f 75 73 6c 79 20 65 76 61 6c 75 61  reviously evalua
1210: 74 65 64 20 61 6e 64 20 63 61 63 68 65 64 20 69  ted and cached i
1220: 6e 20 61 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  n a register */.
1230: 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 2d        int j = p-
1240: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
1250: 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20 20  if( j>=0 ){.    
1260: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1270: 7a 43 6f 6c 6c 20 3d 20 70 2d 3e 70 54 61 62 2d  zColl = p->pTab-
1280: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a  >aCol[j].zColl;.
1290: 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
12a0: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
12b0: 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20  eq(db, ENC(db), 
12c0: 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20  zColl, 0);.     
12d0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
12e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
12f0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
1300: 61 74 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ate ){.      if(
1310: 20 70 2d 3e 70 4c 65 66 74 20 26 26 20 28 70 2d   p->pLeft && (p-
1320: 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20  >pLeft->flags & 
1330: 45 50 5f 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29  EP_Collate)!=0 )
1340: 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 2d  {.        p = p-
1350: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 65  >pLeft;.      }e
1360: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 78 70  lse{.        Exp
1370: 72 20 2a 70 4e 65 78 74 20 20 3d 20 70 2d 3e 70  r *pNext  = p->p
1380: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 2f  Right;.        /
1390: 2a 20 54 68 65 20 45 78 70 72 2e 78 20 75 6e 69  * The Expr.x uni
13a0: 6f 6e 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  on is never used
13b0: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
13c0: 65 20 61 73 20 45 78 70 72 2e 70 52 69 67 68 74  e as Expr.pRight
13d0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
13e0: 72 74 28 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d  rt( p->x.pList==
13f0: 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d  0 || p->pRight==
1400: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 );.        /* 
1410: 70 2d 3e 66 6c 61 67 73 20 68 6f 6c 64 73 20 45  p->flags holds E
1420: 50 5f 43 6f 6c 6c 61 74 65 20 61 6e 64 20 70 2d  P_Collate and p-
1430: 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 64 6f  >pLeft->flags do
1440: 65 73 20 6e 6f 74 2e 20 20 41 6e 64 0a 20 20 20  es not.  And.   
1450: 20 20 20 20 20 2a 2a 20 70 2d 3e 78 2e 70 53 65       ** p->x.pSe
1460: 6c 65 63 74 20 63 61 6e 6e 6f 74 2e 20 20 53 6f  lect cannot.  So
1470: 20 69 66 20 70 2d 3e 78 2e 70 4c 65 66 74 20 65   if p->x.pLeft e
1480: 78 69 73 74 73 2c 20 69 74 20 6d 75 73 74 20 68  xists, it must h
1490: 6f 6c 64 20 61 74 0a 20 20 20 20 20 20 20 20 2a  old at.        *
14a0: 2a 20 6c 65 61 73 74 20 6f 6e 65 20 45 50 5f 43  * least one EP_C
14b0: 6f 6c 6c 61 74 65 2e 20 54 68 75 73 20 74 68 65  ollate. Thus the
14c0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 41   following two A
14d0: 4c 57 41 59 53 2e 20 2a 2f 0a 20 20 20 20 20 20  LWAYS. */.      
14e0: 20 20 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74    if( p->x.pList
14f0: 21 3d 30 20 26 26 20 41 4c 57 41 59 53 28 21 45  !=0 && ALWAYS(!E
1500: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1510: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 29  , EP_xIsSelect))
1520: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
1530: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 66  t i;.          f
1540: 6f 72 28 69 3d 30 3b 20 41 4c 57 41 59 53 28 69  or(i=0; ALWAYS(i
1550: 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  <p->x.pList->nEx
1560: 70 72 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  pr); i++){.     
1570: 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48         if( ExprH
1580: 61 73 50 72 6f 70 65 72 74 79 28 70 2d 3e 78 2e  asProperty(p->x.
1590: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
15a0: 72 2c 20 45 50 5f 43 6f 6c 6c 61 74 65 29 20 29  r, EP_Collate) )
15b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
15c0: 70 4e 65 78 74 20 3d 20 70 2d 3e 78 2e 70 4c 69  pNext = p->x.pLi
15d0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
15e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
15f0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
1600: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
1610: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1620: 20 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20   p = pNext;.    
1630: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
1640: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1650: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  }.  }.  if( sqli
1660: 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28  te3CheckCollSeq(
1670: 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29  pParse, pColl) )
1680: 7b 20 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30  { .    pColl = 0
1690: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
16a0: 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  Coll;.}../*.** p
16b0: 45 78 70 72 20 69 73 20 61 6e 20 6f 70 65 72 61  Expr is an opera
16c0: 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73  nd of a comparis
16d0: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 61 66  on operator.  af
16e0: 66 32 20 69 73 20 74 68 65 0a 2a 2a 20 74 79 70  f2 is the.** typ
16f0: 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68  e affinity of th
1700: 65 20 6f 74 68 65 72 20 6f 70 65 72 61 6e 64 2e  e other operand.
1710: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72    This routine r
1720: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 74 79  eturns the.** ty
1730: 70 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74  pe affinity that
1740: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
1750: 66 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73  for the comparis
1760: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a  on operator..*/.
1770: 63 68 61 72 20 73 71 6c 69 74 65 33 43 6f 6d 70  char sqlite3Comp
1780: 61 72 65 41 66 66 69 6e 69 74 79 28 45 78 70 72  areAffinity(Expr
1790: 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20 61 66   *pExpr, char af
17a0: 66 32 29 7b 0a 20 20 63 68 61 72 20 61 66 66 31  f2){.  char aff1
17b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
17c0: 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20  finity(pExpr);. 
17d0: 20 69 66 28 20 61 66 66 31 20 26 26 20 61 66 66   if( aff1 && aff
17e0: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42 6f 74 68  2 ){.    /* Both
17f0: 20 73 69 64 65 73 20 6f 66 20 74 68 65 20 63 6f   sides of the co
1800: 6d 70 61 72 69 73 6f 6e 20 61 72 65 20 63 6f 6c  mparison are col
1810: 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20 68 61 73  umns. If one has
1820: 20 6e 75 6d 65 72 69 63 0a 20 20 20 20 2a 2a 20   numeric.    ** 
1830: 61 66 66 69 6e 69 74 79 2c 20 75 73 65 20 74 68  affinity, use th
1840: 61 74 2e 20 4f 74 68 65 72 77 69 73 65 20 75 73  at. Otherwise us
1850: 65 20 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20  e no affinity.. 
1860: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71     */.    if( sq
1870: 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66  lite3IsNumericAf
1880: 66 69 6e 69 74 79 28 61 66 66 31 29 20 7c 7c 20  finity(aff1) || 
1890: 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63  sqlite3IsNumeric
18a0: 41 66 66 69 6e 69 74 79 28 61 66 66 32 29 20 29  Affinity(aff2) )
18b0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
18c0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
18d0: 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  C;.    }else{.  
18e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18f0: 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20  E_AFF_BLOB;.    
1900: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61  }.  }else if( !a
1910: 66 66 31 20 26 26 20 21 61 66 66 32 20 29 7b 0a  ff1 && !aff2 ){.
1920: 20 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 73      /* Neither s
1930: 69 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 61  ide of the compa
1940: 72 69 73 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  rison is a colum
1950: 6e 2e 20 20 43 6f 6d 70 61 72 65 20 74 68 65 0a  n.  Compare the.
1960: 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 20 64      ** results d
1970: 69 72 65 63 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a  irectly..    */.
1980: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1990: 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d 65  E_AFF_BLOB;.  }e
19a0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20  lse{.    /* One 
19b0: 73 69 64 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e  side is a column
19c0: 2c 20 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e  , the other is n
19d0: 6f 74 2e 20 55 73 65 20 74 68 65 20 63 6f 6c 75  ot. Use the colu
19e0: 6d 6e 73 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f  mns affinity. */
19f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 66 66  .    assert( aff
1a00: 31 3d 3d 30 20 7c 7c 20 61 66 66 32 3d 3d 30 20  1==0 || aff2==0 
1a10: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 61  );.    return (a
1a20: 66 66 31 20 2b 20 61 66 66 32 29 3b 0a 20 20 7d  ff1 + aff2);.  }
1a30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
1a40: 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  is a comparison 
1a50: 6f 70 65 72 61 74 6f 72 2e 20 20 52 65 74 75 72  operator.  Retur
1a60: 6e 20 74 68 65 20 74 79 70 65 20 61 66 66 69 6e  n the type affin
1a70: 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64 0a  ity that should.
1a80: 2a 2a 20 62 65 20 61 70 70 6c 69 65 64 20 74 6f  ** be applied to
1a90: 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 70   both operands p
1aa0: 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 74 68  rior to doing th
1ab0: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f  e comparison..*/
1ac0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 63 6f 6d  .static char com
1ad0: 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28  parisonAffinity(
1ae0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
1af0: 63 68 61 72 20 61 66 66 3b 0a 20 20 61 73 73 65  char aff;.  asse
1b00: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
1b10: 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_EQ || pExpr->o
1b20: 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70 45 78 70  p==TK_IN || pExp
1b30: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a  r->op==TK_LT ||.
1b40: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1b50: 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70 45  >op==TK_GT || pE
1b60: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c  xpr->op==TK_GE |
1b70: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
1b80: 4c 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  LE ||.          
1b90: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45  pExpr->op==TK_NE
1ba0: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
1bb0: 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_IS || pExpr->o
1bc0: 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20  p==TK_ISNOT );. 
1bd0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1be0: 70 4c 65 66 74 20 29 3b 0a 20 20 61 66 66 20 3d  pLeft );.  aff =
1bf0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
1c00: 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66  nity(pExpr->pLef
1c10: 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  t);.  if( pExpr-
1c20: 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 61  >pRight ){.    a
1c30: 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ff = sqlite3Comp
1c40: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70  areAffinity(pExp
1c50: 72 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 29 3b  r->pRight, aff);
1c60: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70  .  }else if( Exp
1c70: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1c80: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
1c90: 29 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73  ) ){.    aff = s
1ca0: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
1cb0: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 78 2e 70  inity(pExpr->x.p
1cc0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
1cd0: 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61 66 66 29  a[0].pExpr, aff)
1ce0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61  ;.  }else if( !a
1cf0: 66 66 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20  ff ){.    aff = 
1d00: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b  SQLITE_AFF_BLOB;
1d10: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66  .  }.  return af
1d20: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70  f;.}../*.** pExp
1d30: 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f  r is a compariso
1d40: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 65 67  n expression, eg
1d50: 2e 20 27 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e  . '=', '<', IN(.
1d60: 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f  ..) etc..** idx_
1d70: 61 66 66 69 6e 69 74 79 20 69 73 20 74 68 65 20  affinity is the 
1d80: 61 66 66 69 6e 69 74 79 20 6f 66 20 61 6e 20 69  affinity of an i
1d90: 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52  ndexed column. R
1da0: 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66  eturn true.** if
1db0: 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20   the index with 
1dc0: 61 66 66 69 6e 69 74 79 20 69 64 78 5f 61 66 66  affinity idx_aff
1dd0: 69 6e 69 74 79 20 6d 61 79 20 62 65 20 75 73 65  inity may be use
1de0: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a  d to implement.*
1df0: 2a 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * the comparison
1e00: 20 69 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e   in pExpr..*/.in
1e10: 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66  t sqlite3IndexAf
1e20: 66 69 6e 69 74 79 4f 6b 28 45 78 70 72 20 2a 70  finityOk(Expr *p
1e30: 45 78 70 72 2c 20 63 68 61 72 20 69 64 78 5f 61  Expr, char idx_a
1e40: 66 66 69 6e 69 74 79 29 7b 0a 20 20 63 68 61 72  ffinity){.  char
1e50: 20 61 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f   aff = compariso
1e60: 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  nAffinity(pExpr)
1e70: 3b 0a 20 20 73 77 69 74 63 68 28 20 61 66 66 20  ;.  switch( aff 
1e80: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
1e90: 54 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a 20 20 20  TE_AFF_BLOB:.   
1ea0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1eb0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46   case SQLITE_AFF
1ec0: 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 72 65 74  _TEXT:.      ret
1ed0: 75 72 6e 20 69 64 78 5f 61 66 66 69 6e 69 74 79  urn idx_affinity
1ee0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ==SQLITE_AFF_TEX
1ef0: 54 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  T;.    default:.
1f00: 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
1f10: 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66  ite3IsNumericAff
1f20: 69 6e 69 74 79 28 69 64 78 5f 61 66 66 69 6e 69  inity(idx_affini
1f30: 74 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ty);.  }.}../*.*
1f40: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 35 20  * Return the P5 
1f50: 76 61 6c 75 65 20 74 68 61 74 20 73 68 6f 75 6c  value that shoul
1f60: 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 61 20  d be used for a 
1f70: 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f  binary compariso
1f80: 6e 0a 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f  n.** opcode (OP_
1f90: 45 71 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29 20  Eq, OP_Ge etc.) 
1fa0: 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20  used to compare 
1fb0: 70 45 78 70 72 31 20 61 6e 64 20 70 45 78 70 72  pExpr1 and pExpr
1fc0: 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  2..*/.static u8 
1fd0: 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28  binaryCompareP5(
1fe0: 45 78 70 72 20 2a 70 45 78 70 72 31 2c 20 45 78  Expr *pExpr1, Ex
1ff0: 70 72 20 2a 70 45 78 70 72 32 2c 20 69 6e 74 20  pr *pExpr2, int 
2000: 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75  jumpIfNull){.  u
2010: 38 20 61 66 66 20 3d 20 28 63 68 61 72 29 73 71  8 aff = (char)sq
2020: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
2030: 79 28 70 45 78 70 72 32 29 3b 0a 20 20 61 66 66  y(pExpr2);.  aff
2040: 20 3d 20 28 75 38 29 73 71 6c 69 74 65 33 43 6f   = (u8)sqlite3Co
2050: 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45  mpareAffinity(pE
2060: 78 70 72 31 2c 20 61 66 66 29 20 7c 20 28 75 38  xpr1, aff) | (u8
2070: 29 6a 75 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72  )jumpIfNull;.  r
2080: 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a  eturn aff;.}../*
2090: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
20a0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c  nter to the coll
20b0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74  ation sequence t
20c0: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
20d0: 65 64 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72  ed by.** a binar
20e0: 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  y comparison ope
20f0: 72 61 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20  rator comparing 
2100: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
2110: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
2120: 65 66 74 20 68 61 6e 64 20 65 78 70 72 65 73 73  eft hand express
2130: 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74  ion has a collat
2140: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 79 70  ing sequence typ
2150: 65 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a  e, then it is.**
2160: 20 75 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65   used. Otherwise
2170: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
2180: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
2190: 72 69 67 68 74 20 68 61 6e 64 20 65 78 70 72 65  right hand expre
21a0: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64  ssion.** is used
21b0: 2c 20 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74  , or the default
21c0: 20 28 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69   (BINARY) if nei
21d0: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ther expression 
21e0: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a  has a collating.
21f0: 2a 2a 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41  ** type..**.** A
2200: 72 67 75 6d 65 6e 74 20 70 52 69 67 68 74 20 28  rgument pRight (
2210: 62 75 74 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d  but not pLeft) m
2220: 61 79 20 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69  ay be a null poi
2230: 6e 74 65 72 2e 20 49 6e 20 74 68 69 73 20 63 61  nter. In this ca
2240: 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  se,.** it is not
2250: 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a   considered..*/.
2260: 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33  CollSeq *sqlite3
2270: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
2280: 6c 53 65 71 28 0a 20 20 50 61 72 73 65 20 2a 70  lSeq(.  Parse *p
2290: 50 61 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a  Parse, .  Expr *
22a0: 70 4c 65 66 74 2c 20 0a 20 20 45 78 70 72 20 2a  pLeft, .  Expr *
22b0: 70 52 69 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c  pRight.){.  Coll
22c0: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73  Seq *pColl;.  as
22d0: 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20  sert( pLeft );. 
22e0: 20 69 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67   if( pLeft->flag
22f0: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29  s & EP_Collate )
2300: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
2310: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2320: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b  (pParse, pLeft);
2330: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69  .  }else if( pRi
2340: 67 68 74 20 26 26 20 28 70 52 69 67 68 74 2d 3e  ght && (pRight->
2350: 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61  flags & EP_Colla
2360: 74 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 43  te)!=0 ){.    pC
2370: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
2380: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
2390: 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73   pRight);.  }els
23a0: 65 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  e{.    pColl = s
23b0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
23c0: 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29  q(pParse, pLeft)
23d0: 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c  ;.    if( !pColl
23e0: 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20   ){.      pColl 
23f0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
2400: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69  lSeq(pParse, pRi
2410: 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ght);.    }.  }.
2420: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
2430: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
2440: 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d  e code for a com
2450: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
2460: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2470: 63 6f 64 65 43 6f 6d 70 61 72 65 28 0a 20 20 50  codeCompare(.  P
2480: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
2490: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
24a0: 28 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61  (and code genera
24b0: 74 69 6e 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f  ting) context */
24c0: 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20  .  Expr *pLeft, 
24d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74       /* The left
24e0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78   operand */.  Ex
24f0: 70 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20  pr *pRight,     
2500: 2f 2a 20 54 68 65 20 72 69 67 68 74 20 6f 70 65  /* The right ope
2510: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  rand */.  int op
2520: 63 6f 64 65 2c 20 20 20 20 20 20 20 2f 2a 20 54  code,       /* T
2530: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  he comparison op
2540: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  code */.  int in
2550: 31 2c 20 69 6e 74 20 69 6e 32 2c 20 2f 2a 20 52  1, int in2, /* R
2560: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
2570: 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 20 20 69 6e  operands */.  in
2580: 74 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20  t dest,         
2590: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
25a0: 74 72 75 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20  true.  */.  int 
25b0: 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a  jumpIfNull    /*
25c0: 20 49 66 20 74 72 75 65 2c 20 6a 75 6d 70 20 69   If true, jump i
25d0: 66 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64  f either operand
25e0: 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   is NULL */.){. 
25f0: 20 69 6e 74 20 70 35 3b 0a 20 20 69 6e 74 20 61   int p5;.  int a
2600: 64 64 72 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ddr;.  CollSeq *
2610: 70 34 3b 0a 0a 20 20 70 34 20 3d 20 73 71 6c 69  p4;..  p4 = sqli
2620: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
2630: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
2640: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a  pLeft, pRight);.
2650: 20 20 70 35 20 3d 20 62 69 6e 61 72 79 43 6f 6d    p5 = binaryCom
2660: 70 61 72 65 50 35 28 70 4c 65 66 74 2c 20 70 52  pareP5(pLeft, pR
2670: 69 67 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  ight, jumpIfNull
2680: 29 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69  );.  addr = sqli
2690: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 50  te3VdbeAddOp4(pP
26a0: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63  arse->pVdbe, opc
26b0: 6f 64 65 2c 20 69 6e 32 2c 20 64 65 73 74 2c 20  ode, in2, dest, 
26c0: 69 6e 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  in1,.           
26d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e0: 28 76 6f 69 64 2a 29 70 34 2c 20 50 34 5f 43 4f  (void*)p4, P4_CO
26f0: 4c 4c 53 45 51 29 3b 0a 20 20 73 71 6c 69 74 65  LLSEQ);.  sqlite
2700: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 70 50  3VdbeChangeP5(pP
2710: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 28 75 38  arse->pVdbe, (u8
2720: 29 70 35 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  )p5);.  return a
2730: 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ddr;.}../*.** Re
2740: 74 75 72 6e 20 74 72 75 65 20 69 66 20 65 78 70  turn true if exp
2750: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73  ression pExpr is
2760: 20 61 20 76 65 63 74 6f 72 2c 20 6f 72 20 66 61   a vector, or fa
2770: 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  lse otherwise..*
2780: 2a 0a 2a 2a 20 41 20 76 65 63 74 6f 72 20 69 73  *.** A vector is
2790: 20 64 65 66 69 6e 65 64 20 61 73 20 61 6e 79 20   defined as any 
27a0: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
27b0: 72 65 73 75 6c 74 73 20 69 6e 20 74 77 6f 20 6f  results in two o
27c0: 72 20 6d 6f 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e  r more.** column
27d0: 73 20 6f 66 20 72 65 73 75 6c 74 2e 20 20 45 76  s of result.  Ev
27e0: 65 72 79 20 54 4b 5f 56 45 43 54 4f 52 20 6e 6f  ery TK_VECTOR no
27f0: 64 65 20 69 73 20 61 6e 20 76 65 63 74 6f 72 20  de is an vector 
2800: 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 70  because the.** p
2810: 61 72 73 65 72 20 77 69 6c 6c 20 6e 6f 74 20 67  arser will not g
2820: 65 6e 65 72 61 74 65 20 61 20 54 4b 5f 56 45 43  enerate a TK_VEC
2830: 54 4f 52 20 77 69 74 68 20 66 65 77 65 72 20 74  TOR with fewer t
2840: 68 61 6e 20 74 77 6f 20 65 6e 74 72 69 65 73 2e  han two entries.
2850: 0a 2a 2a 20 42 75 74 20 61 20 54 4b 5f 53 45 4c  .** But a TK_SEL
2860: 45 43 54 20 6d 69 67 68 74 20 62 65 20 65 69 74  ECT might be eit
2870: 68 65 72 20 61 20 76 65 63 74 6f 72 20 6f 72 20  her a vector or 
2880: 61 20 73 63 61 6c 61 72 2e 20 49 74 20 69 73 20  a scalar. It is 
2890: 6f 6e 6c 79 0a 2a 2a 20 63 6f 6e 73 69 64 65 72  only.** consider
28a0: 65 64 20 61 20 76 65 63 74 6f 72 20 69 66 20 69  ed a vector if i
28b0: 74 20 68 61 73 20 74 77 6f 20 6f 72 20 6d 6f 72  t has two or mor
28c0: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  e result columns
28d0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
28e0: 45 78 70 72 49 73 56 65 63 74 6f 72 28 45 78 70  ExprIsVector(Exp
28f0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 72 65 74  r *pExpr){.  ret
2900: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 56  urn sqlite3ExprV
2910: 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 29  ectorSize(pExpr)
2920: 3e 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  >1;.}../*.** If 
2930: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
2940: 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
2950: 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6f 66  y argument is of
2960: 20 74 79 70 65 20 54 4b 5f 56 45 43 54 4f 52 20   type TK_VECTOR 
2970: 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e  .** return the n
2980: 75 6d 62 65 72 20 6f 66 20 65 78 70 72 65 73 73  umber of express
2990: 69 6f 6e 73 20 69 6e 20 74 68 65 20 76 65 63 74  ions in the vect
29a0: 6f 72 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 65  or. Or, if the e
29b0: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20  xpression.** is 
29c0: 61 20 73 75 62 2d 73 65 6c 65 63 74 2c 20 72 65  a sub-select, re
29d0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
29e0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
29f0: 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 46 6f  e sub-select. Fo
2a00: 72 0a 2a 2a 20 61 6e 79 20 6f 74 68 65 72 20 74  r.** any other t
2a10: 79 70 65 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ype of expressio
2a20: 6e 2c 20 72 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a  n, return 1..*/.
2a30: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 56  int sqlite3ExprV
2a40: 65 63 74 6f 72 53 69 7a 65 28 45 78 70 72 20 2a  ectorSize(Expr *
2a50: 70 45 78 70 72 29 7b 0a 20 20 75 38 20 6f 70 20  pExpr){.  u8 op 
2a60: 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69  = pExpr->op;.  i
2a70: 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  f( op==TK_REGIST
2a80: 45 52 20 29 20 6f 70 20 3d 20 70 45 78 70 72 2d  ER ) op = pExpr-
2a90: 3e 6f 70 32 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  >op2;.  if( op==
2aa0: 54 4b 5f 56 45 43 54 4f 52 20 29 7b 0a 20 20 20  TK_VECTOR ){.   
2ab0: 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 78   return pExpr->x
2ac0: 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  .pList->nExpr;. 
2ad0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54   }else if( op==T
2ae0: 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20  K_SELECT ){.    
2af0: 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e  return pExpr->x.
2b00: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
2b10: 3e 6e 45 78 70 72 3b 0a 20 20 7d 65 6c 73 65 7b  >nExpr;.  }else{
2b20: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
2b30: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
2b40: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
2b50: 52 59 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  RY./*.** Return 
2b60: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
2b70: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  ubexpression of 
2b80: 70 56 65 63 74 6f 72 20 74 68 61 74 20 69 73 20  pVector that is 
2b90: 74 68 65 20 69 2d 74 68 0a 2a 2a 20 63 6f 6c 75  the i-th.** colu
2ba0: 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72  mn of the vector
2bb0: 20 28 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74   (numbered start
2bc0: 69 6e 67 20 77 69 74 68 20 30 29 2e 20 20 54 68  ing with 0).  Th
2bd0: 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a  e caller must.**
2be0: 20 65 6e 73 75 72 65 20 74 68 61 74 20 69 20 69   ensure that i i
2bf0: 73 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 0a  s within range..
2c00: 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72  **.** If pVector
2c10: 20 69 73 20 72 65 61 6c 6c 79 20 61 20 73 63 61   is really a sca
2c20: 6c 61 72 20 28 61 6e 64 20 22 73 63 61 6c 61 72  lar (and "scalar
2c30: 22 20 68 65 72 65 20 69 6e 63 6c 75 64 65 73 20  " here includes 
2c40: 73 75 62 71 75 65 72 69 65 73 0a 2a 2a 20 74 68  subqueries.** th
2c50: 61 74 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67  at return a sing
2c60: 6c 65 20 63 6f 6c 75 6d 6e 21 29 20 74 68 65 6e  le column!) then
2c70: 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 20   return pVector 
2c80: 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  unmodified..**.*
2c90: 2a 20 70 56 65 63 74 6f 72 20 72 65 74 61 69 6e  * pVector retain
2ca0: 73 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74  s ownership of t
2cb0: 68 65 20 72 65 74 75 72 6e 65 64 20 73 75 62 65  he returned sube
2cc0: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
2cd0: 20 49 66 20 74 68 65 20 76 65 63 74 6f 72 20 69   If the vector i
2ce0: 73 20 61 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29  s a (SELECT ...)
2cf0: 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
2d00: 73 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 69 73  sion returned is
2d10: 0a 2a 2a 20 6a 75 73 74 20 74 68 65 20 65 78 70  .** just the exp
2d20: 72 65 73 73 69 6f 6e 20 66 6f 72 20 74 68 65 20  ression for the 
2d30: 69 2d 74 68 20 74 65 72 6d 20 6f 66 20 74 68 65  i-th term of the
2d40: 20 72 65 73 75 6c 74 20 73 65 74 2c 20 61 6e 64   result set, and
2d50: 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 62 65 20 72   may.** not be r
2d60: 65 61 64 79 20 66 6f 72 20 65 76 61 6c 75 61 74  eady for evaluat
2d70: 69 6f 6e 20 62 65 63 61 75 73 65 20 74 68 65 20  ion because the 
2d80: 74 61 62 6c 65 20 63 75 72 73 6f 72 20 68 61 73  table cursor has
2d90: 20 6e 6f 74 20 79 65 74 0a 2a 2a 20 62 65 65 6e   not yet.** been
2da0: 20 70 6f 73 69 74 69 6f 6e 65 64 2e 0a 2a 2f 0a   positioned..*/.
2db0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 56 65 63  Expr *sqlite3Vec
2dc0: 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
2dd0: 45 78 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 69  Expr *pVector, i
2de0: 6e 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28  nt i){.  assert(
2df0: 20 69 3c 73 71 6c 69 74 65 33 45 78 70 72 56 65   i<sqlite3ExprVe
2e00: 63 74 6f 72 53 69 7a 65 28 70 56 65 63 74 6f 72  ctorSize(pVector
2e10: 29 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ) );.  if( sqlit
2e20: 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
2e30: 56 65 63 74 6f 72 29 20 29 7b 0a 20 20 20 20 69  Vector) ){.    i
2e40: 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d  f( pVector->op==
2e50: 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20 20 7c  TK_SELECT.     |
2e60: 7c 20 28 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d  | (pVector->op==
2e70: 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70  TK_REGISTER && p
2e80: 56 65 63 74 6f 72 2d 3e 6f 70 32 3d 3d 54 4b 5f  Vector->op2==TK_
2e90: 53 45 4c 45 43 54 29 0a 20 20 20 20 29 7b 0a 20  SELECT).    ){. 
2ea0: 20 20 20 20 20 72 65 74 75 72 6e 20 70 56 65 63       return pVec
2eb0: 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  tor->x.pSelect->
2ec0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
2ed0: 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  pr;.    }else{. 
2ee0: 20 20 20 20 20 72 65 74 75 72 6e 20 70 56 65 63       return pVec
2ef0: 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  tor->x.pList->a[
2f00: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 0a  i].pExpr;.    }.
2f10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 56 65    }.  return pVe
2f20: 63 74 6f 72 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ctor;.}.#endif /
2f30: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
2f40: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
2f50: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
2f60: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
2f70: 59 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  Y./*.** Compute 
2f80: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 6e 65 77  and return a new
2f90: 20 45 78 70 72 20 6f 62 6a 65 63 74 20 77 68 69   Expr object whi
2fa0: 63 68 20 77 68 65 6e 20 70 61 73 73 65 64 20 74  ch when passed t
2fb0: 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72  o.** sqlite3Expr
2fc0: 43 6f 64 65 28 29 20 77 69 6c 6c 20 67 65 6e 65  Code() will gene
2fd0: 72 61 74 65 20 61 6c 6c 20 6e 65 63 65 73 73 61  rate all necessa
2fe0: 72 79 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75  ry code to compu
2ff0: 74 65 0a 2a 2a 20 74 68 65 20 69 46 69 65 6c 64  te.** the iField
3000: 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  -th column of th
3010: 65 20 76 65 63 74 6f 72 20 65 78 70 72 65 73 73  e vector express
3020: 69 6f 6e 20 70 56 65 63 74 6f 72 2e 0a 2a 2a 0a  ion pVector..**.
3030: 2a 2a 20 49 74 20 69 73 20 6f 6b 20 66 6f 72 20  ** It is ok for 
3040: 70 56 65 63 74 6f 72 20 74 6f 20 62 65 20 61 20  pVector to be a 
3050: 73 63 61 6c 61 72 20 28 61 73 20 6c 6f 6e 67 20  scalar (as long 
3060: 61 73 20 69 46 69 65 6c 64 3d 3d 30 29 2e 20 20  as iField==0).  
3070: 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63 61 73 65  .** In that case
3080: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  , this routine w
3090: 6f 72 6b 73 20 6c 69 6b 65 20 73 71 6c 69 74 65  orks like sqlite
30a0: 33 45 78 70 72 44 75 70 28 29 2e 0a 2a 2a 0a 2a  3ExprDup()..**.*
30b0: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6f 77 6e  * The caller own
30c0: 73 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 45  s the returned E
30d0: 78 70 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 69  xpr object and i
30e0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
30f0: 72 0a 2a 2a 20 65 6e 73 75 72 69 6e 67 20 74 68  r.** ensuring th
3100: 61 74 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  at the returned 
3110: 76 61 6c 75 65 20 65 76 65 6e 74 75 61 6c 6c 79  value eventually
3120: 20 67 65 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a   gets freed..**.
3130: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 72 65  ** The caller re
3140: 74 61 69 6e 73 20 6f 77 6e 65 72 73 68 69 70 20  tains ownership 
3150: 6f 66 20 70 56 65 63 74 6f 72 2e 20 20 49 66 20  of pVector.  If 
3160: 70 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b 5f  pVector is a TK_
3170: 53 45 4c 45 43 54 2c 0a 2a 2a 20 74 68 65 6e 20  SELECT,.** then 
3180: 74 68 65 20 72 65 74 75 72 6e 65 20 6f 62 6a 65  the returne obje
3190: 63 74 20 77 69 6c 6c 20 72 65 66 65 72 65 6e 63  ct will referenc
31a0: 65 20 70 56 65 63 74 6f 72 20 61 6e 64 20 73 6f  e pVector and so
31b0: 20 70 56 65 63 74 6f 72 20 6d 75 73 74 20 72 65   pVector must re
31c0: 6d 61 69 6e 0a 2a 2a 20 76 61 6c 69 64 20 66 6f  main.** valid fo
31d0: 72 20 74 68 65 20 6c 69 66 65 20 6f 66 20 74 68  r the life of th
31e0: 65 20 72 65 74 75 72 6e 65 64 20 6f 62 6a 65 63  e returned objec
31f0: 74 2e 20 20 49 66 20 70 56 65 63 74 6f 72 20 69  t.  If pVector i
3200: 73 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a  s a TK_VECTOR.**
3210: 20 6f 72 20 61 20 73 63 61 6c 61 72 20 65 78 70   or a scalar exp
3220: 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20 69 74  ression, then it
3230: 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 20   can be deleted 
3240: 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 69 73 20  as soon as this 
3250: 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
3260: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 69 63  ns..**.** A tric
3270: 6b 20 74 6f 20 63 61 75 73 65 20 61 20 54 4b 5f  k to cause a TK_
3280: 53 45 4c 45 43 54 20 70 56 65 63 74 6f 72 20 74  SELECT pVector t
3290: 6f 20 62 65 20 64 65 6c 65 74 65 64 20 74 6f 67  o be deleted tog
32a0: 65 74 68 65 72 20 77 69 74 68 0a 2a 2a 20 74 68  ether with.** th
32b0: 65 20 72 65 74 75 72 6e 65 64 20 45 78 70 72 20  e returned Expr 
32c0: 6f 62 6a 65 63 74 20 69 73 20 74 6f 20 61 74 74  object is to att
32d0: 61 63 68 20 74 68 65 20 70 56 65 63 74 6f 72 20  ach the pVector 
32e0: 74 6f 20 74 68 65 20 70 52 69 67 68 74 20 66 69  to the pRight fi
32f0: 65 6c 64 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65  eld.** of the re
3300: 74 75 72 6e 65 64 20 54 4b 5f 53 45 4c 45 43 54  turned TK_SELECT
3310: 5f 43 4f 4c 55 4d 4e 20 45 78 70 72 20 6f 62 6a  _COLUMN Expr obj
3320: 65 63 74 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ect..*/.Expr *sq
3330: 6c 69 74 65 33 45 78 70 72 46 6f 72 56 65 63 74  lite3ExprForVect
3340: 6f 72 46 69 65 6c 64 28 0a 20 20 50 61 72 73 65  orField(.  Parse
3350: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
3360: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
3370: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 56  xt */.  Expr *pV
3380: 65 63 74 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20  ector,       /* 
3390: 54 68 65 20 76 65 63 74 6f 72 2e 20 20 4c 69 73  The vector.  Lis
33a0: 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
33b0: 20 6f 72 20 61 20 73 75 62 2d 53 45 4c 45 43 54   or a sub-SELECT
33c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 65 6c 64   */.  int iField
33d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
33e0: 69 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ich column of th
33f0: 65 20 76 65 63 74 6f 72 20 74 6f 20 72 65 74 75  e vector to retu
3400: 72 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  rn */.){.  Expr 
3410: 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 56 65  *pRet;.  if( pVe
3420: 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  ctor->op==TK_SEL
3430: 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ECT ){.    asser
3440: 74 28 20 70 56 65 63 74 6f 72 2d 3e 66 6c 61 67  t( pVector->flag
3450: 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
3460: 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 54   );.    /* The T
3470: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
3480: 45 78 70 72 20 6e 6f 64 65 3a 0a 20 20 20 20 2a  Expr node:.    *
3490: 2a 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 3a 20  *.    ** pLeft: 
34a0: 20 20 20 20 20 20 20 20 20 20 70 56 65 63 74 6f            pVecto
34b0: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 54 4b 5f  r containing TK_
34c0: 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 70 52  SELECT.    ** pR
34d0: 69 67 68 74 3a 20 20 20 20 20 20 20 20 20 20 6e  ight:          n
34e0: 6f 74 20 75 73 65 64 2e 20 20 42 75 74 20 72 65  ot used.  But re
34f0: 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65  cursively delete
3500: 64 2e 0a 20 20 20 20 2a 2a 20 69 43 6f 6c 75 6d  d..    ** iColum
3510: 6e 3a 20 20 20 20 20 20 20 20 20 49 6e 64 65 78  n:         Index
3520: 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   of a column in 
3530: 70 56 65 63 74 6f 72 0a 20 20 20 20 2a 2a 20 70  pVector.    ** p
3540: 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3a 20 20 20  Left->iTable:   
3550: 46 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61  First in an arra
3560: 79 20 6f 66 20 72 65 67 69 73 74 65 72 20 68 6f  y of register ho
3570: 6c 64 69 6e 67 20 72 65 73 75 6c 74 2c 20 6f 72  lding result, or
3580: 20 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20   0.    **       
3590: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 74 68             if th
35a0: 65 20 72 65 73 75 6c 74 20 69 73 20 6e 6f 74 20  e result is not 
35b0: 79 65 74 20 63 6f 6d 70 75 74 65 64 2e 0a 20 20  yet computed..  
35c0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 71 6c 69    **.    ** sqli
35d0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 29 20  te3ExprDelete() 
35e0: 73 70 65 63 69 66 69 63 61 6c 6c 79 20 73 6b 69  specifically ski
35f0: 70 73 20 74 68 65 20 72 65 63 75 72 73 69 76 65  ps the recursive
3600: 20 64 65 6c 65 74 65 20 6f 66 0a 20 20 20 20 2a   delete of.    *
3610: 2a 20 70 4c 65 66 74 20 6f 6e 20 54 4b 5f 53 45  * pLeft on TK_SE
3620: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  LECT_COLUMN node
3630: 73 2e 20 20 42 75 74 20 70 52 69 67 68 74 20 69  s.  But pRight i
3640: 73 20 66 6f 6c 6c 6f 77 65 64 2c 20 73 6f 20 70  s followed, so p
3650: 56 65 63 74 6f 72 0a 20 20 20 20 2a 2a 20 63 61  Vector.    ** ca
3660: 6e 20 62 65 20 61 74 74 61 63 68 65 64 20 74 6f  n be attached to
3670: 20 70 52 69 67 68 74 20 74 6f 20 63 61 75 73 65   pRight to cause
3680: 20 74 68 69 73 20 6e 6f 64 65 20 74 6f 20 74 61   this node to ta
3690: 6b 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 0a  ke ownership of.
36a0: 20 20 20 20 2a 2a 20 70 56 65 63 74 6f 72 2e 20      ** pVector. 
36b0: 20 54 79 70 69 63 61 6c 6c 79 20 74 68 65 72 65   Typically there
36c0: 20 77 69 6c 6c 20 62 65 20 6d 75 6c 74 69 70 6c   will be multipl
36d0: 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  e TK_SELECT_COLU
36e0: 4d 4e 20 6e 6f 64 65 73 0a 20 20 20 20 2a 2a 20  MN nodes.    ** 
36f0: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 70 4c  with the same pL
3700: 65 66 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  eft pointer to t
3710: 68 65 20 70 56 65 63 74 6f 72 2c 20 62 75 74 20  he pVector, but 
3720: 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 6d  only one of them
3730: 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 6f 77 6e  .    ** will own
3740: 20 74 68 65 20 70 56 65 63 74 6f 72 2e 0a 20 20   the pVector..  
3750: 20 20 2a 2f 0a 20 20 20 20 70 52 65 74 20 3d 20    */.    pRet = 
3760: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
3770: 72 73 65 2c 20 54 4b 5f 53 45 4c 45 43 54 5f 43  rse, TK_SELECT_C
3780: 4f 4c 55 4d 4e 2c 20 30 2c 20 30 2c 20 30 29 3b  OLUMN, 0, 0, 0);
3790: 0a 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b  .    if( pRet ){
37a0: 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 69 43 6f  .      pRet->iCo
37b0: 6c 75 6d 6e 20 3d 20 69 46 69 65 6c 64 3b 0a 20  lumn = iField;. 
37c0: 20 20 20 20 20 70 52 65 74 2d 3e 70 4c 65 66 74       pRet->pLeft
37d0: 20 3d 20 70 56 65 63 74 6f 72 3b 0a 20 20 20 20   = pVector;.    
37e0: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  }.    assert( pR
37f0: 65 74 3d 3d 30 20 7c 7c 20 70 52 65 74 2d 3e 69  et==0 || pRet->i
3800: 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 7d 65  Table==0 );.  }e
3810: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 56 65  lse{.    if( pVe
3820: 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 45 43  ctor->op==TK_VEC
3830: 54 4f 52 20 29 20 70 56 65 63 74 6f 72 20 3d 20  TOR ) pVector = 
3840: 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74  pVector->x.pList
3850: 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70  ->a[iField].pExp
3860: 72 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71  r;.    pRet = sq
3870: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61  lite3ExprDup(pPa
3880: 72 73 65 2d 3e 64 62 2c 20 70 56 65 63 74 6f 72  rse->db, pVector
3890: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
38a0: 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69  rn pRet;.}.#endi
38b0: 66 20 2f 2a 20 21 64 65 66 69 6e 65 28 53 51 4c  f /* !define(SQL
38c0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
38d0: 59 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  Y) */../*.** If 
38e0: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
38f0: 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f 53   is of type TK_S
3900: 45 4c 45 43 54 2c 20 67 65 6e 65 72 61 74 65 20  ELECT, generate 
3910: 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
3920: 0a 2a 2a 20 69 74 2e 20 52 65 74 75 72 6e 20 74  .** it. Return t
3930: 68 65 20 72 65 67 69 73 74 65 72 20 69 6e 20 77  he register in w
3940: 68 69 63 68 20 74 68 65 20 72 65 73 75 6c 74 20  hich the result 
3950: 69 73 20 73 74 6f 72 65 64 20 28 6f 72 2c 20 69  is stored (or, i
3960: 66 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d 73 65  f the .** sub-se
3970: 6c 65 63 74 20 72 65 74 75 72 6e 73 20 6d 6f 72  lect returns mor
3980: 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d  e than one colum
3990: 6e 2c 20 74 68 65 20 66 69 72 73 74 20 69 6e 20  n, the first in 
39a0: 61 6e 20 61 72 72 61 79 0a 2a 2a 20 6f 66 20 72  an array.** of r
39b0: 65 67 69 73 74 65 72 73 20 69 6e 20 77 68 69 63  egisters in whic
39c0: 68 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  h the result is 
39d0: 73 74 6f 72 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 49  stored)..**.** I
39e0: 66 20 70 45 78 70 72 20 69 73 20 6e 6f 74 20 61  f pExpr is not a
39f0: 20 54 4b 5f 53 45 4c 45 43 54 20 65 78 70 72 65   TK_SELECT expre
3a00: 73 73 69 6f 6e 2c 20 72 65 74 75 72 6e 20 30 2e  ssion, return 0.
3a10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
3a20: 78 70 72 43 6f 64 65 53 75 62 73 65 6c 65 63 74  xprCodeSubselect
3a30: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
3a40: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
3a50: 69 6e 74 20 72 65 67 20 3d 20 30 3b 0a 23 69 66  int reg = 0;.#if
3a60: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3a70: 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20  _SUBQUERY.  if( 
3a80: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
3a90: 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65 67 20  LECT ){.    reg 
3aa0: 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62  = sqlite3CodeSub
3ab0: 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
3ac0: 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  Expr, 0, 0);.  }
3ad0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
3ae0: 20 72 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41   reg;.}../*.** A
3af0: 72 67 75 6d 65 6e 74 20 70 56 65 63 74 6f 72 20  rgument pVector 
3b00: 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 65 63 74  points to a vect
3b10: 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 2d 20  or expression - 
3b20: 65 69 74 68 65 72 20 61 20 54 4b 5f 56 45 43 54  either a TK_VECT
3b30: 4f 52 0a 2a 2a 20 6f 72 20 54 4b 5f 53 45 4c 45  OR.** or TK_SELE
3b40: 43 54 20 74 68 61 74 20 72 65 74 75 72 6e 73 20  CT that returns 
3b50: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f  more than one co
3b60: 6c 75 6d 6e 2e 20 54 68 69 73 20 66 75 6e 63 74  lumn. This funct
3b70: 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74  ion returns.** t
3b80: 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  he register numb
3b90: 65 72 20 6f 66 20 61 20 72 65 67 69 73 74 65 72  er of a register
3ba0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
3bb0: 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65  he value of.** e
3bc0: 6c 65 6d 65 6e 74 20 69 46 69 65 6c 64 20 6f 66  lement iField of
3bd0: 20 74 68 65 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a   the vector..**.
3be0: 2a 2a 20 49 66 20 70 56 65 63 74 6f 72 20 69 73  ** If pVector is
3bf0: 20 61 20 54 4b 5f 53 45 4c 45 43 54 20 65 78 70   a TK_SELECT exp
3c00: 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20 63 6f  ression, then co
3c10: 64 65 20 66 6f 72 20 69 74 20 6d 75 73 74 20 68  de for it must h
3c20: 61 76 65 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20  ave .** already 
3c30: 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 20 75  been generated u
3c40: 73 69 6e 67 20 74 68 65 20 65 78 70 72 43 6f 64  sing the exprCod
3c50: 65 53 75 62 73 65 6c 65 63 74 28 29 20 72 6f 75  eSubselect() rou
3c60: 74 69 6e 65 2e 20 49 6e 20 74 68 69 73 0a 2a 2a  tine. In this.**
3c70: 20 63 61 73 65 20 70 61 72 61 6d 65 74 65 72 20   case parameter 
3c80: 72 65 67 53 65 6c 65 63 74 20 73 68 6f 75 6c 64  regSelect should
3c90: 20 62 65 20 74 68 65 20 66 69 72 73 74 20 69 6e   be the first in
3ca0: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   an array of reg
3cb0: 69 73 74 65 72 73 0a 2a 2a 20 63 6f 6e 74 61 69  isters.** contai
3cc0: 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73  ning the results
3cd0: 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65   of the sub-sele
3ce0: 63 74 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56  ct. .**.** If pV
3cf0: 65 63 74 6f 72 20 69 73 20 6f 66 20 74 79 70 65  ector is of type
3d00: 20 54 4b 5f 56 45 43 54 4f 52 2c 20 74 68 65 6e   TK_VECTOR, then
3d10: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 72 65   code for the re
3d20: 71 75 65 73 74 65 64 20 66 69 65 6c 64 0a 2a 2a  quested field.**
3d30: 20 69 73 20 67 65 6e 65 72 61 74 65 64 2e 20 49   is generated. I
3d40: 6e 20 74 68 69 73 20 63 61 73 65 20 28 2a 70 52  n this case (*pR
3d50: 65 67 46 72 65 65 29 20 6d 61 79 20 62 65 20 73  egFree) may be s
3d60: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
3d70: 20 6f 66 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61   of.** a tempora
3d80: 72 79 20 72 65 67 69 73 74 65 72 20 74 6f 20 62  ry register to b
3d90: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
3da0: 61 6c 6c 65 72 20 62 65 66 6f 72 65 20 72 65 74  aller before ret
3db0: 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 42 65  urning..**.** Be
3dc0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
3dd0: 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  output parameter
3de0: 20 28 2a 70 70 45 78 70 72 29 20 69 73 20 73 65   (*ppExpr) is se
3df0: 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
3e00: 65 0a 2a 2a 20 45 78 70 72 20 6f 62 6a 65 63 74  e.** Expr object
3e10: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
3e20: 6f 20 65 6c 65 6d 65 6e 74 20 69 45 6c 65 6d 20  o element iElem 
3e30: 6f 66 20 74 68 65 20 76 65 63 74 6f 72 2e 0a 2a  of the vector..*
3e40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
3e50: 72 56 65 63 74 6f 72 52 65 67 69 73 74 65 72 28  rVectorRegister(
3e60: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
3e70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3e80: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
3e90: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
3ea0: 56 65 63 74 6f 72 2c 20 20 20 20 20 20 20 20 20  Vector,         
3eb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65 63 74           /* Vect
3ec0: 6f 72 20 74 6f 20 65 78 74 72 61 63 74 20 65 6c  or to extract el
3ed0: 65 6d 65 6e 74 20 66 72 6f 6d 20 2a 2f 0a 20 20  ement from */.  
3ee0: 69 6e 74 20 69 46 69 65 6c 64 2c 20 20 20 20 20  int iField,     
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f00: 2f 2a 20 46 69 65 6c 64 20 74 6f 20 65 78 74 72  /* Field to extr
3f10: 61 63 74 20 66 72 6f 6d 20 70 56 65 63 74 6f 72  act from pVector
3f20: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 53 65 6c   */.  int regSel
3f30: 65 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ect,            
3f40: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 69        /* First i
3f50: 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73  n array of regis
3f60: 74 65 72 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ters */.  Expr *
3f70: 2a 70 70 45 78 70 72 2c 20 20 20 20 20 20 20 20  *ppExpr,        
3f80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
3f90: 3a 20 45 78 70 72 65 73 73 69 6f 6e 20 65 6c 65  : Expression ele
3fa0: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ment */.  int *p
3fb0: 52 65 67 46 72 65 65 20 20 20 20 20 20 20 20 20  RegFree         
3fc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
3fd0: 3a 20 54 65 6d 70 20 72 65 67 69 73 74 65 72 20  : Temp register 
3fe0: 74 6f 20 66 72 65 65 20 2a 2f 0a 29 7b 0a 20 20  to free */.){.  
3ff0: 75 38 20 6f 70 20 3d 20 70 56 65 63 74 6f 72 2d  u8 op = pVector-
4000: 3e 6f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  >op;.  assert( o
4010: 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 7c 7c 20  p==TK_VECTOR || 
4020: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 7c 7c  op==TK_SELECT ||
4030: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
4040: 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   );.  if( op==TK
4050: 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20  _REGISTER ){.   
4060: 20 2a 70 70 45 78 70 72 20 3d 20 73 71 6c 69 74   *ppExpr = sqlit
4070: 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62  e3VectorFieldSub
4080: 65 78 70 72 28 70 56 65 63 74 6f 72 2c 20 69 46  expr(pVector, iF
4090: 69 65 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72  ield);.    retur
40a0: 6e 20 70 56 65 63 74 6f 72 2d 3e 69 54 61 62 6c  n pVector->iTabl
40b0: 65 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20  e+iField;.  }.  
40c0: 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  if( op==TK_SELEC
40d0: 54 20 29 7b 0a 20 20 20 20 2a 70 70 45 78 70 72  T ){.    *ppExpr
40e0: 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 53   = pVector->x.pS
40f0: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  elect->pEList->a
4100: 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70 72 3b 0a  [iField].pExpr;.
4110: 20 20 20 20 20 72 65 74 75 72 6e 20 72 65 67 53       return regS
4120: 65 6c 65 63 74 2b 69 46 69 65 6c 64 3b 0a 20 20  elect+iField;.  
4130: 7d 0a 20 20 2a 70 70 45 78 70 72 20 3d 20 70 56  }.  *ppExpr = pV
4140: 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  ector->x.pList->
4150: 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70 72 3b  a[iField].pExpr;
4160: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
4170: 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
4180: 61 72 73 65 2c 20 2a 70 70 45 78 70 72 2c 20 70  arse, *ppExpr, p
4190: 52 65 67 46 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a  RegFree);.}../*.
41a0: 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70 45  ** Expression pE
41b0: 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69  xpr is a compari
41c0: 73 6f 6e 20 62 65 74 77 65 65 6e 20 74 77 6f 20  son between two 
41d0: 76 65 63 74 6f 72 20 76 61 6c 75 65 73 2e 20 43  vector values. C
41e0: 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 72 65  ompute.** the re
41f0: 73 75 6c 74 20 6f 66 20 74 68 65 20 63 6f 6d 70  sult of the comp
4200: 61 72 69 73 6f 6e 20 28 31 2c 20 30 2c 20 6f 72  arison (1, 0, or
4210: 20 4e 55 4c 4c 29 20 61 6e 64 20 77 72 69 74 65   NULL) and write
4220: 20 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c 74 20   that.** result 
4230: 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 64 65  into register de
4240: 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  st..**.** The ca
4250: 6c 6c 65 72 20 6d 75 73 74 20 73 61 74 69 73 66  ller must satisf
4260: 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
4270: 70 72 65 63 6f 6e 64 69 74 69 6f 6e 73 3a 0a 2a  preconditions:.*
4280: 2a 0a 2a 2a 20 20 20 20 69 66 20 70 45 78 70 72  *.**    if pExpr
4290: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 3a 20 20 20 20  ->op==TK_IS:    
42a0: 20 20 6f 70 3d 3d 54 4b 5f 45 51 20 61 6e 64 20    op==TK_EQ and 
42b0: 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  p5==SQLITE_NULLE
42c0: 51 0a 2a 2a 20 20 20 20 69 66 20 70 45 78 70 72  Q.**    if pExpr
42d0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 3a 20  ->op==TK_ISNOT: 
42e0: 20 20 6f 70 3d 3d 54 4b 5f 4e 45 20 61 6e 64 20    op==TK_NE and 
42f0: 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  p5==SQLITE_NULLE
4300: 51 0a 2a 2a 20 20 20 20 6f 74 68 65 72 77 69 73  Q.**    otherwis
4310: 65 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e:              
4320: 20 20 6f 70 3d 3d 70 45 78 70 72 2d 3e 6f 70 20    op==pExpr->op 
4330: 61 6e 64 20 70 35 3d 3d 30 0a 2a 2f 0a 73 74 61  and p5==0.*/.sta
4340: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 56 65 63  tic void codeVec
4350: 74 6f 72 43 6f 6d 70 61 72 65 28 0a 20 20 50 61  torCompare(.  Pa
4360: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4370: 20 20 20 20 2f 2a 20 43 6f 64 65 20 67 65 6e 65      /* Code gene
4380: 72 61 74 6f 72 20 63 6f 6e 74 65 78 74 20 2a 2f  rator context */
4390: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
43a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
43b0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
43c0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65  tion */.  int de
43d0: 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
43e0: 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74 73  /* Write results
43f0: 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73   into this regis
4400: 74 65 72 20 2a 2f 0a 20 20 75 38 20 6f 70 2c 20  ter */.  u8 op, 
4410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4420: 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  * Comparison ope
4430: 72 61 74 6f 72 20 2a 2f 0a 20 20 75 38 20 70 35  rator */.  u8 p5
4440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4450: 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45   /* SQLITE_NULLE
4460: 51 20 6f 72 20 7a 65 72 6f 20 2a 2f 0a 29 7b 0a  Q or zero */.){.
4470: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
4480: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 45 78 70  se->pVdbe;.  Exp
4490: 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
44a0: 2d 3e 70 4c 65 66 74 3b 0a 20 20 45 78 70 72 20  ->pLeft;.  Expr 
44b0: 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  *pRight = pExpr-
44c0: 3e 70 52 69 67 68 74 3b 0a 20 20 69 6e 74 20 6e  >pRight;.  int n
44d0: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
44e0: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65  prVectorSize(pLe
44f0: 66 74 29 3b 0a 20 20 69 6e 74 20 6e 52 69 67 68  ft);.  int nRigh
4500: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  t = sqlite3ExprV
4510: 65 63 74 6f 72 53 69 7a 65 28 70 52 69 67 68 74  ectorSize(pRight
4520: 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
4530: 68 61 74 20 62 6f 74 68 20 73 69 64 65 73 20 6f  hat both sides o
4540: 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
4550: 20 61 72 65 20 76 65 63 74 6f 72 73 2c 20 61 6e   are vectors, an
4560: 64 20 74 68 61 74 0a 20 20 2a 2a 20 62 6f 74 68  d that.  ** both
4570: 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 6c 65   are the same le
4580: 6e 67 74 68 2e 20 20 2a 2f 0a 20 20 69 66 28 20  ngth.  */.  if( 
4590: 6e 4c 65 66 74 21 3d 6e 52 69 67 68 74 20 29 7b  nLeft!=nRight ){
45a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
45b0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72 6f  rMsg(pParse, "ro
45c0: 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22  w value misused"
45d0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
45e0: 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 72  int i;.    int r
45f0: 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20  egLeft = 0;.    
4600: 69 6e 74 20 72 65 67 52 69 67 68 74 20 3d 20 30  int regRight = 0
4610: 3b 0a 20 20 20 20 75 38 20 6f 70 78 20 3d 20 6f  ;.    u8 opx = o
4620: 70 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 44  p;.    int addrD
4630: 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  one = sqlite3Vdb
4640: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
4650: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
4660: 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20  r->op==TK_EQ || 
4670: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45  pExpr->op==TK_NE
4680: 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45   .         || pE
4690: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c  xpr->op==TK_IS |
46a0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
46b0: 49 53 4e 4f 54 20 0a 20 20 20 20 20 20 20 20 20  ISNOT .         
46c0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
46d0: 5f 4c 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _LT || pExpr->op
46e0: 3d 3d 54 4b 5f 47 54 20 0a 20 20 20 20 20 20 20  ==TK_GT .       
46f0: 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d    || pExpr->op==
4700: 54 4b 5f 4c 45 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_LE || pExpr->
4710: 6f 70 3d 3d 54 4b 5f 47 45 20 0a 20 20 20 20 29  op==TK_GE .    )
4720: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
4730: 78 70 72 2d 3e 6f 70 3d 3d 6f 70 20 7c 7c 20 28  xpr->op==op || (
4740: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
4750: 20 26 26 20 6f 70 3d 3d 54 4b 5f 45 51 29 0a 20   && op==TK_EQ). 
4760: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
4770: 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  (pExpr->op==TK_I
4780: 53 4e 4f 54 20 26 26 20 6f 70 3d 3d 54 4b 5f 4e  SNOT && op==TK_N
4790: 45 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  E) );.    assert
47a0: 28 20 70 35 3d 3d 30 20 7c 7c 20 70 45 78 70 72  ( p5==0 || pExpr
47b0: 2d 3e 6f 70 21 3d 6f 70 20 29 3b 0a 20 20 20 20  ->op!=op );.    
47c0: 61 73 73 65 72 74 28 20 70 35 3d 3d 53 51 4c 49  assert( p5==SQLI
47d0: 54 45 5f 4e 55 4c 4c 45 51 20 7c 7c 20 70 45 78  TE_NULLEQ || pEx
47e0: 70 72 2d 3e 6f 70 3d 3d 6f 70 20 29 3b 0a 0a 20  pr->op==op );.. 
47f0: 20 20 20 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f     p5 |= SQLITE_
4800: 53 54 4f 52 45 50 32 3b 0a 20 20 20 20 69 66 28  STOREP2;.    if(
4810: 20 6f 70 78 3d 3d 54 4b 5f 4c 45 20 29 20 6f 70   opx==TK_LE ) op
4820: 78 20 3d 20 54 4b 5f 4c 54 3b 0a 20 20 20 20 69  x = TK_LT;.    i
4830: 66 28 20 6f 70 78 3d 3d 54 4b 5f 47 45 20 29 20  f( opx==TK_GE ) 
4840: 6f 70 78 20 3d 20 54 4b 5f 47 54 3b 0a 0a 20 20  opx = TK_GT;..  
4850: 20 20 72 65 67 4c 65 66 74 20 3d 20 65 78 70 72    regLeft = expr
4860: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
4870: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
4880: 20 20 72 65 67 52 69 67 68 74 20 3d 20 65 78 70    regRight = exp
4890: 72 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  rCodeSubselect(p
48a0: 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a  Parse, pRight);.
48b0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
48c0: 6e 4c 65 66 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  nLeft; i++){.   
48d0: 20 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20     int regFree1 
48e0: 3d 20 30 2c 20 72 65 67 46 72 65 65 32 20 3d 20  = 0, regFree2 = 
48f0: 30 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  0;.      Expr *p
4900: 4c 2c 20 2a 70 52 3b 20 0a 20 20 20 20 20 20 69  L, *pR; .      i
4910: 6e 74 20 72 31 2c 20 72 32 3b 0a 20 20 20 20 20  nt r1, r2;.     
4920: 20 69 66 28 20 69 3e 30 20 29 20 73 71 6c 69 74   if( i>0 ) sqlit
4930: 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
4940: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72  pParse);.      r
4950: 31 20 3d 20 65 78 70 72 56 65 63 74 6f 72 52 65  1 = exprVectorRe
4960: 67 69 73 74 65 72 28 70 50 61 72 73 65 2c 20 70  gister(pParse, p
4970: 4c 65 66 74 2c 20 69 2c 20 72 65 67 4c 65 66 74  Left, i, regLeft
4980: 2c 20 26 70 4c 2c 20 26 72 65 67 46 72 65 65 31  , &pL, &regFree1
4990: 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 65 78  );.      r2 = ex
49a0: 70 72 56 65 63 74 6f 72 52 65 67 69 73 74 65 72  prVectorRegister
49b0: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
49c0: 20 69 2c 20 72 65 67 52 69 67 68 74 2c 20 26 70   i, regRight, &p
49d0: 52 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  R, &regFree2);. 
49e0: 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
49f0: 28 70 50 61 72 73 65 2c 20 70 4c 2c 20 70 52 2c  (pParse, pL, pR,
4a00: 20 6f 70 78 2c 20 72 31 2c 20 72 32 2c 20 64 65   opx, r1, r2, de
4a10: 73 74 2c 20 70 35 29 3b 0a 20 20 20 20 20 20 74  st, p5);.      t
4a20: 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
4a30: 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
4a40: 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  If(v,op==OP_Lt);
4a50: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
4a60: 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65  op==OP_Le); Vdbe
4a70: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
4a80: 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 74  =OP_Le);.      t
4a90: 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
4aa0: 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
4ab0: 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b  If(v,op==OP_Gt);
4ac0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
4ad0: 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65  op==OP_Ge); Vdbe
4ae0: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
4af0: 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 74  =OP_Ge);.      t
4b00: 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45  estcase(op==OP_E
4b10: 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  q); VdbeCoverage
4b20: 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b  If(v,op==OP_Eq);
4b30: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
4b40: 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65  op==OP_Ne); Vdbe
4b50: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
4b60: 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 73  =OP_Ne);.      s
4b70: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
4b80: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
4b90: 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71  Free1);.      sq
4ba0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
4bb0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
4bc0: 72 65 65 32 29 3b 0a 20 20 20 20 20 20 69 66 28  ree2);.      if(
4bd0: 20 69 3e 30 20 29 20 73 71 6c 69 74 65 33 45 78   i>0 ) sqlite3Ex
4be0: 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
4bf0: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d  e);.      if( i=
4c00: 3d 6e 4c 65 66 74 2d 31 20 29 7b 0a 20 20 20 20  =nLeft-1 ){.    
4c10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4c20: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6f 70 78   }.      if( opx
4c30: 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20 20  ==TK_EQ ){.     
4c40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4c50: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp2(v, OP_IfNot
4c60: 2c 20 64 65 73 74 2c 20 61 64 64 72 44 6f 6e 65  , dest, addrDone
4c70: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
4c80: 76 29 3b 0a 20 20 20 20 20 20 20 20 70 35 20 7c  v);.        p5 |
4c90: 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c  = SQLITE_KEEPNUL
4ca0: 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  L;.      }else i
4cb0: 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20 29 7b  f( opx==TK_NE ){
4cc0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4cd0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4ce0: 5f 49 66 2c 20 64 65 73 74 2c 20 61 64 64 72 44  _If, dest, addrD
4cf0: 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  one); VdbeCovera
4d00: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 70  ge(v);.        p
4d10: 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50  5 |= SQLITE_KEEP
4d20: 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73  NULL;.      }els
4d30: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
4d40: 74 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20  t( op==TK_LT || 
4d50: 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d  op==TK_GT || op=
4d60: 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 54 4b  =TK_LE || op==TK
4d70: 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 20 20 73  _GE );.        s
4d80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
4d90: 28 76 2c 20 4f 50 5f 45 6c 73 65 4e 6f 74 45 71  (v, OP_ElseNotEq
4da0: 2c 20 30 2c 20 61 64 64 72 44 6f 6e 65 29 3b 0a  , 0, addrDone);.
4db0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
4dc0: 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
4dd0: 5f 4c 54 29 3b 0a 20 20 20 20 20 20 20 20 56 64  _LT);.        Vd
4de0: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
4df0: 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a 20 20 20 20  op==TK_GT);.    
4e00: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
4e10: 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 45 29  If(v, op==TK_LE)
4e20: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
4e30: 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
4e40: 54 4b 5f 47 45 29 3b 0a 20 20 20 20 20 20 20 20  TK_GE);.        
4e50: 69 66 28 20 69 3d 3d 6e 4c 65 66 74 2d 32 20 29  if( i==nLeft-2 )
4e60: 20 6f 70 78 20 3d 20 6f 70 3b 0a 20 20 20 20 20   opx = op;.     
4e70: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
4e80: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
4e90: 61 62 65 6c 28 76 2c 20 61 64 64 72 44 6f 6e 65  abel(v, addrDone
4ea0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 53 51  );.  }.}..#if SQ
4eb0: 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
4ec0: 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 65 63  PTH>0./*.** Chec
4ed0: 6b 20 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20  k that argument 
4ee0: 6e 48 65 69 67 68 74 20 69 73 20 6c 65 73 73 20  nHeight is less 
4ef0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
4f00: 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20   the maximum.** 
4f10: 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68  expression depth
4f20: 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20 69 74 20   allowed. If it 
4f30: 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65 20 61 6e  is not, leave an
4f40: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
4f50: 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  n.** pParse..*/.
4f60: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
4f70: 68 65 63 6b 48 65 69 67 68 74 28 50 61 72 73 65  heckHeight(Parse
4f80: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 48   *pParse, int nH
4f90: 65 69 67 68 74 29 7b 0a 20 20 69 6e 74 20 72 63  eight){.  int rc
4fa0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
4fb0: 69 6e 74 20 6d 78 48 65 69 67 68 74 20 3d 20 70  int mxHeight = p
4fc0: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69  Parse->db->aLimi
4fd0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45  t[SQLITE_LIMIT_E
4fe0: 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20 20 69 66  XPR_DEPTH];.  if
4ff0: 28 20 6e 48 65 69 67 68 74 3e 6d 78 48 65 69 67  ( nHeight>mxHeig
5000: 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ht ){.    sqlite
5010: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
5020: 2c 20 0a 20 20 20 20 20 20 20 22 45 78 70 72 65  , .       "Expre
5030: 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20 74 6f  ssion tree is to
5040: 6f 20 6c 61 72 67 65 20 28 6d 61 78 69 6d 75 6d  o large (maximum
5050: 20 64 65 70 74 68 20 25 64 29 22 2c 20 6d 78 48   depth %d)", mxH
5060: 65 69 67 68 74 0a 20 20 20 20 29 3b 0a 20 20 20  eight.    );.   
5070: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
5080: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
5090: 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 66   rc;.}../* The f
50a0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 66  ollowing three f
50b0: 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69 67 68 74  unctions, height
50c0: 4f 66 45 78 70 72 28 29 2c 20 68 65 69 67 68 74  OfExpr(), height
50d0: 4f 66 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a 20  OfExprList().** 
50e0: 61 6e 64 20 68 65 69 67 68 74 4f 66 53 65 6c 65  and heightOfSele
50f0: 63 74 28 29 2c 20 61 72 65 20 75 73 65 64 20 74  ct(), are used t
5100: 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
5110: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 0a 2a  maximum height.*
5120: 2a 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73  * of any express
5130: 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e  ion tree referen
5140: 63 65 64 20 62 79 20 74 68 65 20 73 74 72 75 63  ced by the struc
5150: 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20 74  ture passed as t
5160: 68 65 0a 2a 2a 20 66 69 72 73 74 20 61 72 67 75  he.** first argu
5170: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ment..**.** If t
5180: 68 69 73 20 6d 61 78 69 6d 75 6d 20 68 65 69 67  his maximum heig
5190: 68 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ht is greater th
51a0: 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  an the current v
51b0: 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a 2a 2a 20  alue pointed.** 
51c0: 74 6f 20 62 79 20 70 6e 48 65 69 67 68 74 2c 20  to by pnHeight, 
51d0: 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
51e0: 65 74 65 72 2c 20 74 68 65 6e 20 73 65 74 20 2a  eter, then set *
51f0: 70 6e 48 65 69 67 68 74 20 74 6f 20 74 68 61 74  pnHeight to that
5200: 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  .** value..*/.st
5210: 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74  atic void height
5220: 4f 66 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20  OfExpr(Expr *p, 
5230: 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a  int *pnHeight){.
5240: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
5250: 66 28 20 70 2d 3e 6e 48 65 69 67 68 74 3e 2a 70  f( p->nHeight>*p
5260: 6e 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20 20  nHeight ){.     
5270: 20 2a 70 6e 48 65 69 67 68 74 20 3d 20 70 2d 3e   *pnHeight = p->
5280: 6e 48 65 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20  nHeight;.    }. 
5290: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
52a0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
52b0: 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69  t(ExprList *p, i
52c0: 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20  nt *pnHeight){. 
52d0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e   if( p ){.    in
52e0: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
52f0: 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b  ; i<p->nExpr; i+
5300: 2b 29 7b 0a 20 20 20 20 20 20 68 65 69 67 68 74  +){.      height
5310: 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69 5d 2e 70  OfExpr(p->a[i].p
5320: 45 78 70 72 2c 20 70 6e 48 65 69 67 68 74 29 3b  Expr, pnHeight);
5330: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61  .    }.  }.}.sta
5340: 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f  tic void heightO
5350: 66 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a  fSelect(Select *
5360: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
5370: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
5380: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
5390: 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48 65 69 67  ->pWhere, pnHeig
53a0: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
53b0: 66 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67  fExpr(p->pHaving
53c0: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
53d0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
53e0: 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65 69 67 68  >pLimit, pnHeigh
53f0: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
5400: 45 78 70 72 28 70 2d 3e 70 4f 66 66 73 65 74 2c  Expr(p->pOffset,
5410: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
5420: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
5430: 28 70 2d 3e 70 45 4c 69 73 74 2c 20 70 6e 48 65  (p->pEList, pnHe
5440: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
5450: 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  tOfExprList(p->p
5460: 47 72 6f 75 70 42 79 2c 20 70 6e 48 65 69 67 68  GroupBy, pnHeigh
5470: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
5480: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64  ExprList(p->pOrd
5490: 65 72 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b  erBy, pnHeight);
54a0: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c  .    heightOfSel
54b0: 65 63 74 28 70 2d 3e 70 50 72 69 6f 72 2c 20 70  ect(p->pPrior, p
54c0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a  nHeight);.  }.}.
54d0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45  ./*.** Set the E
54e0: 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72 69  xpr.nHeight vari
54f0: 61 62 6c 65 20 69 6e 20 74 68 65 20 73 74 72 75  able in the stru
5500: 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20  cture passed as 
5510: 61 6e 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  an .** argument.
5520: 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 77   An expression w
5530: 69 74 68 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2c  ith no children,
5540: 20 45 78 70 72 2e 70 4c 69 73 74 20 6f 72 20 0a   Expr.pList or .
5550: 2a 2a 20 45 78 70 72 2e 70 53 65 6c 65 63 74 20  ** Expr.pSelect 
5560: 6d 65 6d 62 65 72 20 68 61 73 20 61 20 68 65 69  member has a hei
5570: 67 68 74 20 6f 66 20 31 2e 20 41 6e 79 20 6f 74  ght of 1. Any ot
5580: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  her expression.*
5590: 2a 20 68 61 73 20 61 20 68 65 69 67 68 74 20 65  * has a height e
55a0: 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78 69  qual to the maxi
55b0: 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e  mum height of an
55c0: 79 20 6f 74 68 65 72 20 0a 2a 2a 20 72 65 66 65  y other .** refe
55d0: 72 65 6e 63 65 64 20 45 78 70 72 20 70 6c 75 73  renced Expr plus
55e0: 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f   one..**.** Also
55f0: 20 70 72 6f 70 61 67 61 74 65 20 45 50 5f 50 72   propagate EP_Pr
5600: 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20 75 70  opagate flags up
5610: 20 66 72 6f 6d 20 45 78 70 72 2e 78 2e 70 4c 69   from Expr.x.pLi
5620: 73 74 20 74 6f 20 45 78 70 72 2e 66 6c 61 67 73  st to Expr.flags
5630: 2c 0a 2a 2a 20 69 66 20 61 70 70 72 6f 70 72 69  ,.** if appropri
5640: 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ate..*/.static v
5650: 6f 69 64 20 65 78 70 72 53 65 74 48 65 69 67 68  oid exprSetHeigh
5660: 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e  t(Expr *p){.  in
5670: 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20  t nHeight = 0;. 
5680: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
5690: 3e 70 4c 65 66 74 2c 20 26 6e 48 65 69 67 68 74  >pLeft, &nHeight
56a0: 29 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70  );.  heightOfExp
56b0: 72 28 70 2d 3e 70 52 69 67 68 74 2c 20 26 6e 48  r(p->pRight, &nH
56c0: 65 69 67 68 74 29 3b 0a 20 20 69 66 28 20 45 78  eight);.  if( Ex
56d0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
56e0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
56f0: 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53 65  {.    heightOfSe
5700: 6c 65 63 74 28 70 2d 3e 78 2e 70 53 65 6c 65 63  lect(p->x.pSelec
5710: 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, &nHeight);.  
5720: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 78 2e 70  }else if( p->x.p
5730: 4c 69 73 74 20 29 7b 0a 20 20 20 20 68 65 69 67  List ){.    heig
5740: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
5750: 78 2e 70 4c 69 73 74 2c 20 26 6e 48 65 69 67 68  x.pList, &nHeigh
5760: 74 29 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73  t);.    p->flags
5770: 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65   |= EP_Propagate
5780: 20 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   & sqlite3ExprLi
5790: 73 74 46 6c 61 67 73 28 70 2d 3e 78 2e 70 4c 69  stFlags(p->x.pLi
57a0: 73 74 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48  st);.  }.  p->nH
57b0: 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68 74 20  eight = nHeight 
57c0: 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  + 1;.}../*.** Se
57d0: 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67  t the Expr.nHeig
57e0: 68 74 20 76 61 72 69 61 62 6c 65 20 75 73 69 6e  ht variable usin
57f0: 67 20 74 68 65 20 65 78 70 72 53 65 74 48 65 69  g the exprSetHei
5800: 67 68 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20  ght() function. 
5810: 49 66 0a 2a 2a 20 74 68 65 20 68 65 69 67 68 74  If.** the height
5820: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
5830: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c   the maximum all
5840: 6f 77 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20  owed expression 
5850: 64 65 70 74 68 2c 0a 2a 2a 20 6c 65 61 76 65 20  depth,.** leave 
5860: 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72  an error in pPar
5870: 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70  se..**.** Also p
5880: 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45 50 5f  ropagate all EP_
5890: 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20  Propagate flags 
58a0: 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e  from the Expr.x.
58b0: 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45 78  pList into.** Ex
58c0: 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f  pr.flags. .*/.vo
58d0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53 65  id sqlite3ExprSe
58e0: 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28  tHeightAndFlags(
58f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
5900: 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  xpr *p){.  if( p
5910: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
5920: 74 75 72 6e 3b 0a 20 20 65 78 70 72 53 65 74 48  turn;.  exprSetH
5930: 65 69 67 68 74 28 70 29 3b 0a 20 20 73 71 6c 69  eight(p);.  sqli
5940: 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67  te3ExprCheckHeig
5950: 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48  ht(pParse, p->nH
5960: 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eight);.}../*.**
5970: 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69   Return the maxi
5980: 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e  mum height of an
5990: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  y expression tre
59a0: 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20  e referenced.** 
59b0: 62 79 20 74 68 65 20 73 65 6c 65 63 74 20 73 74  by the select st
59c0: 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
59d0: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  s an argument..*
59e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c  /.int sqlite3Sel
59f0: 65 63 74 45 78 70 72 48 65 69 67 68 74 28 53 65  ectExprHeight(Se
5a00: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20  lect *p){.  int 
5a10: 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68  nHeight = 0;.  h
5a20: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2c  eightOfSelect(p,
5a30: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 72 65   &nHeight);.  re
5a40: 74 75 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d 0a  turn nHeight;.}.
5a50: 23 65 6c 73 65 20 2f 2a 20 41 42 4f 56 45 3a 20  #else /* ABOVE: 
5a60: 20 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65 6d   Height enforcem
5a70: 65 6e 74 20 65 6e 61 62 6c 65 64 2e 20 20 42 45  ent enabled.  BE
5a80: 4c 4f 57 3a 20 48 65 69 67 68 74 20 65 6e 66 6f  LOW: Height enfo
5a90: 72 63 65 6d 65 6e 74 20 6f 66 66 20 2a 2f 0a 2f  rcement off */./
5aa0: 2a 0a 2a 2a 20 50 72 6f 70 61 67 61 74 65 20 61  *.** Propagate a
5ab0: 6c 6c 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20  ll EP_Propagate 
5ac0: 66 6c 61 67 73 20 66 72 6f 6d 20 74 68 65 20 45  flags from the E
5ad0: 78 70 72 2e 78 2e 70 4c 69 73 74 20 69 6e 74 6f  xpr.x.pList into
5ae0: 0a 2a 2a 20 45 78 70 72 2e 66 6c 61 67 73 2e 20  .** Expr.flags. 
5af0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5b00: 45 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64  ExprSetHeightAnd
5b10: 46 6c 61 67 73 28 50 61 72 73 65 20 2a 70 50 61  Flags(Parse *pPa
5b20: 72 73 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20  rse, Expr *p){. 
5b30: 20 69 66 28 20 70 20 26 26 20 70 2d 3e 78 2e 70   if( p && p->x.p
5b40: 4c 69 73 74 20 26 26 20 21 45 78 70 72 48 61 73  List && !ExprHas
5b50: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
5b60: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
5b70: 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f   p->flags |= EP_
5b80: 50 72 6f 70 61 67 61 74 65 20 26 20 73 71 6c 69  Propagate & sqli
5b90: 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73  te3ExprListFlags
5ba0: 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  (p->x.pList);.  
5bb0: 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 65 78 70 72  }.}.#define expr
5bc0: 53 65 74 48 65 69 67 68 74 28 79 29 0a 23 65 6e  SetHeight(y).#en
5bd0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41  dif /* SQLITE_MA
5be0: 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 20 2a  X_EXPR_DEPTH>0 *
5bf0: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  /../*.** This ro
5c00: 75 74 69 6e 65 20 69 73 20 74 68 65 20 63 6f 72  utine is the cor
5c10: 65 20 61 6c 6c 6f 63 61 74 6f 72 20 66 6f 72 20  e allocator for 
5c20: 45 78 70 72 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a  Expr nodes..**.*
5c30: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65  * Construct a ne
5c40: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  w expression nod
5c50: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  e and return a p
5c60: 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 4d  ointer to it.  M
5c70: 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69  emory.** for thi
5c80: 73 20 6e 6f 64 65 20 61 6e 64 20 66 6f 72 20 74  s node and for t
5c90: 68 65 20 70 54 6f 6b 65 6e 20 61 72 67 75 6d 65  he pToken argume
5ca0: 6e 74 20 69 73 20 61 20 73 69 6e 67 6c 65 20 61  nt is a single a
5cb0: 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 6f 62 74  llocation.** obt
5cc0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
5cd0: 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 20 54  e3DbMalloc().  T
5ce0: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
5cf0: 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e  ion.** is respon
5d00: 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67  sible for making
5d10: 20 73 75 72 65 20 74 68 65 20 6e 6f 64 65 20 65   sure the node e
5d20: 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66  ventually gets f
5d30: 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64  reed..**.** If d
5d40: 65 71 75 6f 74 65 20 69 73 20 74 72 75 65 2c 20  equote is true, 
5d50: 74 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20 28  then the token (
5d60: 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73  if it exists) is
5d70: 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66   dequoted..** If
5d80: 20 64 65 71 75 6f 74 65 20 69 73 20 66 61 6c 73   dequote is fals
5d90: 65 2c 20 6e 6f 20 64 65 71 75 6f 74 69 6e 67 20  e, no dequoting 
5da0: 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 20 54  is performed.  T
5db0: 68 65 20 64 65 51 75 6f 74 65 0a 2a 2a 20 70 61  he deQuote.** pa
5dc0: 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72  rameter is ignor
5dd0: 65 64 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20  ed if pToken is 
5de0: 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 74  NULL or if the t
5df0: 6f 6b 65 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  oken does not.**
5e00: 20 61 70 70 65 61 72 20 74 6f 20 62 65 20 71 75   appear to be qu
5e10: 6f 74 65 64 2e 20 20 49 66 20 74 68 65 20 71 75  oted.  If the qu
5e20: 6f 74 65 73 20 77 65 72 65 20 6f 66 20 74 68 65  otes were of the
5e30: 20 66 6f 72 6d 20 22 2e 2e 2e 22 20 28 64 6f 75   form "..." (dou
5e40: 62 6c 65 2d 71 75 6f 74 65 73 29 0a 2a 2a 20 74  ble-quotes).** t
5e50: 68 65 6e 20 74 68 65 20 45 50 5f 44 62 6c 51 75  hen the EP_DblQu
5e60: 6f 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74  oted flag is set
5e70: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
5e80: 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53  on node..**.** S
5e90: 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20 49 66  pecial case:  If
5ea0: 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20   op==TK_INTEGER 
5eb0: 61 6e 64 20 70 54 6f 6b 65 6e 20 70 6f 69 6e 74  and pToken point
5ec0: 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74 68  s to a string th
5ed0: 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 74 72 61  at.** can be tra
5ee0: 6e 73 6c 61 74 65 64 20 69 6e 74 6f 20 61 20 33  nslated into a 3
5ef0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 74  2-bit integer, t
5f00: 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20 69 73  hen the token is
5f10: 20 6e 6f 74 0a 2a 2a 20 73 74 6f 72 65 64 20 69   not.** stored i
5f20: 6e 20 75 2e 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73  n u.zToken.  Ins
5f30: 74 65 61 64 2c 20 74 68 65 20 69 6e 74 65 67 65  tead, the intege
5f40: 72 20 76 61 6c 75 65 73 20 69 73 20 77 72 69 74  r values is writ
5f50: 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 75 2e 69 56  ten.** into u.iV
5f60: 61 6c 75 65 20 61 6e 64 20 74 68 65 20 45 50 5f  alue and the EP_
5f70: 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 69 73  IntValue flag is
5f80: 20 73 65 74 2e 20 20 4e 6f 20 65 78 74 72 61 20   set.  No extra 
5f90: 73 74 6f 72 61 67 65 0a 2a 2a 20 69 73 20 61 6c  storage.** is al
5fa0: 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20  located to hold 
5fb0: 74 68 65 20 69 6e 74 65 67 65 72 20 74 65 78 74  the integer text
5fc0: 20 61 6e 64 20 74 68 65 20 64 65 71 75 6f 74 65   and the dequote
5fd0: 20 66 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64   flag is ignored
5fe0: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
5ff0: 65 33 45 78 70 72 41 6c 6c 6f 63 28 0a 20 20 73  e3ExprAlloc(.  s
6000: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
6010: 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
6020: 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61   for sqlite3DbMa
6030: 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20  llocZero() (may 
6040: 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e  be null) */.  in
6050: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
6060: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
6070: 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ion opcode */.  
6080: 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f  const Token *pTo
6090: 6b 65 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e  ken,    /* Token
60a0: 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68   argument.  Migh
60b0: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  t be NULL */.  i
60c0: 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20  nt dequote      
60d0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
60e0: 6f 20 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a  o dequote */.){.
60f0: 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
6100: 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a  int nExtra = 0;.
6110: 20 20 69 6e 74 20 69 56 61 6c 75 65 20 3d 20 30    int iValue = 0
6120: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  ;..  assert( db!
6130: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b  =0 );.  if( pTok
6140: 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 70  en ){.    if( op
6150: 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20  !=TK_INTEGER || 
6160: 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20  pToken->z==0.   
6170: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
6180: 33 47 65 74 49 6e 74 33 32 28 70 54 6f 6b 65 6e  3GetInt32(pToken
6190: 2d 3e 7a 2c 20 26 69 56 61 6c 75 65 29 3d 3d 30  ->z, &iValue)==0
61a0: 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61   ){.      nExtra
61b0: 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a   = pToken->n+1;.
61c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 56        assert( iV
61d0: 61 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 20 20 7d  alue>=0 );.    }
61e0: 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71  .  }.  pNew = sq
61f0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
6200: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78  NN(db, sizeof(Ex
6210: 70 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69  pr)+nExtra);.  i
6220: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 6d  f( pNew ){.    m
6230: 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73  emset(pNew, 0, s
6240: 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20  izeof(Expr));.  
6250: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38    pNew->op = (u8
6260: 29 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  )op;.    pNew->i
6270: 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66  Agg = -1;.    if
6280: 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  ( pToken ){.    
6290: 20 20 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20    if( nExtra==0 
62a0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
62b0: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74  >flags |= EP_Int
62c0: 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70  Value;.        p
62d0: 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20  New->u.iValue = 
62e0: 69 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65  iValue;.      }e
62f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  lse{.        pNe
6300: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63  w->u.zToken = (c
6310: 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  har*)&pNew[1];. 
6320: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
6330: 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 7c 7c 20 70  Token->z!=0 || p
6340: 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a 20  Token->n==0 );. 
6350: 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 6b 65         if( pToke
6360: 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70 79 28 70 4e  n->n ) memcpy(pN
6370: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54  ew->u.zToken, pT
6380: 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d  oken->z, pToken-
6390: 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  >n);.        pNe
63a0: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b  w->u.zToken[pTok
63b0: 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  en->n] = 0;.    
63c0: 20 20 20 20 69 66 28 20 64 65 71 75 6f 74 65 20      if( dequote 
63d0: 26 26 20 73 71 6c 69 74 65 33 49 73 71 75 6f 74  && sqlite3Isquot
63e0: 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  e(pNew->u.zToken
63f0: 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
6400: 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 7a 54    if( pNew->u.zT
6410: 6f 6b 65 6e 5b 30 5d 3d 3d 27 22 27 20 29 20 70  oken[0]=='"' ) p
6420: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
6430: 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20  _DblQuoted;.    
6440: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71        sqlite3Deq
6450: 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f  uote(pNew->u.zTo
6460: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ken);.        }.
6470: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
6480: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  f SQLITE_MAX_EXP
6490: 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 70 4e  R_DEPTH>0.    pN
64a0: 65 77 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b  ew->nHeight = 1;
64b0: 0a 23 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20  .#endif  .  }.  
64c0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
64d0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
64e0: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
64f0: 6e 6f 64 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f  node from a zero
6500: 2d 74 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65  -terminated toke
6510: 6e 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c  n that has.** al
6520: 72 65 61 64 79 20 62 65 65 6e 20 64 65 71 75 6f  ready been dequo
6530: 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ted..*/.Expr *sq
6540: 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c  lite3Expr(.  sql
6550: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
6560: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
6570: 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  or sqlite3DbMall
6580: 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65  ocZero() (may be
6590: 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20   null) */.  int 
65a0: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
65b0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
65c0: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  n opcode */.  co
65d0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e  nst char *zToken
65e0: 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61        /* Token a
65f0: 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20  rgument.  Might 
6600: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
6610: 54 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d  Token x;.  x.z =
6620: 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d   zToken;.  x.n =
6630: 20 7a 54 6f 6b 65 6e 20 3f 20 73 71 6c 69 74 65   zToken ? sqlite
6640: 33 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e  3Strlen30(zToken
6650: 29 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ) : 0;.  return 
6660: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
6670: 28 64 62 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b  (db, op, &x, 0);
6680: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68  .}../*.** Attach
6690: 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20   subtrees pLeft 
66a0: 61 6e 64 20 70 52 69 67 68 74 20 74 6f 20 74 68  and pRight to th
66b0: 65 20 45 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f  e Expr node pRoo
66c0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f  t..**.** If pRoo
66d0: 74 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61  t==NULL that mea
66e0: 6e 73 20 74 68 61 74 20 61 20 6d 65 6d 6f 72 79  ns that a memory
66f0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
6700: 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a  r has occurred..
6710: 2a 2a 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  ** In that case,
6720: 20 64 65 6c 65 74 65 20 74 68 65 20 73 75 62 74   delete the subt
6730: 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70  rees pLeft and p
6740: 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Right..*/.void s
6750: 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68  qlite3ExprAttach
6760: 53 75 62 74 72 65 65 73 28 0a 20 20 73 71 6c 69  Subtrees(.  sqli
6770: 74 65 33 20 2a 64 62 2c 0a 20 20 45 78 70 72 20  te3 *db,.  Expr 
6780: 2a 70 52 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a  *pRoot,.  Expr *
6790: 70 4c 65 66 74 2c 0a 20 20 45 78 70 72 20 2a 70  pLeft,.  Expr *p
67a0: 52 69 67 68 74 0a 29 7b 0a 20 20 69 66 28 20 70  Right.){.  if( p
67b0: 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61  Root==0 ){.    a
67c0: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
67d0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73  cFailed );.    s
67e0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
67f0: 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20  (db, pLeft);.   
6800: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
6810: 74 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a  te(db, pRight);.
6820: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
6830: 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   pRight ){.     
6840: 20 70 52 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d   pRoot->pRight =
6850: 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70   pRight;.      p
6860: 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Root->flags |= E
6870: 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 70 52  P_Propagate & pR
6880: 69 67 68 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  ight->flags;.   
6890: 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74   }.    if( pLeft
68a0: 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d   ){.      pRoot-
68b0: 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a  >pLeft = pLeft;.
68c0: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61        pRoot->fla
68d0: 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61  gs |= EP_Propaga
68e0: 74 65 20 26 20 70 4c 65 66 74 2d 3e 66 6c 61 67  te & pLeft->flag
68f0: 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 70  s;.    }.    exp
6900: 72 53 65 74 48 65 69 67 68 74 28 70 52 6f 6f 74  rSetHeight(pRoot
6910: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6920: 41 6c 6c 6f 63 61 74 65 20 61 6e 20 45 78 70 72  Allocate an Expr
6930: 20 6e 6f 64 65 20 77 68 69 63 68 20 6a 6f 69 6e   node which join
6940: 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74 77 6f  s as many as two
6950: 20 73 75 62 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a   subtrees..**.**
6960: 20 4f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20   One or both of 
6970: 74 68 65 20 73 75 62 74 72 65 65 73 20 63 61 6e  the subtrees can
6980: 20 62 65 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72   be NULL.  Retur
6990: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
69a0: 68 65 20 6e 65 77 0a 2a 2a 20 45 78 70 72 20 6e  he new.** Expr n
69b0: 6f 64 65 2e 20 20 4f 72 2c 20 69 66 20 61 6e 20  ode.  Or, if an 
69c0: 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73  OOM error occurs
69d0: 2c 20 73 65 74 20 70 50 61 72 73 65 2d 3e 64 62  , set pParse->db
69e0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a  ->mallocFailed,.
69f0: 2a 2a 20 66 72 65 65 20 74 68 65 20 73 75 62 74  ** free the subt
6a00: 72 65 65 73 20 61 6e 64 20 72 65 74 75 72 6e 20  rees and return 
6a10: 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  NULL..*/.Expr *s
6a20: 71 6c 69 74 65 33 50 45 78 70 72 28 0a 20 20 50  qlite3PExpr(.  P
6a30: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
6a40: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
6a50: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
6a60: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
6a70: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
6a80: 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  sion opcode */. 
6a90: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20   Expr *pLeft,   
6aa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74           /* Left
6ab0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78   operand */.  Ex
6ac0: 70 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20  pr *pRight,     
6ad0: 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f        /* Right o
6ae0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73  perand */.  cons
6af0: 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20  t Token *pToken 
6b00: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
6b10: 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78  token */.){.  Ex
6b20: 70 72 20 2a 70 3b 0a 20 20 69 66 28 20 6f 70 3d  pr *p;.  if( op=
6b30: 3d 54 4b 5f 41 4e 44 20 26 26 20 70 50 61 72 73  =TK_AND && pPars
6b40: 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20  e->nErr==0 ){.  
6b50: 20 20 2f 2a 20 54 61 6b 65 20 61 64 76 61 6e 74    /* Take advant
6b60: 61 67 65 20 6f 66 20 73 68 6f 72 74 2d 63 69 72  age of short-cir
6b70: 63 75 69 74 20 66 61 6c 73 65 20 6f 70 74 69 6d  cuit false optim
6b80: 69 7a 61 74 69 6f 6e 20 66 6f 72 20 41 4e 44 20  ization for AND 
6b90: 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  */.    p = sqlit
6ba0: 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65  e3ExprAnd(pParse
6bb0: 2d 3e 64 62 2c 20 70 4c 65 66 74 2c 20 70 52 69  ->db, pLeft, pRi
6bc0: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ght);.  }else{. 
6bd0: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78     p = sqlite3Ex
6be0: 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  prAlloc(pParse->
6bf0: 64 62 2c 20 6f 70 20 26 20 54 4b 46 4c 47 5f 4d  db, op & TKFLG_M
6c00: 41 53 4b 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b  ASK, pToken, 1);
6c10: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
6c20: 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28 70  AttachSubtrees(p
6c30: 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c  Parse->db, p, pL
6c40: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
6c50: 7d 0a 20 20 69 66 28 20 70 20 29 20 7b 0a 20 20  }.  if( p ) {.  
6c60: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65    sqlite3ExprChe
6c70: 63 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c  ckHeight(pParse,
6c80: 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20   p->nHeight);.  
6c90: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
6ca0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 70 53 65 6c 65  ./*.** Add pSele
6cb0: 63 74 20 74 6f 20 74 68 65 20 45 78 70 72 2e 78  ct to the Expr.x
6cc0: 2e 70 53 65 6c 65 63 74 20 66 69 65 6c 64 2e 20  .pSelect field. 
6cd0: 20 4f 72 2c 20 69 66 20 70 45 78 70 72 20 69 73   Or, if pExpr is
6ce0: 20 4e 55 4c 4c 20 28 64 75 65 0a 2a 2a 20 64 6f   NULL (due.** do
6cf0: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
6d00: 74 69 6f 6e 20 66 61 69 6c 75 72 65 29 20 74 68  tion failure) th
6d10: 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 70 53  en delete the pS
6d20: 65 6c 65 63 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f  elect object..*/
6d30: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 45 78  .void sqlite3PEx
6d40: 70 72 41 64 64 53 65 6c 65 63 74 28 50 61 72 73  prAddSelect(Pars
6d50: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
6d60: 2a 70 45 78 70 72 2c 20 53 65 6c 65 63 74 20 2a  *pExpr, Select *
6d70: 70 53 65 6c 65 63 74 29 7b 0a 20 20 69 66 28 20  pSelect){.  if( 
6d80: 70 45 78 70 72 20 29 7b 0a 20 20 20 20 70 45 78  pExpr ){.    pEx
6d90: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20  pr->x.pSelect = 
6da0: 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 45 78 70  pSelect;.    Exp
6db0: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78  rSetProperty(pEx
6dc0: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
6dd0: 7c 45 50 5f 53 75 62 71 75 65 72 79 29 3b 0a 20  |EP_Subquery);. 
6de0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 65     sqlite3ExprSe
6df0: 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28  tHeightAndFlags(
6e00: 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a  pParse, pExpr);.
6e10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
6e20: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
6e30: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
6e40: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
6e50: 63 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  ctDelete(pParse-
6e60: 3e 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  >db, pSelect);. 
6e70: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20   }.}.../*.** If 
6e80: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
6e90: 73 20 61 6c 77 61 79 73 20 65 69 74 68 65 72 20  s always either 
6ea0: 54 52 55 45 20 6f 72 20 46 41 4c 53 45 20 28 72  TRUE or FALSE (r
6eb0: 65 73 70 65 63 74 69 76 65 6c 79 29 2c 0a 2a 2a  espectively),.**
6ec0: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 31 2e 20   then return 1. 
6ed0: 20 49 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 64   If one cannot d
6ee0: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 74 72 75  etermine the tru
6ef0: 74 68 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a  th value of the.
6f00: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74  ** expression at
6f10: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 72 65   compile-time re
6f20: 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68  turn 0..**.** Th
6f30: 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
6f40: 61 74 69 6f 6e 2e 20 20 49 66 20 69 73 20 4f 4b  ation.  If is OK
6f50: 20 74 6f 20 72 65 74 75 72 6e 20 30 20 68 65 72   to return 0 her
6f60: 65 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68 65  e even if.** the
6f70: 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 61 6c   expression real
6f80: 6c 79 20 69 73 20 61 6c 77 61 79 73 20 66 61 6c  ly is always fal
6f90: 73 65 20 6f 72 20 66 61 6c 73 65 20 28 61 20 66  se or false (a f
6fa0: 61 6c 73 65 20 6e 65 67 61 74 69 76 65 29 2e 0a  alse negative)..
6fb0: 2a 2a 20 42 75 74 20 69 74 20 69 73 20 61 20 62  ** But it is a b
6fc0: 75 67 20 74 6f 20 72 65 74 75 72 6e 20 31 20 69  ug to return 1 i
6fd0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
6fe0: 20 6d 69 67 68 74 20 68 61 76 65 20 64 69 66 66   might have diff
6ff0: 65 72 65 6e 74 0a 2a 2a 20 62 6f 6f 6c 65 61 6e  erent.** boolean
7000: 20 76 61 6c 75 65 73 20 69 6e 20 64 69 66 66 65   values in diffe
7010: 72 65 6e 74 20 63 69 72 63 75 6d 73 74 61 6e 63  rent circumstanc
7020: 65 73 20 28 61 20 66 61 6c 73 65 20 70 6f 73 69  es (a false posi
7030: 74 69 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74  tive.).**.** Not
7040: 65 20 74 68 61 74 20 69 66 20 74 68 65 20 65 78  e that if the ex
7050: 70 72 65 73 73 69 6f 6e 20 69 73 20 70 61 72 74  pression is part
7060: 20 6f 66 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20   of conditional 
7070: 66 6f 72 20 61 0a 2a 2a 20 4c 45 46 54 20 4a 4f  for a.** LEFT JO
7080: 49 4e 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 6e  IN, then we cann
7090: 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 61 74 20  ot determine at 
70a0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65  compile-time whe
70b0: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 69  ther or not.** i
70c0: 73 20 69 74 20 74 72 75 65 20 6f 72 20 66 61 6c  s it true or fal
70d0: 73 65 2c 20 73 6f 20 61 6c 77 61 79 73 20 72 65  se, so always re
70e0: 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  turn 0..*/.stati
70f0: 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61 79 73  c int exprAlways
7100: 54 72 75 65 28 45 78 70 72 20 2a 70 29 7b 0a 20  True(Expr *p){. 
7110: 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69 66   int v = 0;.  if
7120: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
7130: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
7140: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
7150: 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72  if( !sqlite3Expr
7160: 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26 76 29  IsInteger(p, &v)
7170: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
7180: 65 74 75 72 6e 20 76 21 3d 30 3b 0a 7d 0a 73 74  eturn v!=0;.}.st
7190: 61 74 69 63 20 69 6e 74 20 65 78 70 72 41 6c 77  atic int exprAlw
71a0: 61 79 73 46 61 6c 73 65 28 45 78 70 72 20 2a 70  aysFalse(Expr *p
71b0: 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a  ){.  int v = 0;.
71c0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
71d0: 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d  perty(p, EP_From
71e0: 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30  Join) ) return 0
71f0: 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
7200: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2c  ExprIsInteger(p,
7210: 20 26 76 29 20 29 20 72 65 74 75 72 6e 20 30 3b   &v) ) return 0;
7220: 0a 20 20 72 65 74 75 72 6e 20 76 3d 3d 30 3b 0a  .  return v==0;.
7230: 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77  }../*.** Join tw
7240: 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73  o expressions us
7250: 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61  ing an AND opera
7260: 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72 20  tor.  If either 
7270: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a  expression is.**
7280: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74   NULL, then just
7290: 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65   return the othe
72a0: 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  r expression..**
72b0: 0a 2a 2a 20 49 66 20 6f 6e 65 20 73 69 64 65 20  .** If one side 
72c0: 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
72d0: 74 68 65 20 41 4e 44 20 69 73 20 6b 6e 6f 77 6e  the AND is known
72e0: 20 74 6f 20 62 65 20 66 61 6c 73 65 2c 20 74 68   to be false, th
72f0: 65 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66  en instead.** of
7300: 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 41 4e   returning an AN
7310: 44 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 6a 75  D expression, ju
7320: 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f 6e 73  st return a cons
7330: 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  tant expression 
7340: 77 69 74 68 0a 2a 2a 20 61 20 76 61 6c 75 65 20  with.** a value 
7350: 6f 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45 78 70  of false..*/.Exp
7360: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6e  r *sqlite3ExprAn
7370: 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  d(sqlite3 *db, E
7380: 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72  xpr *pLeft, Expr
7390: 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 66 28   *pRight){.  if(
73a0: 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20   pLeft==0 ){.   
73b0: 20 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a   return pRight;.
73c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67    }else if( pRig
73d0: 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ht==0 ){.    ret
73e0: 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c  urn pLeft;.  }el
73f0: 73 65 20 69 66 28 20 65 78 70 72 41 6c 77 61 79  se if( exprAlway
7400: 73 46 61 6c 73 65 28 70 4c 65 66 74 29 20 7c 7c  sFalse(pLeft) ||
7410: 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65   exprAlwaysFalse
7420: 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20  (pRight) ){.    
7430: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
7440: 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20  e(db, pLeft);.  
7450: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
7460: 65 74 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b  ete(db, pRight);
7470: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
7480: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
7490: 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71   TK_INTEGER, &sq
74a0: 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30  lite3IntTokens[0
74b0: 5d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ], 0);.  }else{.
74c0: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
74d0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
74e0: 63 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c  c(db, TK_AND, 0,
74f0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
7500: 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65  ExprAttachSubtre
7510: 65 73 28 64 62 2c 20 70 4e 65 77 2c 20 70 4c 65  es(db, pNew, pLe
7520: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  ft, pRight);.   
7530: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 20 20   return pNew;.  
7540: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  }.}../*.** Const
7550: 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65  ruct a new expre
7560: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61  ssion node for a
7570: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d   function with m
7580: 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d  ultiple.** argum
7590: 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ents..*/.Expr *s
75a0: 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69  qlite3ExprFuncti
75b0: 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
75c0: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
75d0: 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
75e0: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
75f0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
7600: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
7610: 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b  ssert( pToken );
7620: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
7630: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
7640: 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b  K_FUNCTION, pTok
7650: 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 4e  en, 1);.  if( pN
7660: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ew==0 ){.    sql
7670: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
7680: 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 20 2f  te(db, pList); /
7690: 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72 79 20 6c  * Avoid memory l
76a0: 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20  eak when malloc 
76b0: 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74  fails */.    ret
76c0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65  urn 0;.  }.  pNe
76d0: 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69  w->x.pList = pLi
76e0: 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45  st;.  assert( !E
76f0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
7700: 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  New, EP_xIsSelec
7710: 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  t) );.  sqlite3E
7720: 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46  xprSetHeightAndF
7730: 6c 61 67 73 28 70 50 61 72 73 65 2c 20 70 4e 65  lags(pParse, pNe
7740: 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  w);.  return pNe
7750: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  w;.}../*.** Assi
7760: 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75  gn a variable nu
7770: 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65  mber to an expre
7780: 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64  ssion that encod
7790: 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a  es a wildcard.**
77a0: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
77b0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
77c0: 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64   .**.** Wildcard
77d0: 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  s consisting of 
77e0: 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65  a single "?" are
77f0: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65   assigned the ne
7800: 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a  xt sequential.**
7810: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
7820: 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64  ..**.** Wildcard
7830: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  s of the form "?
7840: 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65  nnn" are assigne
7850: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e  d the number "nn
7860: 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20  n".  We make.** 
7870: 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f  sure "nnn" is no
7880: 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69  t too be to avoi
7890: 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65  d a denial of se
78a0: 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68 65  rvice attack whe
78b0: 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61  n.** the SQL sta
78c0: 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f  tement comes fro
78d0: 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f  m an external so
78e0: 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64  urce..**.** Wild
78f0: 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72  cards of the for
7900: 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22  m ":aaa", "@aaa"
7910: 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20  , or "$aaa" are 
7920: 61 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d  assigned the sam
7930: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74  e number.** as t
7940: 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74  he previous inst
7950: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
7960: 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69   wildcard.  Or i
7970: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
7980: 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20  rst.** instance 
7990: 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c  of the wildcard,
79a0: 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e   the next sequen
79b0: 74 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75  tial variable nu
79c0: 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67  mber is.** assig
79d0: 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ned..*/.void sql
79e0: 69 74 65 33 45 78 70 72 41 73 73 69 67 6e 56 61  ite3ExprAssignVa
79f0: 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70  rNumber(Parse *p
7a00: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
7a10: 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pr){.  sqlite3 *
7a20: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
7a30: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7a40: 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ;..  if( pExpr==
7a50: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
7a60: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
7a70: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
7a80: 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65 64  _IntValue|EP_Red
7a90: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
7aa0: 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78 70  y) );.  z = pExp
7ab0: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 61  r->u.zToken;.  a
7ac0: 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20  ssert( z!=0 );. 
7ad0: 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d 30   assert( z[0]!=0
7ae0: 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d 3d   );.  if( z[1]==
7af0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64  0 ){.    /* Wild
7b00: 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d  card of the form
7b10: 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74 68   "?".  Assign th
7b20: 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65 20  e next variable 
7b30: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 61 73  number */.    as
7b40: 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20  sert( z[0]=='?' 
7b50: 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 43  );.    pExpr->iC
7b60: 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28  olumn = (ynVar)(
7b70: 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b  ++pParse->nVar);
7b80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 79 6e  .  }else{.    yn
7b90: 56 61 72 20 78 20 3d 20 30 3b 0a 20 20 20 20 75  Var x = 0;.    u
7ba0: 33 32 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  32 n = sqlite3St
7bb0: 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69  rlen30(z);.    i
7bc0: 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a  f( z[0]=='?' ){.
7bd0: 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72        /* Wildcar
7be0: 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  d of the form "?
7bf0: 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22  nnn".  Convert "
7c00: 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67  nnn" to an integ
7c10: 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  er and.      ** 
7c20: 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76 61  use it as the va
7c30: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f  riable number */
7c40: 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a 20 20  .      i64 i;.  
7c50: 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3d      int bOk = 0=
7c60: 3d 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 26  =sqlite3Atoi64(&
7c70: 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53  z[1], &i, n-1, S
7c80: 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20  QLITE_UTF8);.   
7c90: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
7ca0: 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72 29 69  n = x = (ynVar)i
7cb0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
7cc0: 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( i==0 );.      
7cd0: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31 20 29  testcase( i==1 )
7ce0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
7cf0: 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  ( i==db->aLimit[
7d00: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
7d10: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20  IABLE_NUMBER]-1 
7d20: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
7d30: 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74  e( i==db->aLimit
7d40: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
7d50: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29  RIABLE_NUMBER] )
7d60: 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f 6b 3d  ;.      if( bOk=
7d70: 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e 64  =0 || i<1 || i>d
7d80: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
7d90: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
7da0: 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 20  NUMBER] ){.     
7db0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
7dc0: 73 67 28 70 50 61 72 73 65 2c 20 22 76 61 72 69  sg(pParse, "vari
7dd0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  able number must
7de0: 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61   be between ?1 a
7df0: 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20  nd ?%d",.       
7e00: 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b       db->aLimit[
7e10: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
7e20: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a  IABLE_NUMBER]);.
7e30: 20 20 20 20 20 20 20 20 78 20 3d 20 30 3b 0a 20          x = 0;. 
7e40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
7e50: 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72 20   i>pParse->nVar 
7e60: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  ){.        pPars
7e70: 65 2d 3e 6e 56 61 72 20 3d 20 28 69 6e 74 29 69  e->nVar = (int)i
7e80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
7e90: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69  lse{.      /* Wi
7ea0: 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22 3a 61  ldcards like ":a
7eb0: 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72 20 22  aa", "$aaa" or "
7ec0: 40 61 61 61 22 2e 20 20 52 65 75 73 65 20 74 68  @aaa".  Reuse th
7ed0: 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a  e same variable.
7ee0: 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
7ef0: 61 73 20 74 68 65 20 70 72 69 6f 72 20 61 70 70  as the prior app
7f00: 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20 73  earance of the s
7f10: 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20  ame name, or if 
7f20: 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 20 20 2a  the name.      *
7f30: 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70 70 65  * has never appe
7f40: 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65 75  ared before, reu
7f50: 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69  se the same vari
7f60: 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20 20  able number.    
7f70: 20 20 2a 2f 0a 20 20 20 20 20 20 79 6e 56 61 72    */.      ynVar
7f80: 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
7f90: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 7a 56  0; i<pParse->nzV
7fa0: 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ar; i++){.      
7fb0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 7a    if( pParse->az
7fc0: 56 61 72 5b 69 5d 20 26 26 20 73 74 72 63 6d 70  Var[i] && strcmp
7fd0: 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 69  (pParse->azVar[i
7fe0: 5d 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ],z)==0 ){.     
7ff0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
8000: 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72  umn = x = (ynVar
8010: 29 69 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  )i+1;.          
8020: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
8030: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
8040: 66 28 20 78 3d 3d 30 20 29 20 78 20 3d 20 70 45  f( x==0 ) x = pE
8050: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28  xpr->iColumn = (
8060: 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d  ynVar)(++pParse-
8070: 3e 6e 56 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20  >nVar);.    }.  
8080: 20 20 69 66 28 20 78 3e 30 20 29 7b 0a 20 20 20    if( x>0 ){.   
8090: 20 20 20 69 66 28 20 78 3e 70 50 61 72 73 65 2d     if( x>pParse-
80a0: 3e 6e 7a 56 61 72 20 29 7b 0a 20 20 20 20 20 20  >nzVar ){.      
80b0: 20 20 63 68 61 72 20 2a 2a 61 3b 0a 20 20 20 20    char **a;.    
80c0: 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44      a = sqlite3D
80d0: 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 50 61  bRealloc(db, pPa
80e0: 72 73 65 2d 3e 61 7a 56 61 72 2c 20 78 2a 73 69  rse->azVar, x*si
80f0: 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20  zeof(a[0]));.   
8100: 20 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b       if( a==0 ){
8110: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
8120: 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
8130: 6c 65 64 20 29 3b 20 2f 2a 20 45 72 72 6f 72 20  led ); /* Error 
8140: 72 65 70 6f 72 74 65 64 20 74 68 72 6f 75 67 68  reported through
8150: 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 2a 2f   mallocFailed */
8160: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
8170: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
8180: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 7a 56       pParse->azV
8190: 61 72 20 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  ar = a;.        
81a0: 6d 65 6d 73 65 74 28 26 61 5b 70 50 61 72 73 65  memset(&a[pParse
81b0: 2d 3e 6e 7a 56 61 72 5d 2c 20 30 2c 20 28 78 2d  ->nzVar], 0, (x-
81c0: 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 29 2a 73  pParse->nzVar)*s
81d0: 69 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20  izeof(a[0]));.  
81e0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 7a        pParse->nz
81f0: 56 61 72 20 3d 20 78 3b 0a 20 20 20 20 20 20 7d  Var = x;.      }
8200: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 21  .      if( z[0]!
8210: 3d 27 3f 27 20 7c 7c 20 70 50 61 72 73 65 2d 3e  ='?' || pParse->
8220: 61 7a 56 61 72 5b 78 2d 31 5d 3d 3d 30 20 29 7b  azVar[x-1]==0 ){
8230: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8240: 44 62 46 72 65 65 28 64 62 2c 20 70 50 61 72 73  DbFree(db, pPars
8250: 65 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 29 3b 0a  e->azVar[x-1]);.
8260: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
8270: 61 7a 56 61 72 5b 78 2d 31 5d 20 3d 20 73 71 6c  azVar[x-1] = sql
8280: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
8290: 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  , z, n);.      }
82a0: 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66  .    }.  } .  if
82b0: 28 20 21 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  ( !pParse->nErr 
82c0: 26 26 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e  && pParse->nVar>
82d0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
82e0: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
82f0: 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20  _NUMBER] ){.    
8300: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
8310: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
8320: 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 22  y SQL variables"
8330: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
8340: 52 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65  Recursively dele
8350: 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  te an expression
8360: 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   tree..*/.static
8370: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
8380: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70   void sqlite3Exp
8390: 72 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69 74 65  rDeleteNN(sqlite
83a0: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b  3 *db, Expr *p){
83b0: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
83c0: 29 3b 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  );.  /* Sanity c
83d0: 68 65 63 6b 3a 20 41 73 73 65 72 74 20 74 68 61  heck: Assert tha
83e0: 74 20 74 68 65 20 49 6e 74 56 61 6c 75 65 20 69  t the IntValue i
83f0: 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69  s non-negative i
8400: 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f 0a 20  f it exists */. 
8410: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
8420: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
8430: 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70 2d 3e  IntValue) || p->
8440: 75 2e 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20  u.iValue>=0 );. 
8450: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
8460: 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65  perty(p, EP_Toke
8470: 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 2f 2a  nOnly) ){.    /*
8480: 20 54 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f   The Expr.x unio
8490: 6e 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20  n is never used 
84a0: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
84b0: 20 61 73 20 45 78 70 72 2e 70 52 69 67 68 74 20   as Expr.pRight 
84c0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
84d0: 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  ->x.pList==0 || 
84e0: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  p->pRight==0 );.
84f0: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 21 3d 54      if( p->op!=T
8500: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
8510: 29 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  ) sqlite3ExprDel
8520: 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74  ete(db, p->pLeft
8530: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
8540: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
8550: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28  pRight);.    if(
8560: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
8570: 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29  (p, EP_MemToken)
8580: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
8590: 28 64 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  (db, p->u.zToken
85a0: 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  );.    if( ExprH
85b0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
85c0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
85d0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
85e0: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  ctDelete(db, p->
85f0: 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  x.pSelect);.    
8600: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
8610: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
8620: 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73  te(db, p->x.pLis
8630: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
8640: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
8650: 65 72 74 79 28 70 2c 20 45 50 5f 53 74 61 74 69  erty(p, EP_Stati
8660: 63 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  c) ){.    sqlite
8670: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
8680: 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74    }.}.void sqlit
8690: 65 33 45 78 70 72 44 65 6c 65 74 65 28 73 71 6c  e3ExprDelete(sql
86a0: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
86b0: 70 29 7b 0a 20 20 69 66 28 20 70 20 29 20 73 71  p){.  if( p ) sq
86c0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e  lite3ExprDeleteN
86d0: 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  N(db, p);.}../*.
86e0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
86f0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c  mber of bytes al
8700: 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
8710: 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63  expression struc
8720: 74 75 72 65 20 0a 2a 2a 20 70 61 73 73 65 64 20  ture .** passed 
8730: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
8740: 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61  ument. This is a
8750: 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20 45 58 50  lways one of EXP
8760: 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45  R_FULLSIZE,.** E
8770: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
8780: 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c  or EXPR_TOKENONL
8790: 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  YSIZE..*/.static
87a0: 20 69 6e 74 20 65 78 70 72 53 74 72 75 63 74 53   int exprStructS
87b0: 69 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ize(Expr *p){.  
87c0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
87d0: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
87e0: 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20 45 58  nly) ) return EX
87f0: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
8800: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
8810: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65  roperty(p, EP_Re
8820: 64 75 63 65 64 29 20 29 20 72 65 74 75 72 6e 20  duced) ) return 
8830: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
8840: 3b 0a 20 20 72 65 74 75 72 6e 20 45 58 50 52 5f  ;.  return EXPR_
8850: 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a  FULLSIZE;.}../*.
8860: 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72  ** The dupedExpr
8870: 2a 53 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 73  *Size() routines
8880: 20 65 61 63 68 20 72 65 74 75 72 6e 20 74 68 65   each return the
8890: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
88a0: 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20   required.** to 
88b0: 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20  store a copy of 
88c0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72  an expression or
88d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
88e0: 2e 20 20 54 68 65 79 20 64 69 66 66 65 72 20 69  .  They differ i
88f0: 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66  n.** how much of
8900: 20 74 68 65 20 74 72 65 65 20 69 73 20 6d 65 61   the tree is mea
8910: 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  sured..**.**    
8920: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
8930: 53 69 7a 65 28 29 20 20 20 20 20 53 69 7a 65 20  Size()     Size 
8940: 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45 78 70 72  of only the Expr
8950: 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 20   structure .**  
8960: 20 20 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65     dupedExprNode
8970: 53 69 7a 65 28 29 20 20 20 20 20 20 20 53 69 7a  Size()       Siz
8980: 65 20 6f 66 20 45 78 70 72 20 2b 20 73 70 61 63  e of Expr + spac
8990: 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20  e for token.**  
89a0: 20 20 20 64 75 70 65 64 45 78 70 72 53 69 7a 65     dupedExprSize
89b0: 28 29 20 20 20 20 20 20 20 20 20 20 20 45 78 70  ()           Exp
89c0: 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74  r + token + subt
89d0: 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a  ree components.*
89e0: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
89f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
8a30: 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70  .** The dupedExp
8a40: 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 66 75  rStructSize() fu
8a50: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
8a60: 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65 64 20  wo values OR-ed 
8a70: 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28  together:  .** (
8a80: 31 29 20 74 68 65 20 73 70 61 63 65 20 72 65 71  1) the space req
8a90: 75 69 72 65 64 20 66 6f 72 20 61 20 63 6f 70 79  uired for a copy
8aa0: 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72   of the Expr str
8ab0: 75 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20  ucture only and 
8ac0: 0a 2a 2a 20 28 32 29 20 74 68 65 20 45 50 5f 78  .** (2) the EP_x
8ad0: 78 78 20 66 6c 61 67 73 20 74 68 61 74 20 69 6e  xx flags that in
8ae0: 64 69 63 61 74 65 20 77 68 61 74 20 74 68 65 20  dicate what the 
8af0: 73 74 72 75 63 74 75 72 65 20 73 69 7a 65 20 73  structure size s
8b00: 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65  hould be..** The
8b10: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 69   return values i
8b20: 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a  s always one of:
8b30: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50 52  .**.**      EXPR
8b40: 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20  _FULLSIZE.**    
8b50: 20 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49    EXPR_REDUCEDSI
8b60: 5a 45 20 20 20 7c 20 45 50 5f 52 65 64 75 63 65  ZE   | EP_Reduce
8b70: 64 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 54  d.**      EXPR_T
8b80: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45  OKENONLYSIZE | E
8b90: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a  P_TokenOnly.**.*
8ba0: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
8bb0: 65 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20  e structure can 
8bc0: 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b  be found by mask
8bd0: 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20 76  ing the return v
8be0: 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20  alue.** of this 
8bf0: 72 6f 75 74 69 6e 65 20 77 69 74 68 20 30 78 66  routine with 0xf
8c00: 66 66 2e 20 20 54 68 65 20 66 6c 61 67 73 20 63  ff.  The flags c
8c10: 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d  an be found by m
8c20: 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65  asking the.** re
8c30: 74 75 72 6e 20 76 61 6c 75 65 20 77 69 74 68 20  turn value with 
8c40: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
8c50: 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e  kenOnly..**.** N
8c60: 6f 74 65 20 74 68 61 74 20 77 69 74 68 20 66 6c  ote that with fl
8c70: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
8c80: 55 43 45 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  UCE, this routin
8c90: 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c  es works on full
8ca0: 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75  -size.** (unredu
8cb0: 63 65 64 29 20 45 78 70 72 20 6f 62 6a 65 63 74  ced) Expr object
8cc0: 73 20 61 73 20 74 68 65 79 20 6f 72 20 6f 72 69  s as they or ori
8cd0: 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63  ginally construc
8ce0: 74 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  ted by the parse
8cf0: 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78 70  r..** During exp
8d00: 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73  ression analysis
8d10: 2c 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  , extra informat
8d20: 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65 64 20  ion is computed 
8d30: 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a  and moved into.*
8d40: 2a 20 6c 61 74 65 72 20 70 61 72 74 73 20 6f 66  * later parts of
8d50: 20 74 65 68 20 45 78 70 72 20 6f 62 6a 65 63 74   teh Expr object
8d60: 20 61 6e 64 20 74 68 61 74 20 65 78 74 72 61 20   and that extra 
8d70: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68  information migh
8d80: 74 20 67 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a  t get chopped.**
8d90: 20 6f 66 66 20 69 66 20 74 68 65 20 65 78 70 72   off if the expr
8da0: 65 73 73 69 6f 6e 20 69 73 20 72 65 64 75 63 65  ession is reduce
8db0: 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68  d.  Note also th
8dc0: 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 77  at it does not w
8dd0: 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61  ork to.** make a
8de0: 6e 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  n EXPRDUP_REDUCE
8df0: 20 63 6f 70 79 20 6f 66 20 61 20 72 65 64 75 63   copy of a reduc
8e00: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ed expression.  
8e10: 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c  It is only legal
8e20: 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65 20 61 20  .** to reduce a 
8e30: 70 72 69 73 74 69 6e 65 20 65 78 70 72 65 73 73  pristine express
8e40: 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20 74 68  ion tree from th
8e50: 65 20 70 61 72 73 65 72 2e 20 20 54 68 65 20 69  e parser.  The i
8e60: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a  mplementation.**
8e70: 20 6f 66 20 64 75 70 65 64 45 78 70 72 53 74 72   of dupedExprStr
8e80: 75 63 74 53 69 7a 65 28 29 20 63 6f 6e 74 61 69  uctSize() contai
8e90: 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73 73 65 72  n multiple asser
8ea0: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
8eb0: 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  hat attempt.** t
8ec0: 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 63  o enforce this c
8ed0: 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74  onstraint..*/.st
8ee0: 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78  atic int dupedEx
8ef0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70  prStructSize(Exp
8f00: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
8f10: 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20  {.  int nSize;. 
8f20: 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
8f30: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 7c  EXPRDUP_REDUCE |
8f40: 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a  | flags==0 ); /*
8f50: 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76   Only one flag v
8f60: 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a  alue allowed */.
8f70: 20 20 61 73 73 65 72 74 28 20 45 58 50 52 5f 46    assert( EXPR_F
8f80: 55 4c 4c 53 49 5a 45 3c 3d 30 78 66 66 66 20 29  ULLSIZE<=0xfff )
8f90: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 30 78 66  ;.  assert( (0xf
8fa0: 66 66 20 26 20 28 45 50 5f 52 65 64 75 63 65 64  ff & (EP_Reduced
8fb0: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d  |EP_TokenOnly))=
8fc0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d 66  =0 );.  if( 0==f
8fd0: 6c 61 67 73 20 29 7b 0a 20 20 20 20 6e 53 69 7a  lags ){.    nSiz
8fe0: 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a  e = EXPR_FULLSIZ
8ff0: 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
9000: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
9010: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
9020: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
9030: 63 65 64 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ced) );.    asse
9040: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
9050: 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a  erty(p, EP_FromJ
9060: 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20 61 73 73  oin) ); .    ass
9070: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
9080: 70 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54  perty(p, EP_MemT
9090: 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20 61 73 73  oken) );.    ass
90a0: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
90b0: 70 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65  perty(p, EP_NoRe
90c0: 64 75 63 65 29 20 29 3b 0a 20 20 20 20 69 66 28  duce) );.    if(
90d0: 20 70 2d 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e   p->pLeft || p->
90e0: 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  x.pList ){.     
90f0: 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 52 45   nSize = EXPR_RE
9100: 44 55 43 45 44 53 49 5a 45 20 7c 20 45 50 5f 52  DUCEDSIZE | EP_R
9110: 65 64 75 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73  educed;.    }els
9120: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
9130: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b   p->pRight==0 );
9140: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45  .      nSize = E
9150: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
9160: 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  E | EP_TokenOnly
9170: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
9180: 74 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f  turn nSize;.}../
9190: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
91a0: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  on returns the s
91b0: 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 72 65  pace in bytes re
91c0: 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20  quired to store 
91d0: 74 68 65 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20  the copy .** of 
91e0: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75  the Expr structu
91f0: 72 65 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66  re and a copy of
9200: 20 74 68 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b   the Expr.u.zTok
9210: 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20 74 68  en string (if th
9220: 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20  at.** string is 
9230: 64 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61  defined.).*/.sta
9240: 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70  tic int dupedExp
9250: 72 4e 6f 64 65 53 69 7a 65 28 45 78 70 72 20 2a  rNodeSize(Expr *
9260: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
9270: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 64 75 70   int nByte = dup
9280: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
9290: 28 70 2c 20 66 6c 61 67 73 29 20 26 20 30 78 66  (p, flags) & 0xf
92a0: 66 66 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48  ff;.  if( !ExprH
92b0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
92c0: 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d  _IntValue) && p-
92d0: 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  >u.zToken ){.   
92e0: 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65   nByte += sqlite
92f0: 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a  3Strlen30(p->u.z
9300: 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20  Token)+1;.  }.  
9310: 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42  return ROUND8(nB
9320: 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  yte);.}../*.** R
9330: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
9340: 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72   of bytes requir
9350: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 64  ed to create a d
9360: 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20  uplicate of the 
9370: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
9380: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
9390: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  st argument. The
93a0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
93b0: 20 69 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f   is a.** mask co
93c0: 6e 74 61 69 6e 69 6e 67 20 45 58 50 52 44 55 50  ntaining EXPRDUP
93d0: 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a  _XXX flags..**.*
93e0: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
93f0: 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 73 70  rned includes sp
9400: 61 63 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  ace to create a 
9410: 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72  copy of the Expr
9420: 20 73 74 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c   struct.** itsel
9430: 66 20 61 6e 64 20 74 68 65 20 62 75 66 66 65 72  f and the buffer
9440: 20 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20   referred to by 
9450: 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69  Expr.u.zToken, i
9460: 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f any..**.** If 
9470: 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44 55  the EXPRDUP_REDU
9480: 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  CE flag is set, 
9490: 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20  then the return 
94a0: 76 61 6c 75 65 20 69 6e 63 6c 75 64 65 73 20 0a  value includes .
94b0: 2a 2a 20 73 70 61 63 65 20 74 6f 20 64 75 70 6c  ** space to dupl
94c0: 69 63 61 74 65 20 61 6c 6c 20 45 78 70 72 20 6e  icate all Expr n
94d0: 6f 64 65 73 20 69 6e 20 74 68 65 20 74 72 65 65  odes in the tree
94e0: 20 66 6f 72 6d 65 64 20 62 79 20 45 78 70 72 2e   formed by Expr.
94f0: 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78  pLeft .** and Ex
9500: 70 72 2e 70 52 69 67 68 74 20 76 61 72 69 61 62  pr.pRight variab
9510: 6c 65 73 20 28 62 75 74 20 6e 6f 74 20 66 6f 72  les (but not for
9520: 20 61 6e 79 20 73 74 72 75 63 74 75 72 65 73 20   any structures 
9530: 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a  pointed to or .*
9540: 2a 20 64 65 73 63 65 6e 64 65 64 20 66 72 6f 6d  * descended from
9550: 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73   the Expr.x.pLis
9560: 74 20 6f 72 20 45 78 70 72 2e 78 2e 70 53 65 6c  t or Expr.x.pSel
9570: 65 63 74 20 76 61 72 69 61 62 6c 65 73 29 2e 0a  ect variables)..
9580: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
9590: 70 65 64 45 78 70 72 53 69 7a 65 28 45 78 70 72  pedExprSize(Expr
95a0: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
95b0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 30  .  int nByte = 0
95c0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
95d0: 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45 78   nByte = dupedEx
95e0: 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c  prNodeSize(p, fl
95f0: 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 66 6c  ags);.    if( fl
9600: 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55  ags&EXPRDUP_REDU
9610: 43 45 20 29 7b 0a 20 20 20 20 20 20 6e 42 79 74  CE ){.      nByt
9620: 65 20 2b 3d 20 64 75 70 65 64 45 78 70 72 53 69  e += dupedExprSi
9630: 7a 65 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61  ze(p->pLeft, fla
9640: 67 73 29 20 2b 20 64 75 70 65 64 45 78 70 72 53  gs) + dupedExprS
9650: 69 7a 65 28 70 2d 3e 70 52 69 67 68 74 2c 20 66  ize(p->pRight, f
9660: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  lags);.    }.  }
9670: 0a 20 20 72 65 74 75 72 6e 20 6e 42 79 74 65 3b  .  return nByte;
9680: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
9690: 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c  unction is simil
96a0: 61 72 20 74 6f 20 73 71 6c 69 74 65 33 45 78 70  ar to sqlite3Exp
96b0: 72 44 75 70 28 29 2c 20 65 78 63 65 70 74 20 74  rDup(), except t
96c0: 68 61 74 20 69 66 20 70 7a 42 75 66 66 65 72 20  hat if pzBuffer 
96d0: 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  .** is not NULL 
96e0: 74 68 65 6e 20 2a 70 7a 42 75 66 66 65 72 20 69  then *pzBuffer i
96f0: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69  s assumed to poi
9700: 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6c  nt to a buffer l
9710: 61 72 67 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20  arge enough .** 
9720: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70  to store the cop
9730: 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20  y of expression 
9740: 70 2c 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66  p, the copies of
9750: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20   p->u.zToken.** 
9760: 28 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c  (if applicable),
9770: 20 61 6e 64 20 74 68 65 20 63 6f 70 69 65 73 20   and the copies 
9780: 6f 66 20 74 68 65 20 70 2d 3e 70 4c 65 66 74 20  of the p->pLeft 
9790: 61 6e 64 20 70 2d 3e 70 52 69 67 68 74 20 65 78  and p->pRight ex
97a0: 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66  pressions,.** if
97b0: 20 61 6e 79 2e 20 42 65 66 6f 72 65 20 72 65 74   any. Before ret
97c0: 75 72 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65  urning, *pzBuffe
97d0: 72 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  r is set to the 
97e0: 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  first byte past 
97f0: 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f  the.** portion o
9800: 66 20 74 68 65 20 62 75 66 66 65 72 20 63 6f 70  f the buffer cop
9810: 69 65 64 20 69 6e 74 6f 20 62 79 20 74 68 69 73  ied into by this
9820: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
9830: 61 74 69 63 20 45 78 70 72 20 2a 65 78 70 72 44  atic Expr *exprD
9840: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
9850: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 64 75 70  Expr *p, int dup
9860: 46 6c 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75  Flags, u8 **pzBu
9870: 66 66 65 72 29 7b 0a 20 20 45 78 70 72 20 2a 70  ffer){.  Expr *p
9880: 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f  New;           /
9890: 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
98a0: 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a 41 6c 6c 6f  n */.  u8 *zAllo
98b0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  c;           /* 
98c0: 4d 65 6d 6f 72 79 20 73 70 61 63 65 20 66 72 6f  Memory space fro
98d0: 6d 20 77 68 69 63 68 20 74 6f 20 62 75 69 6c 64  m which to build
98e0: 20 45 78 70 72 20 6f 62 6a 65 63 74 20 2a 2f 0a   Expr object */.
98f0: 20 20 75 33 32 20 73 74 61 74 69 63 46 6c 61 67    u32 staticFlag
9900: 3b 20 20 20 20 20 20 20 2f 2a 20 45 50 5f 53 74  ;       /* EP_St
9910: 61 74 69 63 20 69 66 20 73 70 61 63 65 20 6e 6f  atic if space no
9920: 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  t obtained from 
9930: 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20 20 61 73 73  malloc */..  ass
9940: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
9950: 61 73 73 65 72 74 28 20 70 20 29 3b 0a 20 20 61  assert( p );.  a
9960: 73 73 65 72 74 28 20 64 75 70 46 6c 61 67 73 3d  ssert( dupFlags=
9970: 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67 73 3d 3d  =0 || dupFlags==
9980: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29  EXPRDUP_REDUCE )
9990: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 7a 42 75  ;.  assert( pzBu
99a0: 66 66 65 72 3d 3d 30 20 7c 7c 20 64 75 70 46 6c  ffer==0 || dupFl
99b0: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
99c0: 55 43 45 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67  UCE );..  /* Fig
99d0: 75 72 65 20 6f 75 74 20 77 68 65 72 65 20 74 6f  ure out where to
99e0: 20 77 72 69 74 65 20 74 68 65 20 6e 65 77 20 45   write the new E
99f0: 78 70 72 20 73 74 72 75 63 74 75 72 65 2e 20 2a  xpr structure. *
9a00: 2f 0a 20 20 69 66 28 20 70 7a 42 75 66 66 65 72  /.  if( pzBuffer
9a10: 20 29 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63 20 3d   ){.    zAlloc =
9a20: 20 2a 70 7a 42 75 66 66 65 72 3b 0a 20 20 20 20   *pzBuffer;.    
9a30: 73 74 61 74 69 63 46 6c 61 67 20 3d 20 45 50 5f  staticFlag = EP_
9a40: 53 74 61 74 69 63 3b 0a 20 20 7d 65 6c 73 65 7b  Static;.  }else{
9a50: 0a 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 73 71  .    zAlloc = sq
9a60: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
9a70: 4e 4e 28 64 62 2c 20 64 75 70 65 64 45 78 70 72  NN(db, dupedExpr
9a80: 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61 67 73  Size(p, dupFlags
9a90: 29 29 3b 0a 20 20 20 20 73 74 61 74 69 63 46 6c  ));.    staticFl
9aa0: 61 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e  ag = 0;.  }.  pN
9ab0: 65 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c  ew = (Expr *)zAl
9ac0: 6c 6f 63 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77  loc;..  if( pNew
9ad0: 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 74 20 6e   ){.    /* Set n
9ae0: 4e 65 77 53 69 7a 65 20 74 6f 20 74 68 65 20 73  NewSize to the s
9af0: 69 7a 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ize allocated fo
9b00: 72 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  r the structure 
9b10: 70 6f 69 6e 74 65 64 20 74 6f 0a 20 20 20 20 2a  pointed to.    *
9b20: 2a 20 62 79 20 70 4e 65 77 2e 20 54 68 69 73 20  * by pNew. This 
9b30: 69 73 20 65 69 74 68 65 72 20 45 58 50 52 5f 46  is either EXPR_F
9b40: 55 4c 4c 53 49 5a 45 2c 20 45 58 50 52 5f 52 45  ULLSIZE, EXPR_RE
9b50: 44 55 43 45 44 53 49 5a 45 20 6f 72 0a 20 20 20  DUCEDSIZE or.   
9b60: 20 2a 2a 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e   ** EXPR_TOKENON
9b70: 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69  LYSIZE. nToken i
9b80: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
9b90: 62 65 72 20 6f 66 20 62 79 74 65 73 20 63 6f 6e  ber of bytes con
9ba0: 73 75 6d 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  sumed.    ** by 
9bb0: 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20  the copy of the 
9bc0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69  p->u.zToken stri
9bd0: 6e 67 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20  ng (if any)..   
9be0: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e   */.    const un
9bf0: 73 69 67 6e 65 64 20 6e 53 74 72 75 63 74 53 69  signed nStructSi
9c00: 7a 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74  ze = dupedExprSt
9c10: 72 75 63 74 53 69 7a 65 28 70 2c 20 64 75 70 46  ructSize(p, dupF
9c20: 6c 61 67 73 29 3b 0a 20 20 20 20 63 6f 6e 73 74  lags);.    const
9c30: 20 69 6e 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20   int nNewSize = 
9c40: 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20 30 78  nStructSize & 0x
9c50: 66 66 66 3b 0a 20 20 20 20 69 6e 74 20 6e 54 6f  fff;.    int nTo
9c60: 6b 65 6e 3b 0a 20 20 20 20 69 66 28 20 21 45 78  ken;.    if( !Ex
9c70: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
9c80: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26   EP_IntValue) &&
9c90: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a   p->u.zToken ){.
9ca0: 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 73        nToken = s
9cb0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
9cc0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b 20 31 3b  ->u.zToken) + 1;
9cd0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9ce0: 20 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20    nToken = 0;.  
9cf0: 20 20 7d 0a 20 20 20 20 69 66 28 20 64 75 70 46    }.    if( dupF
9d00: 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 61 73  lags ){.      as
9d10: 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f  sert( ExprHasPro
9d20: 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75  perty(p, EP_Redu
9d30: 63 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ced)==0 );.     
9d40: 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20   memcpy(zAlloc, 
9d50: 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20  p, nNewSize);.  
9d60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
9d70: 33 32 20 6e 53 69 7a 65 20 3d 20 28 75 33 32 29  32 nSize = (u32)
9d80: 65 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  exprStructSize(p
9d90: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
9da0: 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a 65  zAlloc, p, nSize
9db0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 53 69  );.      if( nSi
9dc0: 7a 65 3c 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  ze<EXPR_FULLSIZE
9dd0: 20 29 7b 20 0a 20 20 20 20 20 20 20 20 6d 65 6d   ){ .        mem
9de0: 73 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a  set(&zAlloc[nSiz
9df0: 65 5d 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c  e], 0, EXPR_FULL
9e00: 53 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20  SIZE-nSize);.   
9e10: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
9e20: 2f 2a 20 53 65 74 20 74 68 65 20 45 50 5f 52 65  /* Set the EP_Re
9e30: 64 75 63 65 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f  duced, EP_TokenO
9e40: 6e 6c 79 2c 20 61 6e 64 20 45 50 5f 53 74 61 74  nly, and EP_Stat
9e50: 69 63 20 66 6c 61 67 73 20 61 70 70 72 6f 70 72  ic flags appropr
9e60: 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 70  iately. */.    p
9e70: 4e 65 77 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28  New->flags &= ~(
9e80: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
9e90: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61 74 69  kenOnly|EP_Stati
9ea0: 63 7c 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 3b 0a  c|EP_MemToken);.
9eb0: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
9ec0: 7c 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26  |= nStructSize &
9ed0: 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f   (EP_Reduced|EP_
9ee0: 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20  TokenOnly);.    
9ef0: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 73  pNew->flags |= s
9f00: 74 61 74 69 63 46 6c 61 67 3b 0a 0a 20 20 20 20  taticFlag;..    
9f10: 2f 2a 20 43 6f 70 79 20 74 68 65 20 70 2d 3e 75  /* Copy the p->u
9f20: 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 2c 20  .zToken string, 
9f30: 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69  if any. */.    i
9f40: 66 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  f( nToken ){.   
9f50: 20 20 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20     char *zToken 
9f60: 3d 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  = pNew->u.zToken
9f70: 20 3d 20 28 63 68 61 72 2a 29 26 7a 41 6c 6c 6f   = (char*)&zAllo
9f80: 63 5b 6e 4e 65 77 53 69 7a 65 5d 3b 0a 20 20 20  c[nNewSize];.   
9f90: 20 20 20 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e     memcpy(zToken
9fa0: 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e  , p->u.zToken, n
9fb0: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20  Token);.    }.. 
9fc0: 20 20 20 69 66 28 20 30 3d 3d 28 28 70 2d 3e 66     if( 0==((p->f
9fd0: 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61 67 73  lags|pNew->flags
9fe0: 29 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ) & EP_TokenOnly
9ff0: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69  ) ){.      /* Fi
a000: 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e  ll in the pNew->
a010: 78 2e 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65  x.pSelect or pNe
a020: 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65  w->x.pList membe
a030: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  r. */.      if( 
a040: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a050: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
a060: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
a070: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71  ->x.pSelect = sq
a080: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
a090: 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  b, p->x.pSelect,
a0a0: 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20   dupFlags);.    
a0b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a0c0: 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d   pNew->x.pList =
a0d0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
a0e0: 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69  Dup(db, p->x.pLi
a0f0: 73 74 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20  st, dupFlags);. 
a100: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
a110: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65    /* Fill in pNe
a120: 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65  w->pLeft and pNe
a130: 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20  w->pRight. */.  
a140: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
a150: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52  perty(pNew, EP_R
a160: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
a170: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 7a 41  nly) ){.      zA
a180: 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78 70  lloc += dupedExp
a190: 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 64 75 70  rNodeSize(p, dup
a1a0: 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66  Flags);.      if
a1b0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
a1c0: 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75 63  y(pNew, EP_Reduc
a1d0: 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ed) ){.        p
a1e0: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d 3e  New->pLeft = p->
a1f0: 70 4c 65 66 74 20 3f 0a 20 20 20 20 20 20 20 20  pLeft ?.        
a200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
a210: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65  prDup(db, p->pLe
a220: 66 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55  ft, EXPRDUP_REDU
a230: 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a 20 30  CE, &zAlloc) : 0
a240: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
a250: 70 52 69 67 68 74 20 3d 20 70 2d 3e 70 52 69 67  pRight = p->pRig
a260: 68 74 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  ht ?.           
a270: 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70 72              expr
a280: 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68  Dup(db, p->pRigh
a290: 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  t, EXPRDUP_REDUC
a2a0: 45 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b  E, &zAlloc) : 0;
a2b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
a2c0: 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20  f( pzBuffer ){. 
a2d0: 20 20 20 20 20 20 20 2a 70 7a 42 75 66 66 65 72         *pzBuffer
a2e0: 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20   = zAlloc;.     
a2f0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
a300: 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
a310: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
a320: 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  okenOnly) ){.   
a330: 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6f       if( pNew->o
a340: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  p==TK_SELECT_COL
a350: 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UMN ){.         
a360: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70   pNew->pLeft = p
a370: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20  ->pLeft;.       
a380: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a390: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
a3a0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
a3b0: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b  b, p->pLeft, 0);
a3c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a3d0: 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20     pNew->pRight 
a3e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
a3f0: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20  (db, p->pRight, 
a400: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
a410: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
a420: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  New;.}../*.** Cr
a430: 65 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  eate and return 
a440: 61 20 64 65 65 70 20 63 6f 70 79 20 6f 66 20 74  a deep copy of t
a450: 68 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  he object passed
a460: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a   as the second .
a470: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  ** argument. If 
a480: 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e  an OOM condition
a490: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
a4a0: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
a4b0: 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 62 2d  d.** and the db-
a4c0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
a4d0: 61 67 20 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64  ag set..*/.#ifnd
a4e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
a4f0: 54 45 0a 73 74 61 74 69 63 20 57 69 74 68 20 2a  TE.static With *
a500: 77 69 74 68 44 75 70 28 73 71 6c 69 74 65 33 20  withDup(sqlite3 
a510: 2a 64 62 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20  *db, With *p){. 
a520: 20 57 69 74 68 20 2a 70 52 65 74 20 3d 20 30 3b   With *pRet = 0;
a530: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
a540: 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  int nByte = size
a550: 6f 66 28 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28  of(*p) + sizeof(
a560: 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e  p->a[0]) * (p->n
a570: 43 74 65 2d 31 29 3b 0a 20 20 20 20 70 52 65 74  Cte-1);.    pRet
a580: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
a590: 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
a5a0: 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74 20  );.    if( pRet 
a5b0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
a5c0: 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 43 74 65        pRet->nCte
a5d0: 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20   = p->nCte;.    
a5e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
a5f0: 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCte; i++){.    
a600: 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70      pRet->a[i].p
a610: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
a620: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d  SelectDup(db, p-
a630: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30  >a[i].pSelect, 0
a640: 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d  );.        pRet-
a650: 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71  >a[i].pCols = sq
a660: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
a670: 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f  (db, p->a[i].pCo
a680: 6c 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ls, 0);.        
a690: 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  pRet->a[i].zName
a6a0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
a6b0: 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a  up(db, p->a[i].z
a6c0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
a6d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
a6e0: 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a  n pRet;.}.#else.
a6f0: 23 20 64 65 66 69 6e 65 20 77 69 74 68 44 75 70  # define withDup
a700: 28 78 2c 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a  (x,y) 0.#endif..
a710: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
a720: 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75  ing group of rou
a730: 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20  tines make deep 
a740: 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65 73  copies of expres
a750: 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73  sions,.** expres
a760: 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c  sion lists, ID l
a770: 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74  ists, and select
a780: 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68   statements.  Th
a790: 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20  e copies can.** 
a7a0: 62 65 20 64 65 6c 65 74 65 64 20 28 62 79 20 62  be deleted (by b
a7b0: 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74  eing passed to t
a7c0: 68 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20  heir respective 
a7d0: 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74  ...Delete() rout
a7e0: 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74  ines).** without
a7f0: 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f   effecting the o
a800: 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20  riginals..**.** 
a810: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  The expression l
a820: 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75  ist, ID, and sou
a830: 72 63 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e  rce lists return
a840: 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c   by sqlite3ExprL
a850: 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c  istDup(),.** sql
a860: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c  ite3IdListDup(),
a870: 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c   and sqlite3SrcL
a880: 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74  istDup() can not
a890: 20 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61   be further expa
a8a0: 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73  nded .** by subs
a8b0: 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
a8c0: 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e  sqlite*ListAppen
a8d0: 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a  d() routines..**
a8e0: 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74  .** Any tables t
a8f0: 68 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20  hat the SrcList 
a900: 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
a910: 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65  re not duplicate
a920: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61  d..**.** The fla
a930: 67 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e  gs parameter con
a940: 74 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74  tains a combinat
a950: 69 6f 6e 20 6f 66 20 74 68 65 20 45 58 50 52 44  ion of the EXPRD
a960: 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a  UP_XXX flags..**
a970: 20 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f   If the EXPRDUP_
a980: 52 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73  REDUCE flag is s
a990: 65 74 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72  et, then the str
a9a0: 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20  ucture returned 
a9b0: 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65  is a.** truncate
a9c0: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  d version of the
a9d0: 20 75 73 75 61 6c 20 45 78 70 72 20 73 74 72 75   usual Expr stru
a9e0: 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20  cture that will 
a9f0: 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20  be stored as.** 
aa00: 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d  part of the in-m
aa10: 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
aa20: 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
aa30: 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a  base schema..*/.
aa40: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
aa50: 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  rDup(sqlite3 *db
aa60: 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  , Expr *p, int f
aa70: 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28  lags){.  assert(
aa80: 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61   flags==0 || fla
aa90: 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55  gs==EXPRDUP_REDU
aaa0: 43 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  CE );.  return p
aab0: 20 3f 20 65 78 70 72 44 75 70 28 64 62 2c 20 70   ? exprDup(db, p
aac0: 2c 20 66 6c 61 67 73 2c 20 30 29 20 3a 20 30 3b  , flags, 0) : 0;
aad0: 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c  .}.ExprList *sql
aae0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
aaf0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
ab00: 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c  rList *p, int fl
ab10: 61 67 73 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  ags){.  ExprList
ab20: 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74   *pNew;.  struct
ab30: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
ab40: 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d  pItem, *pOldItem
ab50: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  ;.  int i;.  ass
ab60: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
ab70: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
ab80: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
ab90: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
aba0: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  NN(db, sizeof(*p
abb0: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
abc0: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
abd0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20  ;.  pNew->nExpr 
abe0: 3d 20 69 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a  = i = p->nExpr;.
abf0: 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 45    if( (flags & E
ac00: 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3d 3d  XPRDUP_REDUCE)==
ac10: 30 20 29 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70  0 ) for(i=1; i<p
ac20: 2d 3e 6e 45 78 70 72 3b 20 69 2b 3d 69 29 7b 7d  ->nExpr; i+=i){}
ac30: 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74  .  pNew->a = pIt
ac40: 65 6d 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  em = sqlite3DbMa
ac50: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 20 69  llocRawNN(db,  i
ac60: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29  *sizeof(p->a[0])
ac70: 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 3d   );.  if( pItem=
ac80: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
ac90: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77  3DbFree(db, pNew
aca0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
acb0: 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65 6d  .  } .  pOldItem
acc0: 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69   = p->a;.  for(i
acd0: 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20  =0; i<p->nExpr; 
ace0: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f  i++, pItem++, pO
acf0: 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45  ldItem++){.    E
ad00: 78 70 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d 20  xpr *pOldExpr = 
ad10: 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 3b  pOldItem->pExpr;
ad20: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70  .    pItem->pExp
ad30: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
ad40: 75 70 28 64 62 2c 20 70 4f 6c 64 45 78 70 72 2c  up(db, pOldExpr,
ad50: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 49 74   flags);.    pIt
ad60: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
ad70: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
ad80: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  pOldItem->zName)
ad90: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70  ;.    pItem->zSp
ada0: 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  an = sqlite3DbSt
adb0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
adc0: 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70  m->zSpan);.    p
add0: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20  Item->sortOrder 
ade0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74  = pOldItem->sort
adf0: 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65 6d  Order;.    pItem
ae00: 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20  ->done = 0;.    
ae10: 70 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61  pItem->bSpanIsTa
ae20: 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53  b = pOldItem->bS
ae30: 70 61 6e 49 73 54 61 62 3b 0a 20 20 20 20 70 49  panIsTab;.    pI
ae40: 74 65 6d 2d 3e 75 20 3d 20 70 4f 6c 64 49 74 65  tem->u = pOldIte
ae50: 6d 2d 3e 75 3b 0a 20 20 7d 0a 20 20 72 65 74 75  m->u;.  }.  retu
ae60: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
ae70: 2a 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72  * If cursors, tr
ae80: 69 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e  iggers, views an
ae90: 64 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65  d subqueries are
aea0: 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f   all omitted fro
aeb0: 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20  m.** the build, 
aec0: 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65  then none of the
aed0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
aee0: 6e 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20  nes, except for 
aef0: 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63  .** sqlite3Selec
af00: 74 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63  tDup(), can be c
af10: 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65  alled. sqlite3Se
af20: 6c 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d  lectDup() is som
af30: 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64  etimes.** called
af40: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67   with a NULL arg
af50: 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64  ument..*/.#if !d
af60: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
af70: 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
af80: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
af90: 5f 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20  _TRIGGER) \. || 
afa0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
afb0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53  OMIT_SUBQUERY).S
afc0: 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
afd0: 72 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65  rcListDup(sqlite
afe0: 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a  3 *db, SrcList *
aff0: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
b000: 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a   SrcList *pNew;.
b010: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
b020: 42 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Byte;.  assert( 
b030: 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  db!=0 );.  if( p
b040: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
b050: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
b060: 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e  (*p) + (p->nSrc>
b070: 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  0 ? sizeof(p->a[
b080: 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31  0]) * (p->nSrc-1
b090: 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d  ) : 0);.  pNew =
b0a0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
b0b0: 52 61 77 4e 4e 28 64 62 2c 20 6e 42 79 74 65 20  RawNN(db, nByte 
b0c0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
b0d0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
b0e0: 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77  New->nSrc = pNew
b0f0: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53  ->nAlloc = p->nS
b100: 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rc;.  for(i=0; i
b110: 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  <p->nSrc; i++){.
b120: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
b130: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
b140: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
b150: 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
b160: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
b170: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
b180: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
b190: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53      pNewItem->pS
b1a0: 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d  chema = pOldItem
b1b0: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70  ->pSchema;.    p
b1c0: 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  NewItem->zDataba
b1d0: 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  se = sqlite3DbSt
b1e0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
b1f0: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
b200: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
b210: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
b220: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
b230: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
b240: 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  NewItem->zAlias 
b250: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
b260: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
b270: 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65  zAlias);.    pNe
b280: 77 49 74 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64  wItem->fg = pOld
b290: 49 74 65 6d 2d 3e 66 67 3b 0a 20 20 20 20 70 4e  Item->fg;.    pN
b2a0: 65 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  ewItem->iCursor 
b2b0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72  = pOldItem->iCur
b2c0: 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  sor;.    pNewIte
b2d0: 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d  m->addrFillSub =
b2e0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46   pOldItem->addrF
b2f0: 69 6c 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65 77  illSub;.    pNew
b300: 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20  Item->regReturn 
b310: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52  = pOldItem->regR
b320: 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70  eturn;.    if( p
b330: 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e  NewItem->fg.isIn
b340: 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20 20  dexedBy ){.     
b350: 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 7a 49   pNewItem->u1.zI
b360: 6e 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74  ndexedBy = sqlit
b370: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
b380: 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64  OldItem->u1.zInd
b390: 65 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20  exedBy);.    }. 
b3a0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 42     pNewItem->pIB
b3b0: 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d  Index = pOldItem
b3c0: 2d 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 20 20  ->pIBIndex;.    
b3d0: 69 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67  if( pNewItem->fg
b3e0: 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20  .isTabFunc ){.  
b3f0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31      pNewItem->u1
b400: 2e 70 46 75 6e 63 41 72 67 20 3d 20 0a 20 20 20  .pFuncArg = .   
b410: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
b420: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f  prListDup(db, pO
b430: 6c 64 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63  ldItem->u1.pFunc
b440: 41 72 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  Arg, flags);.   
b450: 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e   }.    pTab = pN
b460: 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70  ewItem->pTab = p
b470: 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  OldItem->pTab;. 
b480: 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20     if( pTab ){. 
b490: 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b       pTab->nRef+
b4a0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  +;.    }.    pNe
b4b0: 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  wItem->pSelect =
b4c0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
b4d0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
b4e0: 70 53 65 6c 65 63 74 2c 20 66 6c 61 67 73 29 3b  pSelect, flags);
b4f0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
b500: 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  On = sqlite3Expr
b510: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
b520: 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a 20  ->pOn, flags);. 
b530: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73     pNewItem->pUs
b540: 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c  ing = sqlite3IdL
b550: 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  istDup(db, pOldI
b560: 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
b570: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55    pNewItem->colU
b580: 73 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  sed = pOldItem->
b590: 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72  colUsed;.  }.  r
b5a0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64  eturn pNew;.}.Id
b5b0: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c  List *sqlite3IdL
b5c0: 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  istDup(sqlite3 *
b5d0: 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a  db, IdList *p){.
b5e0: 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a    IdList *pNew;.
b5f0: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
b600: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  t( db!=0 );.  if
b610: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
b620: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
b630: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
b640: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
b650: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
b660: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
b670: 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d    pNew->nId = p-
b680: 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20  >nId;.  pNew->a 
b690: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
b6a0: 63 52 61 77 4e 4e 28 64 62 2c 20 70 2d 3e 6e 49  cRawNN(db, p->nI
b6b0: 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  d*sizeof(p->a[0]
b6c0: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  ) );.  if( pNew-
b6d0: 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  >a==0 ){.    sql
b6e0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
b6f0: 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  New);.    return
b700: 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74   0;.  }.  /* Not
b710: 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20 74  e that because t
b720: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
b730: 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d  llocation for p-
b740: 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  >a[] is not.  **
b750: 20 6e 65 63 65 73 73 61 72 69 6c 79 20 61 20 70   necessarily a p
b760: 6f 77 65 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c  ower of two, sql
b770: 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64  ite3IdListAppend
b780: 28 29 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61  () may not be ca
b790: 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  lled.  ** on the
b7a0: 20 64 75 70 6c 69 63 61 74 65 20 63 72 65 61 74   duplicate creat
b7b0: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
b7c0: 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ion. */.  for(i=
b7d0: 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b  0; i<p->nId; i++
b7e0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ){.    struct Id
b7f0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49  List_item *pNewI
b800: 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69  tem = &pNew->a[i
b810: 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ];.    struct Id
b820: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49  List_item *pOldI
b830: 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a  tem = &p->a[i];.
b840: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e      pNewItem->zN
b850: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
b860: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
b870: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
b880: 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20  pNewItem->idx = 
b890: 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20  pOldItem->idx;. 
b8a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
b8b0: 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  ;.}.Select *sqli
b8c0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c  te3SelectDup(sql
b8d0: 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74  ite3 *db, Select
b8e0: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
b8f0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 2c  .  Select *pNew,
b900: 20 2a 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65   *pPrior;.  asse
b910: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
b920: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
b930: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
b940: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
b950: 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29  N(db, sizeof(*p)
b960: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
b970: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
b980: 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73  pNew->pEList = s
b990: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
b9a0: 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  p(db, p->pEList,
b9b0: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
b9c0: 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53  >pSrc = sqlite3S
b9d0: 72 63 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  rcListDup(db, p-
b9e0: 3e 70 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a 20  >pSrc, flags);. 
b9f0: 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20   pNew->pWhere = 
ba00: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
ba10: 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c  b, p->pWhere, fl
ba20: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47  ags);.  pNew->pG
ba30: 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
ba40: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
ba50: 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c 61  p->pGroupBy, fla
ba60: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61  gs);.  pNew->pHa
ba70: 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78  ving = sqlite3Ex
ba80: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48 61  prDup(db, p->pHa
ba90: 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ving, flags);.  
baa0: 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
bab0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
bac0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  Dup(db, p->pOrde
bad0: 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  rBy, flags);.  p
bae0: 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b  New->op = p->op;
baf0: 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20  .  pNew->pPrior 
bb00: 3d 20 70 50 72 69 6f 72 20 3d 20 73 71 6c 69 74  = pPrior = sqlit
bb10: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
bb20: 70 2d 3e 70 50 72 69 6f 72 2c 20 66 6c 61 67 73  p->pPrior, flags
bb30: 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 20  );.  if( pPrior 
bb40: 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20  ) pPrior->pNext 
bb50: 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e  = pNew;.  pNew->
bb60: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65  pNext = 0;.  pNe
bb70: 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69  w->pLimit = sqli
bb80: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
bb90: 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29  ->pLimit, flags)
bba0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65  ;.  pNew->pOffse
bbb0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
bbc0: 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65  up(db, p->pOffse
bbd0: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  t, flags);.  pNe
bbe0: 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  w->iLimit = 0;. 
bbf0: 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d   pNew->iOffset =
bc00: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46   0;.  pNew->selF
bc10: 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61  lags = p->selFla
bc20: 67 73 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68  gs & ~SF_UsesEph
bc30: 65 6d 65 72 61 6c 3b 0a 20 20 70 4e 65 77 2d 3e  emeral;.  pNew->
bc40: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
bc50: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  = -1;.  pNew->ad
bc60: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20  drOpenEphm[1] = 
bc70: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 65 6c  -1;.  pNew->nSel
bc80: 65 63 74 52 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c  ectRow = p->nSel
bc90: 65 63 74 52 6f 77 3b 0a 20 20 70 4e 65 77 2d 3e  ectRow;.  pNew->
bca0: 70 57 69 74 68 20 3d 20 77 69 74 68 44 75 70 28  pWith = withDup(
bcb0: 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a 20  db, p->pWith);. 
bcc0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65   sqlite3SelectSe
bcd0: 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70 2d 3e 7a  tName(pNew, p->z
bce0: 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  SelName);.  retu
bcf0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65  rn pNew;.}.#else
bd00: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
bd10: 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65  SelectDup(sqlite
bd20: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
bd30: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
bd40: 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a  assert( p==0 );.
bd50: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
bd60: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  ndif.../*.** Add
bd70: 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
bd80: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20  o the end of an 
bd90: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
bda0: 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a    If pList is.**
bdb0: 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c   initially NULL,
bdc0: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e   then create a n
bdd0: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ew expression li
bde0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  st..**.** If a m
bdf0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
be00: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
be10: 68 65 20 65 6e 74 69 72 65 20 6c 69 73 74 20 69  he entire list i
be20: 73 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e  s freed and.** N
be30: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
be40: 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73    If non-NULL is
be50: 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
be60: 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
be70: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77  .** that the new
be80: 20 65 6e 74 72 79 20 77 61 73 20 73 75 63 63 65   entry was succe
be90: 73 73 66 75 6c 6c 79 20 61 70 70 65 6e 64 65 64  ssfully appended
bea0: 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73  ..*/.ExprList *s
beb0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
bec0: 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70  pend(.  Parse *p
bed0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
bee0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
bef0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
bf00: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
bf10: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
bf20: 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68   to append. Migh
bf30: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  t be NULL */.  E
bf40: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
bf50: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
bf60: 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e  sion to be appen
bf70: 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  ded. Might be NU
bf80: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  LL */.){.  sqlit
bf90: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
bfa0: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64  >db;.  assert( d
bfb0: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c  b!=0 );.  if( pL
bfc0: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
bfd0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ist = sqlite3DbM
bfe0: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
bff0: 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20  izeof(ExprList) 
c000: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
c010: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
c020: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a  o no_mem;.    }.
c030: 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72      pList->nExpr
c040: 20 3d 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d   = 0;.    pList-
c050: 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  >a = sqlite3DbMa
c060: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
c070: 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
c080: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  ));.    if( pLis
c090: 74 2d 3e 61 3d 3d 30 20 29 20 67 6f 74 6f 20 6e  t->a==0 ) goto n
c0a0: 6f 5f 6d 65 6d 3b 0a 20 20 7d 65 6c 73 65 20 69  o_mem;.  }else i
c0b0: 66 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72  f( (pList->nExpr
c0c0: 20 26 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72   & (pList->nExpr
c0d0: 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  -1))==0 ){.    s
c0e0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
c0f0: 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61 73 73 65  tem *a;.    asse
c100: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
c110: 3e 30 20 29 3b 0a 20 20 20 20 61 20 3d 20 73 71  >0 );.    a = sq
c120: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
c130: 62 2c 20 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69  b, pList->a, pLi
c140: 73 74 2d 3e 6e 45 78 70 72 2a 32 2a 73 69 7a 65  st->nExpr*2*size
c150: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
c160: 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29  ;.    if( a==0 )
c170: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
c180: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  mem;.    }.    p
c190: 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d  List->a = a;.  }
c1a0: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
c1b0: 2d 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ->a!=0 );.  if( 
c1c0: 31 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  1 ){.    struct 
c1d0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
c1e0: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
c1f0: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d  [pList->nExpr++]
c200: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74  ;.    memset(pIt
c210: 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  em, 0, sizeof(*p
c220: 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49 74 65  Item));.    pIte
c230: 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  m->pExpr = pExpr
c240: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
c250: 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20  List;..no_mem:  
c260: 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c     .  /* Avoid l
c270: 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66  eaking memory if
c280: 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c   malloc has fail
c290: 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ed. */.  sqlite3
c2a0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
c2b0: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
c2c0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
c2d0: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  b, pList);.  ret
c2e0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
c2f0: 70 43 6f 6c 75 6d 6e 73 20 61 6e 64 20 70 45 78  pColumns and pEx
c300: 70 72 20 66 6f 72 6d 20 61 20 76 65 63 74 6f 72  pr form a vector
c310: 20 61 73 73 69 67 6e 6d 65 6e 74 20 77 68 69 63   assignment whic
c320: 68 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  h is part of the
c330: 20 53 45 54 0a 2a 2a 20 63 6c 61 75 73 65 20 6f   SET.** clause o
c340: 66 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74  f an UPDATE stat
c350: 65 6d 65 6e 74 2e 20 20 4c 69 6b 65 20 74 68 69  ement.  Like thi
c360: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
c370: 28 61 2c 62 2c 63 29 20 3d 20 28 65 78 70 72 31  (a,b,c) = (expr1
c380: 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a  ,expr2,expr3).**
c390: 20 4f 72 3a 20 20 20 20 28 61 2c 62 2c 63 29 20   Or:    (a,b,c) 
c3a0: 3d 20 28 53 45 4c 45 43 54 20 78 2c 79 2c 7a 20  = (SELECT x,y,z 
c3b0: 46 52 4f 4d 20 2e 2e 2e 2e 29 0a 2a 2a 0a 2a 2a  FROM ....).**.**
c3c0: 20 46 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6f   For each term o
c3d0: 66 20 74 68 65 20 76 65 63 74 6f 72 20 61 73 73  f the vector ass
c3e0: 69 67 6e 6d 65 6e 74 2c 20 61 70 70 65 6e 64 20  ignment, append 
c3f0: 6e 65 77 20 65 6e 74 72 69 65 73 20 74 6f 20 74  new entries to t
c400: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
c410: 20 6c 69 73 74 20 70 4c 69 73 74 2e 20 20 49 6e   list pList.  In
c420: 20 74 68 65 20 63 61 73 65 20 6f 66 20 61 20 73   the case of a s
c430: 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 4c  ubquery on the L
c440: 48 53 2c 20 61 70 70 65 6e 64 0a 2a 2a 20 54 4b  HS, append.** TK
c450: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 65  _SELECT_COLUMN e
c460: 78 70 72 65 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 45  xpressions..*/.E
c470: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
c480: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 56 65  ExprListAppendVe
c490: 63 74 6f 72 28 0a 20 20 50 61 72 73 65 20 2a 70  ctor(.  Parse *p
c4a0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
c4b0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
c4c0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
c4d0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  *pList,       /*
c4e0: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
c4f0: 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20  o append. Might 
c500: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 49 64 4c  be NULL */.  IdL
c510: 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 73 2c 20 20  ist *pColumns,  
c520: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6e      /* List of n
c530: 61 6d 65 73 20 6f 66 20 4c 48 53 20 6f 66 20 74  ames of LHS of t
c540: 68 65 20 61 73 73 69 67 6e 6d 65 6e 74 20 2a 2f  he assignment */
c550: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
c560: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65 63            /* Vec
c570: 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74  tor expression t
c580: 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d  o be appended. M
c590: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
c5a0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
c5b0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
c5c0: 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69 3b   int n;.  int i;
c5d0: 0a 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20  .  int iFirst = 
c5e0: 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e  pList ? pList->n
c5f0: 45 78 70 72 20 3a 20 30 3b 0a 20 20 69 66 28 20  Expr : 0;.  if( 
c600: 70 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29 20 67 6f  pColumns==0 ) go
c610: 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64  to vector_append
c620: 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 70 45  _error;.  if( pE
c630: 78 70 72 3d 3d 30 20 29 20 67 6f 74 6f 20 76 65  xpr==0 ) goto ve
c640: 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f  ctor_append_erro
c650: 72 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  r;.  n = sqlite3
c660: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
c670: 45 78 70 72 29 3b 0a 20 20 69 66 28 20 70 43 6f  Expr);.  if( pCo
c680: 6c 75 6d 6e 73 2d 3e 6e 49 64 21 3d 6e 20 29 7b  lumns->nId!=n ){
c690: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
c6a0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 64  rMsg(pParse, "%d
c6b0: 20 63 6f 6c 75 6d 6e 73 20 61 73 73 69 67 6e 65   columns assigne
c6c0: 64 20 25 64 20 76 61 6c 75 65 73 22 2c 0a 20 20  d %d values",.  
c6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6e0: 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 2c    pColumns->nId,
c6f0: 20 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 76 65   n);.    goto ve
c700: 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f  ctor_append_erro
c710: 72 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  r;.  }.  for(i=0
c720: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
c730: 20 45 78 70 72 20 2a 70 53 75 62 45 78 70 72 20   Expr *pSubExpr 
c740: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 46 6f 72  = sqlite3ExprFor
c750: 56 65 63 74 6f 72 46 69 65 6c 64 28 70 50 61 72  VectorField(pPar
c760: 73 65 2c 20 70 45 78 70 72 2c 20 69 29 3b 0a 20  se, pExpr, i);. 
c770: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
c780: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
c790: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  (pParse, pList, 
c7a0: 70 53 75 62 45 78 70 72 29 3b 0a 20 20 20 20 69  pSubExpr);.    i
c7b0: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
c7c0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
c7d0: 3e 6e 45 78 70 72 3d 3d 69 46 69 72 73 74 2b 69  >nExpr==iFirst+i
c7e0: 2b 31 20 29 3b 0a 20 20 20 20 20 20 70 4c 69 73  +1 );.      pLis
c7f0: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  t->a[pList->nExp
c800: 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 70 43 6f  r-1].zName = pCo
c810: 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  lumns->a[i].zNam
c820: 65 3b 0a 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e  e;.      pColumn
c830: 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  s->a[i].zName = 
c840: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  0;.    }.  }.  i
c850: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
c860: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 69  _SELECT ){.    i
c870: 66 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73  f( pList && pLis
c880: 74 2d 3e 61 5b 69 46 69 72 73 74 5d 2e 70 45 78  t->a[iFirst].pEx
c890: 70 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  pr ){.      asse
c8a0: 72 74 28 20 70 4c 69 73 74 2d 3e 61 5b 69 46 69  rt( pList->a[iFi
c8b0: 72 73 74 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d  rst].pExpr->op==
c8c0: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
c8d0: 20 29 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d   );.      pList-
c8e0: 3e 61 5b 69 46 69 72 73 74 5d 2e 70 45 78 70 72  >a[iFirst].pExpr
c8f0: 2d 3e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72  ->pRight = pExpr
c900: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20  ;.      pExpr = 
c910: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 76 65  0;.    }.  }..ve
c920: 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f  ctor_append_erro
c930: 72 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  r:.  sqlite3Expr
c940: 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
c950: 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69  );.  sqlite3IdLi
c960: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f  stDelete(db, pCo
c970: 6c 75 6d 6e 73 29 3b 0a 20 20 72 65 74 75 72 6e  lumns);.  return
c980: 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
c990: 20 53 65 74 20 74 68 65 20 73 6f 72 74 20 6f 72   Set the sort or
c9a0: 64 65 72 20 66 6f 72 20 74 68 65 20 6c 61 73 74  der for the last
c9b0: 20 65 6c 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20   element on the 
c9c0: 67 69 76 65 6e 20 45 78 70 72 4c 69 73 74 2e 0a  given ExprList..
c9d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
c9e0: 78 70 72 4c 69 73 74 53 65 74 53 6f 72 74 4f 72  xprListSetSortOr
c9f0: 64 65 72 28 45 78 70 72 4c 69 73 74 20 2a 70 2c  der(ExprList *p,
ca00: 20 69 6e 74 20 69 53 6f 72 74 4f 72 64 65 72 29   int iSortOrder)
ca10: 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  {.  if( p==0 ) r
ca20: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
ca30: 20 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 44 45 46   SQLITE_SO_UNDEF
ca40: 49 4e 45 44 3c 30 20 26 26 20 53 51 4c 49 54 45  INED<0 && SQLITE
ca50: 5f 53 4f 5f 41 53 43 3e 3d 30 20 26 26 20 53 51  _SO_ASC>=0 && SQ
ca60: 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3e 30 20 29  LITE_SO_DESC>0 )
ca70: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
ca80: 45 78 70 72 3e 30 20 29 3b 0a 20 20 69 66 28 20  Expr>0 );.  if( 
ca90: 69 53 6f 72 74 4f 72 64 65 72 3c 30 20 29 7b 0a  iSortOrder<0 ){.
caa0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
cab0: 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72  [p->nExpr-1].sor
cac0: 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53  tOrder==SQLITE_S
cad0: 4f 5f 41 53 43 20 29 3b 0a 20 20 20 20 72 65 74  O_ASC );.    ret
cae0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61 5b  urn;.  }.  p->a[
caf0: 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74  p->nExpr-1].sort
cb00: 4f 72 64 65 72 20 3d 20 28 75 38 29 69 53 6f 72  Order = (u8)iSor
cb10: 74 4f 72 64 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tOrder;.}../*.**
cb20: 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73   Set the ExprLis
cb30: 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d  t.a[].zName elem
cb40: 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ent of the most 
cb50: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69  recently added i
cb60: 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78  tem.** on the ex
cb70: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
cb80: 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74  *.** pList might
cb90: 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69   be NULL followi
cba0: 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  ng an OOM error.
cbb0: 20 20 42 75 74 20 70 4e 61 6d 65 20 73 68 6f 75    But pName shou
cbc0: 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e  ld never be.** N
cbd0: 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72  ULL.  If a memor
cbe0: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
cbf0: 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e  ls, the pParse->
cc00: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
cc10: 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e   flag.** is set.
cc20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
cc30: 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28  ExprListSetName(
cc40: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
cc50: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
cc60: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
cc70: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
cc80: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
cc90: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
cca0: 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a  dd the span. */.
ccb0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20    Token *pName, 
ccc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
ccd0: 65 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f  e to be added */
cce0: 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20  .  int dequote  
ccf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
cd00: 75 65 20 74 6f 20 63 61 75 73 65 20 74 68 65 20  ue to cause the 
cd10: 6e 61 6d 65 20 74 6f 20 62 65 20 64 65 71 75 6f  name to be dequo
cd20: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  ted */.){.  asse
cd30: 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20  rt( pList!=0 || 
cd40: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
cd50: 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20  ocFailed!=0 );. 
cd60: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
cd70: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
cd80: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
cd90: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
cda0: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
cdb0: 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d   pItem = &pList-
cdc0: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  >a[pList->nExpr-
cdd0: 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
cde0: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20  pItem->zName==0 
cdf0: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e  );.    pItem->zN
ce00: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
ce10: 74 72 4e 44 75 70 28 70 50 61 72 73 65 2d 3e 64  trNDup(pParse->d
ce20: 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  b, pName->z, pNa
ce30: 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20  me->n);.    if( 
ce40: 64 65 71 75 6f 74 65 20 29 20 73 71 6c 69 74 65  dequote ) sqlite
ce50: 33 44 65 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e  3Dequote(pItem->
ce60: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  zName);.  }.}../
ce70: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
ce80: 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20  rList.a[].zSpan 
ce90: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d  element of the m
cea0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
ceb0: 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68  ed item.** on th
cec0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
ced0: 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d  t..**.** pList m
cee0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c  ight be NULL fol
cef0: 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72  lowing an OOM er
cf00: 72 6f 72 2e 20 20 42 75 74 20 70 53 70 61 6e 20  ror.  But pSpan 
cf10: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a  should never be.
cf20: 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d  ** NULL.  If a m
cf30: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
cf40: 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72   fails, the pPar
cf50: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
cf60: 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20  iled flag.** is 
cf70: 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
cf80: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53  ite3ExprListSetS
cf90: 70 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  pan(.  Parse *pP
cfa0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
cfb0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
cfc0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
cfd0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  *pList,        /
cfe0: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
cff0: 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e  to add the span.
d000: 20 2a 2f 0a 20 20 45 78 70 72 53 70 61 6e 20 2a   */.  ExprSpan *
d010: 70 53 70 61 6e 20 20 20 20 20 20 20 20 20 2f 2a  pSpan         /*
d020: 20 54 68 65 20 73 70 61 6e 20 74 6f 20 62 65 20   The span to be 
d030: 61 64 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71  added */.){.  sq
d040: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
d050: 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
d060: 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62  ( pList!=0 || db
d070: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d  ->mallocFailed!=
d080: 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  0 );.  if( pList
d090: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
d0a0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
d0b0: 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
d0c0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b  pList->nExpr-1];
d0d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
d0e0: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
d0f0: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
d100: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
d110: 49 74 65 6d 2d 3e 70 45 78 70 72 3d 3d 70 53 70  Item->pExpr==pSp
d120: 61 6e 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20  an->pExpr );.   
d130: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
d140: 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29  b, pItem->zSpan)
d150: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70  ;.    pItem->zSp
d160: 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  an = sqlite3DbSt
d170: 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a  rNDup(db, (char*
d180: 29 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a  )pSpan->zStart,.
d190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1b0: 20 20 20 20 28 69 6e 74 29 28 70 53 70 61 6e 2d      (int)(pSpan-
d1c0: 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a  >zEnd - pSpan->z
d1d0: 53 74 61 72 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  Start));.  }.}..
d1e0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
d1f0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c  ression list pEL
d200: 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72  ist contains mor
d210: 65 20 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c  e than iLimit el
d220: 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65  ements,.** leave
d230: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
d240: 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  e in pParse..*/.
d250: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
d260: 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28  ListCheckLength(
d270: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
d280: 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ,.  ExprList *pE
d290: 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68  List,.  const ch
d2a0: 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20  ar *zObject.){. 
d2b0: 20 69 6e 74 20 6d 78 20 3d 20 70 50 61 72 73 65   int mx = pParse
d2c0: 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ->db->aLimit[SQL
d2d0: 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
d2e0: 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  ];.  testcase( p
d2f0: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
d300: 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20  >nExpr==mx );.  
d310: 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74  testcase( pEList
d320: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
d330: 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28  r==mx+1 );.  if(
d340: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
d350: 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20  t->nExpr>mx ){. 
d360: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
d370: 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
d380: 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  many columns in 
d390: 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20  %s", zObject);. 
d3a0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
d3b0: 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70  te an entire exp
d3c0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f  ression list..*/
d3d0: 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
d3e0: 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 65 78 70  OINLINE void exp
d3f0: 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28 73 71  rListDeleteNN(sq
d400: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c  lite3 *db, ExprL
d410: 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
d420: 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45  nt i;.  struct E
d430: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
d440: 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  tem;.  assert( p
d450: 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 70 4c  List->a!=0 || pL
d460: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 29 3b  ist->nExpr==0 );
d470: 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
d480: 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c  st->a, i=0; i<pL
d490: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  ist->nExpr; i++,
d4a0: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73   pItem++){.    s
d4b0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
d4c0: 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  (db, pItem->pExp
d4d0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  r);.    sqlite3D
d4e0: 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
d4f0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
d500: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
d510: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
d520: 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
d530: 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b  e(db, pList->a);
d540: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
d550: 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 76  (db, pList);.}.v
d560: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
d570: 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  istDelete(sqlite
d580: 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20  3 *db, ExprList 
d590: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 70  *pList){.  if( p
d5a0: 4c 69 73 74 20 29 20 65 78 70 72 4c 69 73 74 44  List ) exprListD
d5b0: 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 4c 69 73  eleteNN(db, pLis
d5c0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
d5d0: 75 72 6e 20 74 68 65 20 62 69 74 77 69 73 65 2d  urn the bitwise-
d5e0: 4f 52 20 6f 66 20 61 6c 6c 20 45 78 70 72 2e 66  OR of all Expr.f
d5f0: 6c 61 67 73 20 66 69 65 6c 64 73 20 69 6e 20 74  lags fields in t
d600: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 45 78 70 72  he given.** Expr
d610: 4c 69 73 74 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  List..*/.u32 sql
d620: 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67  ite3ExprListFlag
d630: 73 28 63 6f 6e 73 74 20 45 78 70 72 4c 69 73 74  s(const ExprList
d640: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
d650: 69 3b 0a 20 20 75 33 32 20 6d 20 3d 20 30 3b 0a  i;.  u32 m = 0;.
d660: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
d670: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
d680: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
d690: 7b 0a 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  {.       Expr *p
d6a0: 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Expr = pList->a[
d6b0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
d6c0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 21 3d   assert( pExpr!=
d6d0: 30 20 29 3b 0a 20 20 20 20 20 20 20 6d 20 7c 3d  0 );.       m |=
d6e0: 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 3b 0a 20   pExpr->flags;. 
d6f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
d700: 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n m;.}../*.** Th
d710: 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
d720: 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b   Walker callback
d730: 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
d740: 65 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a  expressions to.*
d750: 2a 20 73 65 65 20 69 66 20 74 68 65 79 20 61 72  * see if they ar
d760: 65 20 22 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72  e "constant" for
d770: 20 73 6f 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e   some definition
d780: 20 6f 66 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54   of constant.  T
d790: 68 65 0a 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f  he.** Walker.eCo
d7a0: 64 65 20 76 61 6c 75 65 20 64 65 74 65 72 6d 69  de value determi
d7b0: 6e 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20  nes the type of 
d7c0: 22 63 6f 6e 73 74 61 6e 74 22 20 77 65 20 61 72  "constant" we ar
d7d0: 65 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72  e looking.** for
d7e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61  ..**.** These ca
d7f0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20  llback routines 
d800: 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  are used to impl
d810: 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77  ement the follow
d820: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  ing:.**.**     s
d830: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
d840: 74 61 6e 74 28 29 20 20 20 20 20 20 20 20 20 20  tant()          
d850: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
d860: 3e 65 43 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20  >eCode==1.**    
d870: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
d880: 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20  nstantNotJoin() 
d890: 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65            pWalke
d8a0: 72 2d 3e 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20  r->eCode==2.**  
d8b0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73     sqlite3ExprIs
d8c0: 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20  TableConstant() 
d8d0: 20 20 20 20 20 20 20 20 20 20 20 20 70 57 61 6c              pWal
d8e0: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a  ker->eCode==3.**
d8f0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
d900: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
d910: 74 69 6f 6e 28 29 20 20 20 20 20 20 20 20 70 57  tion()        pW
d920: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20  alker->eCode==4 
d930: 6f 72 20 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c  or 5.**.** In al
d940: 6c 20 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c  l cases, the cal
d950: 6c 62 61 63 6b 73 20 73 65 74 20 57 61 6c 6b 65  lbacks set Walke
d960: 72 2e 65 43 6f 64 65 3d 30 20 61 6e 64 20 61 62  r.eCode=0 and ab
d970: 6f 72 74 20 69 66 20 74 68 65 20 65 78 70 72 65  ort if the expre
d980: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e  ssion.** is foun
d990: 64 20 74 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f  d to not be a co
d9a0: 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  nstant..**.** Th
d9b0: 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  e sqlite3ExprIsC
d9c0: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
d9d0: 6e 28 29 20 69 73 20 75 73 65 64 20 66 6f 72 20  n() is used for 
d9e0: 65 76 61 6c 75 61 74 69 6e 67 20 65 78 70 72 65  evaluating expre
d9f0: 73 73 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43  ssions.** in a C
da00: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
da10: 65 6d 65 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b  ement.  The Walk
da20: 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 69  er.eCode value i
da30: 73 20 35 20 77 68 65 6e 20 70 61 72 73 69 6e 67  s 5 when parsing
da40: 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20  .** an existing 
da50: 73 63 68 65 6d 61 20 61 6e 64 20 34 20 77 68 65  schema and 4 whe
da60: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20 6e  n processing a n
da70: 65 77 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41  ew statement.  A
da80: 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65   bound.** parame
da90: 74 65 72 20 72 61 69 73 65 73 20 61 6e 20 65 72  ter raises an er
daa0: 72 6f 72 20 66 6f 72 20 6e 65 77 20 73 74 61 74  ror for new stat
dab0: 65 6d 65 6e 74 73 2c 20 62 75 74 20 69 73 20 73  ements, but is s
dac0: 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65  ilently converte
dad0: 64 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72  d.** to NULL for
dae0: 20 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61   existing schema
daf0: 73 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  s.  This allows 
db00: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
db10: 62 6c 65 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f  bles that .** co
db20: 6e 74 61 69 6e 20 61 20 62 6f 75 6e 64 20 70 61  ntain a bound pa
db30: 72 61 6d 65 74 65 72 20 62 65 63 61 75 73 65 20  rameter because 
db40: 74 68 65 79 20 77 65 72 65 20 67 65 6e 65 72 61  they were genera
db50: 74 65 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72  ted by older ver
db60: 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69  sions.** of SQLi
db70: 74 65 20 74 6f 20 62 65 20 70 61 72 73 65 64 20  te to be parsed 
db80: 62 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  by newer version
db90: 73 20 6f 66 20 53 51 4c 69 74 65 20 77 69 74 68  s of SQLite with
dba0: 6f 75 74 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a  out raising a.**
dbb0: 20 6d 61 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d   malformed schem
dbc0: 61 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  a error..*/.stat
dbd0: 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49  ic int exprNodeI
dbe0: 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72  sConstant(Walker
dbf0: 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
dc00: 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49  *pExpr){..  /* I
dc10: 66 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  f pWalker->eCode
dc20: 20 69 73 20 32 20 74 68 65 6e 20 61 6e 79 20 74   is 2 then any t
dc30: 65 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65  erm of the expre
dc40: 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73  ssion that comes
dc50: 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f   from.  ** the O
dc60: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
dc70: 65 73 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69  es of a left joi
dc80: 6e 20 64 69 73 71 75 61 6c 69 66 69 65 73 20 74  n disqualifies t
dc90: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  he expression.  
dca0: 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f  ** from being co
dcb0: 6e 73 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e  nsidered constan
dcc0: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c  t. */.  if( pWal
dcd0: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26  ker->eCode==2 &&
dce0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
dcf0: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
dd00: 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70 57 61 6c  oin) ){.    pWal
dd10: 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a  ker->eCode = 0;.
dd20: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
dd30: 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69  bort;.  }..  swi
dd40: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
dd50: 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65  {.    /* Conside
dd60: 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62  r functions to b
dd70: 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c  e constant if al
dd80: 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74  l their argument
dd90: 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20  s are constant. 
dda0: 20 20 20 2a 2a 20 61 6e 64 20 65 69 74 68 65 72     ** and either
ddb0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
ddc0: 3d 34 20 6f 72 20 35 20 6f 72 20 74 68 65 20 66  =4 or 5 or the f
ddd0: 75 6e 63 74 69 6f 6e 20 68 61 73 20 74 68 65 0a  unction has the.
dde0: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55      ** SQLITE_FU
ddf0: 4e 43 5f 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a  NC_CONST flag. *
de00: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  /.    case TK_FU
de10: 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66  NCTION:.      if
de20: 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  ( pWalker->eCode
de30: 3e 3d 34 20 7c 7c 20 45 78 70 72 48 61 73 50 72  >=4 || ExprHasPr
de40: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f  operty(pExpr,EP_
de50: 43 6f 6e 73 74 46 75 6e 63 29 20 29 7b 0a 20 20  ConstFunc) ){.  
de60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
de70: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20  _Continue;.     
de80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
de90: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
dea0: 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
deb0: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
dec0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
ded0: 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54  K_ID:.    case T
dee0: 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  K_COLUMN:.    ca
def0: 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
df00: 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ON:.    case TK_
df10: 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20  AGG_COLUMN:.    
df20: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
df30: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a  r->op==TK_ID );.
df40: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
df50: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
df60: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  LUMN );.      te
df70: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
df80: 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
df90: 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ON );.      test
dfa0: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
dfb0: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
dfc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c  ;.      if( pWal
dfd0: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 20 26 26  ker->eCode==3 &&
dfe0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
dff0: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 20  pWalker->u.iCur 
e000: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
e010: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
e020: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e030: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
e040: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
e050: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
e060: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63  t;.      }.    c
e070: 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a  ase TK_VARIABLE:
e080: 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b  .      if( pWalk
e090: 65 72 2d 3e 65 43 6f 64 65 3d 3d 35 20 29 7b 0a  er->eCode==5 ){.
e0a0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6c 65 6e          /* Silen
e0b0: 74 6c 79 20 63 6f 6e 76 65 72 74 20 62 6f 75 6e  tly convert boun
e0c0: 64 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 61  d parameters tha
e0d0: 74 20 61 70 70 65 61 72 20 69 6e 73 69 64 65 20  t appear inside 
e0e0: 6f 66 20 43 52 45 41 54 45 0a 20 20 20 20 20 20  of CREATE.      
e0f0: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20    ** statements 
e100: 69 6e 74 6f 20 61 20 4e 55 4c 4c 20 77 68 65 6e  into a NULL when
e110: 20 70 61 72 73 69 6e 67 20 74 68 65 20 43 52 45   parsing the CRE
e120: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 65  ATE statement te
e130: 78 74 20 6f 75 74 0a 20 20 20 20 20 20 20 20 2a  xt out.        *
e140: 2a 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  * of the sqlite_
e150: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a  master table */.
e160: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
e170: 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20  p = TK_NULL;.   
e180: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57 61     }else if( pWa
e190: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 29  lker->eCode==4 )
e1a0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62  {.        /* A b
e1b0: 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  ound parameter i
e1c0: 6e 20 61 20 43 52 45 41 54 45 20 73 74 61 74 65  n a CREATE state
e1d0: 6d 65 6e 74 20 74 68 61 74 20 6f 72 69 67 69 6e  ment that origin
e1e0: 61 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 20 20  ates from.      
e1f0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72 65    ** sqlite3_pre
e200: 70 61 72 65 28 29 20 63 61 75 73 65 73 20 61 6e  pare() causes an
e210: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
e220: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
e230: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
e240: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
e250: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
e260: 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f   Fall through */
e270: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
e280: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
e290: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
e2a0: 43 54 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e  CT ); /* selectN
e2b0: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69  odeIsConstant wi
e2c0: 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20  ll disallow */. 
e2d0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
e2e0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49  Expr->op==TK_EXI
e2f0: 53 54 53 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74  STS ); /* select
e300: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77  NodeIsConstant w
e310: 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a  ill disallow */.
e320: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
e330: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d  _Continue;.  }.}
e340: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65  .static int sele
e350: 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  ctNodeIsConstant
e360: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
e370: 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65  , Select *NotUse
e380: 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d){.  UNUSED_PAR
e390: 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
e3a0: 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  .  pWalker->eCod
e3b0: 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  e = 0;.  return 
e3c0: 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74 61  WRC_Abort;.}.sta
e3d0: 74 69 63 20 69 6e 74 20 65 78 70 72 49 73 43 6f  tic int exprIsCo
e3e0: 6e 73 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  nst(Expr *p, int
e3f0: 20 69 6e 69 74 46 6c 61 67 2c 20 69 6e 74 20 69   initFlag, int i
e400: 43 75 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  Cur){.  Walker w
e410: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30  ;.  memset(&w, 0
e420: 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
e430: 77 2e 65 43 6f 64 65 20 3d 20 69 6e 69 74 46 6c  w.eCode = initFl
e440: 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  ag;.  w.xExprCal
e450: 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65  lback = exprNode
e460: 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e  IsConstant;.  w.
e470: 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
e480: 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f  = selectNodeIsCo
e490: 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 75 2e 69 43  nstant;.  w.u.iC
e4a0: 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 73 71 6c  ur = iCur;.  sql
e4b0: 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
e4c0: 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e   p);.  return w.
e4d0: 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eCode;.}../*.** 
e4e0: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
e4f0: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
e500: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
e510: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
e520: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30  onstant.** and 0
e530: 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20   if it involves 
e540: 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e  variables or fun
e550: 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a  ction calls..**.
e560: 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
e570: 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ses of this func
e580: 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71  tion, a double-q
e590: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
e5a0: 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63  : "abc").** is c
e5b0: 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69  onsidered a vari
e5c0: 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c  able but a singl
e5d0: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
e5e0: 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a  (ex: 'abc') is.*
e5f0: 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f  * a constant..*/
e600: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
e610: 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20  IsConstant(Expr 
e620: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  *p){.  return ex
e630: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 2c 20  prIsConst(p, 1, 
e640: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  0);.}../*.** Wal
e650: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
e660: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f  tree.  Return no
e670: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78  n-zero if the ex
e680: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
e690: 74 61 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65  tant.** that doe
e6a0: 73 20 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20 66  s no originate f
e6b0: 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53  rom the ON or US
e6c0: 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61  ING clauses of a
e6d0: 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e   join..** Return
e6e0: 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65   0 if it involve
e6f0: 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66  s variables or f
e700: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72  unction calls or
e710: 20 74 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61   terms from.** a
e720: 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  n ON or USING cl
e730: 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ause..*/.int sql
e740: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
e750: 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a  ntNotJoin(Expr *
e760: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70  p){.  return exp
e770: 72 49 73 43 6f 6e 73 74 28 70 2c 20 32 2c 20 30  rIsConst(p, 2, 0
e780: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  );.}../*.** Walk
e790: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
e7a0: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  ree.  Return non
e7b0: 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70  -zero if the exp
e7c0: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
e7d0: 61 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 79 20 73  ant.** for any s
e7e0: 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
e7f0: 20 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73   table with curs
e800: 6f 72 20 69 43 75 72 2e 20 20 49 6e 20 6f 74 68  or iCur.  In oth
e810: 65 72 20 77 6f 72 64 73 2c 20 74 68 65 0a 2a 2a  er words, the.**
e820: 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74   expression must
e830: 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 61 6e   not refer to an
e840: 79 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73  y non-determinis
e850: 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72  tic function nor
e860: 20 61 6e 79 0a 2a 2a 20 74 61 62 6c 65 20 6f 74   any.** table ot
e870: 68 65 72 20 74 68 61 6e 20 69 43 75 72 2e 0a 2a  her than iCur..*
e880: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
e890: 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74  rIsTableConstant
e8a0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 43  (Expr *p, int iC
e8b0: 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  ur){.  return ex
e8c0: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 33 2c 20  prIsConst(p, 3, 
e8d0: 69 43 75 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  iCur);.}../*.** 
e8e0: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
e8f0: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
e900: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
e910: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
e920: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20  onstant.** or a 
e930: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69  function call wi
e940: 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75  th constant argu
e950: 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61  ments.  Return a
e960: 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a  nd 0 if there.**
e970: 20 61 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c   are any variabl
e980: 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  es..**.** For th
e990: 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
e9a0: 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64  is function, a d
e9b0: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
e9c0: 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a  ing (ex: "abc").
e9d0: 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
e9e0: 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20   a variable but 
e9f0: 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20  a single-quoted 
ea00: 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63  string (ex: 'abc
ea10: 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74  ') is.** a const
ea20: 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ant..*/.int sqli
ea30: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
ea40: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72  tOrFunction(Expr
ea50: 20 2a 70 2c 20 75 38 20 69 73 49 6e 69 74 29 7b   *p, u8 isInit){
ea60: 0a 20 20 61 73 73 65 72 74 28 20 69 73 49 6e 69  .  assert( isIni
ea70: 74 3d 3d 30 20 7c 7c 20 69 73 49 6e 69 74 3d 3d  t==0 || isInit==
ea80: 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 78  1 );.  return ex
ea90: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 34 2b 69  prIsConst(p, 4+i
eaa0: 73 49 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a 23 69  sInit, 0);.}..#i
eab0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
eac0: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
ead0: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
eae0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
eaf0: 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
eb00: 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61  expression conta
eb10: 69 6e 73 20 61 0a 2a 2a 20 73 75 62 71 75 65 72  ins a.** subquer
eb20: 79 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20  y of some kind. 
eb30: 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   Return 0 if the
eb40: 72 65 20 61 72 65 20 6e 6f 20 73 75 62 71 75 65  re are no subque
eb50: 72 69 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ries..*/.int sql
eb60: 69 74 65 33 45 78 70 72 43 6f 6e 74 61 69 6e 73  ite3ExprContains
eb70: 53 75 62 71 75 65 72 79 28 45 78 70 72 20 2a 70  Subquery(Expr *p
eb80: 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
eb90: 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
eba0: 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 65  izeof(w));.  w.e
ebb0: 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45  Code = 1;.  w.xE
ebc0: 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71  xprCallback = sq
ebd0: 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f  lite3ExprWalkNoo
ebe0: 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  p;.  w.xSelectCa
ebf0: 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e  llback = selectN
ec00: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20  odeIsConstant;. 
ec10: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
ec20: 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72  (&w, p);.  retur
ec30: 6e 20 77 2e 65 43 6f 64 65 3d 3d 30 3b 0a 7d 0a  n w.eCode==0;.}.
ec40: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
ec50: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
ec60: 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73 74 61  p codes a consta
ec70: 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61 74 20  nt integer that 
ec80: 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a  is small enough.
ec90: 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 33  ** to fit in a 3
eca0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72  2-bit integer, r
ecb0: 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75 74 20  eturn 1 and put 
ecc0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
ecd0: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a   integer.** in *
ece0: 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20  pValue.  If the 
ecf0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f  expression is no
ed00: 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20  t an integer or 
ed10: 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62 69 67  if it is too big
ed20: 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20  .** to fit in a 
ed30: 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e  signed 32-bit in
ed40: 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 30 20  teger, return 0 
ed50: 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61 6c 75  and leave *pValu
ed60: 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  e unchanged..*/.
ed70: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
ed80: 73 49 6e 74 65 67 65 72 28 45 78 70 72 20 2a 70  sInteger(Expr *p
ed90: 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a  , int *pValue){.
eda0: 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 0a 20    int rc = 0;.. 
edb0: 20 2f 2a 20 49 66 20 61 6e 20 65 78 70 72 65 73   /* If an expres
edc0: 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65 67  sion is an integ
edd0: 65 72 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20  er literal that 
ede0: 66 69 74 73 20 69 6e 20 61 20 73 69 67 6e 65 64  fits in a signed
edf0: 20 33 32 2d 62 69 74 0a 20 20 2a 2a 20 69 6e 74   32-bit.  ** int
ee00: 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20 45  eger, then the E
ee10: 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20  P_IntValue flag 
ee20: 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64  will have alread
ee30: 79 20 62 65 65 6e 20 73 65 74 20 2a 2f 0a 20 20  y been set */.  
ee40: 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54  assert( p->op!=T
ee50: 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 28 70 2d  K_INTEGER || (p-
ee60: 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  >flags & EP_IntV
ee70: 61 6c 75 65 29 21 3d 30 0a 20 20 20 20 20 20 20  alue)!=0.       
ee80: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 65      || sqlite3Ge
ee90: 74 49 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b  tInt32(p->u.zTok
eea0: 65 6e 2c 20 26 72 63 29 3d 3d 30 20 29 3b 0a 0a  en, &rc)==0 );..
eeb0: 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26    if( p->flags &
eec0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a   EP_IntValue ){.
eed0: 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 70 2d      *pValue = p-
eee0: 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 72  >u.iValue;.    r
eef0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73  eturn 1;.  }.  s
ef00: 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
ef10: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55      case TK_UPLU
ef20: 53 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  S: {.      rc = 
ef30: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
ef40: 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70  eger(p->pLeft, p
ef50: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72  Value);.      br
ef60: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
ef70: 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b  ase TK_UMINUS: {
ef80: 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a 20 20  .      int v;.  
ef90: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
efa0: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e  xprIsInteger(p->
efb0: 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a 20 20  pLeft, &v) ){.  
efc0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 76 21        assert( v!
efd0: 3d 28 2d 32 31 34 37 34 38 33 36 34 37 2d 31 29  =(-2147483647-1)
efe0: 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 56 61   );.        *pVa
eff0: 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20  lue = -v;.      
f000: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
f010: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
f020: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
f030: 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  : break;.  }.  r
f040: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
f050: 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20  ** Return FALSE 
f060: 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63  if there is no c
f070: 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 65  hance that the e
f080: 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65  xpression can be
f090: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
f0a0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  the expression m
f0b0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72 20  ight be NULL or 
f0c0: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
f0d0: 6e 20 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65 78  n is too complex
f0e0: 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74 75  .** to tell retu
f0f0: 72 6e 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a  rn TRUE.  .**.**
f100: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
f110: 20 75 73 65 64 20 61 73 20 61 6e 20 6f 70 74 69   used as an opti
f120: 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b 69  mization, to ski
f130: 70 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f  p OP_IsNull opco
f140: 64 65 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20 6b  des.** when we k
f150: 6e 6f 77 20 74 68 61 74 20 61 20 76 61 6c 75 65  now that a value
f160: 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e   cannot be NULL.
f170: 20 20 48 65 6e 63 65 2c 20 61 20 66 61 6c 73 65    Hence, a false
f180: 20 70 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72 65   positive.** (re
f190: 74 75 72 6e 69 6e 67 20 54 52 55 45 20 77 68 65  turning TRUE whe
f1a0: 6e 20 69 6e 20 66 61 63 74 20 74 68 65 20 65 78  n in fact the ex
f1b0: 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65 76  pression can nev
f1c0: 65 72 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67 68  er be NULL) migh
f1d0: 74 0a 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c 20  t.** be a small 
f1e0: 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 20  performance hit 
f1f0: 62 75 74 20 69 73 20 6f 74 68 65 72 77 69 73 65  but is otherwise
f200: 20 68 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20 74   harmless.  On t
f210: 68 65 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e 64  he other.** hand
f220: 2c 20 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69  , a false negati
f230: 76 65 20 28 72 65 74 75 72 6e 69 6e 67 20 46 41  ve (returning FA
f240: 4c 53 45 20 77 68 65 6e 20 74 68 65 20 72 65 73  LSE when the res
f250: 75 6c 74 20 63 6f 75 6c 64 20 62 65 20 4e 55 4c  ult could be NUL
f260: 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c  L).** will likel
f270: 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69  y result in an i
f280: 6e 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 2e  ncorrect answer.
f290: 20 20 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f 75    So when in dou
f2a0: 62 74 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54 52  bt, return.** TR
f2b0: 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  UE..*/.int sqlit
f2c0: 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28  e3ExprCanBeNull(
f2d0: 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 29 7b 0a  const Expr *p){.
f2e0: 20 20 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c 65    u8 op;.  while
f2f0: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55  ( p->op==TK_UPLU
f300: 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  S || p->op==TK_U
f310: 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e  MINUS ){ p = p->
f320: 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20  pLeft; }.  op = 
f330: 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  p->op;.  if( op=
f340: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f  =TK_REGISTER ) o
f350: 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77  p = p->op2;.  sw
f360: 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
f370: 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
f380: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
f390: 49 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ING:.    case TK
f3a0: 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65  _FLOAT:.    case
f3b0: 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20   TK_BLOB:.      
f3c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63 61  return 0;.    ca
f3d0: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  se TK_COLUMN:.  
f3e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
f3f0: 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab!=0 );.      
f400: 72 65 74 75 72 6e 20 45 78 70 72 48 61 73 50 72  return ExprHasPr
f410: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 43 61 6e  operty(p, EP_Can
f420: 42 65 4e 75 6c 6c 29 20 7c 7c 0a 20 20 20 20 20  BeNull) ||.     
f430: 20 20 20 20 20 20 20 20 28 70 2d 3e 69 43 6f 6c          (p->iCol
f440: 75 6d 6e 3e 3d 30 20 26 26 20 70 2d 3e 70 54 61  umn>=0 && p->pTa
f450: 62 2d 3e 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75  b->aCol[p->iColu
f460: 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 3b  mn].notNull==0);
f470: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
f480: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
f490: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
f4a0: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
f4b0: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ven expression i
f4c0: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 77 68 69  s a constant whi
f4d0: 63 68 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75  ch would be.** u
f4e0: 6e 63 68 61 6e 67 65 64 20 62 79 20 4f 50 5f 41  nchanged by OP_A
f4f0: 66 66 69 6e 69 74 79 20 77 69 74 68 20 74 68 65  ffinity with the
f500: 20 61 66 66 69 6e 69 74 79 20 67 69 76 65 6e 20   affinity given 
f510: 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  in the second.**
f520: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
f530: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
f540: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
f550: 6e 65 20 69 66 20 74 68 65 20 4f 50 5f 41 66 66  ne if the OP_Aff
f560: 69 6e 69 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a  inity operation.
f570: 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65  ** can be omitte
f580: 64 2e 20 20 57 68 65 6e 20 69 6e 20 64 6f 75 62  d.  When in doub
f590: 74 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 20  t return FALSE. 
f5a0: 20 41 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76   A false negativ
f5b0: 65 0a 2a 2a 20 69 73 20 68 61 72 6d 6c 65 73 73  e.** is harmless
f5c0: 2e 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69 74  .  A false posit
f5d0: 69 76 65 2c 20 68 6f 77 65 76 65 72 2c 20 63 61  ive, however, ca
f5e0: 6e 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20  n result in the 
f5f0: 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e  wrong.** answer.
f600: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
f610: 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69  xprNeedsNoAffini
f620: 74 79 43 68 61 6e 67 65 28 63 6f 6e 73 74 20 45  tyChange(const E
f630: 78 70 72 20 2a 70 2c 20 63 68 61 72 20 61 66 66  xpr *p, char aff
f640: 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 69 66  ){.  u8 op;.  if
f650: 28 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  ( aff==SQLITE_AF
f660: 46 5f 42 4c 4f 42 20 29 20 72 65 74 75 72 6e 20  F_BLOB ) return 
f670: 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f  1;.  while( p->o
f680: 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70  p==TK_UPLUS || p
f690: 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20  ->op==TK_UMINUS 
f6a0: 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b  ){ p = p->pLeft;
f6b0: 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b   }.  op = p->op;
f6c0: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45  .  if( op==TK_RE
f6d0: 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d  GISTER ) op = p-
f6e0: 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20  >op2;.  switch( 
f6f0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
f700: 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  K_INTEGER: {.   
f710: 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53     return aff==S
f720: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
f730: 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  R || aff==SQLITE
f740: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
f750: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
f760: 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 72  FLOAT: {.      r
f770: 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54  eturn aff==SQLIT
f780: 45 5f 41 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66  E_AFF_REAL || af
f790: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
f7a0: 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20  MERIC;.    }.   
f7b0: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
f7c0: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
f7d0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
f7e0: 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  TEXT;.    }.    
f7f0: 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a  case TK_BLOB: {.
f800: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
f810: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
f820: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
f830: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 54 61    assert( p->iTa
f840: 62 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 70 20  ble>=0 );  /* p 
f850: 63 61 6e 6e 6f 74 20 62 65 20 70 61 72 74 20 6f  cannot be part o
f860: 66 20 61 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  f a CHECK constr
f870: 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  aint */.      re
f880: 74 75 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c  turn p->iColumn<
f890: 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28  0.          && (
f8a0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
f8b0: 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d  INTEGER || aff==
f8c0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
f8d0: 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  IC);.    }.    d
f8e0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
f8f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
f900: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
f910: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
f920: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20  given string is 
f930: 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20  a row-id column 
f940: 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  name..*/.int sql
f950: 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73  ite3IsRowid(cons
f960: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66  t char *z){.  if
f970: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
f980: 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d  (z, "_ROWID_")==
f990: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
f9a0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
f9b0: 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d  mp(z, "ROWID")==
f9c0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
f9d0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
f9e0: 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20  mp(z, "OID")==0 
f9f0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
fa00: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
fa10: 20 70 58 20 69 73 20 74 68 65 20 52 48 53 20 6f   pX is the RHS o
fa20: 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  f an IN operator
fa30: 2e 20 20 49 66 20 70 58 20 69 73 20 61 20 53 45  .  If pX is a SE
fa40: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 0a  LECT statement .
fa50: 2a 2a 20 74 68 61 74 20 63 61 6e 20 62 65 20 73  ** that can be s
fa60: 69 6d 70 6c 69 66 69 65 64 20 74 6f 20 61 20 64  implified to a d
fa70: 69 72 65 63 74 20 74 61 62 6c 65 20 61 63 63 65  irect table acce
fa80: 73 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 0a  ss, then return.
fa90: 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
faa0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
fab0: 6d 65 6e 74 2e 20 20 49 66 20 70 58 20 69 73 20  ment.  If pX is 
fac0: 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 73 74 61  not a SELECT sta
fad0: 74 65 6d 65 6e 74 2c 0a 2a 2a 20 6f 72 20 69 66  tement,.** or if
fae0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
faf0: 65 6d 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 62  ement needs to b
fb00: 65 20 6d 61 6e 69 66 65 73 74 65 64 20 69 6e 74  e manifested int
fb10: 6f 20 61 20 74 72 61 6e 73 69 65 6e 74 0a 2a 2a  o a transient.**
fb20: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 72 65 74   table, then ret
fb30: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66  urn NULL..*/.#if
fb40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
fb50: 5f 53 55 42 51 55 45 52 59 0a 73 74 61 74 69 63  _SUBQUERY.static
fb60: 20 53 65 6c 65 63 74 20 2a 69 73 43 61 6e 64 69   Select *isCandi
fb70: 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 45 78 70  dateForInOpt(Exp
fb80: 72 20 2a 70 58 29 7b 0a 20 20 53 65 6c 65 63 74  r *pX){.  Select
fb90: 20 2a 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a   *p;.  SrcList *
fba0: 70 53 72 63 3b 0a 20 20 45 78 70 72 4c 69 73 74  pSrc;.  ExprList
fbb0: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c   *pEList;.  Tabl
fbc0: 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69  e *pTab;.  int i
fbd0: 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  ;.  if( !ExprHas
fbe0: 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f  Property(pX, EP_
fbf0: 78 49 73 53 65 6c 65 63 74 29 20 29 20 72 65 74  xIsSelect) ) ret
fc00: 75 72 6e 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 61  urn 0;  /* Not a
fc10: 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69   subquery */.  i
fc20: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
fc30: 74 79 28 70 58 2c 20 45 50 5f 56 61 72 53 65 6c  ty(pX, EP_VarSel
fc40: 65 63 74 29 20 20 29 20 72 65 74 75 72 6e 20 30  ect)  ) return 0
fc50: 3b 20 20 2f 2a 20 43 6f 72 72 65 6c 61 74 65 64  ;  /* Correlated
fc60: 20 73 75 62 71 20 2a 2f 0a 20 20 70 20 3d 20 70   subq */.  p = p
fc70: 58 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20  X->x.pSelect;.  
fc80: 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20  if( p->pPrior ) 
fc90: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
fca0: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20         /* Not a 
fcb0: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
fcc0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
fcd0: 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
fce0: 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
fcf0: 29 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73  ) ){.    testcas
fd00: 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  e( (p->selFlags 
fd10: 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
fd20: 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
fd30: 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20  F_Distinct );.  
fd40: 20 20 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e    testcase( (p->
fd50: 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
fd60: 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
fd70: 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65  gate))==SF_Aggre
fd80: 67 61 74 65 20 29 3b 0a 20 20 20 20 72 65 74 75  gate );.    retu
fd90: 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54  rn 0; /* No DIST
fda0: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 61 6e 64  INCT keyword and
fdb0: 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75   no aggregate fu
fdc0: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20  nctions */.  }. 
fdd0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f   assert( p->pGro
fde0: 75 70 42 79 3d 3d 30 20 29 3b 20 20 20 20 20 20  upBy==0 );      
fdf0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e          /* Has n
fe00: 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  o GROUP BY claus
fe10: 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c  e */.  if( p->pL
fe20: 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b  imit ) return 0;
fe30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fe40: 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c   Has no LIMIT cl
fe50: 61 75 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  ause */.  assert
fe60: 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20  ( p->pOffset==0 
fe70: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
fe80: 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54 20 6d 65 61   /* No LIMIT mea
fe90: 6e 73 20 6e 6f 20 4f 46 46 53 45 54 20 2a 2f 0a  ns no OFFSET */.
fea0: 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20    if( p->pWhere 
feb0: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
fec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20           /* Has 
fed0: 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  no WHERE clause 
fee0: 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  */.  pSrc = p->p
fef0: 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
ff00: 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Src!=0 );.  if( 
ff10: 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20  pSrc->nSrc!=1 ) 
ff20: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
ff30: 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72     /* Single ter
ff40: 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65  m in FROM clause
ff50: 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e   */.  if( pSrc->
ff60: 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29 20 72  a[0].pSelect ) r
ff70: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20  eturn 0;     /* 
ff80: 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61 20 73 75  FROM is not a su
ff90: 62 71 75 65 72 79 20 6f 72 20 76 69 65 77 20 2a  bquery or view *
ffa0: 2f 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d  /.  pTab = pSrc-
ffb0: 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 61 73  >a[0].pTab;.  as
ffc0: 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
ffd0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
ffe0: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20  >pSelect==0 );  
fff0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f            /* FRO
10000 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20  M clause is not 
10010 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20  a view */.  if( 
10020 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
10030 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
10040 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
10050 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20  e not a virtual 
10060 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73  table */.  pELis
10070 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a  t = p->pEList;..
10080 20 20 2f 2a 20 41 6c 6c 20 53 45 4c 45 43 54 20    /* All SELECT 
10090 72 65 73 75 6c 74 73 20 6d 75 73 74 20 62 65 20  results must be 
100a0 63 6f 6c 75 6d 6e 73 2e 20 2a 2f 0a 20 20 66 6f  columns. */.  fo
100b0 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
100c0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
100d0 20 20 45 78 70 72 20 2a 70 52 65 73 20 3d 20 70    Expr *pRes = p
100e0 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
100f0 72 3b 0a 20 20 20 20 69 66 28 20 70 52 65 73 2d  r;.    if( pRes-
10100 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
10110 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 61   return 0;.    a
10120 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 54 61  ssert( pRes->iTa
10130 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 30 5d 2e  ble==pSrc->a[0].
10140 69 43 75 72 73 6f 72 20 29 3b 20 20 2f 2a 20 4e  iCursor );  /* N
10150 6f 74 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  ot a correlated 
10160 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 7d 0a  subquery */.  }.
10170 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 23 65    return p;.}.#e
10180 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
10190 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
101a0 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
101b0 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63 74 69  P_Once instructi
101c0 6f 6e 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20  on and allocate 
101d0 73 70 61 63 65 20 66 6f 72 20 69 74 73 20 66 6c  space for its fl
101e0 61 67 2e 20 52 65 74 75 72 6e 20 74 68 65 20 0a  ag. Return the .
101f0 2a 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  ** address of th
10200 65 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f  e new instructio
10210 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
10220 33 43 6f 64 65 4f 6e 63 65 28 50 61 72 73 65 20  3CodeOnce(Parse 
10230 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65  *pParse){.  Vdbe
10240 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
10250 56 64 62 65 28 70 50 61 72 73 65 29 3b 20 20 20  Vdbe(pParse);   
10260 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61     /* Virtual ma
10270 63 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65  chine being code
10280 64 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71  d */.  return sq
10290 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
102a0 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20 70 50 61 72  v, OP_Once, pPar
102b0 73 65 2d 3e 6e 4f 6e 63 65 2b 2b 29 3b 0a 7d 0a  se->nOnce++);.}.
102c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
102d0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
102e0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
102f0 65 20 74 68 61 74 20 63 68 65 63 6b 73 20 74 68  e that checks th
10300 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75  e left-most colu
10310 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 61 62 6c  mn of index tabl
10320 65 20 69 43 75 72 20 74 6f 20 73 65 65 20 69 66  e iCur to see if
10330 0a 2a 2a 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  .** it contains 
10340 61 6e 79 20 4e 55 4c 4c 20 65 6e 74 72 69 65 73  any NULL entries
10350 2e 20 20 43 61 75 73 65 20 74 68 65 20 72 65 67  .  Cause the reg
10360 69 73 74 65 72 20 61 74 20 72 65 67 48 61 73 4e  ister at regHasN
10370 75 6c 6c 20 74 6f 20 62 65 20 73 65 74 0a 2a 2a  ull to be set.**
10380 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76   to a non-NULL v
10390 61 6c 75 65 20 69 66 20 69 43 75 72 20 63 6f 6e  alue if iCur con
103a0 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 73 2e 20  tains no NULLs. 
103b0 20 43 61 75 73 65 20 72 65 67 69 73 74 65 72 20   Cause register 
103c0 72 65 67 48 61 73 4e 75 6c 6c 0a 2a 2a 20 74 6f  regHasNull.** to
103d0 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   be set to NULL 
103e0 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73  if iCur contains
103f0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c   one or more NUL
10400 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61  L values..*/.sta
10410 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
10420 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 56  SetHasNullFlag(V
10430 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 43 75 72  dbe *v, int iCur
10440 2c 20 69 6e 74 20 72 65 67 48 61 73 4e 75 6c 6c  , int regHasNull
10450 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 0a  ){.  int addr1;.
10460 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10470 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
10480 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c  r, 0, regHasNull
10490 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  );.  addr1 = sql
104a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
104b0 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75  , OP_Rewind, iCu
104c0 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
104d0 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
104e0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
104f0 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c 20 30 2c 20  olumn, iCur, 0, 
10500 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 73  regHasNull);.  s
10510 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
10520 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50  P5(v, OPFLAG_TYP
10530 45 4f 46 41 52 47 29 3b 0a 20 20 56 64 62 65 43  EOFARG);.  VdbeC
10540 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 69 72 73  omment((v, "firs
10550 74 5f 65 6e 74 72 79 5f 69 6e 28 25 64 29 22 2c  t_entry_in(%d)",
10560 20 69 43 75 72 29 29 3b 0a 20 20 73 71 6c 69 74   iCur));.  sqlit
10570 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
10580 2c 20 61 64 64 72 31 29 3b 0a 7d 0a 23 65 6e 64  , addr1);.}.#end
10590 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  if...#ifndef SQL
105a0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
105b0 59 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75  Y./*.** The argu
105c0 6d 65 6e 74 20 69 73 20 61 6e 20 49 4e 20 6f 70  ment is an IN op
105d0 65 72 61 74 6f 72 20 77 69 74 68 20 61 20 6c 69  erator with a li
105e0 73 74 20 28 6e 6f 74 20 61 20 73 75 62 71 75 65  st (not a subque
105f0 72 79 29 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 72  ry) on the .** r
10600 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 2e 20  ight-hand side. 
10610 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
10620 74 68 61 74 20 6c 69 73 74 20 69 73 20 63 6f 6e  that list is con
10630 73 74 61 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  stant..*/.static
10640 20 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 52 68   int sqlite3InRh
10650 73 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72  sIsConstant(Expr
10660 20 2a 70 49 6e 29 7b 0a 20 20 45 78 70 72 20 2a   *pIn){.  Expr *
10670 70 4c 48 53 3b 0a 20 20 69 6e 74 20 72 65 73 3b  pLHS;.  int res;
10680 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
10690 48 61 73 50 72 6f 70 65 72 74 79 28 70 49 6e 2c  HasProperty(pIn,
106a0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
106b0 3b 0a 20 20 70 4c 48 53 20 3d 20 70 49 6e 2d 3e  ;.  pLHS = pIn->
106c0 70 4c 65 66 74 3b 0a 20 20 70 49 6e 2d 3e 70 4c  pLeft;.  pIn->pL
106d0 65 66 74 20 3d 20 30 3b 0a 20 20 72 65 73 20 3d  eft = 0;.  res =
106e0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
106f0 6e 73 74 61 6e 74 28 70 49 6e 29 3b 0a 20 20 70  nstant(pIn);.  p
10700 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 48 53  In->pLeft = pLHS
10710 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
10720 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
10730 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
10740 20 75 73 65 64 20 62 79 20 74 68 65 20 69 6d 70   used by the imp
10750 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
10760 68 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72  he IN (...) oper
10770 61 74 6f 72 2e 0a 2a 2a 20 54 68 65 20 70 58 20  ator..** The pX 
10780 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
10790 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 6e 20 74   expression on t
107a0 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
107b0 20 6f 70 65 72 61 74 6f 72 2c 20 77 68 69 63 68   operator, which
107c0 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 65 69 74  .** might be eit
107d0 68 65 72 20 61 20 6c 69 73 74 20 6f 66 20 65 78  her a list of ex
107e0 70 72 65 73 73 69 6f 6e 73 20 6f 72 20 61 20 73  pressions or a s
107f0 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  ubquery..**.** T
10800 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72  he job of this r
10810 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 66 69 6e  outine is to fin
10820 64 20 6f 72 20 63 72 65 61 74 65 20 61 20 62 2d  d or create a b-
10830 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74  tree object that
10840 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20   can.** be used 
10850 65 69 74 68 65 72 20 74 6f 20 74 65 73 74 20 66  either to test f
10860 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 69 6e  or membership in
10870 20 74 68 65 20 52 48 53 20 73 65 74 20 6f 72 20   the RHS set or 
10880 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
10890 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65 72  gh.** all member
108a0 73 20 6f 66 20 74 68 65 20 52 48 53 20 73 65 74  s of the RHS set
108b0 2c 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c 69  , skipping dupli
108c0 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63  cates..**.** A c
108d0 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 65 64 20  ursor is opened 
108e0 6f 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62  on the b-tree ob
108f0 6a 65 63 74 20 74 68 61 74 20 69 73 20 74 68 65  ject that is the
10900 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
10910 70 65 72 61 74 6f 72 0a 2a 2a 20 61 6e 64 20 70  perator.** and p
10920 58 2d 3e 69 54 61 62 6c 65 20 69 73 20 73 65 74  X->iTable is set
10930 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
10940 20 74 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2a   that cursor..**
10950 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
10960 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
10970 75 6e 63 74 69 6f 6e 20 69 6e 64 69 63 61 74 65  unction indicate
10980 73 20 74 68 65 20 62 2d 74 72 65 65 20 74 79 70  s the b-tree typ
10990 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  e, as follows:.*
109a0 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  *.**   IN_INDEX_
109b0 52 4f 57 49 44 20 20 20 20 20 20 2d 20 54 68 65  ROWID      - The
109c0 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
109d0 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  ed on a database
109e0 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f   table..**   IN_
109f0 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20  INDEX_INDEX_ASC 
10a00 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61   - The cursor wa
10a10 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 61  s opened on an a
10a20 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a  scending index..
10a30 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  **   IN_INDEX_IN
10a40 44 45 58 5f 44 45 53 43 20 2d 20 54 68 65 20 63  DEX_DESC - The c
10a50 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  ursor was opened
10a60 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67   on a descending
10a70 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f   index..**   IN_
10a80 49 4e 44 45 58 5f 45 50 48 20 20 20 20 20 20 20  INDEX_EPH       
10a90 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61   - The cursor wa
10aa0 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73 70  s opened on a sp
10ab0 65 63 69 61 6c 6c 79 20 63 72 65 61 74 65 64 20  ecially created 
10ac0 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
10ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
10ae0 6f 70 75 6c 61 74 65 64 20 65 70 68 65 72 65 6d  opulated epherem
10af0 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49  al table..**   I
10b00 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 20 20 20  N_INDEX_NOOP    
10b10 20 20 20 2d 20 4e 6f 20 63 75 72 73 6f 72 20 77     - No cursor w
10b20 61 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 54  as allocated.  T
10b30 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d  he IN operator m
10b40 75 73 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20  ust be.**       
10b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b60 20 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73    implemented as
10b70 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63   a sequence of c
10b80 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a  omparisons..**.*
10b90 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 62 2d  * An existing b-
10ba0 74 72 65 65 20 6d 69 67 68 74 20 62 65 20 75 73  tree might be us
10bb0 65 64 20 69 66 20 74 68 65 20 52 48 53 20 65 78  ed if the RHS ex
10bc0 70 72 65 73 73 69 6f 6e 20 70 58 20 69 73 20 61  pression pX is a
10bd0 20 73 69 6d 70 6c 65 0a 2a 2a 20 73 75 62 71 75   simple.** subqu
10be0 65 72 79 20 73 75 63 68 20 61 73 3a 0a 2a 2a 0a  ery such as:.**.
10bf0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 63  **     SELECT <c
10c00 6f 6c 75 6d 6e 31 3e 2c 20 3c 63 6f 6c 75 6d 6e  olumn1>, <column
10c10 32 3e 2e 2e 2e 20 46 52 4f 4d 20 3c 74 61 62 6c  2>... FROM <tabl
10c20 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e>.**.** If the 
10c30 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
10c40 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74  erator is a list
10c50 20 6f 72 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c   or a more compl
10c60 65 78 20 73 75 62 71 75 65 72 79 2c 20 74 68 65  ex subquery, the
10c70 6e 0a 2a 2a 20 61 6e 20 65 70 68 65 6d 65 72 61  n.** an ephemera
10c80 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20 6e 65  l table might ne
10c90 65 64 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74  ed to be generat
10ca0 65 64 20 66 72 6f 6d 20 74 68 65 20 52 48 53 20  ed from the RHS 
10cb0 61 6e 64 20 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e  and then.** pX->
10cc0 69 54 61 62 6c 65 20 6d 61 64 65 20 74 6f 20 70  iTable made to p
10cd0 6f 69 6e 74 20 74 6f 20 74 68 65 20 65 70 68 65  oint to the ephe
10ce0 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 6e 73 74  meral table inst
10cf0 65 61 64 20 6f 66 20 61 6e 0a 2a 2a 20 65 78 69  ead of an.** exi
10d00 73 74 69 6e 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a  sting table..**.
10d10 2a 2a 20 54 68 65 20 69 6e 46 6c 61 67 73 20 70  ** The inFlags p
10d20 61 72 61 6d 65 74 65 72 20 6d 75 73 74 20 63 6f  arameter must co
10d30 6e 74 61 69 6e 20 65 78 61 63 74 6c 79 20 6f 6e  ntain exactly on
10d40 65 20 6f 66 20 74 68 65 20 62 69 74 73 0a 2a 2a  e of the bits.**
10d50 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52   IN_INDEX_MEMBER
10d60 53 48 49 50 20 6f 72 20 49 4e 5f 49 4e 44 45 58  SHIP or IN_INDEX
10d70 5f 4c 4f 4f 50 2e 20 20 49 66 20 69 6e 46 6c 61  _LOOP.  If inFla
10d80 67 73 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 49  gs contains.** I
10d90 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48  N_INDEX_MEMBERSH
10da0 49 50 2c 20 74 68 65 6e 20 74 68 65 20 67 65 6e  IP, then the gen
10db0 65 72 61 74 65 64 20 74 61 62 6c 65 20 77 69 6c  erated table wil
10dc0 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20 61 0a  l be used for a.
10dd0 2a 2a 20 66 61 73 74 20 6d 65 6d 62 65 72 73 68  ** fast membersh
10de0 69 70 20 74 65 73 74 2e 20 20 57 68 65 6e 20 74  ip test.  When t
10df0 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50  he IN_INDEX_LOOP
10e00 20 62 69 74 20 69 73 20 73 65 74 2c 20 74 68 65   bit is set, the
10e10 0a 2a 2a 20 49 4e 20 69 6e 64 65 78 20 77 69 6c  .** IN index wil
10e20 6c 20 62 65 20 75 73 65 64 20 74 6f 20 6c 6f 6f  l be used to loo
10e30 70 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75 65  p over all value
10e40 73 20 6f 66 20 74 68 65 20 52 48 53 20 6f 66 20  s of the RHS of 
10e50 74 68 65 0a 2a 2a 20 49 4e 20 6f 70 65 72 61 74  the.** IN operat
10e60 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49  or..**.** When I
10e70 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 69 73 20  N_INDEX_LOOP is 
10e80 75 73 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d  used (and the b-
10e90 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65  tree will be use
10ea0 64 20 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20  d to iterate.** 
10eb0 74 68 72 6f 75 67 68 20 74 68 65 20 73 65 74 20  through the set 
10ec0 6d 65 6d 62 65 72 73 29 20 74 68 65 6e 20 74 68  members) then th
10ed0 65 20 62 2d 74 72 65 65 20 6d 75 73 74 20 6e 6f  e b-tree must no
10ee0 74 20 63 6f 6e 74 61 69 6e 20 64 75 70 6c 69 63  t contain duplic
10ef0 61 74 65 73 2e 0a 2a 2a 20 41 6e 20 65 70 68 65  ates..** An ephe
10f00 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74  remal table must
10f10 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20   be used unless 
10f20 74 68 65 20 73 65 6c 65 63 74 65 64 20 63 6f 6c  the selected col
10f30 75 6d 6e 73 20 61 72 65 20 67 75 61 72 61 6e 74  umns are guarant
10f40 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 75 6e 69  eed.** to be uni
10f50 71 75 65 20 2d 20 65 69 74 68 65 72 20 62 65 63  que - either bec
10f60 61 75 73 65 20 69 74 20 69 73 20 61 6e 20 49 4e  ause it is an IN
10f70 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
10f80 59 20 6f 72 20 64 75 65 20 74 6f 0a 2a 2a 20 61  Y or due to.** a
10f90 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
10fa0 6e 74 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a  nt or index..**.
10fb0 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58  ** When IN_INDEX
10fc0 5f 4d 45 4d 42 45 52 53 48 49 50 20 69 73 20 75  _MEMBERSHIP is u
10fd0 73 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d 74  sed (and the b-t
10fe0 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ree will be used
10ff0 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20 73 65   .** for fast se
11000 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73  t membership tes
11010 74 73 29 20 74 68 65 6e 20 61 6e 20 65 70 68 65  ts) then an ephe
11020 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74  remal table must
11030 20 0a 2a 2a 20 62 65 20 75 73 65 64 20 75 6e 6c   .** be used unl
11040 65 73 73 20 3c 63 6f 6c 75 6d 6e 73 3e 20 69 73  ess <columns> is
11050 20 61 20 73 69 6e 67 6c 65 20 49 4e 54 45 47 45   a single INTEGE
11060 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  R PRIMARY KEY co
11070 6c 75 6d 6e 20 6f 72 20 61 6e 20 0a 2a 2a 20 69  lumn or an .** i
11080 6e 64 65 78 20 63 61 6e 20 62 65 20 66 6f 75 6e  ndex can be foun
11090 64 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  d with the speci
110a0 66 69 65 64 20 3c 63 6f 6c 75 6d 6e 73 3e 20 61  fied <columns> a
110b0 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74 2e  s its left-most.
110c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49 4e  .**.** If the IN
110d0 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 20 61  _INDEX_NOOP_OK a
110e0 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42  nd IN_INDEX_MEMB
110f0 45 52 53 48 49 50 20 61 72 65 20 62 6f 74 68 20  ERSHIP are both 
11100 73 65 74 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68  set and.** if th
11110 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
11120 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69  operator is a li
11130 73 74 20 28 6e 6f 74 20 61 20 73 75 62 71 75 65  st (not a subque
11140 72 79 29 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a  ry) then this.**
11150 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 64   routine might d
11160 65 63 69 64 65 20 74 68 61 74 20 63 72 65 61 74  ecide that creat
11170 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ing an ephemeral
11180 20 62 2d 74 72 65 65 20 66 6f 72 20 6d 65 6d 62   b-tree for memb
11190 65 72 73 68 69 70 0a 2a 2a 20 74 65 73 74 69 6e  ership.** testin
111a0 67 20 69 73 20 74 6f 6f 20 65 78 70 65 6e 73 69  g is too expensi
111b0 76 65 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4e  ve and return IN
111c0 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 20 20 49 6e  _INDEX_NOOP.  In
111d0 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 0a   that case, the.
111e0 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  ** calling routi
111f0 6e 65 20 73 68 6f 75 6c 64 20 69 6d 70 6c 65 6d  ne should implem
11200 65 6e 74 20 74 68 65 20 49 4e 20 6f 70 65 72 61  ent the IN opera
11210 74 6f 72 20 75 73 69 6e 67 20 61 20 73 65 71 75  tor using a sequ
11220 65 6e 63 65 0a 2a 2a 20 6f 66 20 45 71 20 6f 72  ence.** of Eq or
11230 20 4e 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f   Ne comparison o
11240 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  perations..**.**
11250 20 57 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65   When the b-tree
11260 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 20 66   is being used f
11270 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  or membership te
11280 73 74 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  sts, the calling
11290 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 69 67   function.** mig
112a0 68 74 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20  ht need to know 
112b0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
112c0 68 65 20 52 48 53 20 73 69 64 65 20 6f 66 20 74  he RHS side of t
112d0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a  he IN operator.*
112e0 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c  * contains a NUL
112f0 4c 2e 20 20 49 66 20 70 72 52 68 73 48 61 73 4e  L.  If prRhsHasN
11300 75 6c 6c 20 69 73 20 6e 6f 74 20 61 20 4e 55 4c  ull is not a NUL
11310 4c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 0a 2a  L pointer and .*
11320 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  * if there is an
11330 79 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  y chance that th
11340 65 20 28 2e 2e 2e 29 20 6d 69 67 68 74 20 63 6f  e (...) might co
11350 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61 6c  ntain a NULL val
11360 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65  ue at.** runtime
11370 2c 20 74 68 65 6e 20 61 20 72 65 67 69 73 74 65  , then a registe
11380 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  r is allocated a
11390 6e 64 20 74 68 65 20 72 65 67 69 73 74 65 72 20  nd the register 
113a0 6e 75 6d 62 65 72 20 77 72 69 74 74 65 6e 0a 2a  number written.*
113b0 2a 20 74 6f 20 2a 70 72 52 68 73 48 61 73 4e 75  * to *prRhsHasNu
113c0 6c 6c 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  ll. If there is 
113d0 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  no chance that t
113e0 68 65 20 28 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e  he (...) contain
113f0 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75  s a.** NULL valu
11400 65 2c 20 74 68 65 6e 20 2a 70 72 52 68 73 48 61  e, then *prRhsHa
11410 73 4e 75 6c 6c 20 69 73 20 6c 65 66 74 20 75 6e  sNull is left un
11420 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  changed..**.** I
11430 66 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20  f a register is 
11440 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 74  allocated and it
11450 73 20 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65  s location store
11460 64 20 69 6e 20 2a 70 72 52 68 73 48 61 73 4e 75  d in *prRhsHasNu
11470 6c 6c 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ll, then.** the 
11480 76 61 6c 75 65 20 69 6e 20 74 68 61 74 20 72 65  value in that re
11490 67 69 73 74 65 72 20 77 69 6c 6c 20 62 65 20 4e  gister will be N
114a0 55 4c 4c 20 69 66 20 74 68 65 20 62 2d 74 72 65  ULL if the b-tre
114b0 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f  e contains one o
114c0 72 20 6d 6f 72 65 0a 2a 2a 20 4e 55 4c 4c 20 76  r more.** NULL v
114d0 61 6c 75 65 73 2c 20 61 6e 64 20 69 74 20 77 69  alues, and it wi
114e0 6c 6c 20 62 65 20 73 6f 6d 65 20 6e 6f 6e 2d 4e  ll be some non-N
114f0 55 4c 4c 20 76 61 6c 75 65 20 69 66 20 74 68 65  ULL value if the
11500 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73   b-tree contains
11510 20 6e 6f 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75   no.** NULL valu
11520 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  es..**.** If the
11530 20 61 69 4d 61 70 20 70 61 72 61 6d 65 74 65 72   aiMap parameter
11540 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74   is not NULL, it
11550 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
11560 6e 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 69  n array containi
11570 6e 67 0a 2a 2a 20 6f 6e 65 20 65 6c 65 6d 65 6e  ng.** one elemen
11580 74 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  t for each colum
11590 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  n returned by th
115a0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
115b0 6e 74 20 6f 6e 20 74 68 65 20 52 48 53 0a 2a 2a  nt on the RHS.**
115c0 20 6f 66 20 74 68 65 20 49 4e 28 2e 2e 2e 29 20   of the IN(...) 
115d0 6f 70 65 72 61 74 6f 72 2e 20 54 68 65 20 69 27  operator. The i'
115e0 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  th entry of the 
115f0 61 72 72 61 79 20 69 73 20 70 6f 70 75 6c 61 74  array is populat
11600 65 64 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 6f  ed with the.** o
11610 66 66 73 65 74 20 6f 66 20 74 68 65 20 69 6e 64  ffset of the ind
11620 65 78 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d  ex column that m
11630 61 74 63 68 65 73 20 74 68 65 20 69 27 74 68 20  atches the i'th 
11640 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64 20  column returned 
11650 62 79 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54  by the.** SELECT
11660 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
11670 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
11680 20 61 6e 64 20 73 65 6c 65 63 74 65 64 20 69 6e   and selected in
11690 64 65 78 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20  dex are:.**.**  
116a0 20 28 3f 2c 3f 2c 3f 29 20 49 4e 20 28 53 45 4c   (?,?,?) IN (SEL
116b0 45 43 54 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d  ECT a, b, c FROM
116c0 20 74 31 29 0a 2a 2a 20 20 20 43 52 45 41 54 45   t1).**   CREATE
116d0 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
116e0 62 2c 20 63 2c 20 61 29 3b 0a 2a 2a 0a 2a 2a 20  b, c, a);.**.** 
116f0 74 68 65 6e 20 61 69 4d 61 70 5b 5d 20 69 73 20  then aiMap[] is 
11700 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 7b  populated with {
11710 32 2c 20 30 2c 20 31 7d 2e 0a 2a 2f 0a 23 69 66  2, 0, 1}..*/.#if
11720 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11730 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71  _SUBQUERY.int sq
11740 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
11750 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
11760 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 58 2c 20  e, .  Expr *pX, 
11770 0a 20 20 75 33 32 20 69 6e 46 6c 61 67 73 2c 20  .  u32 inFlags, 
11780 0a 20 20 69 6e 74 20 2a 70 72 52 68 73 48 61 73  .  int *prRhsHas
11790 4e 75 6c 6c 2c 0a 20 20 69 6e 74 20 2a 61 69 4d  Null,.  int *aiM
117a0 61 70 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a  ap.){.  Select *
117b0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
117c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
117d0 20 53 45 4c 45 43 54 20 74 6f 20 74 68 65 20 72   SELECT to the r
117e0 69 67 68 74 20 6f 66 20 49 4e 20 6f 70 65 72 61  ight of IN opera
117f0 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79  tor */.  int eTy
11800 70 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  pe = 0;         
11810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11820 2a 20 54 79 70 65 20 6f 66 20 52 48 53 20 74 61  * Type of RHS ta
11830 62 6c 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20  ble. IN_INDEX_* 
11840 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
11850 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20  pParse->nTab++; 
11860 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
11870 72 73 6f 72 20 6f 66 20 74 68 65 20 52 48 53 20  rsor of the RHS 
11880 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d  table */.  int m
11890 75 73 74 42 65 55 6e 69 71 75 65 3b 20 20 20 20  ustBeUnique;    
118a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118b0 20 2f 2a 20 54 72 75 65 20 69 66 20 52 48 53 20   /* True if RHS 
118c0 6d 75 73 74 20 62 65 20 75 6e 69 71 75 65 20 2a  must be unique *
118d0 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  /.  Vdbe *v = sq
118e0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
118f0 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 56 69 72  rse);     /* Vir
11900 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69  tual machine bei
11910 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 0a 20 20 69  ng coded */..  i
11920 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
11930 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
11940 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  turn IN_INDEX_NO
11950 4f 50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 58  OP;.  assert( pX
11960 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op==TK_IN );. 
11970 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20 3d 20   mustBeUnique = 
11980 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e  (inFlags & IN_IN
11990 44 45 58 5f 4c 4f 4f 50 29 21 3d 30 3b 0a 0a 20  DEX_LOOP)!=0;.. 
119a0 20 2f 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f   /* If the RHS o
119b0 66 20 74 68 69 73 20 49 4e 28 2e 2e 2e 29 20 6f  f this IN(...) o
119c0 70 65 72 61 74 6f 72 20 69 73 20 61 20 53 45 4c  perator is a SEL
119d0 45 43 54 2c 20 61 6e 64 20 69 66 20 69 74 20 6d  ECT, and if it m
119e0 61 74 74 65 72 73 20 0a 20 20 2a 2a 20 77 68 65  atters .  ** whe
119f0 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
11a00 53 45 4c 45 43 54 20 72 65 73 75 6c 74 20 63 6f  SELECT result co
11a10 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75  ntains NULL valu
11a20 65 73 2c 20 63 68 65 63 6b 20 77 68 65 74 68 65  es, check whethe
11a30 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 4e 55  r.  ** or not NU
11a40 4c 4c 20 69 73 20 61 63 74 75 61 6c 6c 79 20 70  LL is actually p
11a50 6f 73 73 69 62 6c 65 20 28 69 74 20 6d 61 79 20  ossible (it may 
11a60 6e 6f 74 20 62 65 2c 20 66 6f 72 20 65 78 61 6d  not be, for exam
11a70 70 6c 65 2c 20 64 75 65 20 0a 20 20 2a 2a 20 74  ple, due .  ** t
11a80 6f 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74  o NOT NULL const
11a90 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 73 63  raints in the sc
11aa0 68 65 6d 61 29 2e 20 49 66 20 6e 6f 20 4e 55 4c  hema). If no NUL
11ab0 4c 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f 73  L values are pos
11ac0 73 69 62 6c 65 2c 0a 20 20 2a 2a 20 73 65 74 20  sible,.  ** set 
11ad0 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 74 6f 20  prRhsHasNull to 
11ae0 30 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75  0 before continu
11af0 69 6e 67 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ing.  */.  if( p
11b00 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26 20 28  rRhsHasNull && (
11b10 70 58 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78  pX->flags & EP_x
11b20 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
11b30 20 69 6e 74 20 69 3b 0a 20 20 20 20 45 78 70 72   int i;.    Expr
11b40 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70  List *pEList = p
11b50 58 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  X->x.pSelect->pE
11b60 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d  List;.    for(i=
11b70 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
11b80 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
11b90 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
11ba0 61 6e 42 65 4e 75 6c 6c 28 70 45 4c 69 73 74 2d  anBeNull(pEList-
11bb0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 20 62  >a[i].pExpr) ) b
11bc0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
11bd0 69 66 28 20 69 3d 3d 70 45 4c 69 73 74 2d 3e 6e  if( i==pEList->n
11be0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 72  Expr ){.      pr
11bf0 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 0a  RhsHasNull = 0;.
11c00 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
11c10 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
11c20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c  an existing tabl
11c30 65 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 62  e or index can b
11c40 65 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 73  e used to.  ** s
11c50 61 74 69 73 66 79 20 74 68 65 20 71 75 65 72 79  atisfy the query
11c60 2e 20 20 54 68 69 73 20 69 73 20 70 72 65 66 65  .  This is prefe
11c70 72 61 62 6c 65 20 74 6f 20 67 65 6e 65 72 61 74  rable to generat
11c80 69 6e 67 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20  ing a new .  ** 
11c90 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e  ephemeral table.
11ca0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
11cb0 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 28 70  e->nErr==0 && (p
11cc0 20 3d 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f   = isCandidateFo
11cd0 72 49 6e 4f 70 74 28 70 58 29 29 21 3d 30 20 29  rInOpt(pX))!=0 )
11ce0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
11cf0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
11d00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11d10 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
11d20 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65  ion */.    Table
11d30 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
11d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d50 20 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c    /* Table <tabl
11d60 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 31 36 20 69  e>. */.    i16 i
11d70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
11d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d90 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 64    /* Database id
11da0 78 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20  x for pTab */.  
11db0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
11dc0 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
11dd0 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20      int nExpr = 
11de0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a  pEList->nExpr;..
11df0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
11e00 45 4c 69 73 74 21 3d 30 20 29 3b 20 20 20 20 20  EList!=0 );     
11e10 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75          /* Becau
11e20 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
11e30 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
11e40 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
11e50 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
11e60 72 21 3d 30 20 29 3b 20 2f 2a 20 42 65 63 61 75  r!=0 ); /* Becau
11e70 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
11e80 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
11e90 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
11ea0 53 72 63 21 3d 30 20 29 3b 20 20 20 20 20 20 20  Src!=0 );       
11eb0 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75          /* Becau
11ec0 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
11ed0 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
11ee0 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53      pTab = p->pS
11ef0 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a  rc->a[0].pTab;..
11f00 20 20 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f      /* Code an O
11f10 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  P_Transaction an
11f20 64 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66  d OP_TableLock f
11f30 6f 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20  or <table>. */. 
11f40 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
11f50 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
11f60 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
11f70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  ;.    sqlite3Cod
11f80 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
11f90 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
11fa0 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
11fb0 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
11fc0 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61  ab->tnum, 0, pTa
11fd0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20  b->zName);..    
11fe0 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
11ff0 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
12000 66 72 6f 6d 20 74 77 6f 20 70 6c 61 63 65 73 2e  from two places.
12010 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73 20 74   In both cases t
12020 68 65 20 76 64 62 65 0a 20 20 20 20 2a 2a 20 68  he vdbe.    ** h
12030 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
12040 61 6c 6c 6f 63 61 74 65 64 2e 20 53 6f 20 61 73  allocated. So as
12050 73 75 6d 65 20 73 71 6c 69 74 65 33 47 65 74 56  sume sqlite3GetV
12060 64 62 65 28 29 20 69 73 20 61 6c 77 61 79 73 0a  dbe() is always.
12070 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75      ** successfu
12080 6c 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  l here..    */. 
12090 20 20 20 61 73 73 65 72 74 28 76 29 3b 0a 20 20     assert(v);.  
120a0 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 26    if( nExpr==1 &
120b0 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  & pEList->a[0].p
120c0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Expr->iColumn<0 
120d0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 41 64  ){.      int iAd
120e0 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  dr = sqlite3Code
120f0 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Once(pParse);.  
12100 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
12110 28 76 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  (v);..      sqli
12120 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
12130 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20  rse, iTab, iDb, 
12140 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
12150 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20  d);.      eType 
12160 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  = IN_INDEX_ROWID
12170 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
12180 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
12190 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73  iAddr);.    }els
121a0 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  e{.      Index *
121b0 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
121c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
121d0 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
121e0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  le */.      int 
121f0 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 31 3b  affinity_ok = 1;
12200 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20  .      int i;.. 
12210 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68       /* Check th
12220 61 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  at the affinity 
12230 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65  that will be use
12240 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 65 61 63  d to perform eac
12250 68 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70  h .      ** comp
12260 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61  arison is the sa
12270 6d 65 20 61 73 20 74 68 65 20 61 66 66 69 6e 69  me as the affini
12280 74 79 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d  ty of each colum
12290 6e 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 69  n. If.      ** i
122a0 74 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74  t not, it is not
122b0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
122c0 20 61 6e 79 20 69 6e 64 65 78 2e 20 20 2a 2f 0a   any index.  */.
122d0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
122e0 3c 6e 45 78 70 72 20 26 26 20 61 66 66 69 6e 69  <nExpr && affini
122f0 74 79 5f 6f 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ty_ok; i++){.   
12300 20 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20       Expr *pLhs 
12310 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46  = sqlite3VectorF
12320 69 65 6c 64 53 75 62 65 78 70 72 28 70 58 2d 3e  ieldSubexpr(pX->
12330 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20  pLeft, i);.     
12340 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45     int iCol = pE
12350 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
12360 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
12370 20 20 20 63 68 61 72 20 69 64 78 61 66 66 20 3d     char idxaff =
12380 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
12390 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  ].affinity;.    
123a0 20 20 20 20 63 68 61 72 20 63 6d 70 61 66 66 20      char cmpaff 
123b0 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
123c0 41 66 66 69 6e 69 74 79 28 70 4c 68 73 2c 20 69  Affinity(pLhs, i
123d0 64 78 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20  dxaff);.        
123e0 73 77 69 74 63 68 28 20 63 6d 70 61 66 66 20 29  switch( cmpaff )
123f0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  {.          case
12400 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
12410 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  :.            br
12420 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 63  eak;.          c
12430 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  ase SQLITE_AFF_T
12440 45 58 54 3a 0a 20 20 20 20 20 20 20 20 20 20 20  EXT:.           
12450 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 28   affinity_ok = (
12460 69 64 78 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  idxaff==SQLITE_A
12470 46 46 5f 54 45 58 54 29 3b 0a 20 20 20 20 20 20  FF_TEXT);.      
12480 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12490 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a         default:.
124a0 20 20 20 20 20 20 20 20 20 20 20 20 61 66 66 69              affi
124b0 6e 69 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65  nity_ok = sqlite
124c0 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
124d0 74 79 28 69 64 78 61 66 66 29 3b 0a 20 20 20 20  ty(idxaff);.    
124e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
124f0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c       /* The coll
12500 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75  ation sequence u
12510 73 65 64 20 62 79 20 74 68 65 20 63 6f 6d 70 61  sed by the compa
12520 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20 69 6e 64  rison. If an ind
12530 65 78 20 69 73 20 74 6f 0a 20 20 20 20 20 20 2a  ex is to.      *
12540 2a 20 62 65 20 75 73 65 64 20 69 6e 20 70 6c 61  * be used in pla
12550 63 65 20 6f 66 20 61 20 74 65 6d 70 2d 74 61 62  ce of a temp-tab
12560 6c 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20 6f  le, it must be o
12570 72 64 65 72 65 64 20 61 63 63 6f 72 64 69 6e 67  rdered according
12580 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 69  .      ** to thi
12590 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  s collation sequ
125a0 65 6e 63 65 2e 20 20 2a 2f 0a 0a 20 20 20 20 20  ence.  */..     
125b0 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
125c0 70 49 6e 64 65 78 3b 20 70 49 64 78 20 26 26 20  pIndex; pIdx && 
125d0 65 54 79 70 65 3d 3d 30 20 26 26 20 61 66 66 69  eType==0 && affi
125e0 6e 69 74 79 5f 6f 6b 3b 20 70 49 64 78 3d 70 49  nity_ok; pIdx=pI
125f0 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
12600 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b      if( pIdx->nK
12610 65 79 43 6f 6c 3c 6e 45 78 70 72 20 29 20 63 6f  eyCol<nExpr ) co
12620 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
12630 69 66 28 20 6d 75 73 74 42 65 55 6e 69 71 75 65  if( mustBeUnique
12640 20 26 26 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43   && (pIdx->nKeyC
12650 6f 6c 21 3d 6e 45 78 70 72 20 7c 7c 20 21 49 73  ol!=nExpr || !Is
12660 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78  UniqueIndex(pIdx
12670 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  )) ){.          
12680 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
12690 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 66 6f 72    }..        for
126a0 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
126b0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  ++){.          E
126c0 78 70 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69  xpr *pLhs = sqli
126d0 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
126e0 62 65 78 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c  bexpr(pX->pLeft,
126f0 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 45   i);.          E
12700 78 70 72 20 2a 70 52 68 73 20 3d 20 70 45 4c 69  xpr *pRhs = pELi
12710 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
12720 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65            CollSe
12730 71 20 2a 70 52 65 71 20 3d 20 73 71 6c 69 74 65  q *pReq = sqlite
12740 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
12750 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
12760 68 73 2c 20 70 52 68 73 29 3b 0a 20 20 20 20 20  hs, pRhs);.     
12770 20 20 20 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 20       int j;..   
12780 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
12790 52 65 71 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  Req || pParse->n
127a0 45 72 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Err );.         
127b0 20 69 66 28 20 70 52 65 71 3d 3d 30 20 29 20 62   if( pReq==0 ) b
127c0 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 20  reak;..         
127d0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 78 70   for(j=0; j<nExp
127e0 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; j++){.       
127f0 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
12800 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70 52 68 73  iColumn[j]!=pRhs
12810 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74  ->iColumn ) cont
12820 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
12830 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
12840 61 7a 43 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20 20 20  azColl[j] );.   
12850 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
12860 69 74 65 33 53 74 72 49 43 6d 70 28 70 52 65 71  ite3StrICmp(pReq
12870 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61  ->zName, pIdx->a
12880 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63  zColl[j])!=0 ) c
12890 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
128a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
128b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
128c0 20 20 69 66 28 20 6a 3d 3d 6e 45 78 70 72 20 29    if( j==nExpr )
128d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
128e0 20 20 69 66 28 20 61 69 4d 61 70 20 29 20 61 69    if( aiMap ) ai
128f0 4d 61 70 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20  Map[i] = j;.    
12900 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
12910 66 28 20 69 3d 3d 6e 45 78 70 72 20 29 7b 0a 20  f( i==nExpr ){. 
12920 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64           int iAd
12930 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  dr = sqlite3Code
12940 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56 64  Once(pParse); Vd
12950 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
12960 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
12970 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
12980 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54 61 62 2c  _OpenRead, iTab,
12990 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62   pIdx->tnum, iDb
129a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
129b0 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
129c0 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  Info(pParse, pId
129d0 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64  x);.          Vd
129e0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
129f0 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  s", pIdx->zName)
12a00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
12a10 65 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  ert( IN_INDEX_IN
12a20 44 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e 5f 49  DEX_DESC == IN_I
12a30 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 2b 31  NDEX_INDEX_ASC+1
12a40 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 54   );.          eT
12a50 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49  ype = IN_INDEX_I
12a60 4e 44 45 58 5f 41 53 43 20 2b 20 70 49 64 78 2d  NDEX_ASC + pIdx-
12a70 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 3b 0a  >aSortOrder[0];.
12a80 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
12a90 72 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 20  rRhsHasNull ){. 
12aa0 20 20 20 20 20 20 20 20 20 20 20 2a 70 72 52 68             *prRh
12ab0 73 48 61 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61  sHasNull = ++pPa
12ac0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 23 69 66 64 65  rse->nMem;.#ifde
12ad0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
12ae0 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b  COLUMN_USED_MASK
12af0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 36 34  .            i64
12b00 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 6e 45 78 70   mask = (1<<nExp
12b10 72 29 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  r)-1;.          
12b20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12b30 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f  Op4Dup8(v, OP_Co
12b40 6c 75 6d 6e 73 55 73 65 64 2c 20 0a 20 20 20 20  lumnsUsed, .    
12b50 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62              iTab
12b60 2c 20 30 2c 20 30 2c 20 28 75 38 2a 29 26 6d 61  , 0, 0, (u8*)&ma
12b70 73 6b 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23  sk, P4_INT64);.#
12b80 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
12b90 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 29    if( nExpr==1 )
12ba0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
12bb0 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c  sqlite3SetHasNul
12bc0 6c 46 6c 61 67 28 76 2c 20 69 54 61 62 2c 20 2a  lFlag(v, iTab, *
12bd0 70 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20  prRhsHasNull);. 
12be0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
12bf0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12c00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
12c10 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29  mpHere(v, iAddr)
12c20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12c30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
12c40 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65 65 78 69   /* If no preexi
12c50 73 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 61  sting index is a
12c60 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65  vailable for the
12c70 20 49 4e 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20   IN clause.  ** 
12c80 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  and IN_INDEX_NOO
12c90 50 20 69 73 20 61 6e 20 61 6c 6c 6f 77 65 64 20  P is an allowed 
12ca0 72 65 70 6c 79 0a 20 20 2a 2a 20 61 6e 64 20 74  reply.  ** and t
12cb0 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
12cc0 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c   operator is a l
12cd0 69 73 74 2c 20 6e 6f 74 20 61 20 73 75 62 71 75  ist, not a subqu
12ce0 65 72 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ery.  ** and the
12cf0 20 52 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 73   RHS is not cons
12d00 74 61 6e 74 20 6f 72 20 68 61 73 20 74 77 6f 20  tant or has two 
12d10 6f 72 20 66 65 77 65 72 20 74 65 72 6d 73 2c 0a  or fewer terms,.
12d20 20 20 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20    ** then it is 
12d30 6e 6f 74 20 77 6f 72 74 68 20 63 72 65 61 74 69  not worth creati
12d40 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  ng an ephemeral 
12d50 74 61 62 6c 65 20 74 6f 20 65 76 61 6c 75 61 74  table to evaluat
12d60 65 0a 20 20 2a 2a 20 74 68 65 20 49 4e 20 6f 70  e.  ** the IN op
12d70 65 72 61 74 6f 72 20 73 6f 20 72 65 74 75 72 6e  erator so return
12d80 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a   IN_INDEX_NOOP..
12d90 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
12da0 3d 3d 30 0a 20 20 20 26 26 20 28 69 6e 46 6c 61  ==0.   && (inFla
12db0 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  gs & IN_INDEX_NO
12dc0 4f 50 5f 4f 4b 29 0a 20 20 20 26 26 20 21 45 78  OP_OK).   && !Ex
12dd0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
12de0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 0a  , EP_xIsSelect).
12df0 20 20 20 26 26 20 28 21 73 71 6c 69 74 65 33 49     && (!sqlite3I
12e00 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 70  nRhsIsConstant(p
12e10 58 29 20 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69 73  X) || pX->x.pLis
12e20 74 2d 3e 6e 45 78 70 72 3c 3d 32 29 0a 20 20 29  t->nExpr<=2).  )
12e30 7b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e  {.    eType = IN
12e40 5f 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d  _INDEX_NOOP;.  }
12e50 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30  ..  if( eType==0
12e60 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64   ){.    /* Could
12e70 20 6e 6f 74 20 66 69 6e 64 20 61 6e 20 65 78 69   not find an exi
12e80 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69  sting table or i
12e90 6e 64 65 78 20 74 6f 20 75 73 65 20 61 73 20 74  ndex to use as t
12ea0 68 65 20 52 48 53 20 62 2d 74 72 65 65 2e 0a 20  he RHS b-tree.. 
12eb0 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61     ** We will ha
12ec0 76 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ve to generate a
12ed0 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
12ee0 65 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e  e to do the job.
12ef0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 33 32 20  .    */.    u32 
12f00 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20  savedNQueryLoop 
12f10 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79  = pParse->nQuery
12f20 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 72 4d  Loop;.    int rM
12f30 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a  ayHaveNull = 0;.
12f40 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
12f50 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20 20 69 66  NDEX_EPH;.    if
12f60 28 20 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49  ( inFlags & IN_I
12f70 4e 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20  NDEX_LOOP ){.   
12f80 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
12f90 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20  yLoop = 0;.     
12fa0 20 69 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e   if( pX->pLeft->
12fb0 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78  iColumn<0 && !Ex
12fc0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
12fd0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
12fe0 29 7b 0a 20 20 20 20 20 20 20 20 65 54 79 70 65  ){.        eType
12ff0 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49   = IN_INDEX_ROWI
13000 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  D;.      }.    }
13010 65 6c 73 65 20 69 66 28 20 70 72 52 68 73 48 61  else if( prRhsHa
13020 73 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2a  sNull ){.      *
13030 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 72  prRhsHasNull = r
13040 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b  MayHaveNull = ++
13050 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
13060 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43    }.    sqlite3C
13070 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
13080 72 73 65 2c 20 70 58 2c 20 72 4d 61 79 48 61 76  rse, pX, rMayHav
13090 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e  eNull, eType==IN
130a0 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20  _INDEX_ROWID);. 
130b0 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
130c0 79 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e 51 75  yLoop = savedNQu
130d0 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65  eryLoop;.  }else
130e0 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61 62 6c 65  {.    pX->iTable
130f0 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 0a 20 20   = iTab;.  }..  
13100 69 66 28 20 61 69 4d 61 70 20 26 26 20 65 54 79  if( aiMap && eTy
13110 70 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  pe!=IN_INDEX_IND
13120 45 58 5f 41 53 43 20 26 26 20 65 54 79 70 65 21  EX_ASC && eType!
13130 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f  =IN_INDEX_INDEX_
13140 44 45 53 43 20 29 7b 0a 20 20 20 20 69 6e 74 20  DESC ){.    int 
13150 69 2c 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 73 71  i, n;.    n = sq
13160 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
13170 69 7a 65 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a  ize(pX->pLeft);.
13180 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
13190 3b 20 69 2b 2b 29 20 61 69 4d 61 70 5b 69 5d 20  ; i++) aiMap[i] 
131a0 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = i;.  }.  retur
131b0 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69  n eType;.}.#endi
131c0 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
131d0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
131e0 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  /*.** Argument p
131f0 45 78 70 72 20 69 73 20 61 6e 20 28 3f 2c 20 3f  Expr is an (?, ?
13200 2e 2e 2e 29 20 49 4e 28 2e 2e 2e 29 20 65 78 70  ...) IN(...) exp
13210 72 65 73 73 69 6f 6e 2e 20 54 68 69 73 20 0a 2a  ression. This .*
13220 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  * function alloc
13230 61 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73  ates and returns
13240 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
13250 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  d string contain
13260 69 6e 67 20 0a 2a 2a 20 74 68 65 20 61 66 66 69  ing .** the affi
13270 6e 69 74 69 65 73 20 74 6f 20 62 65 20 75 73 65  nities to be use
13280 64 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  d for each colum
13290 6e 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  n of the compari
132a0 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  son..**.** It is
132b0 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
132c0 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
132d0 72 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  r to ensure that
132e0 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a   the returned.**
132f0 20 73 74 72 69 6e 67 20 69 73 20 65 76 65 6e 74   string is event
13300 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e  ually freed usin
13310 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  g sqlite3DbFree(
13320 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  )..*/.static cha
13330 72 20 2a 65 78 70 72 49 4e 41 66 66 69 6e 69 74  r *exprINAffinit
13340 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
13350 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
13360 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
13370 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69  Expr->pLeft;.  i
13380 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65  nt nVal = sqlite
13390 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
133a0 70 4c 65 66 74 29 3b 0a 20 20 53 65 6c 65 63 74  pLeft);.  Select
133b0 20 2a 70 53 65 6c 65 63 74 20 3d 20 28 70 45 78   *pSelect = (pEx
133c0 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78  pr->flags & EP_x
133d0 49 73 53 65 6c 65 63 74 29 20 3f 20 70 45 78 70  IsSelect) ? pExp
133e0 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3a 20 30  r->x.pSelect : 0
133f0 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a  ;.  char *zRet;.
13400 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
13410 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op==TK_IN );. 
13420 20 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44   zRet = sqlite3D
13430 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
13440 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2b 31 29 3b  se->db, nVal+1);
13450 0a 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0a 20  .  if( zRet ){. 
13460 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
13470 72 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69  r(i=0; i<nVal; i
13480 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
13490 2a 70 41 20 3d 20 73 71 6c 69 74 65 33 56 65 63  *pA = sqlite3Vec
134a0 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
134b0 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20  pLeft, i);.     
134c0 20 63 68 61 72 20 61 20 3d 20 73 71 6c 69 74 65   char a = sqlite
134d0 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 41  3ExprAffinity(pA
134e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  );.      if( pSe
134f0 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
13500 7a 52 65 74 5b 69 5d 20 3d 20 73 71 6c 69 74 65  zRet[i] = sqlite
13510 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
13520 28 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  (pSelect->pEList
13530 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 61 29  ->a[i].pExpr, a)
13540 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13550 20 20 20 20 20 20 20 7a 52 65 74 5b 69 5d 20 3d         zRet[i] =
13560 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   a;.      }.    
13570 7d 0a 20 20 20 20 7a 52 65 74 5b 6e 56 61 6c 5d  }.    zRet[nVal]
13580 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 72   = '\0';.  }.  r
13590 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65  eturn zRet;.}.#e
135a0 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
135b0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
135c0 52 59 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68  RY./*.** Load th
135d0 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 70  e Parse object p
135e0 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
135f0 73 74 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68  st argument with
13600 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65   an error .** me
13610 73 73 61 67 65 20 6f 66 20 74 68 65 20 66 6f 72  ssage of the for
13620 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d  m:.**.**   "sub-
13630 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20 4e  select returns N
13640 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63   columns - expec
13650 74 65 64 20 4d 22 0a 2a 2f 20 20 20 0a 76 6f 69  ted M".*/   .voi
13660 64 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65  d sqlite3Subsele
13670 63 74 45 72 72 6f 72 28 50 61 72 73 65 20 2a 70  ctError(Parse *p
13680 50 61 72 73 65 2c 20 69 6e 74 20 6e 41 63 74 75  Parse, int nActu
13690 61 6c 2c 20 69 6e 74 20 6e 45 78 70 65 63 74 29  al, int nExpect)
136a0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
136b0 7a 46 6d 74 20 3d 20 22 73 75 62 2d 73 65 6c 65  zFmt = "sub-sele
136c0 63 74 20 72 65 74 75 72 6e 73 20 25 64 20 63 6f  ct returns %d co
136d0 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64  lumns - expected
136e0 20 25 64 22 3b 0a 20 20 73 71 6c 69 74 65 33 45   %d";.  sqlite3E
136f0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
13700 7a 46 6d 74 2c 20 6e 41 63 74 75 61 6c 2c 20 6e  zFmt, nActual, n
13710 45 78 70 65 63 74 29 3b 0a 7d 0a 23 65 6e 64 69  Expect);.}.#endi
13720 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  f../*.** Generat
13730 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61  e code for scala
13740 72 20 73 75 62 71 75 65 72 69 65 73 20 75 73 65  r subqueries use
13750 64 20 61 73 20 61 20 73 75 62 71 75 65 72 79 20  d as a subquery 
13760 65 78 70 72 65 73 73 69 6f 6e 2c 20 45 58 49 53  expression, EXIS
13770 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70 65  TS,.** or IN ope
13780 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65  rators.  Example
13790 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45  s:.**.**     (SE
137a0 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
137b0 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75          -- subqu
137c0 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54  ery.**     EXIST
137d0 53 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  S (SELECT a FROM
137e0 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20   b)   -- EXISTS 
137f0 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20  subquery.**     
13800 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20  x IN (4,5,11)   
13810 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e             -- IN
13820 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c   operator with l
13830 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e  ist on right-han
13840 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20  d side.**     x 
13850 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f  IN (SELECT a FRO
13860 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f  M b)     -- IN o
13870 70 65 72 61 74 6f 72 20 77 69 74 68 20 73 75 62  perator with sub
13880 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67  query on the rig
13890 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78  ht.**.** The pEx
138a0 70 72 20 70 61 72 61 6d 65 74 65 72 20 64 65 73  pr parameter des
138b0 63 72 69 62 65 73 20 74 68 65 20 65 78 70 72 65  cribes the expre
138c0 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61  ssion that conta
138d0 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70  ins the IN.** op
138e0 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71 75 65  erator or subque
138f0 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ry..**.** If par
13900 61 6d 65 74 65 72 20 69 73 52 6f 77 69 64 20 69  ameter isRowid i
13910 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
13920 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
13930 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a  r is guaranteed.
13940 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74 68 65 20  ** to be of the 
13950 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e  form "<rowid> IN
13960 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65   (?, ?, ?)", whe
13970 72 65 20 3c 72 6f 77 69 64 3e 20 69 73 20 61 20  re <rowid> is a 
13980 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20  reference.** to 
13990 73 6f 6d 65 20 69 6e 74 65 67 65 72 20 6b 65 79  some integer key
139a0 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62   column of a tab
139b0 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e 20 74 68  le B-Tree. In th
139c0 69 73 20 63 61 73 65 2c 20 75 73 65 20 61 6e 0a  is case, use an.
139d0 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65  ** intkey B-Tree
139e0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65   to store the se
139f0 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c  t of IN(...) val
13a00 75 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20 74  ues instead of t
13a10 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f  he usual.** (slo
13a20 77 65 72 29 20 76 61 72 69 61 62 6c 65 20 6c 65  wer) variable le
13a30 6e 67 74 68 20 6b 65 79 73 20 42 2d 54 72 65 65  ngth keys B-Tree
13a40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48  ..**.** If rMayH
13a50 61 76 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a  aveNull is non-z
13a60 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ero, that means 
13a70 74 68 61 74 20 74 68 65 20 6f 70 65 72 61 74 69  that the operati
13a80 6f 6e 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28  on is an IN.** (
13a90 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 6f 72 20  not a SELECT or 
13aa0 45 58 49 53 54 53 29 20 61 6e 64 20 74 68 61 74  EXISTS) and that
13ab0 20 74 68 65 20 52 48 53 20 6d 69 67 68 74 20 63   the RHS might c
13ac0 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a  ontains NULLs..*
13ad0 2a 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69  * All this routi
13ae0 6e 65 20 64 6f 65 73 20 69 73 20 69 6e 69 74 69  ne does is initi
13af0 61 6c 69 7a 65 20 74 68 65 20 72 65 67 69 73 74  alize the regist
13b00 65 72 20 67 69 76 65 6e 20 62 79 20 72 4d 61 79  er given by rMay
13b10 48 61 76 65 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 4e  HaveNull.** to N
13b20 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67 20 72 6f  ULL.  Calling ro
13b30 75 74 69 6e 65 73 20 77 69 6c 6c 20 74 61 6b 65  utines will take
13b40 20 63 61 72 65 20 6f 66 20 63 68 61 6e 67 69 6e   care of changin
13b50 67 20 74 68 69 73 20 72 65 67 69 73 74 65 72 0a  g this register.
13b60 2a 2a 20 76 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d  ** value to non-
13b70 4e 55 4c 4c 20 69 66 20 74 68 65 20 52 48 53 20  NULL if the RHS 
13b80 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a  is NULL-free..**
13b90 0a 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54  .** For a SELECT
13ba0 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61   or EXISTS opera
13bb0 74 6f 72 2c 20 72 65 74 75 72 6e 20 74 68 65 20  tor, return the 
13bc0 72 65 67 69 73 74 65 72 20 74 68 61 74 20 68 6f  register that ho
13bd0 6c 64 73 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  lds the.** resul
13be0 74 2e 20 20 46 6f 72 20 61 20 6d 75 6c 74 69 2d  t.  For a multi-
13bf0 63 6f 6c 75 6d 6e 20 53 45 4c 45 43 54 2c 20 74  column SELECT, t
13c00 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f  he result is sto
13c10 72 65 64 20 69 6e 20 61 20 63 6f 6e 74 69 67 75  red in a contigu
13c20 6f 75 73 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20  ous.** array of 
13c30 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68  registers and th
13c40 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
13c50 73 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6f  s the register o
13c60 66 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a  f the left-most.
13c70 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  ** result column
13c80 2e 20 20 52 65 74 75 72 6e 20 30 20 66 6f 72 20  .  Return 0 for 
13c90 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f 72 20  IN operators or 
13ca0 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
13cb0 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  rs..*/.#ifndef S
13cc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
13cd0 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  ERY.int sqlite3C
13ce0 6f 64 65 53 75 62 73 65 6c 65 63 74 28 0a 20 20  odeSubselect(.  
13cf0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
13d00 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
13d10 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
13d20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
13d30 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49          /* The I
13d40 4e 2c 20 53 45 4c 45 43 54 2c 20 6f 72 20 45 58  N, SELECT, or EX
13d50 49 53 54 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f  ISTS operator */
13d60 0a 20 20 69 6e 74 20 72 48 61 73 4e 75 6c 6c 46  .  int rHasNullF
13d70 6c 61 67 2c 20 20 20 20 20 20 20 2f 2a 20 52 65  lag,       /* Re
13d80 67 69 73 74 65 72 20 74 68 61 74 20 72 65 63 6f  gister that reco
13d90 72 64 73 20 77 68 65 74 68 65 72 20 4e 55 4c 4c  rds whether NULL
13da0 73 20 65 78 69 73 74 20 69 6e 20 52 48 53 20 2a  s exist in RHS *
13db0 2f 0a 20 20 69 6e 74 20 69 73 52 6f 77 69 64 20  /.  int isRowid 
13dc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
13dd0 66 20 74 72 75 65 2c 20 4c 48 53 20 6f 66 20 49  f true, LHS of I
13de0 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20  N operator is a 
13df0 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  rowid */.){.  in
13e00 74 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d  t jmpIfDynamic =
13e10 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   -1;            
13e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
13e30 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64 72 65  -time test addre
13e40 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67  ss */.  int rReg
13e50 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
13e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e70 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74 6f 72  /* Register stor
13e80 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f  ing resulting */
13e90 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
13ea0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
13eb0 73 65 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  se);.  if( NEVER
13ec0 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20  (v==0) ) return 
13ed0 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  0;.  sqlite3Expr
13ee0 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
13ef0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 65 76 61  );..  /* The eva
13f00 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49  luation of the I
13f10 4e 2f 45 58 49 53 54 53 2f 53 45 4c 45 43 54 20  N/EXISTS/SELECT 
13f20 6d 75 73 74 20 62 65 20 72 65 70 65 61 74 65 64  must be repeated
13f30 20 65 76 65 72 79 20 74 69 6d 65 20 69 74 0a 20   every time it. 
13f40 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   ** is encounter
13f50 65 64 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  ed if any of the
13f60 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72   following is tr
13f70 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ue:.  **.  **   
13f80 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61   *  The right-ha
13f90 6e 64 20 73 69 64 65 20 69 73 20 61 20 63 6f 72  nd side is a cor
13fa0 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79  related subquery
13fb0 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  .  **    *  The 
13fc0 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
13fd0 69 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  is an expression
13fe0 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67   list containing
13ff0 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20   variables.  ** 
14000 20 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73     *  We are ins
14010 69 64 65 20 61 20 74 72 69 67 67 65 72 0a 20 20  ide a trigger.  
14020 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f  **.  ** If all o
14030 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20  f the above are 
14040 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63  false, then we c
14050 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65  an run this code
14060 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20   just once.  ** 
14070 73 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 73  save the results
14080 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68 65 20  , and reuse the 
14090 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73  same result on s
140a0 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61  ubsequent invoca
140b0 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
140c0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
140d0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72  ty(pExpr, EP_Var
140e0 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6a  Select) ){.    j
140f0 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 73 71  mpIfDynamic = sq
14100 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50  lite3CodeOnce(pP
14110 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72  arse); VdbeCover
14120 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 23 69 66  age(v);.  }..#if
14130 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14140 5f 45 58 50 4c 41 49 4e 0a 20 20 69 66 28 20 70  _EXPLAIN.  if( p
14150 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
14160 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  2 ){.    char *z
14170 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
14180 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c  intf(pParse->db,
14190 20 22 45 58 45 43 55 54 45 20 25 73 25 73 20 53   "EXECUTE %s%s S
141a0 55 42 51 55 45 52 59 20 25 64 22 2c 0a 20 20 20  UBQUERY %d",.   
141b0 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69       jmpIfDynami
141c0 63 3e 3d 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41  c>=0?"":"CORRELA
141d0 54 45 44 20 22 2c 0a 20 20 20 20 20 20 20 20 70  TED ",.        p
141e0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f  Expr->op==TK_IN?
141f0 22 4c 49 53 54 22 3a 22 53 43 41 4c 41 52 22 2c  "LIST":"SCALAR",
14200 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
14210 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 0a 20  >iNextSelectId. 
14220 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
14230 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
14240 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73  P_Explain, pPars
14250 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c  e->iSelectId, 0,
14260 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e   0, zMsg, P4_DYN
14270 41 4d 49 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  AMIC);.  }.#endi
14280 66 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  f..  switch( pEx
14290 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
142a0 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
142b0 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20    int addr;     
142c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
142d0 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f   Address of OP_O
142e0 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
142f0 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  truction */.    
14300 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
14310 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a  pExpr->pLeft; /*
14320 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   the LHS of the 
14330 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
14340 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
14350 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20  eyInfo = 0;     
14360 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74   /* Key informat
14370 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ion */.      int
14380 20 6e 56 61 6c 3b 20 20 20 20 20 20 20 20 20 20   nVal;          
14390 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
143a0 20 6f 66 20 76 65 63 74 6f 72 20 70 4c 65 66 74   of vector pLeft
143b0 20 2a 2f 0a 20 20 20 20 20 20 0a 20 20 20 20 20   */.      .     
143c0 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 45   nVal = sqlite3E
143d0 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c  xprVectorSize(pL
143e0 65 66 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  eft);.      asse
143f0 72 74 28 20 21 69 73 52 6f 77 69 64 20 7c 7c 20  rt( !isRowid || 
14400 6e 56 61 6c 3d 3d 31 20 29 3b 0a 0a 20 20 20 20  nVal==1 );..    
14410 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69    /* Whether thi
14420 73 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45  s is an 'x IN(SE
14430 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20  LECT...)' or an 
14440 27 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e  'x IN(<exprlist>
14450 29 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72  )'.      ** expr
14460 65 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e  ession it is han
14470 64 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77 61  dled the same wa
14480 79 2e 20 20 41 6e 20 65 70 68 65 6d 65 72 61 6c  y.  An ephemeral
14490 20 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20   table is .     
144a0 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20   ** filled with 
144b0 69 6e 64 65 78 20 6b 65 79 73 20 72 65 70 72 65  index keys repre
144c0 73 65 6e 74 69 6e 67 20 74 68 65 20 72 65 73 75  senting the resu
144d0 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  lts from the .  
144e0 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 6f 72      ** SELECT or
144f0 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e   the <exprlist>.
14500 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
14510 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20 65 78  ** If the 'x' ex
14520 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
14530 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74  lumn value, or t
14540 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20  he SELECT....   
14550 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
14560 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e  returns a column
14570 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65   value, then the
14580 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61   affinity of tha
14590 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  t.      ** colum
145a0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62 75 69  n is used to bui
145b0 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79  ld the index key
145c0 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27 20 61  s. If both 'x' a
145d0 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  nd the.      ** 
145e0 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d  SELECT... statem
145f0 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c  ent are columns,
14600 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66   then numeric af
14610 66 69 6e 69 74 79 20 69 73 20 75 73 65 64 0a 20  finity is used. 
14620 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74 68 65       ** if eithe
14630 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d  r column has NUM
14640 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45 52 20  ERIC or INTEGER 
14650 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e 65 69  affinity. If nei
14660 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 27 78  ther.      ** 'x
14670 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43 54  ' nor the SELECT
14680 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72  ... statement ar
14690 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  e columns, then 
146a0 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
146b0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73 65  .      ** is use
146c0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
146d0 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
146e0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
146f0 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
14700 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14710 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
14720 65 72 61 6c 2c 20 0a 20 20 20 20 20 20 20 20 20  eral, .         
14730 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
14740 28 69 73 52 6f 77 69 64 3f 30 3a 6e 56 61 6c 29  (isRowid?0:nVal)
14750 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66  );.      pKeyInf
14760 6f 20 3d 20 69 73 52 6f 77 69 64 20 3f 20 30 20  o = isRowid ? 0 
14770 3a 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  : sqlite3KeyInfo
14780 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
14790 2c 20 6e 56 61 6c 2c 20 31 29 3b 0a 0a 20 20 20  , nVal, 1);..   
147a0 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
147b0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
147c0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
147d0 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31         /* Case 1
147e0 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53  :     expr IN (S
147f0 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20  ELECT ...).     
14800 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
14810 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
14820 6f 20 77 72 69 74 65 20 74 68 65 20 72 65 73 75  o write the resu
14830 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  lts of the selec
14840 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f  t into the tempo
14850 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  rary.        ** 
14860 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20  table allocated 
14870 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f 76 65  and opened above
14880 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
14890 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
148a0 6c 65 63 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  lect = pExpr->x.
148b0 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20  pSelect;.       
148c0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
148d0 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  t = pSelect->pEL
148e0 69 73 74 3b 0a 0a 20 20 20 20 20 20 20 20 61 73  ist;..        as
148f0 73 65 72 74 28 20 21 69 73 52 6f 77 69 64 20 29  sert( !isRowid )
14900 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  ;.        if( pE
14910 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 6e 56 61  List->nExpr!=nVa
14920 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  l ){.          s
14930 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45  qlite3SubselectE
14940 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 45 4c  rror(pParse, pEL
14950 69 73 74 2d 3e 6e 45 78 70 72 2c 20 6e 56 61 6c  ist->nExpr, nVal
14960 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
14970 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65  {.          Sele
14980 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20  ctDest dest;.   
14990 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
149a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
149b0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
149c0 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45  est, SRT_Set, pE
149d0 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  xpr->iTable);.  
149e0 20 20 20 20 20 20 20 20 64 65 73 74 2e 7a 41 66          dest.zAf
149f0 66 53 64 73 74 20 3d 20 65 78 70 72 49 4e 41 66  fSdst = exprINAf
14a00 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 70  finity(pParse, p
14a10 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
14a20 20 61 73 73 65 72 74 28 20 28 70 45 78 70 72 2d   assert( (pExpr-
14a30 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30 46 46  >iTable&0x0000FF
14a40 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  FF)==pExpr->iTab
14a50 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  le );.          
14a60 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20  pSelect->iLimit 
14a70 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 74  = 0;.          t
14a80 65 73 74 63 61 73 65 28 20 70 53 65 6c 65 63 74  estcase( pSelect
14a90 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
14aa0 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
14ab0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14ac0 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f  pKeyInfo==0 ); /
14ad0 2a 20 43 61 75 73 65 64 20 62 79 20 4f 4f 4d 20  * Caused by OOM 
14ae0 69 6e 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  in sqlite3KeyInf
14af0 6f 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20  oAlloc() */.    
14b00 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
14b10 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
14b20 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 20  pSelect, &dest) 
14b30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
14b40 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
14b50 72 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41  rse->db, dest.zA
14b60 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20  ffSdst);.       
14b70 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49       sqlite3KeyI
14b80 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66  nfoUnref(pKeyInf
14b90 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  o);.            
14ba0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
14bb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
14bc0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
14bd0 61 72 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a  arse->db, dest.z
14be0 41 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20  AffSdst);.      
14bf0 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79      assert( pKey
14c00 49 6e 66 6f 21 3d 30 20 29 3b 20 2f 2a 20 4f 4f  Info!=0 ); /* OO
14c10 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 65 78 69  M will cause exi
14c20 74 20 61 66 74 65 72 20 73 71 6c 69 74 65 33 53  t after sqlite3S
14c30 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20 20 20 20  elect() */.     
14c40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c       assert( pEL
14c50 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist!=0 );.      
14c60 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
14c70 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
14c80 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
14c90 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
14ca0 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49  sWriteable(pKeyI
14cb0 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20  nfo) );.        
14cc0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61    for(i=0; i<nVa
14cd0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
14ce0 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 28       Expr *p = (
14cf0 6e 56 61 6c 3e 31 29 20 3f 20 73 71 6c 69 74 65  nVal>1) ? sqlite
14d00 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65  3VectorFieldSube
14d10 78 70 72 28 70 4c 65 66 74 2c 20 69 29 20 3a 20  xpr(pLeft, i) : 
14d20 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20  pLeft;.         
14d30 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f     pKeyInfo->aCo
14d40 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 42  ll[i] = sqlite3B
14d50 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
14d60 53 65 71 28 0a 20 20 20 20 20 20 20 20 20 20 20  Seq(.           
14d70 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 2c 20       pParse, p, 
14d80 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
14d90 70 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  pr.            )
14da0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
14db0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
14dc0 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70  lse if( ALWAYS(p
14dd0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30  Expr->x.pList!=0
14de0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
14df0 43 61 73 65 20 32 3a 20 20 20 20 20 65 78 70 72  Case 2:     expr
14e00 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20   IN (exprlist). 
14e10 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
14e20 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78    ** For each ex
14e30 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20  pression, build 
14e40 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f  an index key fro
14e50 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e  m the evaluation
14e60 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
14e70 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20  store it in the 
14e80 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
14e90 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20   If <expr> is a 
14ea0 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65  column, then use
14eb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
14ec0 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74   columns affinit
14ed0 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20  y when building 
14ee0 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c  index keys. If <
14ef0 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20  expr> is not.   
14f00 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e       ** a column
14f10 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66  , use numeric af
14f20 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20  finity..        
14f30 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  */.        char 
14f40 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20 20  affinity;       
14f50 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
14f60 20 6f 66 20 74 68 65 20 4c 48 53 20 6f 66 20 74   of the LHS of t
14f70 68 65 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20  he IN */.       
14f80 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
14f90 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
14fa0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
14fb0 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  ;.        struct
14fc0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
14fd0 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 69  pItem;.        i
14fe0 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 0a  nt r1, r2, r3;..
14ff0 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79          affinity
15000 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
15010 66 69 6e 69 74 79 28 70 4c 65 66 74 29 3b 0a 20  finity(pLeft);. 
15020 20 20 20 20 20 20 20 69 66 28 20 21 61 66 66 69         if( !affi
15030 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20  nity ){.        
15040 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c    affinity = SQL
15050 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20  ITE_AFF_BLOB;.  
15060 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15070 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  if( pKeyInfo ){.
15080 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
15090 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  ( sqlite3KeyInfo
150a0 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79  IsWriteable(pKey
150b0 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20  Info) );.       
150c0 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f     pKeyInfo->aCo
150d0 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 45  ll[0] = sqlite3E
150e0 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
150f0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
15100 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
15110 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72       /* Loop thr
15120 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73  ough each expres
15130 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73  sion in <exprlis
15140 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  t>. */.        r
15150 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
15160 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
15170 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69         r2 = sqli
15180 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
15190 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69  arse);.        i
151a0 66 28 20 69 73 52 6f 77 69 64 20 29 20 73 71 6c  f( isRowid ) sql
151b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
151c0 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32  , OP_Null, 0, r2
151d0 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
151e0 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  =pList->nExpr, p
151f0 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
15200 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
15210 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
15220 72 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e  r *pE2 = pItem->
15230 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
15240 20 69 6e 74 20 69 56 61 6c 54 6f 49 6e 73 3b 0a   int iValToIns;.
15250 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
15260 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
15270 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20  is not constant 
15280 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65  then we will nee
15290 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a  d to.          *
152a0 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65  * disable the te
152b0 73 74 20 74 68 61 74 20 77 61 73 20 67 65 6e 65  st that was gene
152c0 72 61 74 65 64 20 61 62 6f 76 65 20 74 68 61 74  rated above that
152d0 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20   makes sure.    
152e0 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f        ** this co
152f0 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73  de only executes
15300 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20   once.  Because 
15310 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61  for a non-consta
15320 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nt.          ** 
15330 65 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65  expression we ne
15340 65 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73  ed to rerun this
15350 20 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e   code each time.
15360 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
15370 20 20 20 20 20 20 20 20 69 66 28 20 6a 6d 70 49          if( jmpI
15380 66 44 79 6e 61 6d 69 63 3e 3d 30 20 26 26 20 21  fDynamic>=0 && !
15390 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
153a0 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20  stant(pE2) ){.  
153b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
153c0 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
153d0 70 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69  p(v, jmpIfDynami
153e0 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  c);.            
153f0 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d  jmpIfDynamic = -
15400 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  1;.          }..
15410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61            /* Eva
15420 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65 73  luate the expres
15430 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20  sion and insert 
15440 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70  it into the temp
15450 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
15460 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20      if( isRowid 
15470 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
15480 49 6e 74 65 67 65 72 28 70 45 32 2c 20 26 69 56  Integer(pE2, &iV
15490 61 6c 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20  alToIns) ){.    
154a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
154b0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
154c0 49 6e 73 65 72 74 49 6e 74 2c 20 70 45 78 70 72  InsertInt, pExpr
154d0 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 69 56  ->iTable, r2, iV
154e0 61 6c 54 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20  alToIns);.      
154f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15500 20 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69         r3 = sqli
15510 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
15520 74 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20 72  t(pParse, pE2, r
15530 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
15540 69 66 28 20 69 73 52 6f 77 69 64 20 29 7b 0a 20  if( isRowid ){. 
15550 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
15560 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15570 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
15580 72 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r3,.            
15590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
155b0 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29  urrentAddr(v)+2)
155c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
155d0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
155e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
155f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
15600 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70  (v, OP_Insert, p
15610 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32  Expr->iTable, r2
15620 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20 20  , r3);.         
15630 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15640 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15650 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
15660 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20  MakeRecord, r3, 
15670 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79  1, r2, &affinity
15680 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
15690 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
156a0 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
156b0 67 65 28 70 50 61 72 73 65 2c 20 72 33 2c 20 31  ge(pParse, r3, 1
156c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
156d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
156e0 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
156f0 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  rt, pExpr->iTabl
15700 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20  e, r2);.        
15710 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
15720 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
15730 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
15740 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
15750 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , r1);.        s
15760 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
15770 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29  pReg(pParse, r2)
15780 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15790 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  if( pKeyInfo ){.
157a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
157b0 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61  dbeChangeP4(v, a
157c0 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65  ddr, (void *)pKe
157d0 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
157e0 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  O);.      }.    
157f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
15800 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53      case TK_EXIS
15810 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  TS:.    case TK_
15820 53 45 4c 45 43 54 3a 0a 20 20 20 20 64 65 66 61  SELECT:.    defa
15830 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ult: {.      /* 
15840 43 61 73 65 20 33 3a 20 20 20 20 28 53 45 4c 45  Case 3:    (SELE
15850 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29  CT ... FROM ...)
15860 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 6f 72  .      **     or
15870 3a 20 20 20 20 45 58 49 53 54 53 28 53 45 4c 45  :    EXISTS(SELE
15880 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29  CT ... FROM ...)
15890 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
158a0 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54 2c  ** For a SELECT,
158b0 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   generate code t
158c0 6f 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 73  o put the values
158d0 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73   for all columns
158e0 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   of.      ** the
158f0 20 66 69 72 73 74 20 72 6f 77 20 69 6e 74 6f 20   first row into 
15900 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69  an array of regi
15910 73 74 65 72 73 20 61 6e 64 20 72 65 74 75 72 6e  sters and return
15920 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 20 20   the index of.  
15930 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74      ** the first
15940 20 72 65 67 69 73 74 65 72 2e 0a 20 20 20 20 20   register..     
15950 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
15960 74 68 69 73 20 69 73 20 61 6e 20 45 58 49 53 54  this is an EXIST
15970 53 2c 20 77 72 69 74 65 20 61 6e 20 69 6e 74 65  S, write an inte
15980 67 65 72 20 30 20 28 6e 6f 74 20 65 78 69 73 74  ger 0 (not exist
15990 73 29 20 6f 72 20 31 20 28 65 78 69 73 74 73 29  s) or 1 (exists)
159a0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61  .      ** into a
159b0 20 72 65 67 69 73 74 65 72 20 61 6e 64 20 72 65   register and re
159c0 74 75 72 6e 20 74 68 61 74 20 72 65 67 69 73 74  turn that regist
159d0 65 72 20 6e 75 6d 62 65 72 2e 0a 20 20 20 20 20  er number..     
159e0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20   **.      ** In 
159f0 62 6f 74 68 20 63 61 73 65 73 2c 20 74 68 65 20  both cases, the 
15a00 71 75 65 72 79 20 69 73 20 61 75 67 6d 65 6e 74  query is augment
15a10 65 64 20 77 69 74 68 20 22 4c 49 4d 49 54 20 31  ed with "LIMIT 1
15a20 22 2e 20 20 41 6e 79 20 0a 20 20 20 20 20 20 2a  ".  Any .      *
15a30 2a 20 70 72 65 65 78 69 73 74 69 6e 67 20 6c 69  * preexisting li
15a40 6d 69 74 20 69 73 20 64 69 73 63 61 72 64 65 64  mit is discarded
15a50 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65   in place of the
15a60 20 6e 65 77 20 4c 49 4d 49 54 20 31 2e 0a 20 20   new LIMIT 1..  
15a70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c      */.      Sel
15a80 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 20  ect *pSel;      
15a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15aa0 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61     /* SELECT sta
15ab0 74 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65  tement to encode
15ac0 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74   */.      Select
15ad0 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20  Dest dest;      
15ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15af0 2f 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c 20 77  /* How to deal w
15b00 69 74 68 20 53 45 4c 45 43 54 20 72 65 73 75 6c  ith SELECT resul
15b10 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  t */.      int n
15b20 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Reg;            
15b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b40 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 74 6f   /* Registers to
15b50 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20 20   allocate */..  
15b60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
15b70 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53  xpr->op==TK_EXIS
15b80 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  TS );.      test
15b90 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
15ba0 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20  =TK_SELECT );.  
15bb0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
15bc0 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  r->op==TK_EXISTS
15bd0 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
15be0 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20  K_SELECT );.    
15bf0 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61    assert( ExprHa
15c00 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
15c10 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
15c20 3b 0a 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20  ;..      pSel = 
15c30 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
15c40 3b 0a 20 20 20 20 20 20 6e 52 65 67 20 3d 20 70  ;.      nReg = p
15c50 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
15c60 45 43 54 20 3f 20 70 53 65 6c 2d 3e 70 45 4c 69  ECT ? pSel->pELi
15c70 73 74 2d 3e 6e 45 78 70 72 20 3a 20 31 3b 0a 20  st->nExpr : 1;. 
15c80 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
15c90 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
15ca0 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65  , 0, pParse->nMe
15cb0 6d 2b 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72  m+1);.      pPar
15cc0 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67  se->nMem += nReg
15cd0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
15ce0 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
15cf0 20 29 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74   ){.        dest
15d00 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d  .eDest = SRT_Mem
15d10 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 69  ;.        dest.i
15d20 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53 44 50  Sdst = dest.iSDP
15d30 61 72 6d 3b 0a 20 20 20 20 20 20 20 20 64 65 73  arm;.        des
15d40 74 2e 6e 53 64 73 74 20 3d 20 6e 52 65 67 3b 0a  t.nSdst = nReg;.
15d50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15d60 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
15d70 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 53  Null, 0, dest.iS
15d80 44 50 61 72 6d 2c 20 64 65 73 74 2e 69 53 44 50  DParm, dest.iSDP
15d90 61 72 6d 2b 6e 52 65 67 2d 31 29 3b 0a 20 20 20  arm+nReg-1);.   
15da0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
15db0 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62 71 75  ((v, "Init subqu
15dc0 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20  ery result"));. 
15dd0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15de0 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d      dest.eDest =
15df0 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20   SRT_Exists;.   
15e00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15e10 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
15e20 65 67 65 72 2c 20 30 2c 20 64 65 73 74 2e 69 53  eger, 0, dest.iS
15e30 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  DParm);.        
15e40 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
15e50 22 49 6e 69 74 20 45 58 49 53 54 53 20 72 65 73  "Init EXISTS res
15e60 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a  ult"));.      }.
15e70 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
15e80 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
15e90 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74  db, pSel->pLimit
15ea0 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 70  );.      pSel->p
15eb0 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50  Limit = sqlite3P
15ec0 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
15ed0 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c 0a 20  INTEGER, 0, 0,. 
15ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f00 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65   &sqlite3IntToke
15f10 6e 73 5b 31 5d 29 3b 0a 20 20 20 20 20 20 70 53  ns[1]);.      pS
15f20 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  el->iLimit = 0;.
15f30 20 20 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46        pSel->selF
15f40 6c 61 67 73 20 26 3d 20 7e 53 46 5f 4d 75 6c 74  lags &= ~SF_Mult
15f50 69 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 69 66  iValue;.      if
15f60 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  ( sqlite3Select(
15f70 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 26 64  pParse, pSel, &d
15f80 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  est) ){.        
15f90 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
15fa0 7d 0a 20 20 20 20 20 20 72 52 65 67 20 3d 20 64  }.      rReg = d
15fb0 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20  est.iSDParm;.   
15fc0 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f     ExprSetVVAPro
15fd0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
15fe0 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20  NoReduce);.     
15ff0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
16000 7d 0a 0a 20 20 69 66 28 20 72 48 61 73 4e 75 6c  }..  if( rHasNul
16010 6c 46 6c 61 67 20 29 7b 0a 20 20 20 20 73 71 6c  lFlag ){.    sql
16020 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c  ite3SetHasNullFl
16030 61 67 28 76 2c 20 70 45 78 70 72 2d 3e 69 54 61  ag(v, pExpr->iTa
16040 62 6c 65 2c 20 72 48 61 73 4e 75 6c 6c 46 6c 61  ble, rHasNullFla
16050 67 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6a  g);.  }..  if( j
16060 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20 29  mpIfDynamic>=0 )
16070 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
16080 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70  eJumpHere(v, jmp
16090 49 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20 7d 0a  IfDynamic);.  }.
160a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
160b0 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 0a  hePop(pParse);..
160c0 20 20 72 65 74 75 72 6e 20 72 52 65 67 3b 0a 7d    return rReg;.}
160d0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
160e0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
160f0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
16100 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
16110 0a 2f 2a 0a 2a 2a 20 45 78 70 72 20 70 49 6e 20  ./*.** Expr pIn 
16120 69 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 65 78  is an IN(...) ex
16130 70 72 65 73 73 69 6f 6e 2e 20 54 68 69 73 20 66  pression. This f
16140 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 74  unction checks t
16150 68 61 74 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d  hat the .** sub-
16160 73 65 6c 65 63 74 20 6f 6e 20 74 68 65 20 52 48  select on the RH
16170 53 20 6f 66 20 74 68 65 20 49 4e 28 29 20 6f 70  S of the IN() op
16180 65 72 61 74 6f 72 20 68 61 73 20 74 68 65 20 73  erator has the s
16190 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a  ame number of .*
161a0 2a 20 63 6f 6c 75 6d 6e 73 20 61 73 20 74 68 65  * columns as the
161b0 20 76 65 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c   vector on the L
161c0 48 53 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 52  HS. Or, if the R
161d0 48 53 20 6f 66 20 74 68 65 20 49 4e 28 29 20 69  HS of the IN() i
161e0 73 20 6e 6f 74 20 0a 2a 2a 20 61 20 73 75 62 2d  s not .** a sub-
161f0 71 75 65 72 79 2c 20 74 68 61 74 20 74 68 65 20  query, that the 
16200 4c 48 53 20 69 73 20 61 20 76 65 63 74 6f 72 20  LHS is a vector 
16210 6f 66 20 73 69 7a 65 20 31 2e 0a 2a 2f 0a 69 6e  of size 1..*/.in
16220 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65  t sqlite3ExprChe
16230 63 6b 49 4e 28 50 61 72 73 65 20 2a 70 50 61 72  ckIN(Parse *pPar
16240 73 65 2c 20 45 78 70 72 20 2a 70 49 6e 29 7b 0a  se, Expr *pIn){.
16250 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 20 3d 20    int nVector = 
16260 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
16270 72 53 69 7a 65 28 70 49 6e 2d 3e 70 4c 65 66 74  rSize(pIn->pLeft
16280 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 2d 3e 66  );.  if( (pIn->f
16290 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c  lags & EP_xIsSel
162a0 65 63 74 29 20 29 7b 0a 20 20 20 20 69 66 28 20  ect) ){.    if( 
162b0 6e 56 65 63 74 6f 72 21 3d 70 49 6e 2d 3e 78 2e  nVector!=pIn->x.
162c0 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
162d0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
162e0 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74  sqlite3Subselect
162f0 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 49  Error(pParse, pI
16300 6e 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  n->x.pSelect->pE
16310 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 6e 56 65  List->nExpr, nVe
16320 63 74 6f 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ctor);.      ret
16330 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
16340 65 6c 73 65 20 69 66 28 20 6e 56 65 63 74 6f 72  else if( nVector
16350 21 3d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 28  !=1 ){.    if( (
16360 70 49 6e 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  pIn->pLeft->flag
16370 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
16380 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
16390 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72  e3SubselectError
163a0 28 70 50 61 72 73 65 2c 20 6e 56 65 63 74 6f 72  (pParse, nVector
163b0 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 1);.    }else{
163c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
163d0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
163e0 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65  row value misuse
163f0 64 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  d");.    }.    r
16400 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
16410 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
16420 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
16430 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
16440 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
16450 6f 64 65 20 66 6f 72 20 61 6e 20 49 4e 20 65 78  ode for an IN ex
16460 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
16470 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43       x IN (SELEC
16480 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20 20 20 78  T ...).**      x
16490 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75   IN (value, valu
164a0 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  e, ...).**.** Th
164b0 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65  e left-hand side
164c0 20 28 4c 48 53 29 20 69 73 20 61 20 73 63 61 6c   (LHS) is a scal
164d0 61 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ar expression.  
164e0 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
164f0 69 64 65 20 28 52 48 53 29 0a 2a 2a 20 69 73 20  ide (RHS).** is 
16500 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65 72 6f  an array of zero
16510 20 6f 72 20 6d 6f 72 65 20 76 61 6c 75 65 73 2e   or more values.
16520 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e    The expression
16530 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
16540 4c 48 53 20 69 73 0a 2a 2a 20 63 6f 6e 74 61 69  LHS is.** contai
16550 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52  ned within the R
16560 48 53 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6f  HS.  The value o
16570 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
16580 20 69 73 20 75 6e 6b 6e 6f 77 6e 20 28 4e 55 4c   is unknown (NUL
16590 4c 29 0a 2a 2a 20 69 66 20 74 68 65 20 4c 48 53  L).** if the LHS
165a0 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74   is NULL or if t
165b0 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f  he LHS is not co
165c0 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74  ntained within t
165d0 68 65 20 52 48 53 20 61 6e 64 20 74 68 65 0a 2a  he RHS and the.*
165e0 2a 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 6f  * RHS contains o
165f0 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20  ne or more NULL 
16600 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  values..**.** Th
16610 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
16620 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 6a  ates code that j
16630 75 6d 70 73 20 74 6f 20 64 65 73 74 49 66 46 61  umps to destIfFa
16640 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53 20 69  lse if the LHS i
16650 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61 69  s not .** contai
16660 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52  ned within the R
16670 48 53 2e 20 20 49 66 20 64 75 65 20 74 6f 20 4e  HS.  If due to N
16680 55 4c 4c 73 20 77 65 20 63 61 6e 6e 6f 74 20 64  ULLs we cannot d
16690 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
166a0 4c 48 53 0a 2a 2a 20 69 73 20 63 6f 6e 74 61 69  LHS.** is contai
166b0 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 20 74  ned in the RHS t
166c0 68 65 6e 20 6a 75 6d 70 20 74 6f 20 64 65 73 74  hen jump to dest
166d0 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 20  IfNull.  If the 
166e0 4c 48 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  LHS is contained
166f0 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 52  .** within the R
16700 48 53 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72  HS then fall thr
16710 6f 75 67 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ough..*/.static 
16720 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
16730 43 6f 64 65 49 4e 28 0a 20 20 50 61 72 73 65 20  CodeIN(.  Parse 
16740 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
16750 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
16760 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
16770 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
16780 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
16790 20 20 2f 2a 20 54 68 65 20 49 4e 20 65 78 70 72    /* The IN expr
167a0 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
167b0 64 65 73 74 49 66 46 61 6c 73 65 2c 20 20 20 20  destIfFalse,    
167c0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
167d0 66 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e  f LHS is not con
167e0 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48  tained in the RH
167f0 53 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49  S */.  int destI
16800 66 4e 75 6c 6c 20 20 20 20 20 20 20 20 2f 2a 20  fNull        /* 
16810 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65  Jump here if the
16820 20 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e 6b   results are unk
16830 6e 6f 77 6e 20 64 75 65 20 74 6f 20 4e 55 4c 4c  nown due to NULL
16840 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 52  s */.){.  int rR
16850 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 20 20  hsHasNull = 0;  
16860 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 61 74  /* Register that
16870 20 69 73 20 74 72 75 65 20 69 66 20 52 48 53 20   is true if RHS 
16880 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61  contains NULL va
16890 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 65 54  lues */.  int eT
168a0 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ype;            
168b0 2f 2a 20 54 79 70 65 20 6f 66 20 74 68 65 20 52  /* Type of the R
168c0 48 53 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20  HS */.  int r1, 
168d0 72 32 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r2;           /*
168e0 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72   Temporary use r
168f0 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 56 64  egisters */.  Vd
16900 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
16910 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74      /* Statement
16920 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
16930 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69  ion */.  int *ai
16940 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  Map = 0;       /
16950 2a 20 4d 61 70 20 66 72 6f 6d 20 76 65 63 74 6f  * Map from vecto
16960 72 20 66 69 65 6c 64 20 74 6f 20 69 6e 64 65 78  r field to index
16970 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61   column */.  cha
16980 72 20 2a 7a 41 66 66 20 3d 20 30 3b 20 20 20 20  r *zAff = 0;    
16990 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 73     /* Affinity s
169a0 74 72 69 6e 67 20 66 6f 72 20 63 6f 6d 70 61 72  tring for compar
169b0 69 73 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  isons */.  int n
169c0 56 65 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20  Vector;         
169d0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 76 65 63 74   /* Size of vect
169e0 6f 72 73 20 66 6f 72 20 74 68 69 73 20 49 4e 28  ors for this IN(
169f0 2e 2e 2e 29 20 6f 70 20 2a 2f 0a 20 20 69 6e 74  ...) op */.  int
16a00 20 69 44 75 6d 6d 79 3b 20 20 20 20 20 20 20 20   iDummy;        
16a10 20 20 20 2f 2a 20 44 75 6d 6d 79 20 70 61 72 61     /* Dummy para
16a20 6d 65 74 65 72 20 74 6f 20 65 78 70 72 43 6f 64  meter to exprCod
16a30 65 56 65 63 74 6f 72 28 29 20 2a 2f 0a 20 20 45  eVector() */.  E
16a40 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
16a50 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69 6e 74  pr->pLeft;.  int
16a60 20 69 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74   i;..  if( sqlit
16a70 65 33 45 78 70 72 43 68 65 63 6b 49 4e 28 70 50  e3ExprCheckIN(pP
16a80 61 72 73 65 2c 20 70 45 78 70 72 29 20 29 20 72  arse, pExpr) ) r
16a90 65 74 75 72 6e 3b 0a 20 20 7a 41 66 66 20 3d 20  eturn;.  zAff = 
16aa0 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28 70  exprINAffinity(p
16ab0 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
16ac0 20 69 66 28 20 7a 41 66 66 3d 3d 30 20 29 20 72   if( zAff==0 ) r
16ad0 65 74 75 72 6e 3b 0a 20 20 6e 56 65 63 74 6f 72  eturn;.  nVector
16ae0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
16af0 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d 3e  ctorSize(pExpr->
16b00 70 4c 65 66 74 29 3b 0a 20 20 61 69 4d 61 70 20  pLeft);.  aiMap 
16b10 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 44  = (int*)sqlite3D
16b20 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20  bMallocZero(.   
16b30 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e     pParse->db, n
16b40 56 65 63 74 6f 72 2a 28 73 69 7a 65 6f 66 28 69  Vector*(sizeof(i
16b50 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28 63 68 61  nt) + sizeof(cha
16b60 72 29 29 20 2b 20 31 0a 20 20 29 3b 0a 20 20 69  r)) + 1.  );.  i
16b70 66 28 20 61 69 4d 61 70 3d 3d 30 20 29 7b 0a 20  f( aiMap==0 ){. 
16b80 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
16b90 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 41 66  (pParse->db, zAf
16ba0 66 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  f);.    return;.
16bb0 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 74 65 6d 70    }..  /* Attemp
16bc0 74 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  t to compute the
16bd0 20 52 48 53 2e 20 41 66 74 65 72 20 74 68 69 73   RHS. After this
16be0 20 73 74 65 70 2c 20 69 66 20 61 6e 79 74 68 69   step, if anythi
16bf0 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 0a 20 20  ng other than.  
16c00 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  ** IN_INDEX_NOOP
16c10 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
16c20 65 20 74 61 62 6c 65 20 6f 70 65 6e 65 64 20 69  e table opened i
16c30 74 68 20 63 75 72 73 6f 72 20 70 45 78 70 72 2d  th cursor pExpr-
16c40 3e 69 54 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f  >iTable .  ** co
16c50 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65  ntains the value
16c60 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74  s that make up t
16c70 68 65 20 52 48 53 2e 20 49 66 20 49 4e 5f 49 4e  he RHS. If IN_IN
16c80 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72 65 74 75  DEX_NOOP is retu
16c90 72 6e 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 52  rned,.  ** the R
16ca0 48 53 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  HS has not yet b
16cb0 65 65 6e 20 63 6f 64 65 64 2e 20 20 2a 2f 0a 20  een coded.  */. 
16cc0 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
16cd0 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  be;.  assert( v!
16ce0 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f  =0 );       /* O
16cf0 4f 4d 20 64 65 74 65 63 74 65 64 20 70 72 69 6f  OM detected prio
16d00 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  r to this routin
16d10 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43  e */.  VdbeNoopC
16d20 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69  omment((v, "begi
16d30 6e 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 20 20  n IN expr"));.  
16d40 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46  eType = sqlite3F
16d50 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73  indInIndex(pPars
16d60 65 2c 20 70 45 78 70 72 2c 0a 20 20 20 20 20 20  e, pExpr,.      
16d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d80 20 20 20 20 20 20 20 49 4e 5f 49 4e 44 45 58 5f         IN_INDEX_
16d90 4d 45 4d 42 45 52 53 48 49 50 20 7c 20 49 4e 5f  MEMBERSHIP | IN_
16da0 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a 20  INDEX_NOOP_OK,. 
16db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16dc0 20 20 20 20 20 20 20 20 20 20 20 20 64 65 73 74              dest
16dd0 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e  IfFalse==destIfN
16de0 75 6c 6c 20 3f 20 30 20 3a 20 26 72 52 68 73 48  ull ? 0 : &rRhsH
16df0 61 73 4e 75 6c 6c 2c 20 61 69 4d 61 70 29 3b 0a  asNull, aiMap);.
16e00 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
16e10 65 2d 3e 6e 45 72 72 20 7c 7c 20 6e 56 65 63 74  e->nErr || nVect
16e20 6f 72 3d 3d 31 20 7c 7c 20 65 54 79 70 65 3d 3d  or==1 || eType==
16e30 49 4e 5f 49 4e 44 45 58 5f 45 50 48 0a 20 20 20  IN_INDEX_EPH.   
16e40 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e      || eType==IN
16e50 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43  _INDEX_INDEX_ASC
16e60 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e   || eType==IN_IN
16e70 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 0a  DEX_INDEX_DESC .
16e80 20 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 64 65 20    );..  /* Code 
16e90 74 68 65 20 4c 48 53 2c 20 74 68 65 20 3c 65 78  the LHS, the <ex
16ea0 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e  pr> from "<expr>
16eb0 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 49 66 20 74   IN (...)". If t
16ec0 68 65 20 4c 48 53 20 69 73 20 61 20 0a 20 20 2a  he LHS is a .  *
16ed0 2a 20 76 65 63 74 6f 72 2c 20 74 68 65 6e 20 69  * vector, then i
16ee0 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  t is stored in a
16ef0 6e 20 61 72 72 61 79 20 6f 66 20 6e 56 65 63 74  n array of nVect
16f00 6f 72 20 72 65 67 69 73 74 65 72 73 20 73 74 61  or registers sta
16f10 72 74 69 6e 67 20 0a 20 20 2a 2a 20 61 74 20 72  rting .  ** at r
16f20 31 2e 0a 20 20 2a 2f 0a 20 20 72 31 20 3d 20 73  1..  */.  r1 = s
16f30 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
16f40 67 65 28 70 50 61 72 73 65 2c 20 6e 56 65 63 74  ge(pParse, nVect
16f50 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  or);.  sqlite3Ex
16f60 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
16f70 73 65 29 3b 0a 20 20 72 32 20 3d 20 65 78 70 72  se);.  r2 = expr
16f80 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72 73  CodeVector(pPars
16f90 65 2c 20 70 4c 65 66 74 2c 20 26 69 44 75 6d 6d  e, pLeft, &iDumm
16fa0 79 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  y);.  for(i=0; i
16fb0 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a  <nVector; i++){.
16fc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16fd0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp3(v, OP_Copy
16fe0 2c 20 72 32 2b 69 2c 20 72 31 2b 61 69 4d 61 70  , r2+i, r1+aiMap
16ff0 5b 69 5d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  [i], 0);.  }..  
17000 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 46 69 6e  /* If sqlite3Fin
17010 64 49 6e 49 6e 64 65 78 28 29 20 64 69 64 20 6e  dInIndex() did n
17020 6f 74 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74  ot find or creat
17030 65 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  e an index that 
17040 69 73 0a 20 20 2a 2a 20 73 75 69 74 61 62 6c 65  is.  ** suitable
17050 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20   for evaluating 
17060 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c  the IN operator,
17070 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20 75   then evaluate u
17080 73 69 6e 67 20 61 0a 20 20 2a 2a 20 73 65 71 75  sing a.  ** sequ
17090 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73  ence of comparis
170a0 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
170b0 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
170c0 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 45 78 70 72  NOOP ){.    Expr
170d0 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
170e0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
170f0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
17100 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
17110 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
17120 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
17130 20 69 6e 74 20 6c 61 62 65 6c 4f 6b 20 3d 20 73   int labelOk = s
17140 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
17150 62 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74 20  bel(v);.    int 
17160 72 32 2c 20 72 65 67 54 6f 46 72 65 65 3b 0a 20  r2, regToFree;. 
17170 20 20 20 69 6e 74 20 72 65 67 43 6b 4e 75 6c 6c     int regCkNull
17180 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 69   = 0;.    int ii
17190 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
171a0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
171b0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
171c0 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 64  ct) );.    if( d
171d0 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49  estIfNull!=destI
171e0 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20  fFalse ){.      
171f0 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c 69  regCkNull = sqli
17200 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
17210 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
17220 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
17230 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 31 2c  , OP_BitAnd, r1,
17240 20 72 31 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b   r1, regCkNull);
17250 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
17260 69 3d 30 3b 20 69 69 3c 70 4c 69 73 74 2d 3e 6e  i=0; ii<pList->n
17270 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Expr; ii++){.   
17280 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
17290 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
172a0 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 69 5d  se, pList->a[ii]
172b0 2e 70 45 78 70 72 2c 20 26 72 65 67 54 6f 46 72  .pExpr, &regToFr
172c0 65 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ee);.      if( r
172d0 65 67 43 6b 4e 75 6c 6c 20 26 26 20 73 71 6c 69  egCkNull && sqli
172e0 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
172f0 28 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45  (pList->a[ii].pE
17300 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
17310 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17320 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20  3(v, OP_BitAnd, 
17330 72 65 67 43 6b 4e 75 6c 6c 2c 20 72 32 2c 20 72  regCkNull, r2, r
17340 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  egCkNull);.     
17350 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 69 3c   }.      if( ii<
17360 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 7c  pList->nExpr-1 |
17370 7c 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65  | destIfNull!=de
17380 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20  stIfFalse ){.   
17390 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
173a0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 71 2c  AddOp4(v, OP_Eq,
173b0 20 72 31 2c 20 6c 61 62 65 6c 4f 6b 2c 20 72 32   r1, labelOk, r2
173c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
173d0 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
173e0 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c  d*)pColl, P4_COL
173f0 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 56  LSEQ);.        V
17400 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
17410 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72   ii<pList->nExpr
17420 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  -1);.        Vdb
17430 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 69  eCoverageIf(v, i
17440 69 3d 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  i==pList->nExpr-
17450 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
17460 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
17470 76 2c 20 7a 41 66 66 5b 30 5d 29 3b 0a 20 20 20  v, zAff[0]);.   
17480 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17490 20 20 61 73 73 65 72 74 28 20 64 65 73 74 49 66    assert( destIf
174a0 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73  Null==destIfFals
174b0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e );.        sql
174c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
174d0 2c 20 4f 50 5f 4e 65 2c 20 72 31 2c 20 64 65 73  , OP_Ne, r1, des
174e0 74 49 66 46 61 6c 73 65 2c 20 72 32 2c 0a 20 20  tIfFalse, r2,.  
174f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17500 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
17510 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
17520 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
17530 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
17540 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
17550 76 2c 20 7a 41 66 66 5b 30 5d 20 7c 20 53 51 4c  v, zAff[0] | SQL
17560 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
17570 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
17580 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
17590 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
175a0 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20  ToFree);.    }. 
175b0 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c     if( regCkNull
175c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
175d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
175e0 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 43 6b 4e  P_IsNull, regCkN
175f0 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  ull, destIfNull)
17600 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
17610 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17620 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74  VdbeGoto(v, dest
17630 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 7d 0a  IfFalse);.    }.
17640 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
17650 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
17660 61 62 65 6c 4f 6b 29 3b 0a 20 20 20 20 73 71 6c  abelOk);.    sql
17670 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
17680 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 43 6b  eg(pParse, regCk
17690 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Null);.  }else{.
176a0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79    .    /* If any
176b0 20 76 61 6c 75 65 20 6f 6e 20 74 68 65 20 4c 48   value on the LH
176c0 53 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72  S is NULL, the r
176d0 65 73 75 6c 74 20 6f 66 20 74 68 65 20 49 4e 28  esult of the IN(
176e0 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 0a 20 20  ...) operator.  
176f0 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74    ** must be eit
17700 68 65 72 20 66 61 6c 73 65 20 6f 72 20 4e 55 4c  her false or NUL
17710 4c 2e 20 49 66 20 74 68 65 73 65 20 74 77 6f 20  L. If these two 
17720 61 72 65 20 68 61 6e 64 6c 65 64 20 69 64 65 6e  are handled iden
17730 74 69 63 61 6c 6c 79 2c 0a 20 20 20 20 2a 2a 20  tically,.    ** 
17740 74 65 73 74 20 74 68 65 20 4c 48 53 20 66 6f 72  test the LHS for
17750 20 4e 55 4c 4c 73 20 61 6e 64 20 6a 75 6d 70 20   NULLs and jump 
17760 64 69 72 65 63 74 6c 79 20 74 6f 20 64 65 73 74  directly to dest
17770 49 66 4e 75 6c 6c 20 69 66 20 61 6e 79 20 61 72  IfNull if any ar
17780 65 0a 20 20 20 20 2a 2a 20 66 6f 75 6e 64 2e 20  e.    ** found. 
17790 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f  .    **.    ** O
177a0 74 68 65 72 77 69 73 65 2c 20 69 66 20 4e 55 4c  therwise, if NUL
177b0 4c 20 61 6e 64 20 66 61 6c 73 65 20 61 72 65 20  L and false are 
177c0 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e  handled differen
177d0 74 6c 79 2c 20 61 6e 64 20 74 68 65 0a 20 20 20  tly, and the.   
177e0 20 2a 2a 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72   ** IN(...) oper
177f0 61 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61 20 76  ation is not a v
17800 65 63 74 6f 72 20 6f 70 65 72 61 74 69 6f 6e 2c  ector operation,
17810 20 61 6e 64 20 74 68 65 20 4c 48 53 20 6f 66 20   and the LHS of 
17820 74 68 65 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  the.    ** opera
17830 74 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  tor is NULL, the
17840 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  n the result is 
17850 66 61 6c 73 65 20 69 66 20 74 68 65 20 69 6e 64  false if the ind
17860 65 78 20 69 73 20 0a 20 20 20 20 2a 2a 20 63 6f  ex is .    ** co
17870 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2c 20  mpletely empty, 
17880 6f 72 20 4e 55 4c 4c 20 6f 74 68 65 72 77 69 73  or NULL otherwis
17890 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64  e.  */.    if( d
178a0 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49  estIfNull==destI
178b0 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20  fFalse ){.      
178c0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74  for(i=0; i<nVect
178d0 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  or; i++){.      
178e0 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
178f0 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
17900 62 65 78 70 72 28 70 45 78 70 72 2d 3e 70 4c 65  bexpr(pExpr->pLe
17910 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  ft, i);.        
17920 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
17930 61 6e 42 65 4e 75 6c 6c 28 70 29 20 29 7b 0a 20  anBeNull(p) ){. 
17940 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17950 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17960 5f 49 73 4e 75 6c 6c 2c 20 72 31 2b 61 69 4d 61  _IsNull, r1+aiMa
17970 70 5b 69 5d 2c 20 64 65 73 74 49 66 4e 75 6c 6c  p[i], destIfNull
17980 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
17990 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
179a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
179b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56      }else if( nV
179c0 65 63 74 6f 72 3d 3d 31 20 26 26 20 73 71 6c 69  ector==1 && sqli
179d0 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
179e0 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29  (pExpr->pLeft) )
179f0 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
17a00 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
17a10 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e  ddOp1(v, OP_NotN
17a20 75 6c 6c 2c 20 72 31 29 3b 20 56 64 62 65 43 6f  ull, r1); VdbeCo
17a30 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
17a40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17a50 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
17a60 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
17a70 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
17a80 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
17a90 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
17aa0 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65  e3VdbeGoto(v, de
17ab0 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
17ac0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
17ad0 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
17ae0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
17af0 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
17b00 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20  _ROWID ){.      
17b10 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  /* In this case,
17b20 20 74 68 65 20 52 48 53 20 69 73 20 74 68 65 20   the RHS is the 
17b30 52 4f 57 49 44 20 6f 66 20 74 61 62 6c 65 20 62  ROWID of table b
17b40 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 73  -tree */.      s
17b50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
17b60 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64  (v, OP_SeekRowid
17b70 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
17b80 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31   destIfFalse, r1
17b90 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
17ba0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 65  erage(v);.    }e
17bb0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  lse{.      /* In
17bc0 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20   this case, the 
17bd0 52 48 53 20 69 73 20 61 6e 20 69 6e 64 65 78 20  RHS is an index 
17be0 62 2d 74 72 65 65 2e 20 41 70 70 6c 79 20 74 68  b-tree. Apply th
17bf0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20  e comparison.   
17c00 20 20 20 2a 2a 20 61 66 66 69 6e 69 74 69 65 73     ** affinities
17c10 20 74 6f 20 65 61 63 68 20 76 61 6c 75 65 20 6f   to each value o
17c20 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65  n the LHS of the
17c30 20 6f 70 65 72 61 74 6f 72 2e 20 20 2a 2f 0a 20   operator.  */. 
17c40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17c50 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66  AddOp4(v, OP_Aff
17c60 69 6e 69 74 79 2c 20 72 31 2c 20 6e 56 65 63 74  inity, r1, nVect
17c70 6f 72 2c 20 30 2c 20 7a 41 66 66 2c 20 6e 56 65  or, 0, zAff, nVe
17c80 63 74 6f 72 29 3b 0a 20 20 20 20 20 20 0a 20 20  ctor);.      .  
17c90 20 20 20 20 69 66 28 20 6e 56 65 63 74 6f 72 3e      if( nVector>
17ca0 31 20 26 26 20 64 65 73 74 49 66 4e 75 6c 6c 21  1 && destIfNull!
17cb0 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a  =destIfFalse ){.
17cc0 20 20 20 20 20 20 20 20 69 6e 74 20 69 49 64 78          int iIdx
17cd0 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
17ce0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  ;.        int ad
17cf0 64 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  dr;.        int 
17d00 61 64 64 72 4e 65 78 74 3b 0a 0a 20 20 20 20 20  addrNext;..     
17d10 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65     /* Search the
17d20 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b   index for the k
17d30 65 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ey. */.        a
17d40 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
17d50 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
17d60 5f 46 6f 75 6e 64 2c 20 69 49 64 78 2c 20 30 2c  _Found, iIdx, 0,
17d70 20 72 31 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20   r1, nVector);. 
17d80 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
17d90 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 20  age(v);..       
17da0 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
17db0 74 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  t the specified 
17dc0 6b 65 79 20 69 73 20 6e 6f 74 20 70 72 65 73 65  key is not prese
17dd0 6e 74 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c  nt in the index,
17de0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20   .        ** so 
17df0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
17e00 65 20 49 4e 28 2e 2e 29 20 6f 70 65 72 61 74 6f  e IN(..) operato
17e10 72 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  r must be either
17e20 20 4e 55 4c 4c 20 6f 72 0a 20 20 20 20 20 20 20   NULL or.       
17e30 20 2a 2a 20 30 2e 20 54 68 65 20 76 64 62 65 20   ** 0. The vdbe 
17e40 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
17e50 65 6c 6f 77 20 66 69 67 75 72 65 73 20 6f 75 74  elow figures out
17e60 20 77 68 69 63 68 2e 20 20 2a 2f 0a 20 20 20 20   which.  */.    
17e70 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20 31      addrNext = 1
17e80 2b 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f  +sqlite3VdbeAddO
17e90 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
17ea0 20 69 49 64 78 2c 20 64 65 73 74 49 66 46 61 6c   iIdx, destIfFal
17eb0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  se);.        Vdb
17ec0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
17ed0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
17ee0 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b  i<nVector; i++){
17ef0 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
17f00 2a 70 3b 0a 20 20 20 20 20 20 20 20 20 20 43 6f  *p;.          Co
17f10 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
17f20 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d          int r2 =
17f30 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
17f40 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
17f50 20 20 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65        p = sqlite
17f60 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65  3VectorFieldSube
17f70 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20  xpr(pLeft, i);. 
17f80 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
17f90 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
17fa0 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  Seq(pParse, p);.
17fb0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
17fc0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
17fd0 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 2c  OP_Column, iIdx,
17fe0 20 69 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20   i, r2);.       
17ff0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18000 64 4f 70 34 28 76 2c 20 4f 50 5f 45 71 2c 20 72  dOp4(v, OP_Eq, r
18010 31 2b 69 2c 20 30 2c 20 72 32 2c 20 28 76 6f 69  1+i, 0, r2, (voi
18020 64 2a 29 70 43 6f 6c 6c 2c 50 34 5f 43 4f 4c 4c  d*)pColl,P4_COLL
18030 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20 20  SEQ);.          
18040 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
18050 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4a 55  eP5(v, SQLITE_JU
18060 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
18070 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
18080 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
18090 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
180a0 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 49  2(v, OP_Next, iI
180b0 64 78 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20  dx, addrNext);. 
180c0 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
180d0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
180e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
180f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
18100 2c 20 30 2c 20 64 65 73 74 49 66 46 61 6c 73 65  , 0, destIfFalse
18110 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
18120 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
18130 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
18140 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 33 29  urrentAddr(v)-3)
18150 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
18160 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
18170 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
18180 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
18190 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
181a0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
181b0 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 0a  , destIfNull);..
181c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b          /* The k
181d0 65 79 20 77 61 73 20 66 6f 75 6e 64 20 69 6e 20  ey was found in 
181e0 74 68 65 20 69 6e 64 65 78 2e 20 49 66 20 69 74  the index. If it
181f0 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55   contains any NU
18200 4c 4c 20 76 61 6c 75 65 73 2c 0a 20 20 20 20 20  LL values,.     
18210 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 72     ** then the r
18220 65 73 75 6c 74 20 6f 66 20 74 68 65 20 49 4e 28  esult of the IN(
18230 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20 69 73  ...) operator is
18240 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73 65   NULL. Otherwise
18250 2c 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  , the.        **
18260 20 72 65 73 75 6c 74 20 69 73 20 31 2e 20 20 2a   result is 1.  *
18270 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
18280 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
18290 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20   addr);.        
182a0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74  for(i=0; i<nVect
182b0 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  or; i++){.      
182c0 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
182d0 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
182e0 53 75 62 65 78 70 72 28 70 45 78 70 72 2d 3e 70  Subexpr(pExpr->p
182f0 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Left, i);.      
18300 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
18310 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 29 20  xprCanBeNull(p) 
18320 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
18330 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18340 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
18350 31 2b 61 69 4d 61 70 5b 69 5d 2c 20 64 65 73 74  1+aiMap[i], dest
18360 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  IfNull);.       
18370 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
18380 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
18390 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  }.        }..   
183a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 52 68     }else if( rRh
183b0 73 48 61 73 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20  sHasNull==0 ){. 
183c0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
183d0 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20 69 74  ranch runs if it
183e0 20 69 73 20 6b 6e 6f 77 6e 20 61 74 20 63 6f 6d   is known at com
183f0 70 69 6c 65 20 74 69 6d 65 20 74 68 61 74 20 74  pile time that t
18400 68 65 20 52 48 53 0a 20 20 20 20 20 20 20 20 2a  he RHS.        *
18410 2a 20 63 61 6e 6e 6f 74 20 63 6f 6e 74 61 69 6e  * cannot contain
18420 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 20 54 68   NULL values. Th
18430 69 73 20 68 61 70 70 65 6e 73 20 61 73 20 61 20  is happens as a 
18440 72 65 73 75 6c 74 0a 20 20 20 20 20 20 20 20 2a  result.        *
18450 2a 20 6f 66 20 22 4e 4f 54 20 4e 55 4c 4c 22 20  * of "NOT NULL" 
18460 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74  constraints in t
18470 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
18480 6d 61 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ma..        **. 
18490 20 20 20 20 20 20 20 2a 2a 20 41 6c 73 6f 20 72         ** Also r
184a0 75 6e 20 74 68 69 73 20 62 72 61 6e 63 68 20 69  un this branch i
184b0 66 20 4e 55 4c 4c 20 69 73 20 65 71 75 69 76 61  f NULL is equiva
184c0 6c 65 6e 74 20 74 6f 20 46 41 4c 53 45 0a 20 20  lent to FALSE.  
184d0 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 69        ** for thi
184e0 73 20 70 61 72 74 69 63 75 6c 61 72 20 49 4e 20  s particular IN 
184f0 6f 70 65 72 61 74 6f 72 2e 20 20 2a 2f 0a 20 20  operator.  */.  
18500 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18510 65 41 64 64 4f 70 34 49 6e 74 28 0a 20 20 20 20  eAddOp4Int(.    
18520 20 20 20 20 20 20 20 20 76 2c 20 4f 50 5f 4e 6f          v, OP_No
18530 74 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  tFound, pExpr->i
18540 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c  Table, destIfFal
18550 73 65 2c 20 72 31 2c 20 6e 56 65 63 74 6f 72 0a  se, r1, nVector.
18560 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
18570 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
18580 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  v);.      }else{
18590 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  .        /* In t
185a0 68 69 73 20 62 72 61 6e 63 68 2c 20 74 68 65 20  his branch, the 
185b0 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6d 69  RHS of the IN mi
185c0 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55  ght contain a NU
185d0 4c 4c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  LL and.        *
185e0 2a 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f  * the presence o
185f0 66 20 61 20 4e 55 4c 4c 20 6f 6e 20 74 68 65 20  f a NULL on the 
18600 52 48 53 20 6d 61 6b 65 73 20 61 20 64 69 66 66  RHS makes a diff
18610 65 72 65 6e 63 65 20 69 6e 20 74 68 65 0a 20 20  erence in the.  
18620 20 20 20 20 20 20 2a 2a 20 6f 75 74 63 6f 6d 65        ** outcome
18630 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
18640 20 20 20 20 20 69 6e 74 20 61 64 64 72 31 3b 0a       int addr1;.
18650 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  .        /* Firs
18660 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  t check to see i
18670 66 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e  f the LHS is con
18680 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48  tained in the RH
18690 53 2e 20 20 49 66 20 73 6f 2c 0a 20 20 20 20 20  S.  If so,.     
186a0 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 61     ** then the a
186b0 6e 73 77 65 72 20 69 73 20 54 52 55 45 20 74 68  nswer is TRUE th
186c0 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 4e 55  e presence of NU
186d0 4c 4c 73 20 69 6e 20 74 68 65 20 52 48 53 20 64  LLs in the RHS d
186e0 6f 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  oes.        ** n
186f0 6f 74 20 6d 61 74 74 65 72 2e 20 20 49 66 20 74  ot matter.  If t
18700 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f  he LHS is not co
18710 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52  ntained in the R
18720 48 53 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  HS, then the.   
18730 20 20 20 20 20 2a 2a 20 61 6e 73 77 65 72 20 69       ** answer i
18740 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 52 48  s NULL if the RH
18750 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73  S contains NULLs
18760 20 61 6e 64 20 74 68 65 20 61 6e 73 77 65 72 20   and the answer 
18770 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 41  is.        ** FA
18780 4c 53 45 20 69 66 20 74 68 65 20 52 48 53 20 69  LSE if the RHS i
18790 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 20 20 20  s NULL-free..   
187a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
187b0 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
187c0 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
187d0 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d  OP_Found, pExpr-
187e0 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72 31 2c 20  >iTable, 0, r1, 
187f0 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  1);.        Vdbe
18800 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
18810 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18820 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
18830 75 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c  ull, rRhsHasNull
18840 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
18850 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
18860 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
18870 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
18880 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
18890 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
188a0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
188b0 61 64 64 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a  addr1);.      }.
188c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
188d0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
188e0 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
188f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
18900 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
18910 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
18920 61 72 73 65 2d 3e 64 62 2c 20 61 69 4d 61 70 29  arse->db, aiMap)
18930 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
18940 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 41  e(pParse->db, zA
18950 66 66 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65  ff);.  VdbeComme
18960 6e 74 28 28 76 2c 20 22 65 6e 64 20 49 4e 20 65  nt((v, "end IN e
18970 78 70 72 22 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  xpr"));.}.#endif
18980 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
18990 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66  SUBQUERY */..#if
189a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
189b0 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
189c0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
189d0 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
189e0 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20  at will put the 
189f0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a  floating point.*
18a00 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69 62 65  * value describe
18a10 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69  d by z[0..n-1] i
18a20 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65  nto register iMe
18a30 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d  m..**.** The z[]
18a40 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f   string will pro
18a50 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72  bably not be zer
18a60 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42  o-terminated.  B
18a70 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20  ut the .** z[n] 
18a80 63 68 61 72 61 63 74 65 72 20 69 73 20 67 75 61  character is gua
18a90 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f  ranteed to be so
18aa0 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65  mething that doe
18ab0 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69  s not look.** li
18ac0 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74  ke the continuat
18ad0 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ion of the numbe
18ae0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
18af0 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20  d codeReal(Vdbe 
18b00 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *v, const char *
18b10 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61  z, int negateFla
18b20 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20  g, int iMem){.  
18b30 69 66 28 20 41 4c 57 41 59 53 28 7a 21 3d 30 29  if( ALWAYS(z!=0)
18b40 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76   ){.    double v
18b50 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  alue;.    sqlite
18b60 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c  3AtoF(z, &value,
18b70 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
18b80 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  (z), SQLITE_UTF8
18b90 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
18ba0 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c  sqlite3IsNaN(val
18bb0 75 65 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65  ue) ); /* The ne
18bc0 77 20 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74  w AtoF never ret
18bd0 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20  urns NaN */.    
18be0 69 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29  if( negateFlag )
18bf0 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b   value = -value;
18c00 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
18c10 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50  AddOp4Dup8(v, OP
18c20 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20  _Real, 0, iMem, 
18c30 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20  0, (u8*)&value, 
18c40 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a  P4_REAL);.  }.}.
18c50 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47  #endif.../*.** G
18c60 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72  enerate an instr
18c70 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  uction that will
18c80 20 70 75 74 20 74 68 65 20 69 6e 74 65 67 65 72   put the integer
18c90 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20   describe by.** 
18ca0 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69  text z[0..n-1] i
18cb0 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65  nto register iMe
18cc0 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e  m..**.** Expr.u.
18cd0 7a 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79 73  zToken is always
18ce0 20 55 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d 74   UTF8 and zero-t
18cf0 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74  erminated..*/.st
18d00 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e  atic void codeIn
18d10 74 65 67 65 72 28 50 61 72 73 65 20 2a 70 50 61  teger(Parse *pPa
18d20 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
18d30 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69  , int negFlag, i
18d40 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65  nt iMem){.  Vdbe
18d50 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
18d60 64 62 65 3b 0a 20 20 69 66 28 20 70 45 78 70 72  dbe;.  if( pExpr
18d70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74  ->flags & EP_Int
18d80 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e 74  Value ){.    int
18d90 20 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56   i = pExpr->u.iV
18da0 61 6c 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  alue;.    assert
18db0 28 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  ( i>=0 );.    if
18dc0 28 20 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20  ( negFlag ) i = 
18dd0 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  -i;.    sqlite3V
18de0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18df0 49 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d  Integer, i, iMem
18e00 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
18e10 69 6e 74 20 63 3b 0a 20 20 20 20 69 36 34 20 76  int c;.    i64 v
18e20 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  alue;.    const 
18e30 63 68 61 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d  char *z = pExpr-
18e40 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61  >u.zToken;.    a
18e50 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20  ssert( z!=0 );. 
18e60 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 44 65     c = sqlite3De
18e70 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26  cOrHexToI64(z, &
18e80 76 61 6c 75 65 29 3b 0a 20 20 20 20 69 66 28 20  value);.    if( 
18e90 63 3d 3d 30 20 7c 7c 20 28 63 3d 3d 32 20 26 26  c==0 || (c==2 &&
18ea0 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20 20 20   negFlag) ){.   
18eb0 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29     if( negFlag )
18ec0 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d 32 20 3f  { value = c==2 ?
18ed0 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20   SMALLEST_INT64 
18ee0 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20 20 20  : -value; }.    
18ef0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18f00 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 49 6e  Op4Dup8(v, OP_In
18f10 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c  t64, 0, iMem, 0,
18f20 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34   (u8*)&value, P4
18f30 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c  _INT64);.    }el
18f40 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  se{.#ifdef SQLIT
18f50 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
18f60 50 4f 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69  POINT.      sqli
18f70 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
18f80 73 65 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69  se, "oversized i
18f90 6e 74 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e  nteger: %s%s", n
18fa0 65 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22  egFlag ? "-" : "
18fb0 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 23 69 66  ", z);.#else.#if
18fc0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18fd0 5f 48 45 58 5f 49 4e 54 45 47 45 52 0a 20 20 20  _HEX_INTEGER.   
18fe0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
18ff0 74 72 6e 69 63 6d 70 28 7a 2c 22 30 78 22 2c 32  trnicmp(z,"0x",2
19000 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
19010 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
19020 70 50 61 72 73 65 2c 20 22 68 65 78 20 6c 69 74  pParse, "hex lit
19030 65 72 61 6c 20 74 6f 6f 20 62 69 67 3a 20 25 73  eral too big: %s
19040 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ", z);.      }el
19050 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
19060 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65  {.        codeRe
19070 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67  al(v, z, negFlag
19080 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d  , iMem);.      }
19090 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
190a0 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  }.}..#if defined
190b0 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
190c0 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 65 20  *.** Verify the 
190d0 63 6f 6e 73 69 73 74 65 6e 63 79 20 6f 66 20 74  consistency of t
190e0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 0a  he column cache.
190f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61  */.static int ca
19100 63 68 65 49 73 56 61 6c 69 64 28 50 61 72 73 65  cheIsValid(Parse
19110 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74   *pParse){.  int
19120 20 69 2c 20 6e 3b 0a 20 20 66 6f 72 28 69 3d 6e   i, n;.  for(i=n
19130 3d 30 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  =0; i<SQLITE_N_C
19140 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 29 7b 0a 20  OLCACHE; i++){. 
19150 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61     if( pParse->a
19160 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67  ColCache[i].iReg
19170 3e 30 20 29 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20  >0 ) n++;.  }.  
19180 72 65 74 75 72 6e 20 6e 3d 3d 70 50 61 72 73 65  return n==pParse
19190 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 0a 7d 0a 23  ->nColCache;.}.#
191a0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  endif../*.** Cle
191b0 61 72 20 61 20 63 61 63 68 65 20 65 6e 74 72 79  ar a cache entry
191c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
191d0 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72   cacheEntryClear
191e0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
191f0 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
19200 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74   *p){.  if( p->t
19210 65 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 69 66  empReg ){.    if
19220 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  ( pParse->nTempR
19230 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61  eg<ArraySize(pPa
19240 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29  rse->aTempReg) )
19250 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
19260 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d  aTempReg[pParse-
19270 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70  >nTempReg++] = p
19280 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20  ->iReg;.    }.  
19290 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30    p->tempReg = 0
192a0 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 52 65 67 20  ;.  }.  p->iReg 
192b0 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
192c0 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 61 73  ColCache--;.  as
192d0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
192e0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
192f0 7c 20 63 61 63 68 65 49 73 56 61 6c 69 64 28 70  | cacheIsValid(p
19300 50 61 72 73 65 29 20 29 3b 0a 7d 0a 0a 0a 2f 2a  Parse) );.}.../*
19310 0a 2a 2a 20 52 65 63 6f 72 64 20 69 6e 20 74 68  .** Record in th
19320 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 74  e column cache t
19330 68 61 74 20 61 20 70 61 72 74 69 63 75 6c 61 72  hat a particular
19340 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a   column from a.*
19350 2a 20 70 61 72 74 69 63 75 6c 61 72 20 74 61 62  * particular tab
19360 6c 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  le is stored in 
19370 61 20 70 61 72 74 69 63 75 6c 61 72 20 72 65 67  a particular reg
19380 69 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ister..*/.void s
19390 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53  qlite3ExprCacheS
193a0 74 6f 72 65 28 50 61 72 73 65 20 2a 70 50 61 72  tore(Parse *pPar
193b0 73 65 2c 20 69 6e 74 20 69 54 61 62 2c 20 69 6e  se, int iTab, in
193c0 74 20 69 43 6f 6c 2c 20 69 6e 74 20 69 52 65 67  t iCol, int iReg
193d0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
193e0 74 20 6d 69 6e 4c 72 75 3b 0a 20 20 69 6e 74 20  t minLru;.  int 
193f0 69 64 78 4c 72 75 3b 0a 20 20 73 74 72 75 63 74  idxLru;.  struct
19400 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a   yColCache *p;..
19410 20 20 2f 2a 20 55 6e 6c 65 73 73 20 61 6e 20 65    /* Unless an e
19420 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
19430 64 2c 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  d, register numb
19440 65 72 73 20 61 72 65 20 61 6c 77 61 79 73 20 70  ers are always p
19450 6f 73 69 74 69 76 65 2e 20 2a 2f 0a 20 20 61 73  ositive. */.  as
19460 73 65 72 74 28 20 69 52 65 67 3e 30 20 7c 7c 20  sert( iReg>0 || 
19470 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
19480 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
19490 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 61 73  ocFailed );.  as
194a0 73 65 72 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26  sert( iCol>=-1 &
194b0 26 20 69 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20  & iCol<32768 ); 
194c0 20 2f 2a 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d   /* Finite colum
194d0 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20  n numbers */..  
194e0 2f 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 43 6f  /* The SQLITE_Co
194f0 6c 75 6d 6e 43 61 63 68 65 20 66 6c 61 67 20 64  lumnCache flag d
19500 69 73 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 75  isables the colu
19510 6d 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  mn cache.  This 
19520 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 66 6f 72  is used.  ** for
19530 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 20 2d 20   testing only - 
19540 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 53  to verify that S
19550 51 4c 69 74 65 20 61 6c 77 61 79 73 20 67 65 74  QLite always get
19560 73 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  s the same answe
19570 72 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e 64 20  r.  ** with and 
19580 77 69 74 68 6f 75 74 20 74 68 65 20 63 6f 6c 75  without the colu
19590 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20  mn cache..  */. 
195a0 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f   if( Optimizatio
195b0 6e 44 69 73 61 62 6c 65 64 28 70 50 61 72 73 65  nDisabled(pParse
195c0 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 6c  ->db, SQLITE_Col
195d0 75 6d 6e 43 61 63 68 65 29 20 29 20 72 65 74 75  umnCache) ) retu
195e0 72 6e 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20  rn;..  /* First 
195f0 72 65 70 6c 61 63 65 20 61 6e 79 20 65 78 69 73  replace any exis
19600 74 69 6e 67 20 65 6e 74 72 79 2e 0a 20 20 2a 2a  ting entry..  **
19610 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20  .  ** Actually, 
19620 74 68 65 20 77 61 79 20 74 68 65 20 63 6f 6c 75  the way the colu
19630 6d 6e 20 63 61 63 68 65 20 69 73 20 63 75 72 72  mn cache is curr
19640 65 6e 74 6c 79 20 75 73 65 64 2c 20 77 65 20 61  ently used, we a
19650 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20  re guaranteed.  
19660 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 62 6a 65  ** that the obje
19670 63 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 6c  ct will never al
19680 72 65 61 64 79 20 62 65 20 69 6e 20 63 61 63 68  ready be in cach
19690 65 2e 20 20 56 65 72 69 66 79 20 74 68 69 73 20  e.  Verify this 
196a0 67 75 61 72 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a  guarantee..  */.
196b0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
196c0 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
196d0 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
196e0 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
196f0 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
19700 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 52     assert( p->iR
19710 65 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 54 61 62  eg==0 || p->iTab
19720 6c 65 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e 69  le!=iTab || p->i
19730 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a  Column!=iCol );.
19740 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
19750 20 46 69 6e 64 20 61 6e 20 65 6d 70 74 79 20 73   Find an empty s
19760 6c 6f 74 20 61 6e 64 20 72 65 70 6c 61 63 65 20  lot and replace 
19770 69 74 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  it */.  for(i=0,
19780 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
19790 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
197a0 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
197b0 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
197c0 3e 69 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20  >iReg==0 ){.    
197d0 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50    p->iLevel = pP
197e0 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
197f0 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 54 61 62  l;.      p->iTab
19800 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20  le = iTab;.     
19810 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43   p->iColumn = iC
19820 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65  ol;.      p->iRe
19830 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 20 20  g = iReg;.      
19840 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a  p->tempReg = 0;.
19850 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70        p->lru = p
19860 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74  Parse->iCacheCnt
19870 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  ++;.      pParse
19880 2d 3e 6e 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20  ->nColCache++;. 
19890 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
198a0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
198b0 61 69 6c 65 64 20 7c 7c 20 63 61 63 68 65 49 73  ailed || cacheIs
198c0 56 61 6c 69 64 28 70 50 61 72 73 65 29 20 29 3b  Valid(pParse) );
198d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
198e0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
198f0 65 70 6c 61 63 65 20 74 68 65 20 6c 61 73 74 20  eplace the last 
19900 72 65 63 65 6e 74 6c 79 20 75 73 65 64 20 2a 2f  recently used */
19910 0a 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66  .  minLru = 0x7f
19920 66 66 66 66 66 66 3b 0a 20 20 69 64 78 4c 72 75  ffffff;.  idxLru
19930 20 3d 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30   = -1;.  for(i=0
19940 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
19950 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
19960 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
19970 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
19980 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20 29 7b 0a  ->lru<minLru ){.
19990 20 20 20 20 20 20 69 64 78 4c 72 75 20 3d 20 69        idxLru = i
199a0 3b 0a 20 20 20 20 20 20 6d 69 6e 4c 72 75 20 3d  ;.      minLru =
199b0 20 70 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d 0a 20   p->lru;.    }. 
199c0 20 7d 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28   }.  if( ALWAYS(
199d0 69 64 78 4c 72 75 3e 3d 30 29 20 29 7b 0a 20 20  idxLru>=0) ){.  
199e0 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61    p = &pParse->a
199f0 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72 75 5d  ColCache[idxLru]
19a00 3b 0a 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20  ;.    p->iLevel 
19a10 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
19a20 4c 65 76 65 6c 3b 0a 20 20 20 20 70 2d 3e 69 54  Level;.    p->iT
19a30 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20  able = iTab;.   
19a40 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43   p->iColumn = iC
19a50 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69 52 65 67 20  ol;.    p->iReg 
19a60 3d 20 69 52 65 67 3b 0a 20 20 20 20 70 2d 3e 74  = iReg;.    p->t
19a70 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20  empReg = 0;.    
19a80 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d  p->lru = pParse-
19a90 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20  >iCacheCnt++;.  
19aa0 20 20 61 73 73 65 72 74 28 20 63 61 63 68 65 49    assert( cacheI
19ab0 73 56 61 6c 69 64 28 70 50 61 72 73 65 29 20 29  sValid(pParse) )
19ac0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
19ad0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63  }.}../*.** Indic
19ae0 61 74 65 20 74 68 61 74 20 72 65 67 69 73 74 65  ate that registe
19af0 72 73 20 62 65 74 77 65 65 6e 20 69 52 65 67 2e  rs between iReg.
19b00 2e 69 52 65 67 2b 6e 52 65 67 2d 31 20 61 72 65  .iReg+nReg-1 are
19b10 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74   being overwritt
19b20 65 6e 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68 65  en..** Purge the
19b30 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74   range of regist
19b40 65 72 73 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c  ers from the col
19b50 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f  umn cache..*/.vo
19b60 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
19b70 63 68 65 52 65 6d 6f 76 65 28 50 61 72 73 65 20  cheRemove(Parse 
19b80 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
19b90 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  g, int nReg){.  
19ba0 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
19bb0 20 2a 70 3b 0a 20 20 69 66 28 20 69 52 65 67 3c   *p;.  if( iReg<
19bc0 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 43  =0 || pParse->nC
19bd0 6f 6c 43 61 63 68 65 3d 3d 30 20 29 20 72 65 74  olCache==0 ) ret
19be0 75 72 6e 3b 0a 20 20 70 20 3d 20 26 70 50 61 72  urn;.  p = &pPar
19bf0 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 53 51  se->aColCache[SQ
19c00 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 2d  LITE_N_COLCACHE-
19c10 31 5d 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a  1];.  while(1){.
19c20 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20      if( p->iReg 
19c30 3e 3d 20 69 52 65 67 20 26 26 20 70 2d 3e 69 52  >= iReg && p->iR
19c40 65 67 20 3c 20 69 52 65 67 2b 6e 52 65 67 20 29  eg < iReg+nReg )
19c50 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72   cacheEntryClear
19c60 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
19c70 20 69 66 28 20 70 3d 3d 70 50 61 72 73 65 2d 3e   if( p==pParse->
19c80 61 43 6f 6c 43 61 63 68 65 20 29 20 62 72 65 61  aColCache ) brea
19c90 6b 3b 0a 20 20 20 20 70 2d 2d 3b 0a 20 20 7d 0a  k;.    p--;.  }.
19ca0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65  }../*.** Remembe
19cb0 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  r the current co
19cc0 6c 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74 65  lumn cache conte
19cd0 78 74 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e 74  xt.  Any new ent
19ce0 72 69 65 73 20 61 64 64 65 64 0a 2a 2a 20 61 64  ries added.** ad
19cf0 64 65 64 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d  ded to the colum
19d00 6e 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  n cache after th
19d10 69 73 20 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f  is call are remo
19d20 76 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20  ved when the.** 
19d30 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f  corresponding po
19d40 70 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69  p occurs..*/.voi
19d50 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
19d60 68 65 50 75 73 68 28 50 61 72 73 65 20 2a 70 50  hePush(Parse *pP
19d70 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d  arse){.  pParse-
19d80 3e 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a  >iCacheLevel++;.
19d90 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
19da0 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65  BUG.  if( pParse
19db0 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
19dc0 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72  LITE_VdbeAddopTr
19dd0 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  ace ){.    print
19de0 66 28 22 50 55 53 48 20 74 6f 20 25 64 5c 6e 22  f("PUSH to %d\n"
19df0 2c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  , pParse->iCache
19e00 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64  Level);.  }.#end
19e10 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  if.}../*.** Remo
19e20 76 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75  ve from the colu
19e30 6d 6e 20 63 61 63 68 65 20 61 6e 79 20 65 6e 74  mn cache any ent
19e40 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20 61  ries that were a
19e50 64 64 65 64 20 73 69 6e 63 65 20 74 68 65 0a 2a  dded since the.*
19e60 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  * the previous s
19e70 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
19e80 75 73 68 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ush operation.  
19e90 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
19ea0 72 65 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20 63  restore.** the c
19eb0 61 63 68 65 20 74 6f 20 74 68 65 20 73 74 61 74  ache to the stat
19ec0 65 20 69 74 20 77 61 73 20 69 6e 20 70 72 69 6f  e it was in prio
19ed0 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  r the most recen
19ee0 74 20 50 75 73 68 2e 0a 2a 2f 0a 76 6f 69 64 20  t Push..*/.void 
19ef0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
19f00 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  Pop(Parse *pPars
19f10 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  e){.  int i;.  s
19f20 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
19f30 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  *p;.  assert( pP
19f40 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
19f50 6c 3e 3d 31 20 29 3b 0a 20 20 70 50 61 72 73 65  l>=1 );.  pParse
19f60 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2d 2d 3b  ->iCacheLevel--;
19f70 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
19f80 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73  EBUG.  if( pPars
19f90 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
19fa0 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
19fb0 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e  race ){.    prin
19fc0 74 66 28 22 50 4f 50 20 20 74 6f 20 25 64 5c 6e  tf("POP  to %d\n
19fd0 22 2c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  ", pParse->iCach
19fe0 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e  eLevel);.  }.#en
19ff0 64 69 66 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  dif.  for(i=0, p
1a000 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
1a010 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
1a020 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
1a030 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
1a040 52 65 67 20 26 26 20 70 2d 3e 69 4c 65 76 65 6c  Reg && p->iLevel
1a050 3e 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c  >pParse->iCacheL
1a060 65 76 65 6c 20 29 7b 0a 20 20 20 20 20 20 63 61  evel ){.      ca
1a070 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50  cheEntryClear(pP
1a080 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a  arse, p);.    }.
1a090 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65    }.}../*.** Whe
1a0a0 6e 20 61 20 63 61 63 68 65 64 20 63 6f 6c 75 6d  n a cached colum
1a0b0 6e 20 69 73 20 72 65 75 73 65 64 2c 20 6d 61 6b  n is reused, mak
1a0c0 65 20 73 75 72 65 20 74 68 61 74 20 69 74 73 20  e sure that its 
1a0d0 72 65 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e  register is.** n
1a0e0 6f 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c 61 62  o longer availab
1a0f0 6c 65 20 61 73 20 61 20 74 65 6d 70 20 72 65 67  le as a temp reg
1a100 69 73 74 65 72 2e 20 20 74 69 63 6b 65 74 20 23  ister.  ticket #
1a110 33 38 37 39 3a 20 20 74 68 61 74 20 73 61 6d 65  3879:  that same
1a120 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 6d 69 67  .** register mig
1a130 68 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63  ht be in the cac
1a140 68 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70  he in multiple p
1a150 6c 61 63 65 73 2c 20 73 6f 20 62 65 20 73 75 72  laces, so be sur
1a160 65 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d  e to.** get them
1a170 20 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   all..*/.static 
1a180 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1a190 43 61 63 68 65 50 69 6e 52 65 67 69 73 74 65 72  CachePinRegister
1a1a0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1a1b0 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74  int iReg){.  int
1a1c0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
1a1d0 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72  lCache *p;.  for
1a1e0 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
1a1f0 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
1a200 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
1a210 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
1a220 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67  f( p->iReg==iReg
1a230 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d   ){.      p->tem
1a240 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pReg = 0;.    }.
1a250 20 20 7d 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61    }.}../* Genera
1a260 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
1a270 6c 20 6c 6f 61 64 20 69 6e 74 6f 20 72 65 67 69  l load into regi
1a280 73 74 65 72 20 72 65 67 4f 75 74 20 61 20 76 61  ster regOut a va
1a290 6c 75 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 61  lue that is.** a
1a2a0 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
1a2b0 68 65 20 69 49 64 78 43 6f 6c 2d 74 68 20 63 6f  he iIdxCol-th co
1a2c0 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49  lumn of index pI
1a2d0 64 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  dx..*/.void sqli
1a2e0 74 65 33 45 78 70 72 43 6f 64 65 4c 6f 61 64 49  te3ExprCodeLoadI
1a2f0 6e 64 65 78 43 6f 6c 75 6d 6e 28 0a 20 20 50 61  ndexColumn(.  Pa
1a300 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 2f 2a  rse *pParse,  /*
1a310 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
1a320 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20  text */.  Index 
1a330 2a 70 49 64 78 2c 20 20 20 20 2f 2a 20 54 68 65  *pIdx,    /* The
1a340 20 69 6e 64 65 78 20 77 68 6f 73 65 20 63 6f 6c   index whose col
1a350 75 6d 6e 20 69 73 20 74 6f 20 62 65 20 6c 6f 61  umn is to be loa
1a360 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ded */.  int iTa
1a370 62 43 75 72 2c 20 20 20 20 2f 2a 20 43 75 72 73  bCur,    /* Curs
1a380 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  or pointing to a
1a390 20 74 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20   table row */.  
1a3a0 69 6e 74 20 69 49 64 78 43 6f 6c 2c 20 20 20 20  int iIdxCol,    
1a3b0 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 66  /* The column of
1a3c0 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65   the index to be
1a3d0 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74   loaded */.  int
1a3e0 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20   regOut      /* 
1a3f0 53 74 6f 72 65 20 74 68 65 20 69 6e 64 65 78 20  Store the index 
1a400 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20  column value in 
1a410 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f  this register */
1a420 0a 29 7b 0a 20 20 69 31 36 20 69 54 61 62 43 6f  .){.  i16 iTabCo
1a430 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  l = pIdx->aiColu
1a440 6d 6e 5b 69 49 64 78 43 6f 6c 5d 3b 0a 20 20 69  mn[iIdxCol];.  i
1a450 66 28 20 69 54 61 62 43 6f 6c 3d 3d 58 4e 5f 45  f( iTabCol==XN_E
1a460 58 50 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72  XPR ){.    asser
1a470 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70  t( pIdx->aColExp
1a480 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  r );.    assert(
1a490 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d   pIdx->aColExpr-
1a4a0 3e 6e 45 78 70 72 3e 69 49 64 78 43 6f 6c 20 29  >nExpr>iIdxCol )
1a4b0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53  ;.    pParse->iS
1a4c0 65 6c 66 54 61 62 20 3d 20 69 54 61 62 43 75 72  elfTab = iTabCur
1a4d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1a4e0 72 43 6f 64 65 43 6f 70 79 28 70 50 61 72 73 65  rCodeCopy(pParse
1a4f0 2c 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72  , pIdx->aColExpr
1a500 2d 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e 70 45 78  ->a[iIdxCol].pEx
1a510 70 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d  pr, regOut);.  }
1a520 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
1a530 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
1a540 6d 6e 4f 66 54 61 62 6c 65 28 70 50 61 72 73 65  mnOfTable(pParse
1a550 2d 3e 70 56 64 62 65 2c 20 70 49 64 78 2d 3e 70  ->pVdbe, pIdx->p
1a560 54 61 62 6c 65 2c 20 69 54 61 62 43 75 72 2c 0a  Table, iTabCur,.
1a570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a590 20 20 20 20 69 54 61 62 43 6f 6c 2c 20 72 65 67      iTabCol, reg
1a5a0 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Out);.  }.}../*.
1a5b0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1a5c0 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65 20   to extract the 
1a5d0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 43 6f  value of the iCo
1a5e0 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  l-th column of a
1a5f0 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20   table..*/.void 
1a600 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1a610 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28  etColumnOfTable(
1a620 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
1a630 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 75     /* The VDBE u
1a640 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
1a650 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  n */.  Table *pT
1a660 61 62 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61  ab,    /* The ta
1a670 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
1a680 68 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e  he value */.  in
1a690 74 20 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a  t iTabCur,    /*
1a6a0 20 54 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f   The table curso
1a6b0 72 2e 20 20 4f 72 20 74 68 65 20 50 4b 20 63 75  r.  Or the PK cu
1a6c0 72 73 6f 72 20 66 6f 72 20 57 49 54 48 4f 55 54  rsor for WITHOUT
1a6d0 20 52 4f 57 49 44 20 2a 2f 0a 20 20 69 6e 74 20   ROWID */.  int 
1a6e0 69 43 6f 6c 2c 20 20 20 20 20 20 20 2f 2a 20 49  iCol,       /* I
1a6f0 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75  ndex of the colu
1a700 6d 6e 20 74 6f 20 65 78 74 72 61 63 74 20 2a 2f  mn to extract */
1a710 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20 20 20  .  int regOut   
1a720 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68     /* Extract th
1a730 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 69  e value into thi
1a740 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b  s register */.){
1a750 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c  .  if( iCol<0 ||
1a760 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b   iCol==pTab->iPK
1a770 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
1a780 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a790 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 43 75 72  P_Rowid, iTabCur
1a7a0 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c  , regOut);.  }el
1a7b0 73 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d  se{.    int op =
1a7c0 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
1a7d0 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20   ? OP_VColumn : 
1a7e0 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69  OP_Column;.    i
1a7f0 6e 74 20 78 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  nt x = iCol;.   
1a800 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70   if( !HasRowid(p
1a810 54 61 62 29 20 26 26 20 21 49 73 56 69 72 74 75  Tab) && !IsVirtu
1a820 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
1a830 20 20 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c    x = sqlite3Col
1a840 75 6d 6e 4f 66 49 6e 64 65 78 28 73 71 6c 69 74  umnOfIndex(sqlit
1a850 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
1a860 78 28 70 54 61 62 29 2c 20 69 43 6f 6c 29 3b 0a  x(pTab), iCol);.
1a870 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1a880 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f  3VdbeAddOp3(v, o
1a890 70 2c 20 69 54 61 62 43 75 72 2c 20 78 2c 20 72  p, iTabCur, x, r
1a8a0 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 66  egOut);.  }.  if
1a8b0 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20  ( iCol>=0 ){.   
1a8c0 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65   sqlite3ColumnDe
1a8d0 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69  fault(v, pTab, i
1a8e0 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  Col, regOut);.  
1a8f0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
1a900 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
1a910 6c 6c 20 65 78 74 72 61 63 74 20 74 68 65 20 69  ll extract the i
1a920 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e  Column-th column
1a930 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70   from.** table p
1a940 54 61 62 20 61 6e 64 20 73 74 6f 72 65 20 74 68  Tab and store th
1a950 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  e column value i
1a960 6e 20 61 20 72 65 67 69 73 74 65 72 2e 20 0a 2a  n a register. .*
1a970 2a 0a 2a 2a 20 41 6e 20 65 66 66 6f 72 74 20 69  *.** An effort i
1a980 73 20 6d 61 64 65 20 74 6f 20 73 74 6f 72 65 20  s made to store 
1a990 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  the column value
1a9a0 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65   in register iRe
1a9b0 67 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6e  g.  This.** is n
1a9c0 6f 74 20 67 61 72 61 6e 74 65 65 65 64 20 66 6f  ot garanteeed fo
1a9d0 72 20 47 65 74 43 6f 6c 75 6d 6e 28 29 20 2d 20  r GetColumn() - 
1a9e0 74 68 65 20 72 65 73 75 6c 74 20 63 61 6e 20 62  the result can b
1a9f0 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 61  e stored in.** a
1aa00 6e 79 20 72 65 67 69 73 74 65 72 2e 20 20 42 75  ny register.  Bu
1aa10 74 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  t the result is 
1aa20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 61  guaranteed to la
1aa30 6e 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  nd in register i
1aa40 52 65 67 0a 2a 2a 20 66 6f 72 20 47 65 74 43 6f  Reg.** for GetCo
1aa50 6c 75 6d 6e 54 6f 52 65 67 28 29 2e 0a 2a 2a 0a  lumnToReg()..**.
1aa60 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  ** There must be
1aa70 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20   an open cursor 
1aa80 74 6f 20 70 54 61 62 20 69 6e 20 69 54 61 62 6c  to pTab in iTabl
1aa90 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
1aaa0 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
1aab0 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20  .  If iColumn<0 
1aac0 74 68 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e  then code is gen
1aad0 65 72 61 74 65 64 20 74 68 61 74 20 65 78 74 72  erated that extr
1aae0 61 63 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a  acts the rowid..
1aaf0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
1ab00 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
1ab10 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1ab20 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61  ,   /* Parsing a
1ab30 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
1ab40 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1ab50 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
1ab60 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
1ab70 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20  of the table we 
1ab80 61 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d  are reading from
1ab90 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
1aba0 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20  n,     /* Index 
1abb0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c  of the table col
1abc0 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  umn */.  int iTa
1abd0 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ble,      /* The
1abe0 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   cursor pointing
1abf0 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   to the table */
1ac00 0a 20 20 69 6e 74 20 69 52 65 67 2c 20 20 20 20  .  int iReg,    
1ac10 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73      /* Store res
1ac20 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 75  ults here */.  u
1ac30 38 20 70 35 20 20 20 20 20 20 20 20 20 20 20 20  8 p5            
1ac40 2f 2a 20 50 35 20 76 61 6c 75 65 20 66 6f 72 20  /* P5 value for 
1ac50 4f 50 5f 43 6f 6c 75 6d 6e 20 2b 20 46 4c 41 47  OP_Column + FLAG
1ac60 53 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  S */.){.  Vdbe *
1ac70 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1ac80 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
1ac90 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
1aca0 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  p;..  for(i=0, p
1acb0 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
1acc0 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
1acd0 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
1ace0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
1acf0 52 65 67 3e 30 20 26 26 20 70 2d 3e 69 54 61 62  Reg>0 && p->iTab
1ad00 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 2d  le==iTable && p-
1ad10 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d  >iColumn==iColum
1ad20 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6c 72  n ){.      p->lr
1ad30 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  u = pParse->iCac
1ad40 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73  heCnt++;.      s
1ad50 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1ad60 69 6e 52 65 67 69 73 74 65 72 28 70 50 61 72 73  inRegister(pPars
1ad70 65 2c 20 70 2d 3e 69 52 65 67 29 3b 0a 20 20 20  e, p->iReg);.   
1ad80 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 52 65     return p->iRe
1ad90 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20  g;.    }.  }  . 
1ada0 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
1adb0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  .  sqlite3ExprCo
1adc0 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62  deGetColumnOfTab
1add0 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 54 61 62  le(v, pTab, iTab
1ade0 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65  le, iColumn, iRe
1adf0 67 29 3b 0a 20 20 69 66 28 20 70 35 20 29 7b 0a  g);.  if( p5 ){.
1ae00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1ae10 68 61 6e 67 65 50 35 28 76 2c 20 70 35 29 3b 0a  hangeP5(v, p5);.
1ae20 20 20 7d 65 6c 73 65 7b 20 20 20 0a 20 20 20 20    }else{   .    
1ae30 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1ae40 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 54  Store(pParse, iT
1ae50 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69  able, iColumn, i
1ae60 52 65 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Reg);.  }.  retu
1ae70 72 6e 20 69 52 65 67 3b 0a 7d 0a 76 6f 69 64 20  rn iReg;.}.void 
1ae80 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1ae90 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 0a 20  etColumnToReg(. 
1aea0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1aeb0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
1aec0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
1aed0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61   context */.  Ta
1aee0 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f  ble *pTab,     /
1aef0 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * Description of
1af00 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72   the table we ar
1af10 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a  e reading from *
1af20 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c  /.  int iColumn,
1af30 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1af40 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d   the table colum
1af50 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  n */.  int iTabl
1af60 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  e,      /* The c
1af70 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
1af80 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  o the table */. 
1af90 20 69 6e 74 20 69 52 65 67 20 20 20 20 20 20 20   int iReg       
1afa0 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c    /* Store resul
1afb0 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
1afc0 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
1afd0 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
1afe0 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  n(pParse, pTab, 
1aff0 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 6c 65 2c  iColumn, iTable,
1b000 20 69 52 65 67 2c 20 30 29 3b 0a 20 20 69 66 28   iReg, 0);.  if(
1b010 20 72 31 21 3d 69 52 65 67 20 29 20 73 71 6c 69   r1!=iReg ) sqli
1b020 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50  te3VdbeAddOp2(pP
1b030 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
1b040 53 43 6f 70 79 2c 20 72 31 2c 20 69 52 65 67 29  SCopy, r1, iReg)
1b050 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ;.}.../*.** Clea
1b060 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63  r all column cac
1b070 68 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76  he entries..*/.v
1b080 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1b090 61 63 68 65 43 6c 65 61 72 28 50 61 72 73 65 20  acheClear(Parse 
1b0a0 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20  *pParse){.  int 
1b0b0 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
1b0c0 43 61 63 68 65 20 2a 70 3b 0a 0a 23 69 66 20 53  Cache *p;..#if S
1b0d0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66  QLITE_DEBUG.  if
1b0e0 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  ( pParse->db->fl
1b0f0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
1b100 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20  eAddopTrace ){. 
1b110 20 20 20 70 72 69 6e 74 66 28 22 43 4c 45 41 52     printf("CLEAR
1b120 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  \n");.  }.#endif
1b130 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
1b140 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
1b150 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
1b160 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
1b170 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67  .    if( p->iReg
1b180 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45   ){.      cacheE
1b190 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65  ntryClear(pParse
1b1a0 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , p);.    }.  }.
1b1b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20  }../*.** Record 
1b1c0 74 68 65 20 66 61 63 74 20 74 68 61 74 20 61 6e  the fact that an
1b1d0 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65   affinity change
1b1e0 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 6f 6e   has occurred on
1b1f0 20 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73   iCount.** regis
1b200 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 77 69  ters starting wi
1b210 74 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f  th iStart..*/.vo
1b220 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
1b230 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
1b240 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1b250 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74   int iStart, int
1b260 20 69 43 6f 75 6e 74 29 7b 0a 20 20 73 71 6c 69   iCount){.  sqli
1b270 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
1b280 76 65 28 70 50 61 72 73 65 2c 20 69 53 74 61 72  ve(pParse, iStar
1b290 74 2c 20 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f  t, iCount);.}../
1b2a0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1b2b0 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65  de to move conte
1b2c0 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72  nt from register
1b2d0 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b  s iFrom...iFrom+
1b2e0 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74  nReg-1.** over t
1b2f0 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d  o iTo..iTo+nReg-
1b300 31 2e 20 4b 65 65 70 20 74 68 65 20 63 6f 6c 75  1. Keep the colu
1b310 6d 6e 20 63 61 63 68 65 20 75 70 2d 74 6f 2d 64  mn cache up-to-d
1b320 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ate..*/.void sql
1b330 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
1b340 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1b350 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
1b360 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  To, int nReg){. 
1b370 20 61 73 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d   assert( iFrom>=
1b380 69 54 6f 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f  iTo+nReg || iFro
1b390 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20  m+nReg<=iTo );. 
1b3a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b3b0 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p3(pParse->pVdbe
1b3c0 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d  , OP_Move, iFrom
1b3d0 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 20 20  , iTo, nReg);.  
1b3e0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1b3f0 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69  Remove(pParse, i
1b400 46 72 6f 6d 2c 20 6e 52 65 67 29 3b 0a 7d 0a 0a  From, nReg);.}..
1b410 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1b420 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
1b430 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45  ined(SQLITE_COVE
1b440 52 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  RAGE_TEST)./*.**
1b450 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
1b460 61 6e 79 20 72 65 67 69 73 74 65 72 20 69 6e 20  any register in 
1b470 74 68 65 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e  the range iFrom.
1b480 2e 69 54 6f 20 28 69 6e 63 6c 75 73 69 76 65 29  .iTo (inclusive)
1b490 0a 2a 2a 20 69 73 20 75 73 65 64 20 61 73 20 70  .** is used as p
1b4a0 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  art of the colum
1b4b0 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54  n cache..**.** T
1b4c0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
1b4d0 73 65 64 20 77 69 74 68 69 6e 20 61 73 73 65 72  sed within asser
1b4e0 74 28 29 20 61 6e 64 20 74 65 73 74 63 61 73 65  t() and testcase
1b4f0 28 29 20 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a  () macros only.*
1b500 2a 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61  * and does not a
1b510 70 70 65 61 72 20 69 6e 20 61 20 6e 6f 72 6d 61  ppear in a norma
1b520 6c 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74  l build..*/.stat
1b530 69 63 20 69 6e 74 20 75 73 65 64 41 73 43 6f 6c  ic int usedAsCol
1b540 75 6d 6e 43 61 63 68 65 28 50 61 72 73 65 20 2a  umnCache(Parse *
1b550 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f  pParse, int iFro
1b560 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69  m, int iTo){.  i
1b570 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
1b580 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66  ColCache *p;.  f
1b590 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
1b5a0 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
1b5b0 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
1b5c0 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
1b5d0 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67   int r = p->iReg
1b5e0 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 46 72  ;.    if( r>=iFr
1b5f0 6f 6d 20 26 26 20 72 3c 3d 69 54 6f 20 29 20 72  om && r<=iTo ) r
1b600 65 74 75 72 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f  eturn 1;    /*NO
1b610 5f 54 45 53 54 2a 2f 0a 20 20 7d 0a 20 20 72 65  _TEST*/.  }.  re
1b620 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
1b630 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
1b640 20 7c 7c 20 53 51 4c 49 54 45 5f 43 4f 56 45 52   || SQLITE_COVER
1b650 41 47 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a  AGE_TEST */.../*
1b660 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 73 63  .** Convert a sc
1b670 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20  alar expression 
1b680 6e 6f 64 65 20 74 6f 20 61 20 54 4b 5f 52 45 47  node to a TK_REG
1b690 49 53 54 45 52 20 72 65 66 65 72 65 6e 63 69 6e  ISTER referencin
1b6a0 67 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 52  g.** register iR
1b6b0 65 67 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20  eg.  The caller 
1b6c0 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74  must ensure that
1b6d0 20 69 52 65 67 20 61 6c 72 65 61 64 79 20 63 6f   iReg already co
1b6e0 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 63 6f  ntains.** the co
1b6f0 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20  rrect value for 
1b700 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  the expression..
1b710 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
1b720 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 45 78  xprToRegister(Ex
1b730 70 72 20 2a 70 2c 20 69 6e 74 20 69 52 65 67 29  pr *p, int iReg)
1b740 7b 0a 20 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e  {.  p->op2 = p->
1b750 6f 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b  op;.  p->op = TK
1b760 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e  _REGISTER;.  p->
1b770 69 54 61 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20  iTable = iReg;. 
1b780 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72   ExprClearProper
1b790 74 79 28 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a  ty(p, EP_Skip);.
1b7a0 7d 0a 0a 2f 2a 0a 2a 2a 20 45 76 61 6c 75 61 74  }../*.** Evaluat
1b7b0 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
1b7c0 28 65 69 74 68 65 72 20 61 20 76 65 63 74 6f 72  (either a vector
1b7d0 20 6f 72 20 61 20 73 63 61 6c 61 72 20 65 78 70   or a scalar exp
1b7e0 72 65 73 73 69 6f 6e 29 20 61 6e 64 20 73 74 6f  ression) and sto
1b7f0 72 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  re.** the result
1b800 20 69 6e 20 63 6f 6e 74 69 6e 67 75 6f 75 73 20   in continguous 
1b810 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
1b820 65 72 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ers.  Return the
1b830 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
1b840 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
1b850 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  used to store th
1b860 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20  e result..**.** 
1b870 49 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  If the returned 
1b880 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20  result register 
1b890 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 73  is a temporary s
1b8a0 63 61 6c 61 72 2c 20 74 68 65 6e 20 61 6c 73 6f  calar, then also
1b8b0 20 77 72 69 74 65 0a 2a 2a 20 74 68 61 74 20 72   write.** that r
1b8c0 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 69  egister number i
1b8d0 6e 74 6f 20 2a 70 69 46 72 65 65 61 62 6c 65 2e  nto *piFreeable.
1b8e0 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 65    If the returne
1b8f0 64 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  d result registe
1b900 72 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 74 65  r.** is not a te
1b910 6d 70 6f 72 61 72 79 20 6f 72 20 69 66 20 74 68  mporary or if th
1b920 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1b930 61 20 76 65 63 74 6f 72 20 73 65 74 20 2a 70 69  a vector set *pi
1b940 46 72 65 65 61 62 6c 65 0a 2a 2a 20 74 6f 20 30  Freeable.** to 0
1b950 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b960 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 50  exprCodeVector(P
1b970 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
1b980 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 69 46 72  pr *p, int *piFr
1b990 65 65 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69  eeable){.  int i
1b9a0 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 6e 52  Result;.  int nR
1b9b0 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 45  esult = sqlite3E
1b9c0 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 29  xprVectorSize(p)
1b9d0 3b 0a 20 20 69 66 28 20 6e 52 65 73 75 6c 74 3d  ;.  if( nResult=
1b9e0 3d 31 20 29 7b 0a 20 20 20 20 69 52 65 73 75 6c  =1 ){.    iResul
1b9f0 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  t = sqlite3ExprC
1ba00 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1ba10 70 2c 20 70 69 46 72 65 65 61 62 6c 65 29 3b 0a  p, piFreeable);.
1ba20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 69    }else{.    *pi
1ba30 46 72 65 65 61 62 6c 65 20 3d 20 30 3b 0a 20 20  Freeable = 0;.  
1ba40 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
1ba50 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20  SELECT ){.      
1ba60 69 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65  iResult = sqlite
1ba70 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
1ba80 50 61 72 73 65 2c 20 70 2c 20 30 2c 20 30 29 3b  Parse, p, 0, 0);
1ba90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1baa0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
1bab0 52 65 73 75 6c 74 20 3d 20 70 50 61 72 73 65 2d  Result = pParse-
1bac0 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 70  >nMem+1;.      p
1bad0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
1bae0 52 65 73 75 6c 74 3b 0a 20 20 20 20 20 20 66 6f  Result;.      fo
1baf0 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74  r(i=0; i<nResult
1bb00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1bb10 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1bb20 70 50 61 72 73 65 2c 20 70 2d 3e 78 2e 70 4c 69  pParse, p->x.pLi
1bb30 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
1bb40 69 2b 69 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  i+iResult);.    
1bb50 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1bb60 72 65 74 75 72 6e 20 69 52 65 73 75 6c 74 3b 0a  return iResult;.
1bb70 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
1bb80 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65  te code into the
1bb90 20 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f   current Vdbe to
1bba0 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69   evaluate the gi
1bbb0 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
1bbc0 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73  n.  Attempt to s
1bbd0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
1bbe0 20 69 6e 20 72 65 67 69 73 74 65 72 20 22 74 61   in register "ta
1bbf0 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e  rget"..** Return
1bc00 20 74 68 65 20 72 65 67 69 73 74 65 72 20 77 68   the register wh
1bc10 65 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  ere results are 
1bc20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69  stored..**.** Wi
1bc30 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  th this routine,
1bc40 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61   there is no gua
1bc50 72 61 6e 74 65 65 20 74 68 61 74 20 72 65 73 75  rantee that resu
1bc60 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73  lts will.** be s
1bc70 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e  tored in target.
1bc80 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67    The result mig
1bc90 68 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ht be stored in 
1bca0 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65  some other.** re
1bcb0 67 69 73 74 65 72 20 69 66 20 69 74 20 69 73 20  gister if it is 
1bcc0 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f  convenient to do
1bcd0 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e   so.  The callin
1bce0 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  g function.** mu
1bcf0 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74  st check the ret
1bd00 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76  urn code and mov
1bd10 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f  e the results to
1bd20 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20   the desired.** 
1bd30 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74  register..*/.int
1bd40 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1bd50 54 61 72 67 65 74 28 50 61 72 73 65 20 2a 70 50  Target(Parse *pP
1bd60 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1bd70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
1bd80 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1bd90 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54  se->pVdbe;  /* T
1bda0 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73  he VM under cons
1bdb0 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
1bdc0 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
1bdd0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
1bde0 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65  pcode being code
1bdf0 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67  d */.  int inReg
1be00 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20 20 20   = target;      
1be10 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72   /* Results stor
1be20 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ed in register i
1be30 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65  nReg */.  int re
1be40 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20  gFree1 = 0;     
1be50 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
1be60 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d  ro free this tem
1be70 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
1be80 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  */.  int regFree
1be90 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  2 = 0;         /
1bea0 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72  * If non-zero fr
1beb0 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  ee this temporar
1bec0 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  y register */.  
1bed0 69 6e 74 20 72 31 2c 20 72 32 3b 20 20 20 20 20  int r1, r2;     
1bee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 72            /* Var
1bef0 69 6f 75 73 20 72 65 67 69 73 74 65 72 20 6e 75  ious register nu
1bf00 6d 62 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74  mbers */.  sqlit
1bf10 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1bf20 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61  >db; /* The data
1bf30 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1bf40 2a 2f 0a 20 20 45 78 70 72 20 74 65 6d 70 58 3b  */.  Expr tempX;
1bf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bf60 2a 20 54 65 6d 70 6f 72 61 72 79 20 65 78 70 72  * Temporary expr
1bf70 65 73 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f 0a 20  ession node */. 
1bf80 20 69 6e 74 20 70 35 20 3d 20 30 3b 0a 0a 20 20   int p5 = 0;..  
1bf90 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
1bfa0 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72   && target<=pPar
1bfb0 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66  se->nMem );.  if
1bfc0 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ( v==0 ){.    as
1bfd0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
1bfe0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1bff0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1c000 20 20 7d 0a 0a 20 20 69 66 28 20 70 45 78 70 72    }..  if( pExpr
1c010 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20  ==0 ){.    op = 
1c020 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65  TK_NULL;.  }else
1c030 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72  {.    op = pExpr
1c040 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74  ->op;.  }.  swit
1c050 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
1c060 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
1c070 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66  : {.      AggInf
1c080 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45  o *pAggInfo = pE
1c090 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20  xpr->pAggInfo;. 
1c0a0 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
1c0b0 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20  nfo_col *pCol = 
1c0c0 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  &pAggInfo->aCol[
1c0d0 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20  pExpr->iAgg];.  
1c0e0 20 20 20 20 69 66 28 20 21 70 41 67 67 49 6e 66      if( !pAggInf
1c0f0 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b  o->directMode ){
1c100 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1c110 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b   pCol->iMem>0 );
1c120 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
1c130 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20   pCol->iMem;.   
1c140 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c150 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67    }else if( pAgg
1c160 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67  Info->useSorting
1c170 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Idx ){.        s
1c180 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1c190 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70  (v, OP_Column, p
1c1a0 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67  AggInfo->sorting
1c1b0 49 64 78 50 54 61 62 2c 0a 20 20 20 20 20 20 20  IdxPTab,.       
1c1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1d0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
1c1e0 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67  rterColumn, targ
1c1f0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  et);.        bre
1c200 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1c210 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    /* Otherwise, 
1c220 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74  fall thru into t
1c230 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73  he TK_COLUMN cas
1c240 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63  e */.    }.    c
1c250 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
1c260 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61 62 20  .      int iTab 
1c270 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  = pExpr->iTable;
1c280 0a 20 20 20 20 20 20 69 66 28 20 69 54 61 62 3c  .      if( iTab<
1c290 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
1c2a0 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e   pParse->ckBase>
1c2b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
1c2c0 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 43 48 45  * Generating CHE
1c2d0 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  CK constraints o
1c2e0 72 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f  r inserting into
1c2f0 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 2a   partial index *
1c300 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 52 65  /.          inRe
1c310 67 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  g = pExpr->iColu
1c320 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b 42  mn + pParse->ckB
1c330 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ase;.          b
1c340 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
1c350 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
1c360 2a 20 43 6f 64 69 6e 67 20 61 6e 20 65 78 70 72  * Coding an expr
1c370 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 70  ession that is p
1c380 61 72 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  art of an index 
1c390 77 68 65 72 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  where column nam
1c3a0 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
1c3b0 69 6e 20 74 68 65 20 69 6e 64 65 78 20 72 65 66  in the index ref
1c3c0 65 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  er to the table 
1c3d0 74 6f 20 77 68 69 63 68 20 74 68 65 20 69 6e 64  to which the ind
1c3e0 65 78 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20  ex belongs */.  
1c3f0 20 20 20 20 20 20 20 20 69 54 61 62 20 3d 20 70          iTab = p
1c400 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 3b  Parse->iSelfTab;
1c410 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c420 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   }.      inReg =
1c430 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c440 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  GetColumn(pParse
1c450 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20  , pExpr->pTab,. 
1c460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1c480 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54  xpr->iColumn, iT
1c490 61 62 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20  ab, target,.    
1c4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4b0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1c4c0 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 20 20 62 72  ->op2);.      br
1c4d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1c4e0 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
1c4f0 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65  {.      codeInte
1c500 67 65 72 28 70 50 61 72 73 65 2c 20 70 45 78 70  ger(pParse, pExp
1c510 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 0, target);. 
1c520 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c530 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1c540 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
1c550 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b  OINT.    case TK
1c560 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
1c570 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1c580 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1c590 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1c5a0 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
1c5b0 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1c5c0 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  n, 0, target);. 
1c5d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c5e0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
1c5f0 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20  e TK_STRING: {. 
1c600 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1c610 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1c620 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1c630 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) );.      sqlit
1c640 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67  e3VdbeLoadString
1c650 28 76 2c 20 74 61 72 67 65 74 2c 20 70 45 78 70  (v, target, pExp
1c660 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
1c670 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c680 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c  .    case TK_NUL
1c690 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
1c6a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1c6b0 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67  OP_Null, 0, targ
1c6c0 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  et);.      break
1c6d0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1c6e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42  SQLITE_OMIT_BLOB
1c6f0 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73  _LITERAL.    cas
1c700 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_BLOB: {.   
1c710 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
1c720 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
1c730 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62       char *zBlob
1c740 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1c750 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1c760 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1c770 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73  lue) );.      as
1c780 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
1c790 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c  Token[0]=='x' ||
1c7a0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1c7b0 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20  [0]=='X' );.    
1c7c0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1c7d0 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c  >u.zToken[1]=='\
1c7e0 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20  '' );.      z = 
1c7f0 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  &pExpr->u.zToken
1c800 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73  [2];.      n = s
1c810 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1c820 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73  ) - 1;.      ass
1c830 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20  ert( z[n]=='\'' 
1c840 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d  );.      zBlob =
1c850 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f   sqlite3HexToBlo
1c860 62 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  b(sqlite3VdbeDb(
1c870 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  v), z, n);.     
1c880 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c890 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e  p4(v, OP_Blob, n
1c8a0 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a  /2, target, 0, z
1c8b0 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43  Blob, P4_DYNAMIC
1c8c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1c8d0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1c8e0 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
1c8f0 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  E: {.      asser
1c900 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1c910 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1c920 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1c930 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1c940 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20  u.zToken!=0 );. 
1c950 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
1c960 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21  pr->u.zToken[0]!
1c970 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1c980 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1c990 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45   OP_Variable, pE
1c9a0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61  xpr->iColumn, ta
1c9b0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28  rget);.      if(
1c9c0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1c9d0 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  [1]!=0 ){.      
1c9e0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1c9f0 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f  >u.zToken[0]=='?
1ca00 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ' .             
1ca10 7c 7c 20 73 74 72 63 6d 70 28 70 45 78 70 72 2d  || strcmp(pExpr-
1ca20 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 50 61 72 73  >u.zToken, pPars
1ca30 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72 2d 3e  e->azVar[pExpr->
1ca40 69 43 6f 6c 75 6d 6e 2d 31 5d 29 3d 3d 30 20 29  iColumn-1])==0 )
1ca50 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1ca60 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
1ca70 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56   -1, pParse->azV
1ca80 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ar[pExpr->iColum
1ca90 6e 2d 31 5d 2c 20 50 34 5f 53 54 41 54 49 43 29  n-1], P4_STATIC)
1caa0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1cab0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1cac0 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
1cad0 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67  R: {.      inReg
1cae0 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
1caf0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1cb00 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1cb10 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20  ITE_OMIT_CAST.  
1cb20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20    case TK_CAST: 
1cb30 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65  {.      /* Expre
1cb40 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f  ssions of the fo
1cb50 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74  rm:   CAST(pLeft
1cb60 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20   AS token) */.  
1cb70 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
1cb80 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
1cb90 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
1cba0 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b  >pLeft, target);
1cbb0 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67  .      if( inReg
1cbc0 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20  !=target ){.    
1cbd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1cbe0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
1cbf0 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74  y, inReg, target
1cc00 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  );.        inReg
1cc10 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20   = target;.     
1cc20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1cc30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1cc40 5f 43 61 73 74 2c 20 74 61 72 67 65 74 2c 0a 20  _Cast, target,. 
1cc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 66         sqlite3Af
1cc70 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70 72  finityType(pExpr
1cc80 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 29 3b  ->u.zToken, 0));
1cc90 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1cca0 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63   usedAsColumnCac
1ccb0 68 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67  he(pParse, inReg
1ccc0 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20 20 20 20  , inReg) );.    
1ccd0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1cce0 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
1ccf0 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20  (pParse, inReg, 
1cd00 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
1cd10 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
1cd20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53   SQLITE_OMIT_CAS
1cd30 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  T */.    case TK
1cd40 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
1cd50 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 6f 70  _ISNOT:.      op
1cd60 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f   = (op==TK_IS) ?
1cd70 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a   TK_EQ : TK_NE;.
1cd80 20 20 20 20 20 20 70 35 20 3d 20 53 51 4c 49 54        p5 = SQLIT
1cd90 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20  E_NULLEQ;.      
1cda0 2f 2a 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68 20  /* fall-through 
1cdb0 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  */.    case TK_L
1cdc0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
1cdd0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
1cde0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
1cdf0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
1ce00 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
1ce10 51 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20  Q: {.      Expr 
1ce20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
1ce30 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 69 66 28  pLeft;.      if(
1ce40 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65   sqlite3ExprIsVe
1ce50 63 74 6f 72 28 70 4c 65 66 74 29 20 29 7b 0a 20  ctor(pLeft) ){. 
1ce60 20 20 20 20 20 20 20 63 6f 64 65 56 65 63 74 6f         codeVecto
1ce70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  rCompare(pParse,
1ce80 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20   pExpr, target, 
1ce90 6f 70 2c 20 70 35 29 3b 0a 20 20 20 20 20 20 7d  op, p5);.      }
1cea0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31  else{.        r1
1ceb0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1cec0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1ced0 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1cee0 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73  ;.        r2 = s
1cef0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1cf00 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1cf10 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
1cf20 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  ee2);.        co
1cf30 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
1cf40 2c 20 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  , pLeft, pExpr->
1cf50 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
1cf60 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
1cf70 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54  inReg, SQLITE_ST
1cf80 4f 52 45 50 32 20 7c 20 70 35 29 3b 0a 20 20 20  OREP2 | p5);.   
1cf90 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
1cfa0 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63  T==OP_Lt); testc
1cfb0 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20  ase(op==OP_Lt); 
1cfc0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1cfd0 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20  ,op==OP_Lt);.   
1cfe0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
1cff0 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63  E==OP_Le); testc
1d000 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20  ase(op==OP_Le); 
1d010 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1d020 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20  ,op==OP_Le);.   
1d030 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
1d040 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63  T==OP_Gt); testc
1d050 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20  ase(op==OP_Gt); 
1d060 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1d070 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20  ,op==OP_Gt);.   
1d080 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
1d090 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63  E==OP_Ge); testc
1d0a0 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20  ase(op==OP_Ge); 
1d0b0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1d0c0 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20  ,op==OP_Ge);.   
1d0d0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45       assert(TK_E
1d0e0 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63  Q==OP_Eq); testc
1d0f0 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20  ase(op==OP_Eq); 
1d100 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1d110 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20  ,op==OP_Eq);.   
1d120 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e       assert(TK_N
1d130 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63  E==OP_Ne); testc
1d140 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20  ase(op==OP_Ne); 
1d150 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1d160 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20  ,op==OP_Ne);.   
1d170 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1d180 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1d190 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1d1a0 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
1d1b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
1d1c0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1d1d0 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63  se TK_AND:.    c
1d1e0 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63  ase TK_OR:.    c
1d1f0 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20  ase TK_PLUS:.   
1d200 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20   case TK_STAR:. 
1d210 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53     case TK_MINUS
1d220 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  :.    case TK_RE
1d230 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  M:.    case TK_B
1d240 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20  ITAND:.    case 
1d250 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61  TK_BITOR:.    ca
1d260 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20  se TK_SLASH:.   
1d270 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a   case TK_LSHIFT:
1d280 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48  .    case TK_RSH
1d290 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54  IFT: .    case T
1d2a0 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20  K_CONCAT: {.    
1d2b0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44    assert( TK_AND
1d2c0 3d 3d 4f 50 5f 41 6e 64 20 29 3b 20 20 20 20 20  ==OP_And );     
1d2d0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1d2e0 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20   op==TK_AND );. 
1d2f0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1d300 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20 20 20  OR==OP_Or );    
1d310 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
1d320 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b  se( op==TK_OR );
1d330 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1d340 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29  K_PLUS==OP_Add )
1d350 3b 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;           test
1d360 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55  case( op==TK_PLU
1d370 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  S );.      asser
1d380 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f  t( TK_MINUS==OP_
1d390 53 75 62 74 72 61 63 74 20 29 3b 20 20 20 20 20  Subtract );     
1d3a0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1d3b0 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20 20 20  _MINUS );.      
1d3c0 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d  assert( TK_REM==
1d3d0 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 20  OP_Remainder ); 
1d3e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1d3f0 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20  p==TK_REM );.   
1d400 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
1d410 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20  TAND==OP_BitAnd 
1d420 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65  );      testcase
1d430 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20  ( op==TK_BITAND 
1d440 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1d450 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69   TK_BITOR==OP_Bi
1d460 74 4f 72 20 29 3b 20 20 20 20 20 20 20 20 74 65  tOr );        te
1d470 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42  stcase( op==TK_B
1d480 49 54 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73  ITOR );.      as
1d490 73 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d  sert( TK_SLASH==
1d4a0 4f 50 5f 44 69 76 69 64 65 20 29 3b 20 20 20 20  OP_Divide );    
1d4b0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1d4c0 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20  =TK_SLASH );.   
1d4d0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53     assert( TK_LS
1d4e0 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65  HIFT==OP_ShiftLe
1d4f0 66 74 20 29 3b 20 20 20 74 65 73 74 63 61 73 65  ft );   testcase
1d500 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20  ( op==TK_LSHIFT 
1d510 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1d520 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53   TK_RSHIFT==OP_S
1d530 68 69 66 74 52 69 67 68 74 20 29 3b 20 20 74 65  hiftRight );  te
1d540 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52  stcase( op==TK_R
1d550 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61  SHIFT );.      a
1d560 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54  ssert( TK_CONCAT
1d570 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 20 20  ==OP_Concat );  
1d580 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1d590 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20  ==TK_CONCAT );. 
1d5a0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1d5b0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1d5c0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1d5d0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1d5e0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
1d5f0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1d600 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1d610 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
1d620 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1d630 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c  dbeAddOp3(v, op,
1d640 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29   r2, r1, target)
1d650 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1d660 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1d670 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d680 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
1d690 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d6a0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
1d6b0 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45  MINUS: {.      E
1d6c0 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
1d6d0 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
1d6e0 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29   assert( pLeft )
1d6f0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66  ;.      if( pLef
1d700 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45  t->op==TK_INTEGE
1d710 52 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  R ){.        cod
1d720 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c  eInteger(pParse,
1d730 20 70 4c 65 66 74 2c 20 31 2c 20 74 61 72 67 65   pLeft, 1, targe
1d740 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t);.#ifndef SQLI
1d750 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
1d760 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65 6c  _POINT.      }el
1d770 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70  se if( pLeft->op
1d780 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20  ==TK_FLOAT ){.  
1d790 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1d7a0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1d7b0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
1d7c0 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  e) );.        co
1d7d0 64 65 52 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d  deReal(v, pLeft-
1d7e0 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61  >u.zToken, 1, ta
1d7f0 72 67 65 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rget);.#endif.  
1d800 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d810 20 20 20 74 65 6d 70 58 2e 6f 70 20 3d 20 54 4b     tempX.op = TK
1d820 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20  _INTEGER;.      
1d830 20 20 74 65 6d 70 58 2e 66 6c 61 67 73 20 3d 20    tempX.flags = 
1d840 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 54  EP_IntValue|EP_T
1d850 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 20 20  okenOnly;.      
1d860 20 20 74 65 6d 70 58 2e 75 2e 69 56 61 6c 75 65    tempX.u.iValue
1d870 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 31   = 0;.        r1
1d880 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1d890 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26  deTemp(pParse, &
1d8a0 74 65 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31  tempX, &regFree1
1d8b0 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20  );.        r2 = 
1d8c0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1d8d0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1d8e0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
1d8f0 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ee2);.        sq
1d900 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1d910 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20  v, OP_Subtract, 
1d920 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b  r2, r1, target);
1d930 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1d940 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
1d950 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d960 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a  inReg = target;.
1d970 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d980 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
1d990 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20  ITNOT:.    case 
1d9a0 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
1d9b0 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f  assert( TK_BITNO
1d9c0 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 20  T==OP_BitNot ); 
1d9d0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1d9e0 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20  TK_BITNOT );.   
1d9f0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
1da00 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20 20 20  T==OP_Not );    
1da10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1da20 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20  p==TK_NOT );.   
1da30 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1da40 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1da50 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1da60 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1da70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1da80 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1da90 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65     inReg = targe
1daa0 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
1dab0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
1dac0 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20  , r1, inReg);.  
1dad0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1dae0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
1daf0 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
1db00 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
1db10 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
1db20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e    assert( TK_ISN
1db30 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29  ULL==OP_IsNull )
1db40 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  ;   testcase( op
1db50 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==TK_ISNULL );. 
1db60 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1db70 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e  NOTNULL==OP_NotN
1db80 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28  ull ); testcase(
1db90 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
1dba0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1dbb0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1dbc0 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72  _Integer, 1, tar
1dbd0 67 65 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  get);.      r1 =
1dbe0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1dbf0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1dc00 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1dc10 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73  ree1);.      tes
1dc20 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1dc30 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72  =0 );.      addr
1dc40 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1dc50 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b  dOp1(v, op, r1);
1dc60 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
1dc70 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
1dc80 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56  ISNULL);.      V
1dc90 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1dca0 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29   op==TK_NOTNULL)
1dcb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1dcc0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1dcd0 49 6e 74 65 67 65 72 2c 20 30 2c 20 74 61 72 67  Integer, 0, targ
1dce0 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
1dcf0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
1dd00 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 62  , addr);.      b
1dd10 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1dd20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
1dd30 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67  TION: {.      Ag
1dd40 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70  gInfo *pInfo = p
1dd50 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a  Expr->pAggInfo;.
1dd60 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d        if( pInfo=
1dd70 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
1dd80 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1dd90 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1dda0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1ddb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1ddc0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d  orMsg(pParse, "m
1ddd0 69 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61  isuse of aggrega
1dde0 74 65 3a 20 25 73 28 29 22 2c 20 70 45 78 70 72  te: %s()", pExpr
1ddf0 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
1de00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1de10 20 20 69 6e 52 65 67 20 3d 20 70 49 6e 66 6f 2d    inReg = pInfo-
1de20 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41  >aFunc[pExpr->iA
1de30 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20  gg].iMem;.      
1de40 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
1de50 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1de60 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
1de70 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 61     ExprList *pFa
1de80 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  rg;       /* Lis
1de90 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  t of function ar
1dea0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
1deb0 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20 20 20   int nFarg;     
1dec0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1ded0 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  r of function ar
1dee0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
1def0 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20   FuncDef *pDef; 
1df00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
1df10 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69  unction definiti
1df20 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  on object */.   
1df30 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1df40 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Id;       /* The
1df50 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
1df60 2f 0a 20 20 20 20 20 20 75 33 32 20 63 6f 6e 73  /.      u32 cons
1df70 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 2f  tMask = 0;     /
1df80 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74 69  * Mask of functi
1df90 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61  on arguments tha
1dfa0 74 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 20 2a  t are constant *
1dfb0 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  /.      int i;  
1dfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1dfd0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
1dfe0 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d  /.      u8 enc =
1dff0 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20 20 2f   ENC(db);      /
1e000 2a 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f 64  * The text encod
1e010 69 6e 67 20 75 73 65 64 20 62 79 20 74 68 69 73  ing used by this
1e020 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
1e030 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
1e040 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20 63  l = 0;    /* A c
1e050 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1e060 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65  e */..      asse
1e070 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1e080 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
1e090 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
1e0a0 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
1e0b0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1e0c0 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
1e0d0 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 30         pFarg = 0
1e0e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1e0f0 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 70         pFarg = p
1e100 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
1e110 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 61       }.      nFa
1e120 72 67 20 3d 20 70 46 61 72 67 20 3f 20 70 46 61  rg = pFarg ? pFa
1e130 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20  rg->nExpr : 0;. 
1e140 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1e150 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1e160 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1e170 29 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d  ) );.      zId =
1e180 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1e190 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73  ;.      pDef = s
1e1a0 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
1e1b0 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 46 61 72  on(db, zId, nFar
1e1c0 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 23 69 66 64  g, enc, 0);.#ifd
1e1d0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1e1e0 5f 55 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e  _UNKNOWN_SQL_FUN
1e1f0 43 54 49 4f 4e 0a 20 20 20 20 20 20 69 66 28 20  CTION.      if( 
1e200 70 44 65 66 3d 3d 30 20 26 26 20 70 50 61 72 73  pDef==0 && pPars
1e210 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
1e220 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
1e230 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
1e240 28 64 62 2c 20 22 75 6e 6b 6e 6f 77 6e 22 2c 20  (db, "unknown", 
1e250 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a  nFarg, enc, 0);.
1e260 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1e270 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30       if( pDef==0
1e280 20 7c 7c 20 70 44 65 66 2d 3e 78 46 69 6e 61 6c   || pDef->xFinal
1e290 69 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize!=0 ){.      
1e2a0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1e2b0 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f  g(pParse, "unkno
1e2c0 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73 28  wn function: %s(
1e2d0 29 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20  )", zId);.      
1e2e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1e2f0 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d  ..      /* Attem
1e300 70 74 20 61 20 64 69 72 65 63 74 20 69 6d 70 6c  pt a direct impl
1e310 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
1e320 65 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c 45  e built-in COALE
1e330 53 43 45 28 29 20 61 6e 64 0a 20 20 20 20 20 20  SCE() and.      
1e340 2a 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63  ** IFNULL() func
1e350 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 61 76 6f  tions.  This avo
1e360 69 64 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20  ids unnecessary 
1e370 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 0a 20 20  evaluation of.  
1e380 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73      ** arguments
1e390 20 70 61 73 74 20 74 68 65 20 66 69 72 73 74 20   past the first 
1e3a0 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e  non-NULL argumen
1e3b0 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
1e3c0 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63    if( pDef->func
1e3d0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
1e3e0 55 4e 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a  UNC_COALESCE ){.
1e3f0 20 20 20 20 20 20 20 20 69 6e 74 20 65 6e 64 43          int endC
1e400 6f 61 6c 65 73 63 65 20 3d 20 73 71 6c 69 74 65  oalesce = sqlite
1e410 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1e420 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1e430 74 28 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20  t( nFarg>=2 );. 
1e440 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1e450 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1e460 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
1e470 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1e480 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46     for(i=1; i<nF
1e490 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  arg; i++){.     
1e4a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e4b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp2(v, OP_Not
1e4c0 4e 75 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e  Null, target, en
1e4d0 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20  dCoalesce);.    
1e4e0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1e4f0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
1e500 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1e510 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20  eRemove(pParse, 
1e520 74 61 72 67 65 74 2c 20 31 29 3b 0a 20 20 20 20  target, 1);.    
1e530 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1e540 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
1e550 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
1e560 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1e570 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69  arse, pFarg->a[i
1e580 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
1e590 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1e5a0 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
1e5b0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
1e5c0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
1e5d0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1e5e0 65 6c 28 76 2c 20 65 6e 64 43 6f 61 6c 65 73 63  el(v, endCoalesc
1e5f0 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  e);.        brea
1e600 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
1e610 20 20 2f 2a 20 54 68 65 20 55 4e 4c 49 4b 45 4c    /* The UNLIKEL
1e620 59 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  Y() function is 
1e630 61 20 6e 6f 2d 6f 70 2e 20 20 54 68 65 20 72 65  a no-op.  The re
1e640 73 75 6c 74 20 69 73 20 74 68 65 20 76 61 6c 75  sult is the valu
1e650 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  e.      ** of th
1e660 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1e670 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1e680 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46   if( pDef->funcF
1e690 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
1e6a0 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20  NC_UNLIKELY ){. 
1e6b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
1e6c0 46 61 72 67 3e 3d 31 20 29 3b 0a 20 20 20 20 20  Farg>=1 );.     
1e6d0 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
1e6e0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
1e6f0 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
1e700 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  a[0].pExpr, targ
1e710 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  et);.        bre
1e720 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
1e730 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46     for(i=0; i<nF
1e740 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  arg; i++){.     
1e750 20 20 20 69 66 28 20 69 3c 33 32 20 26 26 20 73     if( i<32 && s
1e760 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
1e770 74 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d  tant(pFarg->a[i]
1e780 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
1e790 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
1e7a0 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20  ==31 );.        
1e7b0 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d    constMask |= M
1e7c0 41 53 4b 42 49 54 33 32 28 69 29 3b 0a 20 20 20  ASKBIT32(i);.   
1e7d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1e7e0 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c  f( (pDef->funcFl
1e7f0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
1e800 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26  C_NEEDCOLL)!=0 &
1e810 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  & !pColl ){.    
1e820 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
1e830 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1e840 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
1e850 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
1e860 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1e870 20 20 20 20 20 69 66 28 20 70 46 61 72 67 20 29       if( pFarg )
1e880 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  {.        if( co
1e890 6e 73 74 4d 61 73 6b 20 29 7b 0a 20 20 20 20 20  nstMask ){.     
1e8a0 20 20 20 20 20 72 31 20 3d 20 70 50 61 72 73 65       r1 = pParse
1e8b0 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20  ->nMem+1;.      
1e8c0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
1e8d0 20 2b 3d 20 6e 46 61 72 67 3b 0a 20 20 20 20 20   += nFarg;.     
1e8e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e8f0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1e900 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
1e910 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20  rse, nFarg);.   
1e920 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1e930 2f 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28 29 20  /* For length() 
1e940 61 6e 64 20 74 79 70 65 6f 66 28 29 20 66 75 6e  and typeof() fun
1e950 63 74 69 6f 6e 73 20 77 69 74 68 20 61 20 63 6f  ctions with a co
1e960 6c 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a 20  lumn argument,. 
1e970 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68         ** set th
1e980 65 20 50 35 20 70 61 72 61 6d 65 74 65 72 20 74  e P5 parameter t
1e990 6f 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20  o the OP_Column 
1e9a0 6f 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41 47  opcode to OPFLAG
1e9b0 5f 4c 45 4e 47 54 48 41 52 47 0a 20 20 20 20 20  _LENGTHARG.     
1e9c0 20 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47 5f     ** or OPFLAG_
1e9d0 54 59 50 45 4f 46 41 52 47 20 72 65 73 70 65 63  TYPEOFARG respec
1e9e0 74 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69 64  tively, to avoid
1e9f0 20 75 6e 6e 65 63 65 73 73 61 72 79 20 64 61 74   unnecessary dat
1ea00 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 61  a.        ** loa
1ea10 64 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ding..        */
1ea20 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44  .        if( (pD
1ea30 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
1ea40 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e  (SQLITE_FUNC_LEN
1ea50 47 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f  GTH|SQLITE_FUNC_
1ea60 54 59 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a 20  TYPEOF))!=0 ){. 
1ea70 20 20 20 20 20 20 20 20 20 75 38 20 65 78 70 72           u8 expr
1ea80 4f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  Op;.          as
1ea90 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29  sert( nFarg==1 )
1eaa0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
1eab0 72 74 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  rt( pFarg->a[0].
1eac0 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  pExpr!=0 );.    
1ead0 20 20 20 20 20 20 65 78 70 72 4f 70 20 3d 20 70        exprOp = p
1eae0 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
1eaf0 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20  ->op;.          
1eb00 69 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 43  if( exprOp==TK_C
1eb10 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70 3d  OLUMN || exprOp=
1eb20 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
1eb30 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
1eb40 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e  sert( SQLITE_FUN
1eb50 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41 47  C_LENGTH==OPFLAG
1eb60 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20  _LENGTHARG );.  
1eb70 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1eb80 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59  ( SQLITE_FUNC_TY
1eb90 50 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59 50  PEOF==OPFLAG_TYP
1eba0 45 4f 46 41 52 47 20 29 3b 0a 20 20 20 20 20 20  EOFARG );.      
1ebb0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ebc0 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
1ebd0 26 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41  & OPFLAG_LENGTHA
1ebe0 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  RG );.          
1ebf0 20 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45    pFarg->a[0].pE
1ec00 78 70 72 2d 3e 6f 70 32 20 3d 20 0a 20 20 20 20  xpr->op2 = .    
1ec10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44                pD
1ec20 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
1ec30 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52  (OPFLAG_LENGTHAR
1ec40 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41  G|OPFLAG_TYPEOFA
1ec50 52 47 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  RG);.          }
1ec60 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1ec70 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1ec80 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
1ec90 3b 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20  ;     /* Ticket 
1eca0 32 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a  2ea2425d34be */.
1ecb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1ecc0 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
1ecd0 70 50 61 72 73 65 2c 20 70 46 61 72 67 2c 20 72  pParse, pFarg, r
1ece0 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  1, 0,.          
1ecf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed00 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45        SQLITE_ECE
1ed10 4c 5f 44 55 50 7c 53 51 4c 49 54 45 5f 45 43 45  L_DUP|SQLITE_ECE
1ed20 4c 5f 46 41 43 54 4f 52 29 3b 0a 20 20 20 20 20  L_FACTOR);.     
1ed30 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1ed40 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 20  chePop(pParse); 
1ed50 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32       /* Ticket 2
1ed60 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20  ea2425d34be */. 
1ed70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1ed80 20 20 20 20 72 31 20 3d 20 30 3b 0a 20 20 20 20      r1 = 0;.    
1ed90 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1eda0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1edb0 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f  ABLE.      /* Po
1edc0 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20  ssibly overload 
1edd0 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20  the function if 
1ede0 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
1edf0 6e 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  nt is.      ** a
1ee00 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63   virtual table c
1ee10 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a  olumn..      **.
1ee20 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66        ** For inf
1ee30 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49  ix functions (LI
1ee40 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50  KE, GLOB, REGEXP
1ee50 2c 20 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65  , and MATCH) use
1ee60 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65   the.      ** se
1ee70 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e  cond argument, n
1ee80 6f 74 20 74 68 65 20 66 69 72 73 74 2c 20 61 73  ot the first, as
1ee90 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   the argument to
1eea0 20 74 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a   test to.      *
1eeb0 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 61  * see if it is a
1eec0 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72   column in a vir
1eed0 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69  tual table.  Thi
1eee0 73 20 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73  s is done becaus
1eef0 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c  e.      ** the l
1ef00 65 66 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69  eft operand of i
1ef10 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28  nfix functions (
1ef20 74 68 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77  the operand we w
1ef30 61 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ant to.      ** 
1ef40 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64  control overload
1ef50 69 6e 67 29 20 65 6e 64 73 20 75 70 20 61 73 20  ing) ends up as 
1ef60 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1ef70 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20  ent to the.     
1ef80 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54   ** function.  T
1ef90 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41  he expression "A
1efa0 20 67 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69   glob B" is equi
1efb0 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20  valent to .     
1efc0 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20   ** "glob(B,A). 
1efd0 20 57 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20   We want to use 
1efe0 74 68 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62  the A in "A glob
1eff0 20 42 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20   B" to test.    
1f000 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f    ** for functio
1f010 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20  n overloading.  
1f020 42 75 74 20 77 65 20 75 73 65 20 74 68 65 20 42  But we use the B
1f030 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42   term in "glob(B
1f040 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ,A)"..      */. 
1f050 20 20 20 20 20 69 66 28 20 6e 46 61 72 67 3e 3d       if( nFarg>=
1f060 32 20 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61  2 && (pExpr->fla
1f070 67 73 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e  gs & EP_InfixFun
1f080 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  c) ){.        pD
1f090 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  ef = sqlite3Vtab
1f0a0 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e  OverloadFunction
1f0b0 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67  (db, pDef, nFarg
1f0c0 2c 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45  , pFarg->a[1].pE
1f0d0 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  xpr);.      }els
1f0e0 65 20 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b  e if( nFarg>0 ){
1f0f0 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
1f100 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c  sqlite3VtabOverl
1f110 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  oadFunction(db, 
1f120 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61  pDef, nFarg, pFa
1f130 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  rg->a[0].pExpr);
1f140 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1f150 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
1f160 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
1f170 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
1f180 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1f190 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
1f1a0 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20   db->pDfltColl; 
1f1b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f1c0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1f1d0 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20  _CollSeq, 0, 0, 
1f1e0 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c  0, (char *)pColl
1f1f0 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
1f200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1f210 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1f220 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 2c 20  , OP_Function0, 
1f230 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74  constMask, r1, t
1f240 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20  arget,.         
1f250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1f260 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46  char*)pDef, P4_F
1f270 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73  UNCDEF);.      s
1f280 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1f290 50 35 28 76 2c 20 28 75 38 29 6e 46 61 72 67 29  P5(v, (u8)nFarg)
1f2a0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72  ;.      if( nFar
1f2b0 67 20 26 26 20 63 6f 6e 73 74 4d 61 73 6b 3d 3d  g && constMask==
1f2c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
1f2d0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1f2e0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c  ange(pParse, r1,
1f2f0 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d   nFarg);.      }
1f300 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1f310 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1f320 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1f330 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
1f340 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  STS:.    case TK
1f350 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
1f360 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   int nCol;.     
1f370 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1f380 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20  K_EXISTS );.    
1f390 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1f3a0 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20  TK_SELECT );.   
1f3b0 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45     if( op==TK_SE
1f3c0 4c 45 43 54 20 26 26 20 28 6e 43 6f 6c 20 3d 20  LECT && (nCol = 
1f3d0 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
1f3e0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
1f3f0 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
1f400 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45  qlite3SubselectE
1f410 72 72 6f 72 28 70 50 61 72 73 65 2c 20 6e 43 6f  rror(pParse, nCo
1f420 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  l, 1);.      }el
1f430 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65  se{.        inRe
1f440 67 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53  g = sqlite3CodeS
1f450 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
1f460 20 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20   pExpr, 0, 0);. 
1f470 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
1f480 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1f490 73 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  se TK_SELECT_COL
1f4a0 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  UMN: {.      if(
1f4b0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69   pExpr->pLeft->i
1f4c0 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Table==0 ){.    
1f4d0 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
1f4e0 2d 3e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74  ->iTable = sqlit
1f4f0 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
1f500 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1f510 4c 65 66 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Left, 0, 0);.   
1f520 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67     }.      inReg
1f530 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d   = pExpr->pLeft-
1f540 3e 69 54 61 62 6c 65 20 2b 20 70 45 78 70 72 2d  >iTable + pExpr-
1f550 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
1f560 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1f570 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
1f580 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46       int destIfF
1f590 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  alse = sqlite3Vd
1f5a0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1f5b0 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
1f5c0 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  Null = sqlite3Vd
1f5d0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1f5e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f5f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
1f600 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
1f610 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1f620 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
1f630 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c  pExpr, destIfFal
1f640 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  se, destIfNull);
1f650 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1f660 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1f670 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65  nteger, 1, targe
1f680 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1f690 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1f6a0 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65  l(v, destIfFalse
1f6b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f6c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1f6d0 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c  _AddImm, target,
1f6e0 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
1f6f0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1f700 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c  el(v, destIfNull
1f710 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1f720 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
1f730 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1f740 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a  UERY */...    /*
1f750 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54  .    **    x BET
1f760 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20  WEEN y AND z.   
1f770 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
1f780 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
1f790 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1f7a0 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a    x>=y AND x<=z.
1f7b0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20      **.    ** X 
1f7c0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
1f7d0 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a  pr->pLeft..    *
1f7e0 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Y is stored in
1f7f0 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
1f800 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [0].pExpr..    *
1f810 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Z is stored in
1f820 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
1f830 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [1].pExpr..    *
1f840 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  /.    case TK_BE
1f850 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 65  TWEEN: {.      e
1f860 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70  xprCodeBetween(p
1f870 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
1f880 72 67 65 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  rget, 0, 0);.   
1f890 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f8a0 20 20 20 20 63 61 73 65 20 54 4b 5f 53 50 41 4e      case TK_SPAN
1f8b0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
1f8c0 4c 4c 41 54 45 3a 20 0a 20 20 20 20 63 61 73 65  LLATE: .    case
1f8d0 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20   TK_UPLUS: {.   
1f8e0 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
1f8f0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
1f900 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1f910 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a  pLeft, target);.
1f920 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f930 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
1f940 54 52 49 47 47 45 52 3a 20 7b 0a 20 20 20 20 20  TRIGGER: {.     
1f950 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 63 6f 64   /* If the opcod
1f960 65 20 69 73 20 54 4b 5f 54 52 49 47 47 45 52 2c  e is TK_TRIGGER,
1f970 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
1f980 73 69 6f 6e 20 69 73 20 61 20 72 65 66 65 72 65  sion is a refere
1f990 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  nce.      ** to 
1f9a0 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  a column in the 
1f9b0 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70  new.* or old.* p
1f9c0 73 65 75 64 6f 2d 74 61 62 6c 65 73 20 61 76 61  seudo-tables ava
1f9d0 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20  ilable to.      
1f9e0 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  ** trigger progr
1f9f0 61 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ams. In this cas
1fa00 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20 69 73  e Expr.iTable is
1fa10 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20 74 68   set to 1 for th
1fa20 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a  e.      ** new.*
1fa30 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f   pseudo-table, o
1fa40 72 20 30 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e  r 0 for the old.
1fa50 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20  * pseudo-table. 
1fa60 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20  Expr.iColumn.   
1fa70 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20     ** is set to 
1fa80 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  the column of th
1fa90 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 74  e pseudo-table t
1faa0 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31  o read, or to -1
1fab0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61   to.      ** rea
1fac0 64 20 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c  d the rowid fiel
1fad0 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
1fae0 20 20 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73    ** The express
1faf0 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
1fb00 65 64 20 75 73 69 6e 67 20 61 6e 20 4f 50 5f 50  ed using an OP_P
1fb10 61 72 61 6d 20 6f 70 63 6f 64 65 2e 20 54 68 65  aram opcode. The
1fb20 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 70 61 72   p1.      ** par
1fb30 61 6d 65 74 65 72 20 69 73 20 73 65 74 20 74 6f  ameter is set to
1fb40 20 30 20 66 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f   0 for an old.ro
1fb50 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 6f  wid reference, o
1fb60 72 20 74 6f 20 28 69 2b 31 29 0a 20 20 20 20 20  r to (i+1).     
1fb70 20 2a 2a 20 74 6f 20 72 65 66 65 72 65 6e 63 65   ** to reference
1fb80 20 61 6e 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20   another column 
1fb90 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65  of the old.* pse
1fba0 75 64 6f 2d 74 61 62 6c 65 2c 20 77 68 65 72 65  udo-table, where
1fbb0 20 0a 20 20 20 20 20 20 2a 2a 20 69 20 69 73 20   .      ** i is 
1fbc0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
1fbd0 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61 20 6e   column. For a n
1fbe0 65 77 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e  ew.rowid referen
1fbf0 63 65 2c 20 70 31 20 69 73 0a 20 20 20 20 20 20  ce, p1 is.      
1fc00 2a 2a 20 73 65 74 20 74 6f 20 28 6e 2b 31 29 2c  ** set to (n+1),
1fc10 20 77 68 65 72 65 20 6e 20 69 73 20 74 68 65 20   where n is the 
1fc20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
1fc30 73 20 69 6e 20 65 61 63 68 20 70 73 65 75 64 6f  s in each pseudo
1fc40 2d 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a  -table..      **
1fc50 20 46 6f 72 20 61 20 72 65 66 65 72 65 6e 63 65   For a reference
1fc60 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 63 6f   to any other co
1fc70 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e  lumn in the new.
1fc80 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20  * pseudo-table, 
1fc90 70 31 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  p1.      ** is s
1fca0 65 74 20 74 6f 20 28 6e 2b 32 2b 69 29 2c 20 77  et to (n+2+i), w
1fcb0 68 65 72 65 20 6e 20 61 6e 64 20 69 20 61 72 65  here n and i are
1fcc0 20 61 73 20 64 65 66 69 6e 65 64 20 70 72 65 76   as defined prev
1fcd0 69 6f 75 73 6c 79 2e 20 46 6f 72 0a 20 20 20 20  iously. For.    
1fce0 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66    ** example, if
1fcf0 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 77 68   the table on wh
1fd00 69 63 68 20 74 72 69 67 67 65 72 73 20 61 72 65  ich triggers are
1fd10 20 62 65 69 6e 67 20 66 69 72 65 64 20 69 73 0a   being fired is.
1fd20 20 20 20 20 20 20 2a 2a 20 64 65 63 6c 61 72 65        ** declare
1fd30 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  d as:.      **. 
1fd40 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45       **   CREATE
1fd50 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
1fd60 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
1fd70 2a 2a 20 54 68 65 6e 20 70 31 20 69 73 20 69 6e  ** Then p1 is in
1fd80 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c  terpreted as fol
1fd90 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  lows:.      **. 
1fda0 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 30 20       **   p1==0 
1fdb0 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f 77 69    ->    old.rowi
1fdc0 64 20 20 20 20 20 70 31 3d 3d 33 20 20 20 2d 3e  d     p1==3   ->
1fdd0 20 20 20 20 6e 65 77 2e 72 6f 77 69 64 0a 20 20      new.rowid.  
1fde0 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 31 20 20      **   p1==1  
1fdf0 20 2d 3e 20 20 20 20 6f 6c 64 2e 61 20 20 20 20   ->    old.a    
1fe00 20 20 20 20 20 70 31 3d 3d 34 20 20 20 2d 3e 20       p1==4   -> 
1fe10 20 20 20 6e 65 77 2e 61 0a 20 20 20 20 20 20 2a     new.a.      *
1fe20 2a 20 20 20 70 31 3d 3d 32 20 20 20 2d 3e 20 20  *   p1==2   ->  
1fe30 20 20 6f 6c 64 2e 62 20 20 20 20 20 20 20 20 20    old.b         
1fe40 70 31 3d 3d 35 20 20 20 2d 3e 20 20 20 20 6e 65  p1==5   ->    ne
1fe50 77 2e 62 20 20 20 20 20 20 20 0a 20 20 20 20 20  w.b       .     
1fe60 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20   */.      Table 
1fe70 2a 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70  *pTab = pExpr->p
1fe80 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 70  Tab;.      int p
1fe90 31 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  1 = pExpr->iTabl
1fea0 65 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b  e * (pTab->nCol+
1feb0 31 29 20 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e  1) + 1 + pExpr->
1fec0 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20  iColumn;..      
1fed0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69  assert( pExpr->i
1fee0 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70  Table==0 || pExp
1fef0 72 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a  r->iTable==1 );.
1ff00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1ff10 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31  xpr->iColumn>=-1
1ff20 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   && pExpr->iColu
1ff30 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  mn<pTab->nCol );
1ff40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1ff50 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20  Tab->iPKey<0 || 
1ff60 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  pExpr->iColumn!=
1ff70 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20  pTab->iPKey );. 
1ff80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e       assert( p1>
1ff90 3d 30 20 26 26 20 70 31 3c 28 70 54 61 62 2d 3e  =0 && p1<(pTab->
1ffa0 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20  nCol*2+2) );..  
1ffb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ffc0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72 61  ddOp2(v, OP_Para
1ffd0 6d 2c 20 70 31 2c 20 74 61 72 67 65 74 29 3b 0a  m, p1, target);.
1ffe0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
1fff0 74 28 28 76 2c 20 22 25 73 2e 25 73 20 2d 3e 20  t((v, "%s.%s -> 
20000 24 25 64 22 2c 0a 20 20 20 20 20 20 20 20 28 70  $%d",.        (p
20010 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22  Expr->iTable ? "
20020 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20  new" : "old"),. 
20030 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69         (pExpr->i
20040 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69  Column<0 ? "rowi
20050 64 22 20 3a 20 70 45 78 70 72 2d 3e 70 54 61 62  d" : pExpr->pTab
20060 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43  ->aCol[pExpr->iC
20070 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a 20  olumn].zName),. 
20080 20 20 20 20 20 20 20 74 61 72 67 65 74 0a 20 20         target.  
20090 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65 66      ));..#ifndef
200a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
200b0 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
200c0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
200d0 6d 6e 20 68 61 73 20 52 45 41 4c 20 61 66 66 69  mn has REAL affi
200e0 6e 69 74 79 2c 20 69 74 20 6d 61 79 20 63 75 72  nity, it may cur
200f0 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64  rently be stored
20100 20 61 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20   as an.      ** 
20110 69 6e 74 65 67 65 72 2e 20 55 73 65 20 4f 50 5f  integer. Use OP_
20120 52 65 61 6c 41 66 66 69 6e 69 74 79 20 74 6f 20  RealAffinity to 
20130 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20  make sure it is 
20140 72 65 61 6c 6c 79 20 72 65 61 6c 2e 0a 20 20 20  really real..   
20150 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45     **.      ** E
20160 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 30  VIDENCE-OF: R-60
20170 39 38 35 2d 35 37 36 36 32 20 53 51 4c 69 74 65  985-57662 SQLite
20180 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74 68   will convert th
20190 65 20 76 61 6c 75 65 20 62 61 63 6b 20 74 6f 0a  e value back to.
201a0 20 20 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e        ** floatin
201b0 67 20 70 6f 69 6e 74 20 77 68 65 6e 20 65 78 74  g point when ext
201c0 72 61 63 74 69 6e 67 20 69 74 20 66 72 6f 6d 20  racting it from 
201d0 74 68 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f 0a  the record.  */.
201e0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
201f0 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20  >iColumn>=0 .   
20200 20 20 20 20 26 26 20 70 54 61 62 2d 3e 61 43 6f      && pTab->aCo
20210 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  l[pExpr->iColumn
20220 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ].affinity==SQLI
20230 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20 20  TE_AFF_REAL.    
20240 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c    ){.        sql
20250 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
20260 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74  , OP_RealAffinit
20270 79 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  y, target);.    
20280 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
20290 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
202a0 20 20 20 63 61 73 65 20 54 4b 5f 56 45 43 54 4f     case TK_VECTO
202b0 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
202c0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
202d0 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69  e, "row value mi
202e0 73 75 73 65 64 22 29 3b 0a 20 20 20 20 20 20 62  sused");.      b
202f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
20300 20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20   /*.    ** Form 
20310 41 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45  A:.    **   CASE
20320 20 78 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20   x WHEN e1 THEN 
20330 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20  r1 WHEN e2 THEN 
20340 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54  r2 ... WHEN eN T
20350 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
20360 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
20370 46 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20  Form B:.    **  
20380 20 43 41 53 45 20 57 48 45 4e 20 65 31 20 54 48   CASE WHEN e1 TH
20390 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48  EN r1 WHEN e2 TH
203a0 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65  EN r2 ... WHEN e
203b0 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
203c0 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
203d0 2a 2a 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e  ** Form A is can
203e0 20 62 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20   be transformed 
203f0 69 6e 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c  into the equival
20400 65 6e 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f  ent form B as fo
20410 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20  llows:.    **   
20420 43 41 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54  CASE WHEN x=e1 T
20430 48 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32  HEN r1 WHEN x=e2
20440 20 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20   THEN r2 ....   
20450 20 2a 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20   **        WHEN 
20460 78 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53  x=eN THEN rN ELS
20470 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20  E y END.    **. 
20480 20 20 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65     ** X (if it e
20490 78 69 73 74 73 29 20 69 73 20 69 6e 20 70 45 78  xists) is in pEx
204a0 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a  pr->pLeft..    *
204b0 2a 20 59 20 69 73 20 69 6e 20 74 68 65 20 6c 61  * Y is in the la
204c0 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45  st element of pE
204d0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20  xpr->x.pList if 
204e0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
204f0 6e 45 78 70 72 20 69 73 0a 20 20 20 20 2a 2a 20  nExpr is.    ** 
20500 6f 64 64 2e 20 20 54 68 65 20 59 20 69 73 20 61  odd.  The Y is a
20510 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49  lso optional.  I
20520 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
20530 65 6c 65 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c  elements in x.pL
20540 69 73 74 0a 20 20 20 20 2a 2a 20 69 73 20 65 76  ist.    ** is ev
20550 65 6e 2c 20 74 68 65 6e 20 59 20 69 73 20 6f 6d  en, then Y is om
20560 69 74 74 65 64 20 61 6e 64 20 74 68 65 20 22 6f  itted and the "o
20570 74 68 65 72 77 69 73 65 22 20 72 65 73 75 6c 74  therwise" result
20580 20 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a   is NULL..    **
20590 20 45 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d   Ei is in pExpr-
205a0 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61  >pList->a[i*2] a
205b0 6e 64 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e  nd Ri is pExpr->
205c0 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e  pList->a[i*2+1].
205d0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
205e0 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
205f0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
20600 68 65 20 52 69 20 66 6f 72 20 74 68 65 20 66 69  he Ri for the fi
20610 72 73 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c  rst matching Ei,
20620 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68  .    ** or if th
20630 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69  ere is no matchi
20640 6e 67 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20  ng Ei, the ELSE 
20650 74 65 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68  term Y, or if th
20660 65 72 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f  ere is.    ** no
20670 20 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c   ELSE term, NULL
20680 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
20690 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70  ault: assert( op
206a0 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20  ==TK_CASE ); {. 
206b0 20 20 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65       int endLabe
206c0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
206d0 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c         /* GOTO l
206e0 61 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20  abel for end of 
206f0 43 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20  CASE stmt */.   
20700 20 20 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b     int nextCase;
20710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20720 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62       /* GOTO lab
20730 65 6c 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e  el for next WHEN
20740 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
20750 20 69 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20   int nExpr;     
20760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20770 20 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20     /* 2x number 
20780 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f  of WHEN terms */
20790 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
207a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
207c0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
207d0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
207e0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
207f0 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57      /* List of W
20800 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
20810 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
20820 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c  st_item *aListel
20830 65 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66  em;  /* Array of
20840 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
20850 20 20 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70       Expr opComp
20860 61 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  are;            
20870 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d         /* The X=
20880 3d 45 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  =Ei expression *
20890 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  /.      Expr *pX
208a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
208b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
208c0 20 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f   X expression */
208d0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65  .      Expr *pTe
208e0 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
208f0 20 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45           /* X==E
20900 69 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75  i (form A) or ju
20910 73 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a  st Ei (form B) *
20920 2f 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59  /.      VVA_ONLY
20930 28 20 69 6e 74 20 69 43 61 63 68 65 4c 65 76 65  ( int iCacheLeve
20940 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  l = pParse->iCac
20950 68 65 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20  heLevel; )..    
20960 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
20970 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
20980 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
20990 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  && pExpr->x.pLis
209a0 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
209b0 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  t(pExpr->x.pList
209c0 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20  ->nExpr > 0);.  
209d0 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78      pEList = pEx
209e0 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
209f0 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70     aListelem = p
20a00 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  EList->a;.      
20a10 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e  nExpr = pEList->
20a20 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64  nExpr;.      end
20a30 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56  Label = sqlite3V
20a40 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
20a50 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 20 3d  .      if( (pX =
20a60 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d   pExpr->pLeft)!=
20a70 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 6d  0 ){.        tem
20a80 70 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20  pX = *pX;.      
20a90 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
20aa0 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
20ab0 0a 20 20 20 20 20 20 20 20 65 78 70 72 54 6f 52  .        exprToR
20ac0 65 67 69 73 74 65 72 28 26 74 65 6d 70 58 2c 20  egister(&tempX, 
20ad0 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70  exprCodeVector(p
20ae0 50 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26  Parse, &tempX, &
20af0 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20 20 20  regFree1));.    
20b00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
20b10 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
20b20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 70 43       memset(&opC
20b30 6f 6d 70 61 72 65 2c 20 30 2c 20 73 69 7a 65 6f  ompare, 0, sizeo
20b40 66 28 6f 70 43 6f 6d 70 61 72 65 29 29 3b 0a 20  f(opCompare));. 
20b50 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65         opCompare
20b60 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20  .op = TK_EQ;.   
20b70 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70       opCompare.p
20b80 4c 65 66 74 20 3d 20 26 74 65 6d 70 58 3b 0a 20  Left = &tempX;. 
20b90 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 26         pTest = &
20ba0 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20  opCompare;.     
20bb0 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 62 33 35     /* Ticket b35
20bc0 31 64 39 35 66 39 63 64 35 65 66 31 37 65 39 64  1d95f9cd5ef17e9d
20bd0 39 64 62 61 65 31 38 66 35 63 61 38 36 31 31 31  9dbae18f5ca86111
20be0 39 30 30 30 31 3a 0a 20 20 20 20 20 20 20 20 2a  90001:.        *
20bf0 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 72  * The value in r
20c00 65 67 46 72 65 65 31 20 6d 69 67 68 74 20 67 65  egFree1 might ge
20c10 74 20 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20  t SCopy-ed into 
20c20 74 68 65 20 66 69 6c 65 20 72 65 73 75 6c 74 2e  the file result.
20c30 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d  .        ** So m
20c40 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
20c50 65 20 72 65 67 46 72 65 65 31 20 72 65 67 69 73  e regFree1 regis
20c60 74 65 72 20 69 73 20 6e 6f 74 20 72 65 75 73 65  ter is not reuse
20c70 64 20 66 6f 72 20 6f 74 68 65 72 0a 20 20 20 20  d for other.    
20c80 20 20 20 20 2a 2a 20 70 75 72 70 6f 73 65 73 20      ** purposes 
20c90 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 76 65  and possibly ove
20ca0 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20  rwritten.  */.  
20cb0 20 20 20 20 20 20 72 65 67 46 72 65 65 31 20 3d        regFree1 =
20cc0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
20cd0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
20ce0 70 72 2d 31 3b 20 69 3d 69 2b 32 29 7b 0a 20 20  pr-1; i=i+2){.  
20cf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20d00 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
20d10 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
20d20 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pX ){.          
20d30 61 73 73 65 72 74 28 20 70 54 65 73 74 21 3d 30  assert( pTest!=0
20d40 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70   );.          op
20d50 43 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d  Compare.pRight =
20d60 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45   aListelem[i].pE
20d70 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  xpr;.        }el
20d80 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54  se{.          pT
20d90 65 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b  est = aListelem[
20da0 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
20db0 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74    }.        next
20dc0 43 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Case = sqlite3Vd
20dd0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
20de0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
20df0 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pTest->op==TK_
20e00 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
20e10 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
20e20 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65  alse(pParse, pTe
20e30 73 74 2c 20 6e 65 78 74 43 61 73 65 2c 20 53 51  st, nextCase, SQ
20e40 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
20e50 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
20e60 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b  se( aListelem[i+
20e70 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  1].pExpr->op==TK
20e80 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
20e90 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
20ea0 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74  de(pParse, aList
20eb0 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c  elem[i+1].pExpr,
20ec0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
20ed0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
20ee0 6f 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a  o(v, endLabel);.
20ef0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
20f00 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
20f10 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
20f20 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
20f30 61 62 65 6c 28 76 2c 20 6e 65 78 74 43 61 73 65  abel(v, nextCase
20f40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
20f50 20 69 66 28 20 28 6e 45 78 70 72 26 31 29 21 3d   if( (nExpr&1)!=
20f60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
20f70 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
20f80 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
20f90 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
20fa0 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  de(pParse, pELis
20fb0 74 2d 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e 70 45  t->a[nExpr-1].pE
20fc0 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
20fd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20fe0 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
20ff0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
21000 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
21010 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
21020 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
21030 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21040 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
21050 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  ocFailed || pPar
21060 73 65 2d 3e 6e 45 72 72 3e 30 20 0a 20 20 20 20  se->nErr>0 .    
21070 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65         || pParse
21080 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 69  ->iCacheLevel==i
21090 43 61 63 68 65 4c 65 76 65 6c 20 29 3b 0a 20 20  CacheLevel );.  
210a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
210b0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
210c0 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  ndLabel);.      
210d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
210e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
210f0 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63 61 73  _TRIGGER.    cas
21100 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20  e TK_RAISE: {.  
21110 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
21120 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
21130 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20 20  Rollback .      
21140 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61       || pExpr->a
21150 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72  ffinity==OE_Abor
21160 74 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  t.           || 
21170 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
21180 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20 20 20  =OE_Fail.       
21190 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66      || pExpr->af
211a0 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72  finity==OE_Ignor
211b0 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  e.      );.     
211c0 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 70 54   if( !pParse->pT
211d0 72 69 67 67 65 72 54 61 62 20 29 7b 0a 20 20 20  riggerTab ){.   
211e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
211f0 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
21200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21210 20 20 20 20 22 52 41 49 53 45 28 29 20 6d 61 79      "RAISE() may
21220 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69   only be used wi
21230 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70  thin a trigger-p
21240 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20  rogram");.      
21250 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
21260 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
21270 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
21280 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20  E_Abort ){.     
21290 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f     sqlite3MayAbo
212a0 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  rt(pParse);.    
212b0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
212c0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
212d0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
212e0 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
212f0 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  if( pExpr->affin
21300 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29  ity==OE_Ignore )
21310 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
21320 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20  3VdbeAddOp4(.   
21330 20 20 20 20 20 20 20 20 20 76 2c 20 4f 50 5f 48           v, OP_H
21340 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  alt, SQLITE_OK, 
21350 4f 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20 70 45  OE_Ignore, 0, pE
21360 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29  xpr->u.zToken,0)
21370 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
21380 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
21390 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
213a0 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74  sqlite3HaltConst
213b0 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 53 51  raint(pParse, SQ
213c0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
213d0 54 52 49 47 47 45 52 2c 0a 20 20 20 20 20 20 20  TRIGGER,.       
213e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213f0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66         pExpr->af
21400 66 69 6e 69 74 79 2c 20 70 45 78 70 72 2d 3e 75  finity, pExpr->u
21410 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 30 29 3b 0a  .zToken, 0, 0);.
21420 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62        }..      b
21430 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
21440 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  if.  }.  sqlite3
21450 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
21460 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
21470 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
21480 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
21490 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 72  , regFree2);.  r
214a0 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a  eturn inReg;.}..
214b0 2f 2a 0a 2a 2a 20 46 61 63 74 6f 72 20 6f 75 74  /*.** Factor out
214c0 20 74 68 65 20 63 6f 64 65 20 6f 66 20 74 68 65   the code of the
214d0 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
214e0 6e 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74  n to initializat
214f0 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69  ion time..*/.voi
21500 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
21510 65 41 74 49 6e 69 74 28 0a 20 20 50 61 72 73 65  eAtInit(.  Parse
21520 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
21530 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
21540 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
21550 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78  ,      /* The ex
21560 70 72 65 73 73 69 6f 6e 20 74 6f 20 63 6f 64 65  pression to code
21570 20 77 68 65 6e 20 74 68 65 20 56 44 42 45 20 69   when the VDBE i
21580 6e 69 74 69 61 6c 69 7a 65 73 20 2a 2f 0a 20 20  nitializes */.  
21590 69 6e 74 20 72 65 67 44 65 73 74 2c 20 20 20 20  int regDest,    
215a0 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 76    /* Store the v
215b0 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65 67  alue in this reg
215c0 69 73 74 65 72 20 2a 2f 0a 20 20 75 38 20 72 65  ister */.  u8 re
215d0 75 73 61 62 6c 65 20 20 20 20 20 20 20 2f 2a 20  usable       /* 
215e0 54 72 75 65 20 69 66 20 74 68 69 73 20 65 78 70  True if this exp
215f0 72 65 73 73 69 6f 6e 20 69 73 20 72 65 75 73 61  ression is reusa
21600 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ble */.){.  Expr
21610 4c 69 73 74 20 2a 70 3b 0a 20 20 61 73 73 65 72  List *p;.  asser
21620 74 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b  t( ConstFactorOk
21630 28 70 50 61 72 73 65 29 20 29 3b 0a 20 20 70 20  (pParse) );.  p 
21640 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74  = pParse->pConst
21650 45 78 70 72 3b 0a 20 20 70 45 78 70 72 20 3d 20  Expr;.  pExpr = 
21660 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
21670 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72  Parse->db, pExpr
21680 2c 20 30 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69  , 0);.  p = sqli
21690 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
216a0 64 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 78  d(pParse, p, pEx
216b0 70 72 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  pr);.  if( p ){.
216c0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
216d0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
216e0 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70   = &p->a[p->nExp
216f0 72 2d 31 5d 3b 0a 20 20 20 20 20 70 49 74 65 6d  r-1];.     pItem
21700 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65  ->u.iConstExprRe
21710 67 20 3d 20 72 65 67 44 65 73 74 3b 0a 20 20 20  g = regDest;.   
21720 20 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c    pItem->reusabl
21730 65 20 3d 20 72 65 75 73 61 62 6c 65 3b 0a 20 20  e = reusable;.  
21740 7d 0a 20 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e  }.  pParse->pCon
21750 73 74 45 78 70 72 20 3d 20 70 3b 0a 7d 0a 0a 2f  stExpr = p;.}../
21760 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
21770 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  de to evaluate a
21780 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  n expression and
21790 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
217a0 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67  ts.** into a reg
217b0 69 73 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74  ister.  Return t
217c0 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  he register numb
217d0 65 72 20 77 68 65 72 65 20 74 68 65 20 72 65 73  er where the res
217e0 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72  ults.** are stor
217f0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
21800 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20 74   register is a t
21810 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
21820 72 20 74 68 61 74 20 63 61 6e 20 62 65 20 64 65  r that can be de
21830 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68  allocated,.** th
21840 65 6e 20 77 72 69 74 65 20 69 74 73 20 6e 75 6d  en write its num
21850 62 65 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20  ber into *pReg. 
21860 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 72   If the result r
21870 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a  egister is not.*
21880 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 2c 20 74  * a temporary, t
21890 68 65 6e 20 73 65 74 20 2a 70 52 65 67 20 74 6f  hen set *pReg to
218a0 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   zero..**.** If 
218b0 70 45 78 70 72 20 69 73 20 61 20 63 6f 6e 73 74  pExpr is a const
218c0 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ant, then this r
218d0 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 67 65 6e  outine might gen
218e0 65 72 61 74 65 20 74 68 69 73 0a 2a 2a 20 63 6f  erate this.** co
218f0 64 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 72  de to fill the r
21900 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 69  egister in the i
21910 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73 65  nitialization se
21920 63 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  ction of the.** 
21930 56 44 42 45 20 70 72 6f 67 72 61 6d 2c 20 69 6e  VDBE program, in
21940 20 6f 72 64 65 72 20 74 6f 20 66 61 63 74 6f 72   order to factor
21950 20 69 74 20 6f 75 74 20 6f 66 20 74 68 65 20 65   it out of the e
21960 76 61 6c 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a  valuation loop..
21970 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
21980 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72 73 65  prCodeTemp(Parse
21990 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
219a0 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 65 67  pExpr, int *pReg
219b0 29 7b 0a 20 20 69 6e 74 20 72 32 3b 0a 20 20 70  ){.  int r2;.  p
219c0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
219d0 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
219e0 78 70 72 29 3b 0a 20 20 69 66 28 20 43 6f 6e 73  xpr);.  if( Cons
219f0 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65  tFactorOk(pParse
21a00 29 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 6f  ).   && pExpr->o
21a10 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 0a 20  p!=TK_REGISTER. 
21a20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
21a30 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
21a40 6e 28 70 45 78 70 72 29 0a 20 20 29 7b 0a 20 20  n(pExpr).  ){.  
21a50 20 20 45 78 70 72 4c 69 73 74 20 2a 70 20 3d 20    ExprList *p = 
21a60 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78  pParse->pConstEx
21a70 70 72 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  pr;.    int i;. 
21a80 20 20 20 2a 70 52 65 67 20 20 3d 20 30 3b 0a 20     *pReg  = 0;. 
21a90 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
21aa0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
21ab0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
21ac0 20 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70       for(pItem=p
21ad0 2d 3e 61 2c 20 69 3d 70 2d 3e 6e 45 78 70 72 3b  ->a, i=p->nExpr;
21ae0 20 69 3e 30 3b 20 70 49 74 65 6d 2b 2b 2c 20 69   i>0; pItem++, i
21af0 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  --){.        if(
21b00 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65   pItem->reusable
21b10 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
21b20 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45  ompare(pItem->pE
21b30 78 70 72 2c 70 45 78 70 72 2c 2d 31 29 3d 3d 30  xpr,pExpr,-1)==0
21b40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
21b50 74 75 72 6e 20 70 49 74 65 6d 2d 3e 75 2e 69 43  turn pItem->u.iC
21b60 6f 6e 73 74 45 78 70 72 52 65 67 3b 0a 20 20 20  onstExprReg;.   
21b70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
21b80 20 20 20 7d 0a 20 20 20 20 72 32 20 3d 20 2b 2b     }.    r2 = ++
21b90 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
21ba0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
21bb0 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20  eAtInit(pParse, 
21bc0 70 45 78 70 72 2c 20 72 32 2c 20 31 29 3b 0a 20  pExpr, r2, 1);. 
21bd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
21be0 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
21bf0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
21c00 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
21c10 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
21c20 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31  Parse, pExpr, r1
21c30 29 3b 0a 20 20 20 20 69 66 28 20 72 32 3d 3d 72  );.    if( r2==r
21c40 31 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 67  1 ){.      *pReg
21c50 20 3d 20 72 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = r1;.    }else
21c60 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
21c70 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
21c80 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
21c90 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20   *pReg = 0;.    
21ca0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
21cb0 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  2;.}../*.** Gene
21cc0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
21cd0 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70  ill evaluate exp
21ce0 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e  ression pExpr an
21cf0 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72  d store the.** r
21d00 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74  esults in regist
21d10 65 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20  er target.  The 
21d20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72  results are guar
21d30 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72  anteed to appear
21d40 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20  .** in register 
21d50 74 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20  target..*/.void 
21d60 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
21d70 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
21d80 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
21d90 74 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69  target){.  int i
21da0 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  nReg;..  assert(
21db0 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72   target>0 && tar
21dc0 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65  get<=pParse->nMe
21dd0 6d 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72  m );.  if( pExpr
21de0 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   && pExpr->op==T
21df0 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20  K_REGISTER ){.  
21e00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21e10 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op2(pParse->pVdb
21e20 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70  e, OP_Copy, pExp
21e30 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65  r->iTable, targe
21e40 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
21e50 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
21e60 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
21e70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
21e80 72 67 65 74 29 3b 0a 20 20 20 20 61 73 73 65 72  rget);.    asser
21e90 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  t( pParse->pVdbe
21ea0 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  !=0 || pParse->d
21eb0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
21ec0 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67  );.    if( inReg
21ed0 21 3d 74 61 72 67 65 74 20 26 26 20 70 50 61 72  !=target && pPar
21ee0 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20  se->pVdbe ){.   
21ef0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21f00 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp2(pParse->pVd
21f10 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e  be, OP_SCopy, in
21f20 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  Reg, target);.  
21f30 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
21f40 20 4d 61 6b 65 20 61 20 74 72 61 6e 73 69 65 6e   Make a transien
21f50 74 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73  t copy of expres
21f60 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 74  sion pExpr and t
21f70 68 65 6e 20 63 6f 64 65 20 69 74 20 75 73 69 6e  hen code it usin
21f80 67 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72  g.** sqlite3Expr
21f90 43 6f 64 65 28 29 2e 20 20 54 68 69 73 20 72 6f  Code().  This ro
21fa0 75 74 69 6e 65 20 77 6f 72 6b 73 20 6a 75 73 74  utine works just
21fb0 20 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70   like sqlite3Exp
21fc0 72 43 6f 64 65 28 29 0a 2a 2a 20 65 78 63 65 70  rCode().** excep
21fd0 74 20 74 68 61 74 20 74 68 65 20 69 6e 70 75 74  t that the input
21fe0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 67   expression is g
21ff0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
22000 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f  unchanged..*/.vo
22010 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
22020 64 65 43 6f 70 79 28 50 61 72 73 65 20 2a 70 50  deCopy(Parse *pP
22030 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
22040 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
22050 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
22060 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 45  pParse->db;.  pE
22070 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
22080 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20  rDup(db, pExpr, 
22090 30 29 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  0);.  if( !db->m
220a0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 73 71  allocFailed ) sq
220b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
220c0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
220d0 67 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  get);.  sqlite3E
220e0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
220f0 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  xpr);.}../*.** G
22100 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
22110 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20  t will evaluate 
22120 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
22130 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a   and store the.*
22140 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67  * results in reg
22150 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54  ister target.  T
22160 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67  he results are g
22170 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70  uaranteed to app
22180 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  ear.** in regist
22190 65 72 20 74 61 72 67 65 74 2e 20 20 49 66 20 74  er target.  If t
221a0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
221b0 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20   constant, then 
221c0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
221d0 6d 69 67 68 74 20 63 68 6f 6f 73 65 20 74 6f 20  might choose to 
221e0 63 6f 64 65 20 74 68 65 20 65 78 70 72 65 73 73  code the express
221f0 69 6f 6e 20 61 74 20 69 6e 69 74 69 61 6c 69 7a  ion at initializ
22200 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76  ation time..*/.v
22210 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
22220 6f 64 65 46 61 63 74 6f 72 61 62 6c 65 28 50 61  odeFactorable(Pa
22230 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
22240 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
22250 72 67 65 74 29 7b 0a 20 20 69 66 28 20 70 50 61  rget){.  if( pPa
22260 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74  rse->okConstFact
22270 6f 72 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  or && sqlite3Exp
22280 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70  rIsConstant(pExp
22290 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  r) ){.    sqlite
222a0 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28  3ExprCodeAtInit(
222b0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
222c0 61 72 67 65 74 2c 20 30 29 3b 0a 20 20 7d 65 6c  arget, 0);.  }el
222d0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
222e0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
222f0 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
22300 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
22310 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
22320 65 76 61 6c 75 61 74 65 73 20 74 68 65 20 67 69  evaluates the gi
22330 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61  ven expression a
22340 6e 64 20 70 75 74 73 20 74 68 65 20 72 65 73 75  nd puts the resu
22350 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  lt.** in registe
22360 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20  r target..**.** 
22370 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79  Also make a copy
22380 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
22390 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20  on results into 
223a0 61 6e 6f 74 68 65 72 20 22 63 61 63 68 65 22 20  another "cache" 
223b0 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20  register.** and 
223c0 6d 6f 64 69 66 79 20 74 68 65 20 65 78 70 72 65  modify the expre
223d0 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68  ssion so that th
223e0 65 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69  e next time it i
223f0 73 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20  s evaluated,.** 
22400 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20  the result is a 
22410 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 63 68  copy of the cach
22420 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a  e register..**.*
22430 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
22440 73 20 75 73 65 64 20 66 6f 72 20 65 78 70 72 65  s used for expre
22450 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ssions that are 
22460 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a  used multiple .*
22470 2a 20 74 69 6d 65 73 2e 20 20 54 68 65 79 20 61  * times.  They a
22480 72 65 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63  re evaluated onc
22490 65 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74  e and the result
224a0 73 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  s of the express
224b0 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73 65  ion.** are reuse
224c0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
224d0 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63  e3ExprCodeAndCac
224e0 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  he(Parse *pParse
224f0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
22500 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64  nt target){.  Vd
22510 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
22520 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65  pVdbe;.  int iMe
22530 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61  m;..  assert( ta
22540 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  rget>0 );.  asse
22550 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
22560 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20  K_REGISTER );.  
22570 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
22580 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
22590 61 72 67 65 74 29 3b 0a 20 20 69 4d 65 6d 20 3d  arget);.  iMem =
225a0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
225b0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
225c0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
225d0 20 74 61 72 67 65 74 2c 20 69 4d 65 6d 29 3b 0a   target, iMem);.
225e0 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72    exprToRegister
225f0 28 70 45 78 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d  (pExpr, iMem);.}
22600 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
22610 20 63 6f 64 65 20 74 68 61 74 20 70 75 73 68 65   code that pushe
22620 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65  s the value of e
22630 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20  very element of 
22640 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70  the given.** exp
22650 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74  ression list int
22660 6f 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  o a sequence of 
22670 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e  registers beginn
22680 69 6e 67 20 61 74 20 74 61 72 67 65 74 2e 0a 2a  ing at target..*
22690 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
226a0 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
226b0 74 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2a  ts evaluated..**
226c0 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45  .** The SQLITE_E
226d0 43 45 4c 5f 44 55 50 20 66 6c 61 67 20 70 72 65  CEL_DUP flag pre
226e0 76 65 6e 74 73 20 74 68 65 20 61 72 67 75 6d 65  vents the argume
226f0 6e 74 73 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a  nts from being.*
22700 2a 20 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 4f  * filled using O
22710 50 5f 53 43 6f 70 79 2e 20 20 4f 50 5f 43 6f 70  P_SCopy.  OP_Cop
22720 79 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 69  y must be used i
22730 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  nstead..**.** Th
22740 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41  e SQLITE_ECEL_FA
22750 43 54 4f 52 20 61 72 67 75 6d 65 6e 74 20 61 6c  CTOR argument al
22760 6c 6f 77 73 20 63 6f 6e 73 74 61 6e 74 20 61 72  lows constant ar
22770 67 75 6d 65 6e 74 73 20 74 6f 20 62 65 0a 2a 2a  guments to be.**
22780 20 66 61 63 74 6f 72 65 64 20 6f 75 74 20 69 6e   factored out in
22790 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  to initializatio
227a0 6e 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  n code..**.** Th
227b0 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45  e SQLITE_ECEL_RE
227c0 46 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61  F flag means tha
227d0 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  t expressions in
227e0 20 74 68 65 20 6c 69 73 74 20 77 69 74 68 0a 2a   the list with.*
227f0 2a 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 75  * ExprList.a[].u
22800 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30  .x.iOrderByCol>0
22810 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
22820 65 6e 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  en evaluated and
22830 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 72 65   stored.** in re
22840 67 69 73 74 65 72 73 20 61 74 20 73 72 63 52 65  gisters at srcRe
22850 67 2c 20 61 6e 64 20 73 6f 20 74 68 65 20 76 61  g, and so the va
22860 6c 75 65 20 63 61 6e 20 62 65 20 63 6f 70 69 65  lue can be copie
22870 64 20 66 72 6f 6d 20 74 68 65 72 65 2e 0a 2a 2f  d from there..*/
22880 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
22890 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20  CodeExprList(.  
228a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
228b0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
228c0 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
228d0 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a  ist *pList,   /*
228e0 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
228f0 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64  list to be coded
22900 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74   */.  int target
22910 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72  ,        /* Wher
22920 65 20 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c  e to write resul
22930 74 73 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 52  ts */.  int srcR
22940 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 6f  eg,        /* So
22950 75 72 63 65 20 72 65 67 69 73 74 65 72 73 20 69  urce registers i
22960 66 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45  f SQLITE_ECEL_RE
22970 46 20 2a 2f 0a 20 20 75 38 20 66 6c 61 67 73 20  F */.  u8 flags 
22980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
22990 49 54 45 5f 45 43 45 4c 5f 2a 20 66 6c 61 67 73  ITE_ECEL_* flags
229a0 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
229b0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
229c0 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Item;.  int i, j
229d0 2c 20 6e 3b 0a 20 20 75 38 20 63 6f 70 79 4f 70  , n;.  u8 copyOp
229e0 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
229f0 54 45 5f 45 43 45 4c 5f 44 55 50 29 20 3f 20 4f  TE_ECEL_DUP) ? O
22a00 50 5f 43 6f 70 79 20 3a 20 4f 50 5f 53 43 6f 70  P_Copy : OP_SCop
22a10 79 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  y;.  Vdbe *v = p
22a20 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
22a30 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
22a40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61   );.  assert( ta
22a50 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  rget>0 );.  asse
22a60 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62  rt( pParse->pVdb
22a70 65 21 3d 30 20 29 3b 20 20 2f 2a 20 4e 65 76 65  e!=0 );  /* Neve
22a80 72 20 67 65 74 73 20 74 68 69 73 20 66 61 72 20  r gets this far 
22a90 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 6e  otherwise */.  n
22aa0 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
22ab0 0a 20 20 69 66 28 20 21 43 6f 6e 73 74 46 61 63  .  if( !ConstFac
22ac0 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29 20  torOk(pParse) ) 
22ad0 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
22ae0 5f 45 43 45 4c 5f 46 41 43 54 4f 52 3b 0a 20 20  _ECEL_FACTOR;.  
22af0 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
22b00 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  >a, i=0; i<n; i+
22b10 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
22b20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
22b30 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
22b40 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 53 51   if( (flags & SQ
22b50 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 29 21 3d  LITE_ECEL_REF)!=
22b60 30 20 26 26 20 28 6a 20 3d 20 70 4c 69 73 74 2d  0 && (j = pList-
22b70 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  >a[i].u.x.iOrder
22b80 42 79 43 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20  ByCol)>0 ){.    
22b90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22ba0 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20 6a  Op2(v, copyOp, j
22bb0 2b 73 72 63 52 65 67 2d 31 2c 20 74 61 72 67 65  +srcReg-1, targe
22bc0 74 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  t+i);.    }else 
22bd0 69 66 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c  if( (flags & SQL
22be0 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29  ITE_ECEL_FACTOR)
22bf0 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 45 78  !=0 && sqlite3Ex
22c00 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78  prIsConstant(pEx
22c10 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  pr) ){.      sql
22c20 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e  ite3ExprCodeAtIn
22c30 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  it(pParse, pExpr
22c40 2c 20 74 61 72 67 65 74 2b 69 2c 20 30 29 3b 0a  , target+i, 0);.
22c50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22c60 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 73 71 6c   int inReg = sql
22c70 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
22c80 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
22c90 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20  , target+i);.   
22ca0 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61     if( inReg!=ta
22cb0 72 67 65 74 2b 69 20 29 7b 0a 20 20 20 20 20 20  rget+i ){.      
22cc0 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
22cd0 20 20 20 20 20 20 20 69 66 28 20 63 6f 70 79 4f         if( copyO
22ce0 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20  p==OP_Copy.     
22cf0 20 20 20 20 26 26 20 28 70 4f 70 3d 73 71 6c 69      && (pOp=sqli
22d00 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
22d10 2d 31 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50  -1))->opcode==OP
22d20 5f 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26  _Copy.         &
22d30 26 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70  & pOp->p1+pOp->p
22d40 33 2b 31 3d 3d 69 6e 52 65 67 0a 20 20 20 20 20  3+1==inReg.     
22d50 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70      && pOp->p2+p
22d60 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61 72 67 65 74  Op->p3+1==target
22d70 2b 69 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  +i.        ){.  
22d80 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 2b          pOp->p3+
22d90 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  +;.        }else
22da0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
22db0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
22dc0 20 63 6f 70 79 4f 70 2c 20 69 6e 52 65 67 2c 20   copyOp, inReg, 
22dd0 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20  target+i);.     
22de0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
22df0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
22e00 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  n;.}../*.** Gene
22e10 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
22e20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72  BETWEEN operator
22e30 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20 42 45 54  ..**.**    x BET
22e40 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a  WEEN y AND z.**.
22e50 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73 20  ** The above is 
22e60 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 2a  equivalent to .*
22e70 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44  *.**    x>=y AND
22e80 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65   x<=z.**.** Code
22e90 20 69 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b   it as such, tak
22ea0 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74  ing care to do t
22eb0 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70  he common subexp
22ec0 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c 69 6d 69  ression.** elimi
22ed0 6e 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2a 0a  nation of x..**.
22ee0 2a 2a 20 54 68 65 20 78 4a 75 6d 70 49 66 20 70  ** The xJumpIf p
22ef0 61 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69  arameter determi
22f00 6e 65 73 20 64 65 74 61 69 6c 73 3a 0a 2a 2a 0a  nes details:.**.
22f10 2a 2a 20 20 20 20 4e 55 4c 4c 3a 20 20 20 20 20  **    NULL:     
22f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 74                St
22f30 6f 72 65 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20  ore the boolean 
22f40 72 65 73 75 6c 74 20 69 6e 20 72 65 67 5b 64 65  result in reg[de
22f50 73 74 5d 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65  st].**    sqlite
22f60 33 45 78 70 72 49 66 54 72 75 65 3a 20 20 20 20  3ExprIfTrue:    
22f70 20 20 4a 75 6d 70 20 74 6f 20 64 65 73 74 20 69    Jump to dest i
22f80 66 20 74 72 75 65 0a 2a 2a 20 20 20 20 73 71 6c  f true.**    sql
22f90 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 3a  ite3ExprIfFalse:
22fa0 20 20 20 20 20 4a 75 6d 70 20 74 6f 20 64 65 73       Jump to des
22fb0 74 20 69 66 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a  t if false.**.**
22fc0 20 54 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   The jumpIfNull 
22fd0 70 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e  parameter is ign
22fe0 6f 72 65 64 20 69 66 20 78 4a 75 6d 70 49 66 20  ored if xJumpIf 
22ff0 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  is NULL..*/.stat
23000 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 64 65  ic void exprCode
23010 42 65 74 77 65 65 6e 28 0a 20 20 50 61 72 73 65  Between(.  Parse
23020 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
23030 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
23040 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
23050 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
23060 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  Expr,      /* Th
23070 65 20 42 45 54 57 45 45 4e 20 65 78 70 72 65 73  e BETWEEN expres
23080 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65  sion */.  int de
23090 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  st,         /* J
230a0 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ump destination 
230b0 6f 72 20 73 74 6f 72 61 67 65 20 6c 6f 63 61 74  or storage locat
230c0 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ion */.  void (*
230d0 78 4a 75 6d 70 29 28 50 61 72 73 65 2a 2c 45 78  xJump)(Parse*,Ex
230e0 70 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 20 2f 2a  pr*,int,int), /*
230f0 20 41 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20   Action to take 
23100 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e  */.  int jumpIfN
23110 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20 74  ull    /* Take t
23120 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42  he jump if the B
23130 45 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20 2a  ETWEEN is NULL *
23140 2f 0a 29 7b 0a 20 45 78 70 72 20 65 78 70 72 41  /.){. Expr exprA
23150 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 41  nd;     /* The A
23160 4e 44 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 20  ND operator in  
23170 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20 20 2a  x>=y AND x<=z  *
23180 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66  /.  Expr compLef
23190 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 20 78 3e  t;    /* The  x>
231a0 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78  =y  term */.  Ex
231b0 70 72 20 63 6f 6d 70 52 69 67 68 74 3b 20 20 20  pr compRight;   
231c0 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20 74 65  /* The  x<=z  te
231d0 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 65 78 70  rm */.  Expr exp
231e0 72 58 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  rX;       /* The
231f0 20 20 78 20 20 73 75 62 65 78 70 72 65 73 73 69    x  subexpressi
23200 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46  on */.  int regF
23210 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54 65 6d  ree1 = 0; /* Tem
23220 70 6f 72 61 72 79 20 75 73 65 20 72 65 67 69 73  porary use regis
23230 74 65 72 20 2a 2f 0a 0a 0a 20 20 6d 65 6d 73 65  ter */...  memse
23240 74 28 26 63 6f 6d 70 4c 65 66 74 2c 20 30 2c 20  t(&compLeft, 0, 
23250 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20  sizeof(Expr));. 
23260 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 52 69 67   memset(&compRig
23270 68 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78  ht, 0, sizeof(Ex
23280 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  pr));.  memset(&
23290 65 78 70 72 41 6e 64 2c 20 30 2c 20 73 69 7a 65  exprAnd, 0, size
232a0 6f 66 28 45 78 70 72 29 29 3b 0a 0a 20 20 61 73  of(Expr));..  as
232b0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
232c0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
232d0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
232e0 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d   exprX = *pExpr-
232f0 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e  >pLeft;.  exprAn
23300 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20  d.op = TK_AND;. 
23310 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d   exprAnd.pLeft =
23320 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 65 78   &compLeft;.  ex
23330 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26  prAnd.pRight = &
23340 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63 6f 6d  compRight;.  com
23350 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45  pLeft.op = TK_GE
23360 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65  ;.  compLeft.pLe
23370 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63  ft = &exprX;.  c
23380 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20 3d  ompLeft.pRight =
23390 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
233a0 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 63  >a[0].pExpr;.  c
233b0 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b  ompRight.op = TK
233c0 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74  _LE;.  compRight
233d0 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b  .pLeft = &exprX;
233e0 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69  .  compRight.pRi
233f0 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ght = pExpr->x.p
23400 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
23410 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69 73 74  ;.  exprToRegist
23420 65 72 28 26 65 78 70 72 58 2c 20 65 78 70 72 43  er(&exprX, exprC
23430 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72 73 65  odeVector(pParse
23440 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67 46 72  , &exprX, &regFr
23450 65 65 31 29 29 3b 0a 20 20 69 66 28 20 78 4a 75  ee1));.  if( xJu
23460 6d 70 20 29 7b 0a 20 20 20 20 78 4a 75 6d 70 28  mp ){.    xJump(
23470 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64  pParse, &exprAnd
23480 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
23490 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ll);.  }else{.  
234a0 20 20 65 78 70 72 58 2e 66 6c 61 67 73 20 7c 3d    exprX.flags |=
234b0 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20   EP_FromJoin;.  
234c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
234d0 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
234e0 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 29 3b  &exprAnd, dest);
234f0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
23500 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
23510 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
23520 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 61 64 65  .  /* Ensure ade
23530 71 75 61 74 65 20 74 65 73 74 20 63 6f 76 65 72  quate test cover
23540 61 67 65 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  age */.  testcas
23550 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
23560 33 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20  3ExprIfTrue  && 
23570 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26  jumpIfNull==0 &&
23580 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
23590 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
235a0 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
235b0 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e  True  && jumpIfN
235c0 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
235d0 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1!=0 );.  testc
235e0 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
235f0 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20 26  te3ExprIfTrue  &
23600 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20  & jumpIfNull!=0 
23610 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  && regFree1==0 )
23620 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
23630 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ump==sqlite3Expr
23640 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49  IfTrue  && jumpI
23650 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
23660 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73  ree1!=0 );.  tes
23670 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
23680 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
23690 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
236a0 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
236b0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
236c0 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78  xJump==sqlite3Ex
236d0 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d  prIfFalse && jum
236e0 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
236f0 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74  gFree1!=0 );.  t
23700 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
23710 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
23720 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  se && jumpIfNull
23730 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  !=0 && regFree1=
23740 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
23750 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
23760 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a  ExprIfFalse && j
23770 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
23780 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20  regFree1!=0 );. 
23790 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
237a0 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ==0 );.}../*.** 
237b0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
237c0 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72  r a boolean expr
237d0 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74  ession such that
237e0 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a   a jump is made.
237f0 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20  ** to the label 
23800 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78  "dest" if the ex
23810 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65  pression is true
23820 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a   but execution.*
23830 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61  * continues stra
23840 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65  ight thru if the
23850 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
23860 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  alse..**.** If t
23870 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76  he expression ev
23880 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20  aluates to NULL 
23890 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f  (neither true no
238a0 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a  r false), then.*
238b0 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20  * take the jump 
238c0 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c  if the jumpIfNul
238d0 6c 20 66 6c 61 67 20 69 73 20 53 51 4c 49 54 45  l flag is SQLITE
238e0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a  _JUMPIFNULL..**.
238f0 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70  ** This code dep
23900 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74  ends on the fact
23910 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f   that certain to
23920 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ken values (ex: 
23930 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68  TK_EQ).** are th
23940 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65  e same as opcode
23950 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f   values (ex: OP_
23960 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  Eq) that impleme
23970 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  nt the correspon
23980 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  ding.** operatio
23990 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d  n.  Special comm
239a0 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61  ents in vdbe.c a
239b0 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68  nd the mkopcodeh
239c0 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a  .awk script in.*
239d0 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65  * the make proce
239e0 73 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76  ss cause these v
239f0 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20  alues to align. 
23a00 20 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68   Assert()s in th
23a10 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20  e code.** below 
23a20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
23a30 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67  numbers are alig
23a40 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  ned correctly..*
23a50 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
23a60 70 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a  prIfTrue(Parse *
23a70 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
23a80 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
23a90 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
23aa0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
23ab0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
23ac0 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72   op = 0;.  int r
23ad0 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69  egFree1 = 0;.  i
23ae0 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  nt regFree2 = 0;
23af0 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a  .  int r1, r2;..
23b00 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66    assert( jumpIf
23b10 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d  Null==SQLITE_JUM
23b20 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49  PIFNULL || jumpI
23b30 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  fNull==0 );.  if
23b40 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
23b50 20 20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20      return;  /* 
23b60 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42  Existence of VDB
23b70 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c  E checked by cal
23b80 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ler */.  if( NEV
23b90 45 52 28 70 45 78 70 72 3d 3d 30 29 20 29 20 72  ER(pExpr==0) ) r
23ba0 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61  eturn;  /* No wa
23bb0 79 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65  y this can happe
23bc0 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45 78 70  n */.  op = pExp
23bd0 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28  r->op;.  switch(
23be0 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
23bf0 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20  TK_AND: {.      
23c00 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
23c10 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
23c20 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
23c30 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
23c40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
23c50 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
23c60 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
23c70 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e  , d2,jumpIfNull^
23c80 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
23c90 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
23ca0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
23cb0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
23cc0 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
23cd0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
23ce0 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
23cf0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
23d00 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
23d10 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a  veLabel(v, d2);.
23d20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
23d30 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
23d40 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
23d50 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
23d60 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 74 65  K_OR: {.      te
23d70 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
23d80 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
23d90 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
23da0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
23db0 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
23dc0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
23dd0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
23de0 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
23df0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
23e00 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
23e10 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
23e20 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
23e30 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
23e40 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
23e50 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
23e60 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
23e70 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  K_NOT: {.      t
23e80 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
23e90 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
23ea0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
23eb0 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
23ec0 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
23ed0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
23ee0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
23ef0 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20     case TK_IS:. 
23f00 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54     case TK_ISNOT
23f10 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
23f20 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ( op==TK_IS );. 
23f30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
23f40 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20  p==TK_ISNOT );. 
23f50 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54       op = (op==T
23f60 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20  K_IS) ? TK_EQ : 
23f70 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 6a 75 6d  TK_NE;.      jum
23f80 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45  pIfNull = SQLITE
23f90 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f  _NULLEQ;.      /
23fa0 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20  * Fall thru */. 
23fb0 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
23fc0 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
23fd0 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
23fe0 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
23ff0 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
24000 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
24010 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
24020 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
24030 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 20 67  Expr->pLeft) ) g
24040 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78 70 72  oto default_expr
24050 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
24060 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
24070 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
24080 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
24090 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
240a0 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
240b0 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
240c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
240d0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
240e0 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
240f0 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ee2);.      code
24100 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
24110 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
24120 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
24130 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24140 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c     r1, r2, dest,
24150 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
24160 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54      assert(TK_LT
24170 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61  ==OP_Lt); testca
24180 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56  se(op==OP_Lt); V
24190 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
241a0 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20  op==OP_Lt);.    
241b0 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d    assert(TK_LE==
241c0 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Le); testcase
241d0 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62  (op==OP_Le); Vdb
241e0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
241f0 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20  ==OP_Le);.      
24200 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50  assert(TK_GT==OP
24210 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Gt); testcase(o
24220 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43  p==OP_Gt); VdbeC
24230 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
24240 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73  OP_Gt);.      as
24250 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47  sert(TK_GE==OP_G
24260 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
24270 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ge); VdbeCov
24280 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
24290 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Ge);.      asse
242a0 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29  rt(TK_EQ==OP_Eq)
242b0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
242c0 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56 64 62  P_Eq);.      Vdb
242d0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
242e0 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70  p==OP_Eq && jump
242f0 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e  IfNull==SQLITE_N
24300 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64  ULLEQ);.      Vd
24310 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
24320 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d  op==OP_Eq && jum
24330 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f  pIfNull!=SQLITE_
24340 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 61  NULLEQ);.      a
24350 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f  ssert(TK_NE==OP_
24360 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ne); testcase(op
24370 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ne);.      
24380 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
24390 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a  , op==OP_Ne && j
243a0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
243b0 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
243c0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
243d0 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20  v, op==OP_Ne && 
243e0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49  jumpIfNull!=SQLI
243f0 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
24400 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
24410 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
24420 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
24430 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
24440 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
24450 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
24460 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
24470 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73  NULL: {.      as
24480 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d  sert( TK_ISNULL=
24490 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20  =OP_IsNull );   
244a0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
244b0 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
244c0 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e   assert( TK_NOTN
244d0 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20  ULL==OP_NotNull 
244e0 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d  ); testcase( op=
244f0 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20  =TK_NOTNULL );. 
24500 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
24510 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
24520 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
24530 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
24540 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
24550 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72  eAddOp2(v, op, r
24560 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  1, dest);.      
24570 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
24580 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29  , op==TK_ISNULL)
24590 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
245a0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
245b0 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  _NOTNULL);.     
245c0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
245d0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
245e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
245f0 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
24600 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
24610 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
24620 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43  0 );.      exprC
24630 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73  odeBetween(pPars
24640 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
24650 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
24660 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  e, jumpIfNull);.
24670 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
24680 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
24690 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
246a0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
246b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  {.      int dest
246c0 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65  IfFalse = sqlite
246d0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
246e0 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73  );.      int des
246f0 74 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49 66  tIfNull = jumpIf
24700 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64 65  Null ? dest : de
24710 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 20 20 20  stIfFalse;.     
24720 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
24730 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
24740 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64  , destIfFalse, d
24750 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
24760 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
24770 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  o(v, dest);.    
24780 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
24790 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
247a0 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20  tIfFalse);.     
247b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
247c0 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
247d0 3a 20 7b 0a 20 20 20 20 64 65 66 61 75 6c 74 5f  : {.    default_
247e0 65 78 70 72 3a 0a 20 20 20 20 20 20 69 66 28 20  expr:.      if( 
247f0 65 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 70  exprAlwaysTrue(p
24800 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
24810 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
24820 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  (v, dest);.     
24830 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72 41   }else if( exprA
24840 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78 70 72  lwaysFalse(pExpr
24850 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
24860 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d  No-op */.      }
24870 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31  else{.        r1
24880 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
24890 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
248a0 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29  Expr, &regFree1)
248b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
248c0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
248d0 50 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c 20  P_If, r1, dest, 
248e0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a  jumpIfNull!=0);.
248f0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
24900 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
24910 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
24920 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
24930 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
24940 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
24950 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
24960 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
24970 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
24980 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
24990 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
249a0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
249b0 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
249c0 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ;  .}../*.** Gen
249d0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
249e0 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
249f0 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
24a00 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
24a10 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
24a20 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
24a30 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62  ssion is false b
24a40 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
24a50 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
24a60 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
24a70 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
24a80 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
24a90 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
24aa0 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65  ates to NULL (ne
24ab0 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66  ither true nor f
24ac0 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75  alse) then.** ju
24ad0 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c  mp if jumpIfNull
24ae0 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49   is SQLITE_JUMPI
24af0 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68  FNULL or fall th
24b00 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e  rough if jumpIfN
24b10 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a  ull.** is 0..*/.
24b20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
24b30 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70  IfFalse(Parse *p
24b40 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
24b50 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
24b60 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
24b70 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
24b80 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
24b90 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  op = 0;.  int re
24ba0 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e  gFree1 = 0;.  in
24bb0 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a  t regFree2 = 0;.
24bc0 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20    int r1, r2;.. 
24bd0 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e   assert( jumpIfN
24be0 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50  ull==SQLITE_JUMP
24bf0 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66  IFNULL || jumpIf
24c00 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Null==0 );.  if(
24c10 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72   NEVER(v==0) ) r
24c20 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74 65  eturn; /* Existe
24c30 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63  nce of VDBE chec
24c40 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f  ked by caller */
24c50 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
24c60 29 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20  )    return;..  
24c70 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  /* The value of 
24c80 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70  pExpr->op and op
24c90 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73 20   are related as 
24ca0 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
24cb0 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  **       pExpr->
24cc0 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f 70  op            op
24cd0 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d  .  **       ----
24ce0 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d  -----          -
24cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20  ---------.  **  
24d00 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20       TK_ISNULL  
24d10 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75          OP_NotNu
24d20 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  ll.  **       TK
24d30 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20  _NOTNULL        
24d40 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20   OP_IsNull.  ** 
24d50 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20        TK_NE     
24d60 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20           OP_Eq. 
24d70 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20   **       TK_EQ 
24d80 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
24d90 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Ne.  **       TK
24da0 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _GT             
24db0 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Le.  **     
24dc0 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20    TK_LE         
24dd0 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20       OP_Gt.  ** 
24de0 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20        TK_GE     
24df0 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20           OP_Lt. 
24e00 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20   **       TK_LT 
24e10 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
24e20 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72  Ge.  **.  ** For
24e30 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66   other values of
24e40 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69   pExpr->op, op i
24e50 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20  s undefined and 
24e60 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65  unused..  ** The
24e70 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e   value of TK_ an
24e80 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20  d OP_ constants 
24e90 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75 63  are arranged suc
24ea0 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63  h that we.  ** c
24eb0 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d  an compute the m
24ec0 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69  apping above usi
24ed0 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
24ee0 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a   expression..  *
24ef0 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72 69  * Assert()s veri
24f00 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70  fy that the comp
24f10 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65  utation is corre
24f20 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20  ct..  */.  op = 
24f30 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f  ((pExpr->op+(TK_
24f40 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54  ISNULL&1))^1)-(T
24f50 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20  K_ISNULL&1);..  
24f60 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65 63  /* Verify correc
24f70 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54  t alignment of T
24f80 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
24f90 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ants.  */.  asse
24fa0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
24fb0 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d  K_ISNULL || op==
24fc0 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20  OP_NotNull );.  
24fd0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
24fe0 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c  p!=TK_NOTNULL ||
24ff0 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29   op==OP_IsNull )
25000 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
25010 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20  r->op!=TK_NE || 
25020 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61  op==OP_Eq );.  a
25030 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
25040 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_EQ || op==O
25050 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ne );.  assert
25060 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
25070 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20  LT || op==OP_Ge 
25080 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
25090 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c  pr->op!=TK_LE ||
250a0 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20   op==OP_Gt );.  
250b0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
250c0 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d  p!=TK_GT || op==
250d0 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Le );.  asser
250e0 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
250f0 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74  _GE || op==OP_Lt
25100 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70   );..  switch( p
25110 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
25120 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
25130 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
25140 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
25150 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
25160 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
25170 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
25180 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
25190 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
251a0 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
251b0 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
251c0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
251d0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
251e0 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
251f0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
25200 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
25210 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
25220 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
25230 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b     case TK_OR: {
25240 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20  .      int d2 = 
25250 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
25260 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74  abel(v);.      t
25270 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
25280 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
25290 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
252a0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
252b0 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70  >pLeft, d2, jump
252c0 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55  IfNull^SQLITE_JU
252d0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
252e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
252f0 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
25300 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
25310 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
25320 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
25330 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
25340 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
25350 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
25360 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71  v, d2);.      sq
25370 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
25380 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
25390 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
253a0 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
253b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
253c0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
253d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
253e0 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
253f0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
25400 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
25410 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
25420 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
25430 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IS:.    case T
25440 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74  K_ISNOT:.      t
25450 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
25460 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
25470 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
25480 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
25490 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28   );.      op = (
254a0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
254b0 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45  ) ? TK_NE : TK_E
254c0 51 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49 66 4e  Q;.      jumpIfN
254d0 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c  ull = SQLITE_NUL
254e0 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61  LEQ;.      /* Fa
254f0 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63  ll thru */.    c
25500 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
25510 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
25520 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
25530 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
25540 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
25550 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
25560 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
25570 70 72 49 73 56 65 63 74 6f 72 28 70 45 78 70 72  prIsVector(pExpr
25580 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f 74 6f 20  ->pLeft) ) goto 
25590 64 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20  default_expr;.  
255a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
255b0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
255c0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
255d0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
255e0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
255f0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
25600 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
25610 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
25620 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
25630 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
25640 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
25650 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
25660 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
25670 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
25680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
25690 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d  1, r2, dest, jum
256a0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
256b0 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50  assert(TK_LT==OP
256c0 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Lt); testcase(o
256d0 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43  p==OP_Lt); VdbeC
256e0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
256f0 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73  OP_Lt);.      as
25700 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c  sert(TK_LE==OP_L
25710 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
25720 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Le); VdbeCov
25730 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
25740 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Le);.      asse
25750 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29  rt(TK_GT==OP_Gt)
25760 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
25770 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Gt); VdbeCover
25780 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
25790 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
257a0 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20  (TK_GE==OP_Ge); 
257b0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
257c0 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
257d0 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
257e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
257f0 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65  K_EQ==OP_Eq); te
25800 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71  stcase(op==OP_Eq
25810 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
25820 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
25830 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Eq && jumpIfNu
25840 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll!=SQLITE_NULLE
25850 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
25860 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
25870 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Eq && jumpIfN
25880 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull==SQLITE_NULL
25890 45 51 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  EQ);.      asser
258a0 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b  t(TK_NE==OP_Ne);
258b0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
258c0 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _Ne);.      Vdbe
258d0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
258e0 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49  ==OP_Ne && jumpI
258f0 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55  fNull!=SQLITE_NU
25900 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62  LLEQ);.      Vdb
25910 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
25920 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70  p==OP_Ne && jump
25930 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e  IfNull==SQLITE_N
25940 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65  ULLEQ);.      te
25950 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
25960 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
25970 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
25980 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
25990 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
259a0 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
259b0 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
259c0 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  : {.      r1 = s
259d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
259e0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
259f0 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
25a00 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e1);.      sqlit
25a10 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
25a20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20  op, r1, dest);. 
25a30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
25a40 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20  p==TK_ISNULL ); 
25a50 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
25a60 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  (v, op==TK_ISNUL
25a70 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  L);.      testca
25a80 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  se( op==TK_NOTNU
25a90 4c 4c 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72  LL );  VdbeCover
25aa0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
25ab0 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  NOTNULL);.      
25ac0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
25ad0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e1==0 );.      b
25ae0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
25af0 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
25b00 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
25b10 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
25b20 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f   );.      exprCo
25b30 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65  deBetween(pParse
25b40 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 73  , pExpr, dest, s
25b50 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
25b60 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  e, jumpIfNull);.
25b70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25b80 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
25b90 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
25ba0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
25bb0 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 75 6d 70  {.      if( jump
25bc0 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  IfNull ){.      
25bd0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
25be0 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70  eIN(pParse, pExp
25bf0 72 2c 20 64 65 73 74 2c 20 64 65 73 74 29 3b 0a  r, dest, dest);.
25c00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
25c10 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
25c20 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ull = sqlite3Vdb
25c30 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
25c40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
25c50 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
25c60 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65   pExpr, dest, de
25c70 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
25c80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
25c90 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
25ca0 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
25cb0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
25cc0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
25cd0 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
25ce0 64 65 66 61 75 6c 74 5f 65 78 70 72 3a 20 0a 20  default_expr: . 
25cf0 20 20 20 20 20 69 66 28 20 65 78 70 72 41 6c 77       if( exprAlw
25d00 61 79 73 46 61 6c 73 65 28 70 45 78 70 72 29 20  aysFalse(pExpr) 
25d10 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
25d20 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65  e3VdbeGoto(v, de
25d30 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
25d40 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 54   if( exprAlwaysT
25d50 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  rue(pExpr) ){.  
25d60 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a        /* no-op *
25d70 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  /.      }else{. 
25d80 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
25d90 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
25da0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26  pParse, pExpr, &
25db0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
25dc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
25dd0 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp3(v, OP_IfNot
25de0 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r1, dest, jump
25df0 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20  IfNull!=0);.    
25e00 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
25e10 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  (v);.        tes
25e20 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
25e30 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
25e40 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
25e50 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  ll==0 );.      }
25e60 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
25e70 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
25e80 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
25e90 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
25ea0 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
25eb0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
25ec0 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a  e, regFree2);.}.
25ed0 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69  ./*.** Like sqli
25ee0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 29  te3ExprIfFalse()
25ef0 20 65 78 63 65 70 74 20 74 68 61 74 20 61 20 63   except that a c
25f00 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 70  opy is made of p
25f10 45 78 70 72 20 62 65 66 6f 72 65 0a 2a 2a 20 63  Expr before.** c
25f20 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2c 20  ode generation, 
25f30 61 6e 64 20 74 68 61 74 20 63 6f 70 79 20 69 73  and that copy is
25f40 20 64 65 6c 65 74 65 64 20 61 66 74 65 72 20 63   deleted after c
25f50 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20  ode generation. 
25f60 54 68 69 73 0a 2a 2a 20 65 6e 73 75 72 65 73 20  This.** ensures 
25f70 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
25f80 6c 20 70 45 78 70 72 20 69 73 20 75 6e 63 68 61  l pExpr is uncha
25f90 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  nged..*/.void sq
25fa0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
25fb0 44 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  Dup(Parse *pPars
25fc0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
25fd0 69 6e 74 20 64 65 73 74 2c 69 6e 74 20 6a 75 6d  int dest,int jum
25fe0 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 73 71 6c 69  pIfNull){.  sqli
25ff0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
26000 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 43  ->db;.  Expr *pC
26010 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  opy = sqlite3Exp
26020 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20  rDup(db, pExpr, 
26030 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  0);.  if( db->ma
26040 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b  llocFailed==0 ){
26050 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
26060 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
26070 70 43 6f 70 79 2c 20 64 65 73 74 2c 20 6a 75 6d  pCopy, dest, jum
26080 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20  pIfNull);.  }.  
26090 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
260a0 65 28 64 62 2c 20 70 43 6f 70 79 29 3b 0a 7d 0a  e(db, pCopy);.}.
260b0 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65  ../*.** Do a dee
260c0 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20  p comparison of 
260d0 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74  two expression t
260e0 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 30 20  rees.  Return 0 
260f0 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78  if the two.** ex
26100 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 63 6f  pressions are co
26110 6d 70 6c 65 74 65 6c 79 20 69 64 65 6e 74 69 63  mpletely identic
26120 61 6c 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  al.  Return 1 if
26130 20 74 68 65 79 20 64 69 66 66 65 72 20 6f 6e 6c   they differ onl
26140 79 0a 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41 54  y.** by a COLLAT
26150 45 20 6f 70 65 72 61 74 6f 72 20 61 74 20 74 68  E operator at th
26160 65 20 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52 65  e top level.  Re
26170 74 75 72 6e 20 32 20 69 66 20 74 68 65 72 65 20  turn 2 if there 
26180 61 72 65 20 64 69 66 66 65 72 65 6e 63 65 73 0a  are differences.
26190 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ** other than th
261a0 65 20 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c  e top-level COLL
261b0 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  ATE operator..**
261c0 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c  .** If any subel
261d0 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20  ement of pB has 
261e0 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31  Expr.iTable==(-1
261f0 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c  ) then it is all
26200 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61  owed.** to compa
26210 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65  re equal to an e
26220 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e  quivalent elemen
26230 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70  t in pA with Exp
26240 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a  r.iTable==iTab..
26250 2a 2a 0a 2a 2a 20 54 68 65 20 70 41 20 73 69 64  **.** The pA sid
26260 65 20 6d 69 67 68 74 20 62 65 20 75 73 69 6e 67  e might be using
26270 20 54 4b 5f 52 45 47 49 53 54 45 52 2e 20 20 49   TK_REGISTER.  I
26280 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61  f that is the ca
26290 73 65 20 61 6e 64 20 70 42 20 69 73 0a 2a 2a 20  se and pB is.** 
262a0 6e 6f 74 20 75 73 69 6e 67 20 54 4b 5f 52 45 47  not using TK_REG
262b0 49 53 54 45 52 20 62 75 74 20 69 73 20 6f 74 68  ISTER but is oth
262c0 65 72 77 69 73 65 20 65 71 75 69 76 61 6c 65 6e  erwise equivalen
262d0 74 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65  t, then still re
262e0 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f  turn 0..**.** So
262f0 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75  metimes this rou
26300 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
26310 20 32 20 65 76 65 6e 20 69 66 20 74 68 65 20 74   2 even if the t
26320 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  wo expressions.*
26330 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75  * really are equ
26340 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20  ivalent.  If we 
26350 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61  cannot prove tha
26360 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
26370 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63  s are.** identic
26380 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32 20  al, we return 2 
26390 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e  just to be safe.
263a0 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75    So if this rou
263b0 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
263c0 32 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e  2, then you do n
263d0 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66  ot really know f
263e0 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20 74 68  or certain if th
263f0 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73  e two.** express
26400 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d  ions are the sam
26410 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20 67  e.  But if you g
26420 65 74 20 61 20 30 20 6f 72 20 31 20 72 65 74 75  et a 0 or 1 retu
26430 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20  rn, then you.** 
26440 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 65 20  can be sure the 
26450 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
26460 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68  the same.  In th
26470 65 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a  e places where.*
26480 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
26490 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20  s used, it does 
264a0 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74 20  not hurt to get 
264b0 61 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68 61  an extra 2 - tha
264c0 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20  t.** just might 
264d0 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73  result in some s
264e0 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63  lightly slower c
264f0 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e  ode.  But return
26500 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72  ing.** an incorr
26510 65 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c 64  ect 0 or 1 could
26520 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75   lead to a malfu
26530 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
26540 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
26550 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72  e(Expr *pA, Expr
26560 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b   *pB, int iTab){
26570 0a 20 20 75 33 32 20 63 6f 6d 62 69 6e 65 64 46  .  u32 combinedF
26580 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 41 3d 3d  lags;.  if( pA==
26590 30 20 7c 7c 20 70 42 3d 3d 30 20 29 7b 0a 20 20  0 || pB==0 ){.  
265a0 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 20    return pB==pA 
265b0 3f 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20 63  ? 0 : 2;.  }.  c
265c0 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 3d 20 70  ombinedFlags = p
265d0 41 2d 3e 66 6c 61 67 73 20 7c 20 70 42 2d 3e 66  A->flags | pB->f
265e0 6c 61 67 73 3b 0a 20 20 69 66 28 20 63 6f 6d 62  lags;.  if( comb
265f0 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 49  inedFlags & EP_I
26600 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69  ntValue ){.    i
26610 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 26 70 42  f( (pA->flags&pB
26620 2d 3e 66 6c 61 67 73 26 45 50 5f 49 6e 74 56 61  ->flags&EP_IntVa
26630 6c 75 65 29 21 3d 30 20 26 26 20 70 41 2d 3e 75  lue)!=0 && pA->u
26640 2e 69 56 61 6c 75 65 3d 3d 70 42 2d 3e 75 2e 69  .iValue==pB->u.i
26650 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 72  Value ){.      r
26660 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
26670 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
26680 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70  .  if( pA->op!=p
26690 42 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 69 66 28  B->op ){.    if(
266a0 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   pA->op==TK_COLL
266b0 41 54 45 20 26 26 20 73 71 6c 69 74 65 33 45 78  ATE && sqlite3Ex
266c0 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c  prCompare(pA->pL
266d0 65 66 74 2c 20 70 42 2c 20 69 54 61 62 29 3c 32  eft, pB, iTab)<2
266e0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
266f0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
26700 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pB->op==TK_COL
26710 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33 45  LATE && sqlite3E
26720 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2c 20 70  xprCompare(pA, p
26730 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3c  B->pLeft, iTab)<
26740 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  2 ){.      retur
26750 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  n 1;.    }.    r
26760 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69  eturn 2;.  }.  i
26770 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  f( pA->op!=TK_CO
26780 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 6f 70 21 3d  LUMN && pA->op!=
26790 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 26 26  TK_AGG_COLUMN &&
267a0 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b   pA->u.zToken ){
267b0 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d  .    if( pA->op=
267c0 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a  =TK_FUNCTION ){.
267d0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
267e0 33 53 74 72 49 43 6d 70 28 70 41 2d 3e 75 2e 7a  3StrICmp(pA->u.z
267f0 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b  Token,pB->u.zTok
26800 65 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20  en)!=0 ) return 
26810 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  2;.    }else if(
26820 20 73 74 72 63 6d 70 28 70 41 2d 3e 75 2e 7a 54   strcmp(pA->u.zT
26830 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65  oken,pB->u.zToke
26840 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  n)!=0 ){.      r
26850 65 74 75 72 6e 20 70 41 2d 3e 6f 70 3d 3d 54 4b  eturn pA->op==TK
26860 5f 43 4f 4c 4c 41 54 45 20 3f 20 31 20 3a 20 32  _COLLATE ? 1 : 2
26870 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
26880 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45  ( (pA->flags & E
26890 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42  P_Distinct)!=(pB
268a0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
268b0 74 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20  tinct) ) return 
268c0 32 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  2;.  if( ALWAYS(
268d0 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26  (combinedFlags &
268e0 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d   EP_TokenOnly)==
268f0 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20 63 6f  0) ){.    if( co
26900 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
26910 5f 78 49 73 53 65 6c 65 63 74 20 29 20 72 65 74  _xIsSelect ) ret
26920 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73  urn 2;.    if( s
26930 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
26940 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d  e(pA->pLeft, pB-
26950 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 20 29 20  >pLeft, iTab) ) 
26960 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
26970 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
26980 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c  pare(pA->pRight,
26990 20 70 42 2d 3e 70 52 69 67 68 74 2c 20 69 54 61   pB->pRight, iTa
269a0 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  b) ) return 2;. 
269b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
269c0 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 41  prListCompare(pA
269d0 2d 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d 3e 78  ->x.pList, pB->x
269e0 2e 70 4c 69 73 74 2c 20 69 54 61 62 29 20 29 20  .pList, iTab) ) 
269f0 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
26a00 28 20 41 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e  ( ALWAYS((combin
26a10 65 64 46 6c 61 67 73 20 26 20 45 50 5f 52 65 64  edFlags & EP_Red
26a20 75 63 65 64 29 3d 3d 30 29 20 26 26 20 70 41 2d  uced)==0) && pA-
26a30 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47 20 29  >op!=TK_STRING )
26a40 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e  {.      if( pA->
26a50 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f  iColumn!=pB->iCo
26a60 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 32 3b  lumn ) return 2;
26a70 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e 69  .      if( pA->i
26a80 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c  Table!=pB->iTabl
26a90 65 20 0a 20 20 20 20 20 20 20 26 26 20 28 70 41  e .       && (pA
26aa0 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c  ->iTable!=iTab |
26ab0 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69 54 61 62  | NEVER(pB->iTab
26ac0 6c 65 3e 3d 30 29 29 20 29 20 72 65 74 75 72 6e  le>=0)) ) return
26ad0 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   2;.    }.  }.  
26ae0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
26af0 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 45  ** Compare two E
26b00 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 2e  xprList objects.
26b10 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68    Return 0 if th
26b20 65 79 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  ey are identical
26b30 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72   and .** non-zer
26b40 6f 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72  o if they differ
26b50 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a   in any way..**.
26b60 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c 65  ** If any subele
26b70 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20 45  ment of pB has E
26b80 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29  xpr.iTable==(-1)
26b90 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f   then it is allo
26ba0 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72  wed.** to compar
26bb0 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65 71  e equal to an eq
26bc0 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74  uivalent element
26bd0 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70 72   in pA with Expr
26be0 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a  .iTable==iTab..*
26bf0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
26c00 65 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 6e  e might return n
26c10 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71 75 69  on-zero for equi
26c20 76 61 6c 65 6e 74 20 45 78 70 72 4c 69 73 74 73  valent ExprLists
26c30 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63  .  The.** only c
26c40 6f 6e 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 20  onsequence will 
26c50 62 65 20 64 69 73 61 62 6c 65 64 20 6f 70 74 69  be disabled opti
26c60 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75 74 20  mizations.  But 
26c70 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
26c80 6d 75 73 74 20 6e 65 76 65 72 20 72 65 74 75 72  must never retur
26c90 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 20 45  n 0 if the two E
26ca0 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 20  xprList objects 
26cb0 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20 6f  are different, o
26cc0 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63 74 69  r.** a malfuncti
26cd0 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 2e 0a  on will result..
26ce0 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 70  **.** Two NULL p
26cf0 6f 69 6e 74 65 72 73 20 61 72 65 20 63 6f 6e 73  ointers are cons
26d00 69 64 65 72 65 64 20 74 6f 20 62 65 20 74 68 65  idered to be the
26d10 20 73 61 6d 65 2e 20 20 42 75 74 20 61 20 4e 55   same.  But a NU
26d20 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 61 6c  LL pointer.** al
26d30 77 61 79 73 20 64 69 66 66 65 72 73 20 66 72 6f  ways differs fro
26d40 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69  m a non-NULL poi
26d50 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nter..*/.int sql
26d60 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
26d70 61 72 65 28 45 78 70 72 4c 69 73 74 20 2a 70 41  are(ExprList *pA
26d80 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 42 2c 20  , ExprList *pB, 
26d90 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 6e 74  int iTab){.  int
26da0 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20   i;.  if( pA==0 
26db0 26 26 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72  && pB==0 ) retur
26dc0 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30  n 0;.  if( pA==0
26dd0 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72 65 74 75   || pB==0 ) retu
26de0 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 41 2d 3e  rn 1;.  if( pA->
26df0 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45 78 70 72  nExpr!=pB->nExpr
26e00 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66   ) return 1;.  f
26e10 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 6e 45  or(i=0; i<pA->nE
26e20 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
26e30 78 70 72 20 2a 70 45 78 70 72 41 20 3d 20 70 41  xpr *pExprA = pA
26e40 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
26e50 20 20 45 78 70 72 20 2a 70 45 78 70 72 42 20 3d    Expr *pExprB =
26e60 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b   pB->a[i].pExpr;
26e70 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 61 5b 69  .    if( pA->a[i
26e80 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d 70 42 2d  ].sortOrder!=pB-
26e90 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[i].sortOrder 
26ea0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
26eb0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
26ec0 6f 6d 70 61 72 65 28 70 45 78 70 72 41 2c 20 70  ompare(pExprA, p
26ed0 45 78 70 72 42 2c 20 69 54 61 62 29 20 29 20 72  ExprB, iTab) ) r
26ee0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
26ef0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
26f00 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
26f10 20 77 65 20 63 61 6e 20 70 72 6f 76 65 20 74 68   we can prove th
26f20 65 20 70 45 32 20 77 69 6c 6c 20 61 6c 77 61 79  e pE2 will alway
26f30 73 20 62 65 20 74 72 75 65 20 69 66 20 70 45 31  s be true if pE1
26f40 20 69 73 0a 2a 2a 20 74 72 75 65 2e 20 20 52 65   is.** true.  Re
26f50 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 77 65  turn false if we
26f60 20 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   cannot complete
26f70 20 74 68 65 20 70 72 6f 6f 66 20 6f 72 20 69 66   the proof or if
26f80 20 70 45 32 20 6d 69 67 68 74 0a 2a 2a 20 62 65   pE2 might.** be
26f90 20 66 61 6c 73 65 2e 20 20 45 78 61 6d 70 6c 65   false.  Example
26fa0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 45 31  s:.**.**     pE1
26fb0 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 70 45 32  : x==5       pE2
26fc0 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20  : x==5          
26fd0 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a     Result: true.
26fe0 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3e 30 20  **     pE1: x>0 
26ff0 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35         pE2: x==5
27000 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65 73               Res
27010 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20  ult: false.**   
27020 20 20 70 45 31 3a 20 78 3d 32 31 20 20 20 20 20    pE1: x=21     
27030 20 20 70 45 32 3a 20 78 3d 32 31 20 4f 52 20 79    pE2: x=21 OR y
27040 3d 34 33 20 20 20 20 20 52 65 73 75 6c 74 3a 20  =43     Result: 
27050 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  true.**     pE1:
27060 20 78 21 3d 31 32 33 20 20 20 20 20 70 45 32 3a   x!=123     pE2:
27070 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20   x IS NOT NULL  
27080 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a    Result: true.*
27090 2a 20 20 20 20 20 70 45 31 3a 20 78 21 3d 3f 31  *     pE1: x!=?1
270a0 20 20 20 20 20 20 70 45 32 3a 20 78 20 49 53 20        pE2: x IS 
270b0 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75  NOT NULL    Resu
270c0 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20  lt: true.**     
270d0 70 45 31 3a 20 78 20 49 53 20 4e 55 4c 4c 20 20  pE1: x IS NULL  
270e0 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55  pE2: x IS NOT NU
270f0 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61  LL    Result: fa
27100 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  lse.**     pE1: 
27110 78 20 49 53 20 3f 32 20 20 20 20 70 45 32 3a 20  x IS ?2    pE2: 
27120 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  x IS NOT NULL   
27130 20 52 65 75 73 6c 74 3a 20 66 61 6c 73 65 0a 2a   Reuslt: false.*
27140 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 61 72  *.** When compar
27150 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f  ing TK_COLUMN no
27160 64 65 73 20 62 65 74 77 65 65 6e 20 70 45 31 20  des between pE1 
27170 61 6e 64 20 70 45 32 2c 20 69 66 20 70 45 32 20  and pE2, if pE2 
27180 68 61 73 0a 2a 2a 20 45 78 70 72 2e 69 54 61 62  has.** Expr.iTab
27190 6c 65 3c 30 20 74 68 65 6e 20 61 73 73 75 6d 65  le<0 then assume
271a0 20 61 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20   a table number 
271b0 67 69 76 65 6e 20 62 79 20 69 54 61 62 2e 0a 2a  given by iTab..*
271c0 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e 20 64 6f 75  *.** When in dou
271d0 62 74 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65  bt, return false
271e0 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 74 72 75  .  Returning tru
271f0 65 20 6d 69 67 68 74 20 67 69 76 65 20 61 20 70  e might give a p
27200 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d  erformance.** im
27210 70 72 6f 76 65 6d 65 6e 74 2e 20 20 52 65 74 75  provement.  Retu
27220 72 6e 69 6e 67 20 66 61 6c 73 65 20 6d 69 67 68  rning false migh
27230 74 20 63 61 75 73 65 20 61 20 70 65 72 66 6f 72  t cause a perfor
27240 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2c  mance reduction,
27250 20 62 75 74 0a 2a 2a 20 69 74 20 77 69 6c 6c 20   but.** it will 
27260 61 6c 77 61 79 73 20 67 69 76 65 20 74 68 65 20  always give the 
27270 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 61  correct answer a
27280 6e 64 20 69 73 20 68 65 6e 63 65 20 61 6c 77 61  nd is hence alwa
27290 79 73 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20  ys safe..*/.int 
272a0 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69  sqlite3ExprImpli
272b0 65 73 45 78 70 72 28 45 78 70 72 20 2a 70 45 31  esExpr(Expr *pE1
272c0 2c 20 45 78 70 72 20 2a 70 45 32 2c 20 69 6e 74  , Expr *pE2, int
272d0 20 69 54 61 62 29 7b 0a 20 20 69 66 28 20 73 71   iTab){.  if( sq
272e0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
272f0 28 70 45 31 2c 20 70 45 32 2c 20 69 54 61 62 29  (pE1, pE2, iTab)
27300 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
27310 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 1;.  }.  if( p
27320 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20 20  E2->op==TK_OR.  
27330 20 26 26 20 28 73 71 6c 69 74 65 33 45 78 70 72   && (sqlite3Expr
27340 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45 31 2c  ImpliesExpr(pE1,
27350 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61   pE2->pLeft, iTa
27360 62 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b).             
27370 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d  || sqlite3ExprIm
27380 70 6c 69 65 73 45 78 70 72 28 70 45 31 2c 20 70  pliesExpr(pE1, p
27390 45 32 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62  E2->pRight, iTab
273a0 29 20 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ) ).  ){.    ret
273b0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
273c0 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54   pE2->op==TK_NOT
273d0 4e 55 4c 4c 0a 20 20 20 26 26 20 73 71 6c 69 74  NULL.   && sqlit
273e0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45  e3ExprCompare(pE
273f0 31 2d 3e 70 4c 65 66 74 2c 20 70 45 32 2d 3e 70  1->pLeft, pE2->p
27400 4c 65 66 74 2c 20 69 54 61 62 29 3d 3d 30 0a 20  Left, iTab)==0. 
27410 20 20 26 26 20 28 70 45 31 2d 3e 6f 70 21 3d 54    && (pE1->op!=T
27420 4b 5f 49 53 4e 55 4c 4c 20 26 26 20 70 45 31 2d  K_ISNULL && pE1-
27430 3e 6f 70 21 3d 54 4b 5f 49 53 29 0a 20 20 29 7b  >op!=TK_IS).  ){
27440 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
27450 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
27460 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
27470 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
27480 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69  wing structure i
27490 73 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72  s used by the tr
274a0 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20  ee walker.** to 
274b0 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20  determine if an 
274c0 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62  expression can b
274d0 65 20 65 76 61 6c 75 61 74 65 64 20 62 79 20 72  e evaluated by r
274e0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a  eference to the.
274f0 2a 2a 20 69 6e 64 65 78 20 6f 6e 6c 79 2c 20 77  ** index only, w
27500 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
27510 20 64 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72   do a search for
27520 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
27530 6e 67 0a 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72  ng.** table entr
27540 79 2e 20 20 54 68 65 20 49 64 78 43 6f 76 65 72  y.  The IdxCover
27550 2e 70 49 64 78 20 66 69 65 6c 64 20 69 73 20 74  .pIdx field is t
27560 68 65 20 69 6e 64 65 78 2e 20 20 49 64 78 43 6f  he index.  IdxCo
27570 76 65 72 2e 69 43 75 72 0a 2a 2a 20 69 73 20 74  ver.iCur.** is t
27580 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  he cursor for th
27590 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75  e table..*/.stru
275a0 63 74 20 49 64 78 43 6f 76 65 72 20 7b 0a 20 20  ct IdxCover {.  
275b0 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
275c0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f   /* The index to
275d0 20 62 65 20 74 65 73 74 65 64 20 66 6f 72 20 63   be tested for c
275e0 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 69 6e 74  overage */.  int
275f0 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 2f 2a   iCur;        /*
27600 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   Cursor number f
27610 6f 72 20 74 68 65 20 74 61 62 6c 65 20 63 6f 72  or the table cor
27620 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
27630 65 20 69 6e 64 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f  e index */.};../
27640 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
27650 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 72  e if there are r
27660 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
27670 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 0a 2a  umns in table .*
27680 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64  * pWalker->u.pId
27690 78 43 6f 76 65 72 2d 3e 69 43 75 72 20 63 61 6e  xCover->iCur can
276a0 20 62 65 20 73 61 74 69 73 66 69 65 64 20 75 73   be satisfied us
276b0 69 6e 67 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a  ing the index.**
276c0 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78   pWalker->u.pIdx
276d0 43 6f 76 65 72 2d 3e 70 49 64 78 2e 0a 2a 2f 0a  Cover->pIdx..*/.
276e0 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 49  static int exprI
276f0 64 78 43 6f 76 65 72 28 57 61 6c 6b 65 72 20 2a  dxCover(Walker *
27700 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
27710 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78  Expr){.  if( pEx
27720 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
27730 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69  N.   && pExpr->i
27740 54 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e  Table==pWalker->
27750 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75  u.pIdxCover->iCu
27760 72 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 43  r.   && sqlite3C
27770 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 57 61  olumnOfIndex(pWa
27780 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65  lker->u.pIdxCove
27790 72 2d 3e 70 49 64 78 2c 20 70 45 78 70 72 2d 3e  r->pIdx, pExpr->
277a0 69 43 6f 6c 75 6d 6e 29 3c 30 0a 20 20 29 7b 0a  iColumn)<0.  ){.
277b0 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
277c0 64 65 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  de = 1;.    retu
277d0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
277e0 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
277f0 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
27800 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61  * Determine if a
27810 6e 20 69 6e 64 65 78 20 70 49 64 78 20 6f 6e 20  n index pIdx on 
27820 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f  table with curso
27830 72 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20  r iCur contains 
27840 77 69 6c 6c 0a 2a 2a 20 74 68 65 20 65 78 70 72  will.** the expr
27850 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52  ession pExpr.  R
27860 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
27870 65 20 69 6e 64 65 78 20 64 6f 65 73 20 63 6f 76  e index does cov
27880 65 72 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  er the.** expres
27890 73 69 6f 6e 20 61 6e 64 20 66 61 6c 73 65 20 69  sion and false i
278a0 66 20 74 68 65 20 70 45 78 70 72 20 65 78 70 72  f the pExpr expr
278b0 65 73 73 69 6f 6e 20 72 65 66 65 72 65 6e 63 65  ession reference
278c0 73 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 0a  s table columns.
278d0 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  ** that are not 
278e0 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 69 6e 64  found in the ind
278f0 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 41  ex pIdx..**.** A
27900 6e 20 69 6e 64 65 78 20 63 6f 76 65 72 69 6e 67  n index covering
27910 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d   an expression m
27920 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 65 78  eans that the ex
27930 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 0a  pression can be.
27940 2a 2a 20 65 76 61 6c 75 61 74 65 64 20 75 73 69  ** evaluated usi
27950 6e 67 20 6f 6e 6c 79 20 74 68 65 20 69 6e 64 65  ng only the inde
27960 78 20 61 6e 64 20 77 69 74 68 6f 75 74 20 68 61  x and without ha
27970 76 69 6e 67 20 74 6f 20 6c 6f 6f 6b 75 70 20 74  ving to lookup t
27980 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  he.** correspond
27990 69 6e 67 20 74 61 62 6c 65 20 65 6e 74 72 79 2e  ing table entry.
279a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
279b0 78 70 72 43 6f 76 65 72 65 64 42 79 49 6e 64 65  xprCoveredByInde
279c0 78 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  x(.  Expr *pExpr
279d0 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
279e0 69 6e 64 65 78 20 74 6f 20 62 65 20 74 65 73 74  index to be test
279f0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  ed */.  int iCur
27a00 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
27a10 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
27a20 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70   for the corresp
27a30 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a  onding table */.
27a40 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
27a50 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
27a60 65 78 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  ex that might be
27a70 20 75 73 65 64 20 66 6f 72 20 63 6f 76 65 72 61   used for covera
27a80 67 65 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65  ge */.){.  Walke
27a90 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20 49 64  r w;.  struct Id
27aa0 78 43 6f 76 65 72 20 78 63 6f 76 3b 0a 20 20 6d  xCover xcov;.  m
27ab0 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
27ac0 65 6f 66 28 77 29 29 3b 0a 20 20 78 63 6f 76 2e  eof(w));.  xcov.
27ad0 69 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 78  iCur = iCur;.  x
27ae0 63 6f 76 2e 70 49 64 78 20 3d 20 70 49 64 78 3b  cov.pIdx = pIdx;
27af0 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
27b00 63 6b 20 3d 20 65 78 70 72 49 64 78 43 6f 76 65  ck = exprIdxCove
27b10 72 3b 0a 20 20 77 2e 75 2e 70 49 64 78 43 6f 76  r;.  w.u.pIdxCov
27b20 65 72 20 3d 20 26 78 63 6f 76 3b 0a 20 20 73 71  er = &xcov;.  sq
27b30 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
27b40 2c 20 70 45 78 70 72 29 3b 0a 20 20 72 65 74 75  , pExpr);.  retu
27b50 72 6e 20 21 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a  rn !w.eCode;.}..
27b60 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
27b70 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
27b80 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
27b90 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72 65   used by the tre
27ba0 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63  e walker.** to c
27bb0 6f 75 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20  ount references 
27bc0 74 6f 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  to table columns
27bd0 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
27be0 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 61 67 67 72  s of an .** aggr
27bf0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20  egate function, 
27c00 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c  in order to impl
27c10 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 73 71 6c  ement the.** sql
27c20 69 74 65 33 46 75 6e 63 74 69 6f 6e 54 68 69 73  ite3FunctionThis
27c30 53 72 63 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a  Src() routine..*
27c40 2f 0a 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e  /.struct SrcCoun
27c50 74 20 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  t {.  SrcList *p
27c60 53 72 63 3b 20 20 20 2f 2a 20 4f 6e 65 20 70 61  Src;   /* One pa
27c70 72 74 69 63 75 6c 61 72 20 46 52 4f 4d 20 63 6c  rticular FROM cl
27c80 61 75 73 65 20 69 6e 20 61 20 6e 65 73 74 65 64  ause in a nested
27c90 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
27ca0 6e 54 68 69 73 3b 20 20 20 20 20 20 20 2f 2a 20  nThis;       /* 
27cb0 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  Number of refere
27cc0 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20  nces to columns 
27cd0 69 6e 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20  in pSrcList */. 
27ce0 20 69 6e 74 20 6e 4f 74 68 65 72 3b 20 20 20 20   int nOther;    
27cf0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
27d00 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
27d10 75 6d 6e 73 20 69 6e 20 6f 74 68 65 72 20 46 52  umns in other FR
27d20 4f 4d 20 63 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b  OM clauses */.};
27d30 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68  ../*.** Count th
27d40 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
27d50 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e  rences to column
27d60 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
27d70 20 65 78 70 72 53 72 63 43 6f 75 6e 74 28 57 61   exprSrcCount(Wa
27d80 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
27d90 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 2f  xpr *pExpr){.  /
27da0 2a 20 54 68 65 20 4e 45 56 45 52 28 29 20 6f 6e  * The NEVER() on
27db0 20 74 68 65 20 73 65 63 6f 6e 64 20 74 65 72 6d   the second term
27dc0 20 69 73 20 62 65 63 61 75 73 65 20 73 71 6c 69   is because sqli
27dd0 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54  te3FunctionUsesT
27de0 68 69 73 53 72 63 28 29 0a 20 20 2a 2a 20 69 73  hisSrc().  ** is
27df0 20 61 6c 77 61 79 73 20 63 61 6c 6c 65 64 20 62   always called b
27e00 65 66 6f 72 65 20 73 71 6c 69 74 65 33 45 78 70  efore sqlite3Exp
27e10 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
27e20 65 73 28 29 20 61 6e 64 20 73 6f 20 74 68 65 0a  es() and so the.
27e30 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20    ** TK_COLUMNs 
27e40 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65  have not yet bee
27e50 6e 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  n converted into
27e60 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20   TK_AGG_COLUMN. 
27e70 20 49 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   If.  ** sqlite3
27e80 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73  FunctionUsesThis
27e90 53 72 63 28 29 20 69 73 20 75 73 65 64 20 64 69  Src() is used di
27ea0 66 66 65 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  fferently in the
27eb0 20 66 75 74 75 72 65 2c 20 74 68 65 0a 20 20 2a   future, the.  *
27ec0 2a 20 4e 45 56 45 52 28 29 20 77 69 6c 6c 20 6e  * NEVER() will n
27ed0 65 65 64 20 74 6f 20 62 65 20 72 65 6d 6f 76 65  eed to be remove
27ee0 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  d. */.  if( pExp
27ef0 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
27f00 20 7c 7c 20 4e 45 56 45 52 28 70 45 78 70 72 2d   || NEVER(pExpr-
27f10 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
27f20 4d 4e 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  MN) ){.    int i
27f30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  ;.    struct Src
27f40 43 6f 75 6e 74 20 2a 70 20 3d 20 70 57 61 6c 6b  Count *p = pWalk
27f50 65 72 2d 3e 75 2e 70 53 72 63 43 6f 75 6e 74 3b  er->u.pSrcCount;
27f60 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53  .    SrcList *pS
27f70 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
27f80 20 20 69 6e 74 20 6e 53 72 63 20 3d 20 70 53 72    int nSrc = pSr
27f90 63 20 3f 20 70 53 72 63 2d 3e 6e 53 72 63 20 3a  c ? pSrc->nSrc :
27fa0 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
27fb0 20 69 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20   i<nSrc; i++){. 
27fc0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
27fd0 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b  iTable==pSrc->a[
27fe0 69 5d 2e 69 43 75 72 73 6f 72 20 29 20 62 72 65  i].iCursor ) bre
27ff0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
28000 28 20 69 3c 6e 53 72 63 20 29 7b 0a 20 20 20 20  ( i<nSrc ){.    
28010 20 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20    p->nThis++;.  
28020 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
28030 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20 20 20  ->nOther++;.    
28040 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  }.  }.  return W
28050 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
28060 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
28070 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 61 72  if any of the ar
28080 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 70  guments to the p
28090 45 78 70 72 20 46 75 6e 63 74 69 6f 6e 20 72 65  Expr Function re
280a0 66 65 72 65 6e 63 65 0a 2a 2a 20 70 53 72 63 4c  ference.** pSrcL
280b0 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75  ist.  Return tru
280c0 65 20 69 66 20 74 68 65 79 20 64 6f 2e 20 20 41  e if they do.  A
280d0 6c 73 6f 20 72 65 74 75 72 6e 20 74 72 75 65 20  lso return true 
280e0 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a  if the function.
280f0 2a 2a 20 68 61 73 20 6e 6f 20 61 72 67 75 6d 65  ** has no argume
28100 6e 74 73 20 6f 72 20 68 61 73 20 6f 6e 6c 79 20  nts or has only 
28110 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e  constant argumen
28120 74 73 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73  ts.  Return fals
28130 65 20 69 66 20 70 45 78 70 72 0a 2a 2a 20 72 65  e if pExpr.** re
28140 66 65 72 65 6e 63 65 73 20 63 6f 6c 75 6d 6e 73  ferences columns
28150 20 62 75 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73   but not columns
28160 20 6f 66 20 74 61 62 6c 65 73 20 66 6f 75 6e 64   of tables found
28170 20 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2f   in pSrcList..*/
28180 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 75 6e 63  .int sqlite3Func
28190 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28  tionUsesThisSrc(
281a0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53 72 63  Expr *pExpr, Src
281b0 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 29 7b  List *pSrcList){
281c0 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73  .  Walker w;.  s
281d0 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 63  truct SrcCount c
281e0 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  nt;.  assert( pE
281f0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
28200 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 6d 65  FUNCTION );.  me
28210 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
28220 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70  of(w));.  w.xExp
28230 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
28240 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77 2e 75 2e  SrcCount;.  w.u.
28250 70 53 72 63 43 6f 75 6e 74 20 3d 20 26 63 6e 74  pSrcCount = &cnt
28260 3b 0a 20 20 63 6e 74 2e 70 53 72 63 20 3d 20 70  ;.  cnt.pSrc = p
28270 53 72 63 4c 69 73 74 3b 0a 20 20 63 6e 74 2e 6e  SrcList;.  cnt.n
28280 54 68 69 73 20 3d 20 30 3b 0a 20 20 63 6e 74 2e  This = 0;.  cnt.
28290 6e 4f 74 68 65 72 20 3d 20 30 3b 0a 20 20 73 71  nOther = 0;.  sq
282a0 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73  lite3WalkExprLis
282b0 74 28 26 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70  t(&w, pExpr->x.p
282c0 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  List);.  return 
282d0 63 6e 74 2e 6e 54 68 69 73 3e 30 20 7c 7c 20 63  cnt.nThis>0 || c
282e0 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a  nt.nOther==0;.}.
282f0 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
28300 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
28310 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
28320 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
28330 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20  the index of.** 
28340 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e  the new element.
28350 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74    Return a negat
28360 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61  ive number if ma
28370 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  lloc fails..*/.s
28380 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67  tatic int addAgg
28390 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74  InfoColumn(sqlit
283a0 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20  e3 *db, AggInfo 
283b0 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69  *pInfo){.  int i
283c0 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20  ;.  pInfo->aCol 
283d0 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
283e0 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64  locate(.       d
283f0 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d  b,.       pInfo-
28400 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69  >aCol,.       si
28410 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c  zeof(pInfo->aCol
28420 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49  [0]),.       &pI
28430 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20  nfo->nColumn,.  
28440 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72       &i.  );.  r
28450 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a  eturn i;.}    ..
28460 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
28470 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70  element to the p
28480 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
28490 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
284a0 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20  the index of.** 
284b0 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e  the new element.
284c0 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74    Return a negat
284d0 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61  ive number if ma
284e0 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  lloc fails..*/.s
284f0 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67  tatic int addAgg
28500 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74 65 33  InfoFunc(sqlite3
28510 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70   *db, AggInfo *p
28520 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Info){.  int i;.
28530 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d    pInfo->aFunc =
28540 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c   sqlite3ArrayAll
28550 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62  ocate(.       db
28560 2c 20 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d  , .       pInfo-
28570 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 73  >aFunc,.       s
28580 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75  izeof(pInfo->aFu
28590 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26  nc[0]),.       &
285a0 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20  pInfo->nFunc,.  
285b0 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72       &i.  );.  r
285c0 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a  eturn i;.}    ..
285d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
285e0 65 20 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  e xExprCallback 
285f0 66 6f 72 20 61 20 74 72 65 65 20 77 61 6c 6b 65  for a tree walke
28600 72 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 74  r.  It is used t
28610 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73  o.** implement s
28620 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
28630 65 41 67 67 72 65 67 61 74 65 73 28 29 2e 20 20  eAggregates().  
28640 53 65 65 20 73 71 6c 69 74 65 33 45 78 70 72 41  See sqlite3ExprA
28650 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
28660 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .** for addition
28670 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
28680 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e  */.static int an
28690 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28 57  alyzeAggregate(W
286a0 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
286b0 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
286c0 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
286d0 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c  text *pNC = pWal
286e0 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61  ker->u.pNC;.  Pa
286f0 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e  rse *pParse = pN
28700 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72 63  C->pParse;.  Src
28710 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d  List *pSrcList =
28720 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a   pNC->pSrcList;.
28730 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49    AggInfo *pAggI
28740 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49  nfo = pNC->pAggI
28750 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  nfo;..  switch( 
28760 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
28770 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
28780 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UMN:.    case TK
28790 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
287a0 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
287b0 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
287c0 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  UMN );.      tes
287d0 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
287e0 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
287f0 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
28800 20 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75   see if the colu
28810 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20  mn is in one of 
28820 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68  the tables in th
28830 65 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20  e FROM.      ** 
28840 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67  clause of the ag
28850 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f  gregate query */
28860 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
28870 53 28 70 53 72 63 4c 69 73 74 21 3d 30 29 20 29  S(pSrcList!=0) )
28880 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
28890 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
288a0 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d  Item = pSrcList-
288b0 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  >a;.        for(
288c0 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d  i=0; i<pSrcList-
288d0 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
288e0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
288f0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
28900 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20  ol *pCol;.      
28910 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
28920 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
28930 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
28940 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
28950 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
28960 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74  xpr->iTable==pIt
28970 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20  em->iCursor ){. 
28980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
28990 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
289a0 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74  oint, it means t
289b0 68 61 74 20 70 45 78 70 72 20 72 65 66 65 72 73  hat pExpr refers
289c0 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20   to a table.    
289d0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
289e0 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  is in the FROM c
289f0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67  lause of the agg
28a00 72 65 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a  regate query.  .
28a10 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20              **. 
28a20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61             ** Ma
28a30 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  ke an entry for 
28a40 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41  the column in pA
28a50 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69  ggInfo->aCol[] i
28a60 66 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20  f there.        
28a70 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e      ** is not an
28a80 20 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72   entry there alr
28a90 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20  eady..          
28aa0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
28ab0 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20   int k;.        
28ac0 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49      pCol = pAggI
28ad0 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  nfo->aCol;.     
28ae0 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20         for(k=0; 
28af0 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  k<pAggInfo->nCol
28b00 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b  umn; k++, pCol++
28b10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
28b20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c   if( pCol->iTabl
28b30 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e==pExpr->iTable
28b40 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
28b50 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c        pCol->iCol
28b60 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn==pExpr->iCol
28b70 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
28b80 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
28b90 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
28ba0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
28bb0 20 20 20 20 20 20 20 20 69 66 28 20 28 6b 3e 3d          if( (k>=
28bc0 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
28bd0 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n).             
28be0 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e  && (k = addAggIn
28bf0 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d  foColumn(pParse-
28c00 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e  >db, pAggInfo))>
28c10 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0 .            
28c20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
28c30 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66   pCol = &pAggInf
28c40 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20  o->aCol[k];.    
28c50 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
28c60 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54  pTab = pExpr->pT
28c70 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab;.            
28c80 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d    pCol->iTable =
28c90 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
28ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
28cb0 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45  ol->iColumn = pE
28cc0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
28cd0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
28ce0 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  ->iMem = ++pPars
28cf0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
28d00 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
28d10 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  rterColumn = -1;
28d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
28d30 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  Col->pExpr = pEx
28d40 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
28d50 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e    if( pAggInfo->
28d60 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
28d70 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
28d80 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  j, n;.          
28d90 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
28da0 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  pGB = pAggInfo->
28db0 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  pGroupBy;.      
28dc0 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
28dd0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
28de0 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a  pTerm = pGB->a;.
28df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e00 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a  n = pGB->nExpr;.
28e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b  for(j=0; j<n; j+
28e30 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
28e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
28e50 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d  xpr *pE = pTerm-
28e60 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
28e70 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
28e80 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
28e90 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70  && pE->iTable==p
28ea0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a  Expr->iTable &&.
28eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ec0 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d        pE->iColum
28ed0 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n==pExpr->iColum
28ee0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
28ef0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
28f00 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a  SorterColumn = j
28f10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
28f20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
28f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
28f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28f50 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
28f60 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
28f70 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74   if( pCol->iSort
28f80 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  erColumn<0 ){.  
28f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
28fa0 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
28fb0 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53  n = pAggInfo->nS
28fc0 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a  ortingColumn++;.
28fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
28fe0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
28ff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
29000 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74  re is now an ent
29010 72 79 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20  ry for pExpr in 
29020 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
29030 20 28 65 69 74 68 65 72 0a 20 20 20 20 20 20 20   (either.       
29040 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20       ** because 
29050 69 74 20 77 61 73 20 74 68 65 72 65 20 62 65 66  it was there bef
29060 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65 20 77  ore or because w
29070 65 20 6a 75 73 74 20 63 72 65 61 74 65 64 20 69  e just created i
29080 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  t)..            
29090 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70  ** Convert the p
290a0 45 78 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f  Expr to be a TK_
290b0 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72  AGG_COLUMN refer
290c0 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20  ring to that.   
290d0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67           ** pAgg
290e0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74  Info->aCol[] ent
290f0 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry..            
29100 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  */.            E
29110 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74  xprSetVVAPropert
29120 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65  y(pExpr, EP_NoRe
29130 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20  duce);.         
29140 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e     pExpr->pAggIn
29150 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20  fo = pAggInfo;. 
29160 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
29170 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f  ->op = TK_AGG_CO
29180 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20  LUMN;.          
29190 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
291a0 28 69 31 36 29 6b 3b 0a 20 20 20 20 20 20 20 20  (i16)k;.        
291b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
291c0 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20       } /* endif 
291d0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
291e0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f  Item->iCursor */
291f0 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e  .        } /* en
29200 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63  d loop over pSrc
29210 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  List */.      }.
29220 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
29230 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  _Prune;.    }.  
29240 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
29250 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
29260 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67  if( (pNC->ncFlag
29270 73 20 26 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63  s & NC_InAggFunc
29280 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70  )==0.       && p
29290 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65  Walker->walkerDe
292a0 70 74 68 3d 3d 70 45 78 70 72 2d 3e 6f 70 32 0a  pth==pExpr->op2.
292b0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
292c0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
292d0 20 69 66 20 70 45 78 70 72 20 69 73 20 61 20 64   if pExpr is a d
292e0 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74  uplicate of anot
292f0 68 65 72 20 61 67 67 72 65 67 61 74 65 20 0a 20  her aggregate . 
29300 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
29310 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65 61  on that is alrea
29320 64 79 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e  dy in the pAggIn
29330 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 20  fo structure.   
29340 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
29350 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
29360 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67  unc *pItem = pAg
29370 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20  gInfo->aFunc;.  
29380 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
29390 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
293a0 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
293b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
293c0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
293d0 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20  e(pItem->pExpr, 
293e0 70 45 78 70 72 2c 20 2d 31 29 3d 3d 30 20 29 7b  pExpr, -1)==0 ){
293f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
29400 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
29410 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29420 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66    if( i>=pAggInf
29430 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20  o->nFunc ){.    
29440 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69        /* pExpr i
29450 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b  s original.  Mak
29460 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  e a new entry in
29470 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
29480 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  [].          */.
29490 20 20 20 20 20 20 20 20 20 20 75 38 20 65 6e 63            u8 enc
294a0 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64   = ENC(pParse->d
294b0 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  b);.          i 
294c0 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63  = addAggInfoFunc
294d0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67  (pParse->db, pAg
294e0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  gInfo);.        
294f0 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20    if( i>=0 ){.  
29500 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
29510 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
29520 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
29530 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
29540 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26         pItem = &
29550 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
29560 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i];.            
29570 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pItem->pExpr = p
29580 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
29590 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20    pItem->iMem = 
295a0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
295b0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
295c0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
295d0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
295e0 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
295f0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
29600 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69  Func = sqlite3Fi
29610 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  ndFunction(pPars
29620 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20  e->db,.         
29630 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
29640 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 0a 20 20 20 20  >u.zToken, .    
29650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
29660 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20  Expr->x.pList ? 
29670 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
29680 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20  nExpr : 0, enc, 
29690 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
296a0 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
296b0 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29   & EP_Distinct )
296c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
296d0 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74  pItem->iDistinct
296e0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
296f0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  +;.            }
29700 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
29710 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74      pItem->iDist
29720 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  inct = -1;.     
29730 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29740 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
29750 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70         /* Make p
29760 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68  Expr point to th
29770 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 70 41  e appropriate pA
29780 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20  ggInfo->aFunc[] 
29790 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f  entry.        */
297a0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
297b0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
297c0 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
297d0 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
297e0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70  ) );.        Exp
297f0 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28  rSetVVAProperty(
29800 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75  pExpr, EP_NoRedu
29810 63 65 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78  ce);.        pEx
29820 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29  pr->iAgg = (i16)
29830 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  i;.        pExpr
29840 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67  ->pAggInfo = pAg
29850 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72  gInfo;.        r
29860 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
29870 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
29880 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
29890 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20  _Continue;.     
298a0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
298b0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
298c0 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  ue;.}.static int
298d0 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
298e0 65 73 49 6e 53 65 6c 65 63 74 28 57 61 6c 6b 65  esInSelect(Walke
298f0 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
29900 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
29910 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
29920 28 70 57 61 6c 6b 65 72 29 3b 0a 20 20 55 4e 55  (pWalker);.  UNU
29930 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 53  SED_PARAMETER(pS
29940 65 6c 65 63 74 29 3b 0a 20 20 72 65 74 75 72 6e  elect);.  return
29950 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
29960 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  ../*.** Analyze 
29970 74 68 65 20 70 45 78 70 72 20 65 78 70 72 65 73  the pExpr expres
29980 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  sion looking for
29990 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
299a0 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
299b0 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e  variables that n
299c0 65 65 64 20 74 6f 20 62 65 20 61 64 64 65 64 20  eed to be added 
299d0 74 6f 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63  to AggInfo objec
299e0 74 20 74 68 61 74 20 70 4e 43 2d 3e 70 41 67 67  t that pNC->pAgg
299f0 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  Info.** points t
29a00 6f 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65  o.  Additional e
29a10 6e 74 72 69 65 73 20 61 72 65 20 6d 61 64 65 20  ntries are made 
29a20 6f 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 6f  on the AggInfo o
29a30 62 6a 65 63 74 20 61 73 0a 2a 2a 20 6e 65 63 65  bject as.** nece
29a40 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ssary..**.** Thi
29a50 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
29a60 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
29a70 61 66 74 65 72 20 74 68 65 20 65 78 70 72 65 73  after the expres
29a80 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a  sion has been.**
29a90 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c   analyzed by sql
29aa0 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
29ab0 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  ames()..*/.void 
29ac0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
29ad0 7a 65 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d  zeAggregates(Nam
29ae0 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45  eContext *pNC, E
29af0 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57  xpr *pExpr){.  W
29b00 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65  alker w;.  memse
29b10 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
29b20 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  w));.  w.xExprCa
29b30 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65  llback = analyze
29b40 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78  Aggregate;.  w.x
29b50 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
29b60 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
29b70 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e  esInSelect;.  w.
29b80 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 61  u.pNC = pNC;.  a
29b90 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63  ssert( pNC->pSrc
29ba0 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73 71 6c  List!=0 );.  sql
29bb0 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
29bc0 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pExpr);.}../*.*
29bd0 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78  * Call sqlite3Ex
29be0 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
29bf0 74 65 73 28 29 20 66 6f 72 20 65 76 65 72 79 20  tes() for every 
29c00 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e  expression in an
29c10 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
29c20 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ist.  Return the
29c30 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
29c40 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  s..**.** If an e
29c50 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74  rror is found, t
29c60 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63  he analysis is c
29c70 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69  ut short..*/.voi
29c80 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  d sqlite3ExprAna
29c90 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65  lyzeAggList(Name
29ca0 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78  Context *pNC, Ex
29cb0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
29cc0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
29cd0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
29ce0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
29cf0 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70  ist ){.    for(p
29d00 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
29d10 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
29d20 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
29d30 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
29d40 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
29d50 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d  gates(pNC, pItem
29d60 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ->pExpr);.    }.
29d70 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
29d80 6f 63 61 74 65 20 61 20 73 69 6e 67 6c 65 20 6e  ocate a single n
29d90 65 77 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ew register for 
29da0 75 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d 65  use to hold some
29db0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
29dc0 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sult..*/.int sql
29dd0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 50  ite3GetTempReg(P
29de0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
29df0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65   if( pParse->nTe
29e00 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20  mpReg==0 ){.    
29e10 72 65 74 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d  return ++pParse-
29e20 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74  >nMem;.  }.  ret
29e30 75 72 6e 20 70 50 61 72 73 65 2d 3e 61 54 65 6d  urn pParse->aTem
29e40 70 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e  pReg[--pParse->n
29e50 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a  TempReg];.}../*.
29e60 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20  ** Deallocate a 
29e70 72 65 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e 67  register, making
29e80 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72   available for r
29e90 65 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74  euse for some ot
29ea0 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e 0a  her.** purpose..
29eb0 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73  **.** If a regis
29ec0 74 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ter is currently
29ed0 20 62 65 69 6e 67 20 75 73 65 64 20 62 79 20 74   being used by t
29ee0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2c  he column cache,
29ef0 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64 65 61   then.** the dea
29f00 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 64 65 66  llocation is def
29f10 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20  erred until the 
29f20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 6c 69 6e  column cache lin
29f30 65 20 74 68 61 74 20 75 73 65 73 0a 2a 2a 20 74  e that uses.** t
29f40 68 65 20 72 65 67 69 73 74 65 72 20 62 65 63 6f  he register beco
29f50 6d 65 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f  mes stale..*/.vo
29f60 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  id sqlite3Releas
29f70 65 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a  eTempReg(Parse *
29f80 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
29f90 29 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26 26  ){.  if( iReg &&
29fa0 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
29fb0 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72  g<ArraySize(pPar
29fc0 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b  se->aTempReg) ){
29fd0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
29fe0 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
29ff0 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30   *p;.    for(i=0
2a000 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
2a010 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
2a020 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
2a030 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   p++){.      if(
2a040 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29   p->iReg==iReg )
2a050 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 74 65 6d  {.        p->tem
2a060 70 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  pReg = 1;.      
2a070 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
2a080 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  }.    }.    pPar
2a090 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61  se->aTempReg[pPa
2a0a0 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d  rse->nTempReg++]
2a0b0 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a   = iReg;.  }.}..
2a0c0 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f  /*.** Allocate o
2a0d0 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62  r deallocate a b
2a0e0 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e  lock of nReg con
2a0f0 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65  secutive registe
2a100 72 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  rs.*/.int sqlite
2a110 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61  3GetTempRange(Pa
2a120 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
2a130 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c   nReg){.  int i,
2a140 20 6e 3b 0a 20 20 69 20 3d 20 70 50 61 72 73 65   n;.  i = pParse
2a150 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e  ->iRangeReg;.  n
2a160 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67   = pParse->nRang
2a170 65 52 65 67 3b 0a 20 20 69 66 28 20 6e 52 65 67  eReg;.  if( nReg
2a180 3c 3d 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  <=n ){.    asser
2a190 74 28 20 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e  t( !usedAsColumn
2a1a0 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 2c  Cache(pParse, i,
2a1b0 20 69 2b 6e 2d 31 29 20 29 3b 0a 20 20 20 20 70   i+n-1) );.    p
2a1c0 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
2a1d0 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50   += nReg;.    pP
2a1e0 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
2a1f0 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65  -= nReg;.  }else
2a200 7b 0a 20 20 20 20 69 20 3d 20 70 50 61 72 73 65  {.    i = pParse
2a210 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50  ->nMem+1;.    pP
2a220 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
2a230 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  eg;.  }.  return
2a240 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74   i;.}.void sqlit
2a250 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
2a260 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
2a270 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20  , int iReg, int 
2a280 6e 52 65 67 29 7b 0a 20 20 73 71 6c 69 74 65 33  nReg){.  sqlite3
2a290 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
2a2a0 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 52  pParse, iReg, nR
2a2b0 65 67 29 3b 0a 20 20 69 66 28 20 6e 52 65 67 3e  eg);.  if( nReg>
2a2c0 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
2a2d0 67 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  g ){.    pParse-
2a2e0 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65  >nRangeReg = nRe
2a2f0 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69  g;.    pParse->i
2a300 52 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b  RangeReg = iReg;
2a310 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
2a320 72 6b 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79  rk all temporary
2a330 20 72 65 67 69 73 74 65 72 73 20 61 73 20 62 65   registers as be
2a340 69 6e 67 20 75 6e 61 76 61 69 6c 61 62 6c 65 20  ing unavailable 
2a350 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f 0a 76 6f  for reuse..*/.vo
2a360 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54  id sqlite3ClearT
2a370 65 6d 70 52 65 67 43 61 63 68 65 28 50 61 72 73  empRegCache(Pars
2a380 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50  e *pParse){.  pP
2a390 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d  arse->nTempReg =
2a3a0 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 52   0;.  pParse->nR
2a3b0 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d 0a 0a  angeReg = 0;.}..
2a3c0 2f 2a 0a 2a 2a 20 56 61 6c 69 64 61 74 65 20 74  /*.** Validate t
2a3d0 68 61 74 20 6e 6f 20 74 65 6d 70 6f 72 61 72 79  hat no temporary
2a3e0 20 72 65 67 69 73 74 65 72 20 66 61 6c 6c 73 20   register falls 
2a3f0 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65  within the range
2a400 20 6f 66 0a 2a 2a 20 69 46 69 72 73 74 2e 2e 69   of.** iFirst..i
2a410 4c 61 73 74 2c 20 69 6e 63 6c 75 73 69 76 65 2e  Last, inclusive.
2a420 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
2a430 73 20 6f 6e 6c 79 20 63 61 6c 6c 20 66 72 6f 6d  s only call from
2a440 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29   within assert()
2a450 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  .** statements..
2a460 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2a470 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74  _DEBUG.int sqlit
2a480 65 33 4e 6f 54 65 6d 70 73 49 6e 52 61 6e 67 65  e3NoTempsInRange
2a490 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2a4a0 69 6e 74 20 69 46 69 72 73 74 2c 20 69 6e 74 20  int iFirst, int 
2a4b0 69 4c 61 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  iLast){.  int i;
2a4c0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
2a4d0 52 61 6e 67 65 52 65 67 3e 30 0a 20 20 20 26 26  RangeReg>0.   &&
2a4e0 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
2a4f0 65 67 2b 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67  eg+pParse->nRang
2a500 65 52 65 67 3c 69 4c 61 73 74 0a 20 20 20 26 26  eReg<iLast.   &&
2a510 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
2a520 65 67 3e 3d 69 46 69 72 73 74 0a 20 20 29 7b 0a  eg>=iFirst.  ){.
2a530 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
2a540 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
2a550 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
2a560 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
2a570 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
2a580 5b 69 5d 3e 3d 69 46 69 72 73 74 20 26 26 20 70  [i]>=iFirst && p
2a590 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
2a5a0 69 5d 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20  i]<=iLast ){.   
2a5b0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
2a5c0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2a5d0 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1;.}.#endif /* S
2a5e0 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a     QLITE_DEBUG */.