/ Hex Artifact Content
Login

Artifact 77215e927ab39426e19340b2e109267f62abe398:


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 0a 2a 2a 20 52 65 74 75  t.h"../*.** Retu
0220: 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74 79  rn the 'affinity
0230: 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  ' of the express
0240: 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e 79  ion pExpr if any
0250: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
0260: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61 20   is a column, a 
0270: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 63  reference to a c
0280: 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41 53  olumn via an 'AS
0290: 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20 61  ' alias,.** or a
02a0: 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74 68   sub-select with
02b0: 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65   a column as the
02c0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 74   return value, t
02d0: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66 69  hen the .** affi
02e0: 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f 6c  nity of that col
02f0: 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  umn is returned.
0300: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30 30   Otherwise, 0x00
0310: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
0320: 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 61   indicating no a
0330: 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65 20  ffinity for the 
0340: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
0350: 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52 45  * i.e. the WHERE
0360: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69   clause expressi
0370: 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ons in the follo
0380: 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
0390: 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20 61  all.** have an a
03a0: 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20 43  ffinity:.**.** C
03b0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
03c0: 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  );.** SELECT * F
03d0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b 0a  ROM t1 WHERE a;.
03e0: 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20 62  ** SELECT a AS b
03f0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62   FROM t1 WHERE b
0400: 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46 52  ;.** SELECT * FR
0410: 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65 6c  OM t1 WHERE (sel
0420: 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b 0a  ect a from t1);.
0430: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 45  */.char sqlite3E
0440: 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70 72  xprAffinity(Expr
0450: 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
0460: 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71  op;.  pExpr = sq
0470: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
0480: 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20 69  late(pExpr);.  i
0490: 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
04a0: 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20 72  & EP_Generic ) r
04b0: 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d 20  eturn 0;.  op = 
04c0: 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28  pExpr->op;.  if(
04d0: 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29   op==TK_SELECT )
04e0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
04f0: 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78 49  xpr->flags&EP_xI
0500: 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20 72  sSelect );.    r
0510: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
0520: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  rAffinity(pExpr-
0530: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
0540: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
0550: 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54  .  }.  if( op==T
0560: 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20  K_REGISTER ) op 
0570: 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 23 69  = pExpr->op2;.#i
0580: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
0590: 54 5f 43 41 53 54 0a 20 20 69 66 28 20 6f 70 3d  T_CAST.  if( op=
05a0: 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20 20 20  =TK_CAST ){.    
05b0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
05c0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
05d0: 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
05e0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
05f0: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70  e3AffinityType(p
0600: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
0610: 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  0);.  }.#endif. 
0620: 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47 47   if( (op==TK_AGG
0630: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54  _COLUMN || op==T
0640: 4b 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 45 78  K_COLUMN) && pEx
0650: 70 72 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20  pr->pTab!=0 ){. 
0660: 20 20 20 69 6e 74 20 6a 20 3d 20 70 45 78 70 72     int j = pExpr
0670: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69  ->iColumn;.    i
0680: 66 28 20 6a 3c 30 20 29 20 72 65 74 75 72 6e 20  f( j<0 ) return 
0690: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
06a0: 45 52 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ER;.    assert( 
06b0: 70 45 78 70 72 2d 3e 70 54 61 62 20 26 26 20 6a  pExpr->pTab && j
06c0: 3c 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e 6e 43  <pExpr->pTab->nC
06d0: 6f 6c 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ol );.    return
06e0: 20 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43   pExpr->pTab->aC
06f0: 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  ol[j].affinity;.
0700: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78    }.  return pEx
0710: 70 72 2d 3e 61 66 66 69 6e 69 74 79 3b 0a 7d 0a  pr->affinity;.}.
0720: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63  ./*.** Set the c
0730: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
0740: 65 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  e for expression
0750: 20 70 45 78 70 72 20 74 6f 20 62 65 20 74 68 65   pExpr to be the
0760: 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65   collating.** se
0770: 71 75 65 6e 63 65 20 6e 61 6d 65 64 20 62 79 20  quence named by 
0780: 70 54 6f 6b 65 6e 2e 20 20 20 52 65 74 75 72 6e  pToken.   Return
0790: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
07a0: 6e 65 77 20 45 78 70 72 20 6e 6f 64 65 20 74 68  new Expr node th
07b0: 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73  at.** implements
07c0: 20 74 68 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65   the COLLATE ope
07d0: 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rator..**.** If 
07e0: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
07f0: 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ion error occurs
0800: 2c 20 74 68 61 74 20 66 61 63 74 20 69 73 20 72  , that fact is r
0810: 65 63 6f 72 64 65 64 20 69 6e 20 70 50 61 72 73  ecorded in pPars
0820: 65 2d 3e 64 62 0a 2a 2a 20 61 6e 64 20 74 68 65  e->db.** and the
0830: 20 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72   pExpr parameter
0840: 20 69 73 20 72 65 74 75 72 6e 65 64 20 75 6e 63   is returned unc
0850: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 45 78 70 72 20  hanged..*/.Expr 
0860: 2a 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43  *sqlite3ExprAddC
0870: 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 0a 20 20 50  ollateToken(.  P
0880: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
0890: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
08a0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
08b0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
08c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
08d0: 74 68 65 20 22 43 4f 4c 4c 41 54 45 22 20 63 6c  the "COLLATE" cl
08e0: 61 75 73 65 20 74 6f 20 74 68 69 73 20 65 78 70  ause to this exp
08f0: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  ression */.  con
0900: 73 74 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c 4e  st Token *pCollN
0910: 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame,  /* Name of
0920: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
0930: 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71  nce */.  int deq
0940: 75 6f 74 65 20 20 20 20 20 20 20 20 20 20 20 20  uote            
0950: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 71    /* True to deq
0960: 75 6f 74 65 20 70 43 6f 6c 6c 4e 61 6d 65 20 2a  uote pCollName *
0970: 2f 0a 29 7b 0a 20 20 69 66 28 20 70 43 6f 6c 6c  /.){.  if( pColl
0980: 4e 61 6d 65 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20  Name->n>0 ){.   
0990: 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71   Expr *pNew = sq
09a0: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70  lite3ExprAlloc(p
09b0: 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 43 4f  Parse->db, TK_CO
09c0: 4c 4c 41 54 45 2c 20 70 43 6f 6c 6c 4e 61 6d 65  LLATE, pCollName
09d0: 2c 20 64 65 71 75 6f 74 65 29 3b 0a 20 20 20 20  , dequote);.    
09e0: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
09f0: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
0a00: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65  pExpr;.      pNe
0a10: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43  w->flags |= EP_C
0a20: 6f 6c 6c 61 74 65 7c 45 50 5f 53 6b 69 70 3b 0a  ollate|EP_Skip;.
0a30: 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e        pExpr = pN
0a40: 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ew;.    }.  }.  
0a50: 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
0a60: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
0a70: 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e  rAddCollateStrin
0a80: 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  g(Parse *pParse,
0a90: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 6f   Expr *pExpr, co
0aa0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 29 7b 0a 20  nst char *zC){. 
0ab0: 20 54 6f 6b 65 6e 20 73 3b 0a 20 20 61 73 73 65   Token s;.  asse
0ac0: 72 74 28 20 7a 43 21 3d 30 20 29 3b 0a 20 20 73  rt( zC!=0 );.  s
0ad0: 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28  qlite3TokenInit(
0ae0: 26 73 2c 20 28 63 68 61 72 2a 29 7a 43 29 3b 0a  &s, (char*)zC);.
0af0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
0b00: 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f  ExprAddCollateTo
0b10: 6b 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70  ken(pParse, pExp
0b20: 72 2c 20 26 73 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  r, &s, 0);.}../*
0b30: 0a 2a 2a 20 53 6b 69 70 20 6f 76 65 72 20 61 6e  .** Skip over an
0b40: 79 20 54 4b 5f 43 4f 4c 4c 41 54 45 20 6f 70 65  y TK_COLLATE ope
0b50: 72 61 74 6f 72 73 20 61 6e 64 20 61 6e 79 20 75  rators and any u
0b60: 6e 6c 69 6b 65 6c 79 28 29 0a 2a 2a 20 6f 72 20  nlikely().** or 
0b70: 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 66 75 6e  likelihood() fun
0b80: 63 74 69 6f 6e 20 61 74 20 74 68 65 20 72 6f 6f  ction at the roo
0b90: 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
0ba0: 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  on..*/.Expr *sql
0bb0: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
0bc0: 61 74 65 28 45 78 70 72 20 2a 70 45 78 70 72 29  ate(Expr *pExpr)
0bd0: 7b 0a 20 20 77 68 69 6c 65 28 20 70 45 78 70 72  {.  while( pExpr
0be0: 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65   && ExprHasPrope
0bf0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 6b  rty(pExpr, EP_Sk
0c00: 69 70 29 20 29 7b 0a 20 20 20 20 69 66 28 20 45  ip) ){.    if( E
0c10: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
0c20: 45 78 70 72 2c 20 45 50 5f 55 6e 6c 69 6b 65 6c  Expr, EP_Unlikel
0c30: 79 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  y) ){.      asse
0c40: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
0c50: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
0c60: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
0c70: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
0c80: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
0c90: 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >0 );.      asse
0ca0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
0cb0: 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  K_FUNCTION );.  
0cc0: 20 20 20 20 70 45 78 70 72 20 3d 20 70 45 78 70      pExpr = pExp
0cd0: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d  r->x.pList->a[0]
0ce0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73  .pExpr;.    }els
0cf0: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
0d00: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
0d10: 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20 20 20  OLLATE );.      
0d20: 70 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 70  pExpr = pExpr->p
0d30: 4c 65 66 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  Left;.    }.  } 
0d40: 20 20 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70    .  return pExp
0d50: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  r;.}../*.** Retu
0d60: 72 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  rn the collation
0d70: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
0d80: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
0d90: 70 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20  pr. If.** there 
0da0: 69 73 20 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f  is no defined co
0db0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
0dc0: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  , return NULL..*
0dd0: 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69  *.** The collati
0de0: 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 69 67 68  ng sequence migh
0df0: 74 20 62 65 20 64 65 74 65 72 6d 69 6e 65 64 20  t be determined 
0e00: 62 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65  by a COLLATE ope
0e10: 72 61 74 6f 72 0a 2a 2a 20 6f 72 20 62 79 20 74  rator.** or by t
0e20: 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 61  he presence of a
0e30: 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 61 20 64   column with a d
0e40: 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67  efined collating
0e50: 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 20 43 4f   sequence..** CO
0e60: 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73 20  LLATE operators 
0e70: 74 61 6b 65 20 66 69 72 73 74 20 70 72 65 63 65  take first prece
0e80: 64 65 6e 63 65 2e 20 20 4c 65 66 74 20 6f 70 65  dence.  Left ope
0e90: 72 61 6e 64 73 20 74 61 6b 65 0a 2a 2a 20 70 72  rands take.** pr
0ea0: 65 63 65 64 65 6e 63 65 20 6f 76 65 72 20 72 69  ecedence over ri
0eb0: 67 68 74 20 6f 70 65 72 61 6e 64 73 2e 0a 2a 2f  ght operands..*/
0ec0: 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65  .CollSeq *sqlite
0ed0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 50 61 72  3ExprCollSeq(Par
0ee0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
0ef0: 20 2a 70 45 78 70 72 29 7b 0a 20 20 73 71 6c 69   *pExpr){.  sqli
0f00: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
0f10: 2d 3e 64 62 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  ->db;.  CollSeq 
0f20: 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 45 78  *pColl = 0;.  Ex
0f30: 70 72 20 2a 70 20 3d 20 70 45 78 70 72 3b 0a 20  pr *p = pExpr;. 
0f40: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
0f50: 20 69 6e 74 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b   int op = p->op;
0f60: 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  .    if( p->flag
0f70: 73 20 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29  s & EP_Generic )
0f80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
0f90: 6f 70 3d 3d 54 4b 5f 43 41 53 54 20 7c 7c 20 6f  op==TK_CAST || o
0fa0: 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 7b 0a 20  p==TK_UPLUS ){. 
0fb0: 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66       p = p->pLef
0fc0: 74 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  t;.      continu
0fd0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
0fe0: 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20   op==TK_COLLATE 
0ff0: 7c 7c 20 28 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  || (op==TK_REGIS
1000: 54 45 52 20 26 26 20 70 2d 3e 6f 70 32 3d 3d 54  TER && p->op2==T
1010: 4b 5f 43 4f 4c 4c 41 54 45 29 20 29 7b 0a 20 20  K_COLLATE) ){.  
1020: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1030: 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50  te3GetCollSeq(pP
1040: 61 72 73 65 2c 20 45 4e 43 28 64 62 29 2c 20 30  arse, ENC(db), 0
1050: 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  , p->u.zToken);.
1060: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1070: 20 7d 0a 20 20 20 20 69 66 28 20 28 6f 70 3d 3d   }.    if( (op==
1080: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c 7c  TK_AGG_COLUMN ||
1090: 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20   op==TK_COLUMN. 
10a0: 20 20 20 20 20 20 20 20 20 7c 7c 20 6f 70 3d 3d           || op==
10b0: 54 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f  TK_REGISTER || o
10c0: 70 3d 3d 54 4b 5f 54 52 49 47 47 45 52 29 0a 20  p==TK_TRIGGER). 
10d0: 20 20 20 20 26 26 20 70 2d 3e 70 54 61 62 21 3d      && p->pTab!=
10e0: 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  0.    ){.      /
10f0: 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  * op==TK_REGISTE
1100: 52 20 26 26 20 70 2d 3e 70 54 61 62 21 3d 30 20  R && p->pTab!=0 
1110: 68 61 70 70 65 6e 73 20 77 68 65 6e 20 70 45 78  happens when pEx
1120: 70 72 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c  pr was originall
1130: 79 0a 20 20 20 20 20 20 2a 2a 20 61 20 54 4b 5f  y.      ** a TK_
1140: 43 4f 4c 55 4d 4e 20 62 75 74 20 77 61 73 20 70  COLUMN but was p
1150: 72 65 76 69 6f 75 73 6c 79 20 65 76 61 6c 75 61  reviously evalua
1160: 74 65 64 20 61 6e 64 20 63 61 63 68 65 64 20 69  ted and cached i
1170: 6e 20 61 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  n a register */.
1180: 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 2d        int j = p-
1190: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
11a0: 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20 20  if( j>=0 ){.    
11b0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
11c0: 7a 43 6f 6c 6c 20 3d 20 70 2d 3e 70 54 61 62 2d  zColl = p->pTab-
11d0: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a  >aCol[j].zColl;.
11e0: 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
11f0: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
1200: 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20  eq(db, ENC(db), 
1210: 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20  zColl, 0);.     
1220: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
1230: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
1240: 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
1250: 61 74 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ate ){.      if(
1260: 20 70 2d 3e 70 4c 65 66 74 20 26 26 20 28 70 2d   p->pLeft && (p-
1270: 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20  >pLeft->flags & 
1280: 45 50 5f 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29  EP_Collate)!=0 )
1290: 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 2d  {.        p = p-
12a0: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 65  >pLeft;.      }e
12b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 78 70  lse{.        Exp
12c0: 72 20 2a 70 4e 65 78 74 20 20 3d 20 70 2d 3e 70  r *pNext  = p->p
12d0: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 2f  Right;.        /
12e0: 2a 20 54 68 65 20 45 78 70 72 2e 78 20 75 6e 69  * The Expr.x uni
12f0: 6f 6e 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  on is never used
1300: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
1310: 65 20 61 73 20 45 78 70 72 2e 70 52 69 67 68 74  e as Expr.pRight
1320: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
1330: 72 74 28 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d  rt( p->x.pList==
1340: 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d  0 || p->pRight==
1350: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 );.        /* 
1360: 70 2d 3e 66 6c 61 67 73 20 68 6f 6c 64 73 20 45  p->flags holds E
1370: 50 5f 43 6f 6c 6c 61 74 65 20 61 6e 64 20 70 2d  P_Collate and p-
1380: 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 64 6f  >pLeft->flags do
1390: 65 73 20 6e 6f 74 2e 20 20 41 6e 64 0a 20 20 20  es not.  And.   
13a0: 20 20 20 20 20 2a 2a 20 70 2d 3e 78 2e 70 53 65       ** p->x.pSe
13b0: 6c 65 63 74 20 63 61 6e 6e 6f 74 2e 20 20 53 6f  lect cannot.  So
13c0: 20 69 66 20 70 2d 3e 78 2e 70 4c 65 66 74 20 65   if p->x.pLeft e
13d0: 78 69 73 74 73 2c 20 69 74 20 6d 75 73 74 20 68  xists, it must h
13e0: 6f 6c 64 20 61 74 0a 20 20 20 20 20 20 20 20 2a  old at.        *
13f0: 2a 20 6c 65 61 73 74 20 6f 6e 65 20 45 50 5f 43  * least one EP_C
1400: 6f 6c 6c 61 74 65 2e 20 54 68 75 73 20 74 68 65  ollate. Thus the
1410: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 41   following two A
1420: 4c 57 41 59 53 2e 20 2a 2f 0a 20 20 20 20 20 20  LWAYS. */.      
1430: 20 20 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74    if( p->x.pList
1440: 21 3d 30 20 26 26 20 41 4c 57 41 59 53 28 21 45  !=0 && ALWAYS(!E
1450: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1460: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 29  , EP_xIsSelect))
1470: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
1480: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 66  t i;.          f
1490: 6f 72 28 69 3d 30 3b 20 41 4c 57 41 59 53 28 69  or(i=0; ALWAYS(i
14a0: 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  <p->x.pList->nEx
14b0: 70 72 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  pr); i++){.     
14c0: 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48         if( ExprH
14d0: 61 73 50 72 6f 70 65 72 74 79 28 70 2d 3e 78 2e  asProperty(p->x.
14e0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
14f0: 72 2c 20 45 50 5f 43 6f 6c 6c 61 74 65 29 20 29  r, EP_Collate) )
1500: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1510: 70 4e 65 78 74 20 3d 20 70 2d 3e 78 2e 70 4c 69  pNext = p->x.pLi
1520: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
1530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
1540: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
1550: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
1560: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1570: 20 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20   p = pNext;.    
1580: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
1590: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15a0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  }.  }.  if( sqli
15b0: 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28  te3CheckCollSeq(
15c0: 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29  pParse, pColl) )
15d0: 7b 20 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30  { .    pColl = 0
15e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
15f0: 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  Coll;.}../*.** p
1600: 45 78 70 72 20 69 73 20 61 6e 20 6f 70 65 72 61  Expr is an opera
1610: 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73  nd of a comparis
1620: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 61 66  on operator.  af
1630: 66 32 20 69 73 20 74 68 65 0a 2a 2a 20 74 79 70  f2 is the.** typ
1640: 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68  e affinity of th
1650: 65 20 6f 74 68 65 72 20 6f 70 65 72 61 6e 64 2e  e other operand.
1660: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72    This routine r
1670: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 74 79  eturns the.** ty
1680: 70 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74  pe affinity that
1690: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
16a0: 66 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73  for the comparis
16b0: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a  on operator..*/.
16c0: 63 68 61 72 20 73 71 6c 69 74 65 33 43 6f 6d 70  char sqlite3Comp
16d0: 61 72 65 41 66 66 69 6e 69 74 79 28 45 78 70 72  areAffinity(Expr
16e0: 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20 61 66   *pExpr, char af
16f0: 66 32 29 7b 0a 20 20 63 68 61 72 20 61 66 66 31  f2){.  char aff1
1700: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
1710: 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20  finity(pExpr);. 
1720: 20 69 66 28 20 61 66 66 31 20 26 26 20 61 66 66   if( aff1 && aff
1730: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42 6f 74 68  2 ){.    /* Both
1740: 20 73 69 64 65 73 20 6f 66 20 74 68 65 20 63 6f   sides of the co
1750: 6d 70 61 72 69 73 6f 6e 20 61 72 65 20 63 6f 6c  mparison are col
1760: 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20 68 61 73  umns. If one has
1770: 20 6e 75 6d 65 72 69 63 0a 20 20 20 20 2a 2a 20   numeric.    ** 
1780: 61 66 66 69 6e 69 74 79 2c 20 75 73 65 20 74 68  affinity, use th
1790: 61 74 2e 20 4f 74 68 65 72 77 69 73 65 20 75 73  at. Otherwise us
17a0: 65 20 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20  e no affinity.. 
17b0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71     */.    if( sq
17c0: 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66  lite3IsNumericAf
17d0: 66 69 6e 69 74 79 28 61 66 66 31 29 20 7c 7c 20  finity(aff1) || 
17e0: 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63  sqlite3IsNumeric
17f0: 41 66 66 69 6e 69 74 79 28 61 66 66 32 29 20 29  Affinity(aff2) )
1800: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1810: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
1820: 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  C;.    }else{.  
1830: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1840: 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20  E_AFF_BLOB;.    
1850: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61  }.  }else if( !a
1860: 66 66 31 20 26 26 20 21 61 66 66 32 20 29 7b 0a  ff1 && !aff2 ){.
1870: 20 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 73      /* Neither s
1880: 69 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 61  ide of the compa
1890: 72 69 73 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  rison is a colum
18a0: 6e 2e 20 20 43 6f 6d 70 61 72 65 20 74 68 65 0a  n.  Compare the.
18b0: 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 20 64      ** results d
18c0: 69 72 65 63 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a  irectly..    */.
18d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18e0: 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d 65  E_AFF_BLOB;.  }e
18f0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20  lse{.    /* One 
1900: 73 69 64 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e  side is a column
1910: 2c 20 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e  , the other is n
1920: 6f 74 2e 20 55 73 65 20 74 68 65 20 63 6f 6c 75  ot. Use the colu
1930: 6d 6e 73 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f  mns affinity. */
1940: 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 66 66  .    assert( aff
1950: 31 3d 3d 30 20 7c 7c 20 61 66 66 32 3d 3d 30 20  1==0 || aff2==0 
1960: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 61  );.    return (a
1970: 66 66 31 20 2b 20 61 66 66 32 29 3b 0a 20 20 7d  ff1 + aff2);.  }
1980: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
1990: 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  is a comparison 
19a0: 6f 70 65 72 61 74 6f 72 2e 20 20 52 65 74 75 72  operator.  Retur
19b0: 6e 20 74 68 65 20 74 79 70 65 20 61 66 66 69 6e  n the type affin
19c0: 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64 0a  ity that should.
19d0: 2a 2a 20 62 65 20 61 70 70 6c 69 65 64 20 74 6f  ** be applied to
19e0: 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 70   both operands p
19f0: 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 74 68  rior to doing th
1a00: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f  e comparison..*/
1a10: 0a 73 74 61 74 69 63 20 63 68 61 72 20 63 6f 6d  .static char com
1a20: 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28  parisonAffinity(
1a30: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
1a40: 63 68 61 72 20 61 66 66 3b 0a 20 20 61 73 73 65  char aff;.  asse
1a50: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
1a60: 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_EQ || pExpr->o
1a70: 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70 45 78 70  p==TK_IN || pExp
1a80: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a  r->op==TK_LT ||.
1a90: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1aa0: 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70 45  >op==TK_GT || pE
1ab0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c  xpr->op==TK_GE |
1ac0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
1ad0: 4c 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  LE ||.          
1ae0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45  pExpr->op==TK_NE
1af0: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
1b00: 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_IS || pExpr->o
1b10: 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20  p==TK_ISNOT );. 
1b20: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1b30: 70 4c 65 66 74 20 29 3b 0a 20 20 61 66 66 20 3d  pLeft );.  aff =
1b40: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
1b50: 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66  nity(pExpr->pLef
1b60: 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  t);.  if( pExpr-
1b70: 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 61  >pRight ){.    a
1b80: 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ff = sqlite3Comp
1b90: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70  areAffinity(pExp
1ba0: 72 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 29 3b  r->pRight, aff);
1bb0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70  .  }else if( Exp
1bc0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1bd0: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
1be0: 29 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73  ) ){.    aff = s
1bf0: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
1c00: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 78 2e 70  inity(pExpr->x.p
1c10: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
1c20: 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61 66 66 29  a[0].pExpr, aff)
1c30: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61  ;.  }else if( !a
1c40: 66 66 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20  ff ){.    aff = 
1c50: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b  SQLITE_AFF_BLOB;
1c60: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66  .  }.  return af
1c70: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70  f;.}../*.** pExp
1c80: 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f  r is a compariso
1c90: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 65 67  n expression, eg
1ca0: 2e 20 27 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e  . '=', '<', IN(.
1cb0: 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f  ..) etc..** idx_
1cc0: 61 66 66 69 6e 69 74 79 20 69 73 20 74 68 65 20  affinity is the 
1cd0: 61 66 66 69 6e 69 74 79 20 6f 66 20 61 6e 20 69  affinity of an i
1ce0: 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52  ndexed column. R
1cf0: 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66  eturn true.** if
1d00: 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20   the index with 
1d10: 61 66 66 69 6e 69 74 79 20 69 64 78 5f 61 66 66  affinity idx_aff
1d20: 69 6e 69 74 79 20 6d 61 79 20 62 65 20 75 73 65  inity may be use
1d30: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a  d to implement.*
1d40: 2a 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * the comparison
1d50: 20 69 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e   in pExpr..*/.in
1d60: 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66  t sqlite3IndexAf
1d70: 66 69 6e 69 74 79 4f 6b 28 45 78 70 72 20 2a 70  finityOk(Expr *p
1d80: 45 78 70 72 2c 20 63 68 61 72 20 69 64 78 5f 61  Expr, char idx_a
1d90: 66 66 69 6e 69 74 79 29 7b 0a 20 20 63 68 61 72  ffinity){.  char
1da0: 20 61 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f   aff = compariso
1db0: 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  nAffinity(pExpr)
1dc0: 3b 0a 20 20 73 77 69 74 63 68 28 20 61 66 66 20  ;.  switch( aff 
1dd0: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
1de0: 54 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a 20 20 20  TE_AFF_BLOB:.   
1df0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1e00: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46   case SQLITE_AFF
1e10: 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 72 65 74  _TEXT:.      ret
1e20: 75 72 6e 20 69 64 78 5f 61 66 66 69 6e 69 74 79  urn idx_affinity
1e30: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ==SQLITE_AFF_TEX
1e40: 54 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  T;.    default:.
1e50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
1e60: 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66  ite3IsNumericAff
1e70: 69 6e 69 74 79 28 69 64 78 5f 61 66 66 69 6e 69  inity(idx_affini
1e80: 74 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ty);.  }.}../*.*
1e90: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 35 20  * Return the P5 
1ea0: 76 61 6c 75 65 20 74 68 61 74 20 73 68 6f 75 6c  value that shoul
1eb0: 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 61 20  d be used for a 
1ec0: 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f  binary compariso
1ed0: 6e 0a 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f  n.** opcode (OP_
1ee0: 45 71 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29 20  Eq, OP_Ge etc.) 
1ef0: 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20  used to compare 
1f00: 70 45 78 70 72 31 20 61 6e 64 20 70 45 78 70 72  pExpr1 and pExpr
1f10: 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  2..*/.static u8 
1f20: 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28  binaryCompareP5(
1f30: 45 78 70 72 20 2a 70 45 78 70 72 31 2c 20 45 78  Expr *pExpr1, Ex
1f40: 70 72 20 2a 70 45 78 70 72 32 2c 20 69 6e 74 20  pr *pExpr2, int 
1f50: 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75  jumpIfNull){.  u
1f60: 38 20 61 66 66 20 3d 20 28 63 68 61 72 29 73 71  8 aff = (char)sq
1f70: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
1f80: 79 28 70 45 78 70 72 32 29 3b 0a 20 20 61 66 66  y(pExpr2);.  aff
1f90: 20 3d 20 28 75 38 29 73 71 6c 69 74 65 33 43 6f   = (u8)sqlite3Co
1fa0: 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45  mpareAffinity(pE
1fb0: 78 70 72 31 2c 20 61 66 66 29 20 7c 20 28 75 38  xpr1, aff) | (u8
1fc0: 29 6a 75 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72  )jumpIfNull;.  r
1fd0: 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a  eturn aff;.}../*
1fe0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
1ff0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c  nter to the coll
2000: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74  ation sequence t
2010: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
2020: 65 64 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72  ed by.** a binar
2030: 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  y comparison ope
2040: 72 61 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20  rator comparing 
2050: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
2060: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
2070: 65 66 74 20 68 61 6e 64 20 65 78 70 72 65 73 73  eft hand express
2080: 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74  ion has a collat
2090: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 79 70  ing sequence typ
20a0: 65 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a  e, then it is.**
20b0: 20 75 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65   used. Otherwise
20c0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
20d0: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
20e0: 72 69 67 68 74 20 68 61 6e 64 20 65 78 70 72 65  right hand expre
20f0: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64  ssion.** is used
2100: 2c 20 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74  , or the default
2110: 20 28 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69   (BINARY) if nei
2120: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ther expression 
2130: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a  has a collating.
2140: 2a 2a 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41  ** type..**.** A
2150: 72 67 75 6d 65 6e 74 20 70 52 69 67 68 74 20 28  rgument pRight (
2160: 62 75 74 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d  but not pLeft) m
2170: 61 79 20 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69  ay be a null poi
2180: 6e 74 65 72 2e 20 49 6e 20 74 68 69 73 20 63 61  nter. In this ca
2190: 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  se,.** it is not
21a0: 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a   considered..*/.
21b0: 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33  CollSeq *sqlite3
21c0: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
21d0: 6c 53 65 71 28 0a 20 20 50 61 72 73 65 20 2a 70  lSeq(.  Parse *p
21e0: 50 61 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a  Parse, .  Expr *
21f0: 70 4c 65 66 74 2c 20 0a 20 20 45 78 70 72 20 2a  pLeft, .  Expr *
2200: 70 52 69 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c  pRight.){.  Coll
2210: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73  Seq *pColl;.  as
2220: 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20  sert( pLeft );. 
2230: 20 69 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67   if( pLeft->flag
2240: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29  s & EP_Collate )
2250: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
2260: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2270: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b  (pParse, pLeft);
2280: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69  .  }else if( pRi
2290: 67 68 74 20 26 26 20 28 70 52 69 67 68 74 2d 3e  ght && (pRight->
22a0: 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61  flags & EP_Colla
22b0: 74 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 43  te)!=0 ){.    pC
22c0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
22d0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
22e0: 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73   pRight);.  }els
22f0: 65 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  e{.    pColl = s
2300: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
2310: 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29  q(pParse, pLeft)
2320: 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c  ;.    if( !pColl
2330: 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20   ){.      pColl 
2340: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
2350: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69  lSeq(pParse, pRi
2360: 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ght);.    }.  }.
2370: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
2380: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
2390: 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d  e code for a com
23a0: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
23b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23c0: 63 6f 64 65 43 6f 6d 70 61 72 65 28 0a 20 20 50  codeCompare(.  P
23d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
23e0: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
23f0: 28 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61  (and code genera
2400: 74 69 6e 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f  ting) context */
2410: 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20  .  Expr *pLeft, 
2420: 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74       /* The left
2430: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78   operand */.  Ex
2440: 70 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20  pr *pRight,     
2450: 2f 2a 20 54 68 65 20 72 69 67 68 74 20 6f 70 65  /* The right ope
2460: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  rand */.  int op
2470: 63 6f 64 65 2c 20 20 20 20 20 20 20 2f 2a 20 54  code,       /* T
2480: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  he comparison op
2490: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  code */.  int in
24a0: 31 2c 20 69 6e 74 20 69 6e 32 2c 20 2f 2a 20 52  1, int in2, /* R
24b0: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
24c0: 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 20 20 69 6e  operands */.  in
24d0: 74 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20  t dest,         
24e0: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
24f0: 74 72 75 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20  true.  */.  int 
2500: 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a  jumpIfNull    /*
2510: 20 49 66 20 74 72 75 65 2c 20 6a 75 6d 70 20 69   If true, jump i
2520: 66 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64  f either operand
2530: 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   is NULL */.){. 
2540: 20 69 6e 74 20 70 35 3b 0a 20 20 69 6e 74 20 61   int p5;.  int a
2550: 64 64 72 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ddr;.  CollSeq *
2560: 70 34 3b 0a 0a 20 20 70 34 20 3d 20 73 71 6c 69  p4;..  p4 = sqli
2570: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
2580: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
2590: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a  pLeft, pRight);.
25a0: 20 20 70 35 20 3d 20 62 69 6e 61 72 79 43 6f 6d    p5 = binaryCom
25b0: 70 61 72 65 50 35 28 70 4c 65 66 74 2c 20 70 52  pareP5(pLeft, pR
25c0: 69 67 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  ight, jumpIfNull
25d0: 29 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69  );.  addr = sqli
25e0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 50  te3VdbeAddOp4(pP
25f0: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63  arse->pVdbe, opc
2600: 6f 64 65 2c 20 69 6e 32 2c 20 64 65 73 74 2c 20  ode, in2, dest, 
2610: 69 6e 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  in1,.           
2620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2630: 28 76 6f 69 64 2a 29 70 34 2c 20 50 34 5f 43 4f  (void*)p4, P4_CO
2640: 4c 4c 53 45 51 29 3b 0a 20 20 73 71 6c 69 74 65  LLSEQ);.  sqlite
2650: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 70 50  3VdbeChangeP5(pP
2660: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 28 75 38  arse->pVdbe, (u8
2670: 29 70 35 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  )p5);.  return a
2680: 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ddr;.}../*.** Re
2690: 74 75 72 6e 20 74 72 75 65 20 69 66 20 65 78 70  turn true if exp
26a0: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73  ression pExpr is
26b0: 20 61 20 76 65 63 74 6f 72 2c 20 6f 72 20 66 61   a vector, or fa
26c0: 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  lse otherwise..*
26d0: 2a 0a 2a 2a 20 41 20 76 65 63 74 6f 72 20 69 73  *.** A vector is
26e0: 20 64 65 66 69 6e 65 64 20 61 73 20 61 6e 79 20   defined as any 
26f0: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
2700: 72 65 73 75 6c 74 73 20 69 6e 20 74 77 6f 20 6f  results in two o
2710: 72 20 6d 6f 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e  r more.** column
2720: 73 20 6f 66 20 72 65 73 75 6c 74 2e 20 20 45 76  s of result.  Ev
2730: 65 72 79 20 54 4b 5f 56 45 43 54 4f 52 20 6e 6f  ery TK_VECTOR no
2740: 64 65 20 69 73 20 61 6e 20 76 65 63 74 6f 72 20  de is an vector 
2750: 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 70  because the.** p
2760: 61 72 73 65 72 20 77 69 6c 6c 20 6e 6f 74 20 67  arser will not g
2770: 65 6e 65 72 61 74 65 20 61 20 54 4b 5f 56 45 43  enerate a TK_VEC
2780: 54 4f 52 20 77 69 74 68 20 66 65 77 65 72 20 74  TOR with fewer t
2790: 68 61 6e 20 74 77 6f 20 65 6e 74 72 69 65 73 2e  han two entries.
27a0: 0a 2a 2a 20 42 75 74 20 61 20 54 4b 5f 53 45 4c  .** But a TK_SEL
27b0: 45 43 54 20 6d 69 67 68 74 20 62 65 20 65 69 74  ECT might be eit
27c0: 68 65 72 20 61 20 76 65 63 74 6f 72 20 6f 72 20  her a vector or 
27d0: 61 20 73 63 61 6c 61 72 2e 20 49 74 20 69 73 20  a scalar. It is 
27e0: 6f 6e 6c 79 0a 2a 2a 20 63 6f 6e 73 69 64 65 72  only.** consider
27f0: 65 64 20 61 20 76 65 63 74 6f 72 20 69 66 20 69  ed a vector if i
2800: 74 20 68 61 73 20 74 77 6f 20 6f 72 20 6d 6f 72  t has two or mor
2810: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  e result columns
2820: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2830: 45 78 70 72 49 73 56 65 63 74 6f 72 28 45 78 70  ExprIsVector(Exp
2840: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 72 65 74  r *pExpr){.  ret
2850: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 56  urn sqlite3ExprV
2860: 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 29  ectorSize(pExpr)
2870: 3e 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  >1;.}../*.** If 
2880: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
2890: 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
28a0: 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6f 66  y argument is of
28b0: 20 74 79 70 65 20 54 4b 5f 56 45 43 54 4f 52 20   type TK_VECTOR 
28c0: 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e  .** return the n
28d0: 75 6d 62 65 72 20 6f 66 20 65 78 70 72 65 73 73  umber of express
28e0: 69 6f 6e 73 20 69 6e 20 74 68 65 20 76 65 63 74  ions in the vect
28f0: 6f 72 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 65  or. Or, if the e
2900: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20  xpression.** is 
2910: 61 20 73 75 62 2d 73 65 6c 65 63 74 2c 20 72 65  a sub-select, re
2920: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
2930: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
2940: 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 46 6f  e sub-select. Fo
2950: 72 0a 2a 2a 20 61 6e 79 20 6f 74 68 65 72 20 74  r.** any other t
2960: 79 70 65 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ype of expressio
2970: 6e 2c 20 72 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a  n, return 1..*/.
2980: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 56  int sqlite3ExprV
2990: 65 63 74 6f 72 53 69 7a 65 28 45 78 70 72 20 2a  ectorSize(Expr *
29a0: 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45  pExpr){.  if( pE
29b0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 45 43 54  xpr->op==TK_VECT
29c0: 4f 52 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OR ){.    return
29d0: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
29e0: 3e 6e 45 78 70 72 3b 0a 20 20 7d 65 6c 73 65 20  >nExpr;.  }else 
29f0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
2a00: 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20  K_SELECT ){.    
2a10: 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e  return pExpr->x.
2a20: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
2a30: 3e 6e 45 78 70 72 3b 0a 20 20 7d 65 6c 73 65 7b  >nExpr;.  }else{
2a40: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
2a50: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
2a60: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
2a70: 52 59 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  RY./*.** Return 
2a80: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
2a90: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  ubexpression of 
2aa0: 70 56 65 63 74 6f 72 20 74 68 61 74 20 69 73 20  pVector that is 
2ab0: 74 68 65 20 69 2d 74 68 0a 2a 2a 20 63 6f 6c 75  the i-th.** colu
2ac0: 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72  mn of the vector
2ad0: 20 28 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74   (numbered start
2ae0: 69 6e 67 20 77 69 74 68 20 30 29 2e 20 20 54 68  ing with 0).  Th
2af0: 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a  e caller must.**
2b00: 20 65 6e 73 75 72 65 20 74 68 61 74 20 69 20 69   ensure that i i
2b10: 73 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 0a  s within range..
2b20: 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72  **.** If pVector
2b30: 20 69 73 20 72 65 61 6c 6c 79 20 61 20 73 63 61   is really a sca
2b40: 6c 61 72 20 28 61 6e 64 20 22 73 63 61 6c 61 72  lar (and "scalar
2b50: 22 20 68 65 72 65 20 69 6e 63 6c 75 64 65 73 20  " here includes 
2b60: 73 75 62 71 75 65 72 69 65 73 0a 2a 2a 20 74 68  subqueries.** th
2b70: 61 74 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67  at return a sing
2b80: 6c 65 20 63 6f 6c 75 6d 6e 21 29 20 74 68 65 6e  le column!) then
2b90: 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 20   return pVector 
2ba0: 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  unmodified..**.*
2bb0: 2a 20 70 56 65 63 74 6f 72 20 72 65 74 61 69 6e  * pVector retain
2bc0: 73 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74  s ownership of t
2bd0: 68 65 20 72 65 74 75 72 6e 65 64 20 73 75 62 65  he returned sube
2be0: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
2bf0: 20 49 66 20 74 68 65 20 76 65 63 74 6f 72 20 69   If the vector i
2c00: 73 20 61 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29  s a (SELECT ...)
2c10: 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
2c20: 73 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 69 73  sion returned is
2c30: 0a 2a 2a 20 6a 75 73 74 20 74 68 65 20 65 78 70  .** just the exp
2c40: 72 65 73 73 69 6f 6e 20 66 6f 72 20 74 68 65 20  ression for the 
2c50: 69 2d 74 68 20 74 65 72 6d 20 6f 66 20 74 68 65  i-th term of the
2c60: 20 72 65 73 75 6c 74 20 73 65 74 2c 20 61 6e 64   result set, and
2c70: 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 62 65 20 72   may.** not be r
2c80: 65 61 64 79 20 66 6f 72 20 65 76 61 6c 75 61 74  eady for evaluat
2c90: 69 6f 6e 20 62 65 63 61 75 73 65 20 74 68 65 20  ion because the 
2ca0: 74 61 62 6c 65 20 63 75 72 73 6f 72 20 68 61 73  table cursor has
2cb0: 20 6e 6f 74 20 79 65 74 0a 2a 2a 20 62 65 65 6e   not yet.** been
2cc0: 20 70 6f 73 69 74 69 6f 6e 65 64 2e 0a 2a 2f 0a   positioned..*/.
2cd0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 56 65 63  Expr *sqlite3Vec
2ce0: 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
2cf0: 45 78 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 69  Expr *pVector, i
2d00: 6e 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28  nt i){.  assert(
2d10: 20 69 3c 73 71 6c 69 74 65 33 45 78 70 72 56 65   i<sqlite3ExprVe
2d20: 63 74 6f 72 53 69 7a 65 28 70 56 65 63 74 6f 72  ctorSize(pVector
2d30: 29 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ) );.  if( sqlit
2d40: 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
2d50: 56 65 63 74 6f 72 29 20 29 7b 0a 20 20 20 20 69  Vector) ){.    i
2d60: 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d  f( pVector->op==
2d70: 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20  TK_SELECT ){.   
2d80: 20 20 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f     return pVecto
2d90: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  r->x.pSelect->pE
2da0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
2db0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2dc0: 20 20 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f     return pVecto
2dd0: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d  r->x.pList->a[i]
2de0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 0a 20 20  .pExpr;.    }.  
2df0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 56 65 63 74  }.  return pVect
2e00: 6f 72 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  or;.}.#endif /* 
2e10: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
2e20: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 2a  OMIT_SUBQUERY) *
2e30: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
2e40: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
2e50: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e  /*.** Compute an
2e60: 64 20 72 65 74 75 72 6e 20 61 20 6e 65 77 20 45  d return a new E
2e70: 78 70 72 20 6f 62 6a 65 63 74 20 77 68 69 63 68  xpr object which
2e80: 20 77 68 65 6e 20 70 61 73 73 65 64 20 74 6f 0a   when passed to.
2e90: 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  ** sqlite3ExprCo
2ea0: 64 65 28 29 20 77 69 6c 6c 20 67 65 6e 65 72 61  de() will genera
2eb0: 74 65 20 61 6c 6c 20 6e 65 63 65 73 73 61 72 79  te all necessary
2ec0: 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75 74 65   code to compute
2ed0: 0a 2a 2a 20 74 68 65 20 69 46 69 65 6c 64 2d 74  .** the iField-t
2ee0: 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  h column of the 
2ef0: 76 65 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f  vector expressio
2f00: 6e 20 70 56 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a  n pVector..**.**
2f10: 20 49 74 20 69 73 20 6f 6b 20 66 6f 72 20 70 56   It is ok for pV
2f20: 65 63 74 6f 72 20 74 6f 20 62 65 20 61 20 73 63  ector to be a sc
2f30: 61 6c 61 72 20 28 61 73 20 6c 6f 6e 67 20 61 73  alar (as long as
2f40: 20 69 46 69 65 6c 64 3d 3d 30 29 2e 20 20 0a 2a   iField==0).  .*
2f50: 2a 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20  * In that case, 
2f60: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72  this routine wor
2f70: 6b 73 20 6c 69 6b 65 20 73 71 6c 69 74 65 33 45  ks like sqlite3E
2f80: 78 70 72 44 75 70 28 29 2e 0a 2a 2a 0a 2a 2a 20  xprDup()..**.** 
2f90: 54 68 65 20 63 61 6c 6c 65 72 20 6f 77 6e 73 20  The caller owns 
2fa0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 45 78 70  the returned Exp
2fb0: 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 73 20  r object and is 
2fc0: 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a  responsible for.
2fd0: 2a 2a 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74  ** ensuring that
2fe0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   the returned va
2ff0: 6c 75 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67  lue eventually g
3000: 65 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a  ets freed..**.**
3010: 20 54 68 65 20 63 61 6c 6c 65 72 20 72 65 74 61   The caller reta
3020: 69 6e 73 20 6f 77 6e 65 72 73 68 69 70 20 6f 66  ins ownership of
3030: 20 70 56 65 63 74 6f 72 2e 20 20 49 66 20 70 56   pVector.  If pV
3040: 65 63 74 6f 72 20 69 73 20 61 20 54 4b 5f 53 45  ector is a TK_SE
3050: 4c 45 43 54 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  LECT,.** then th
3060: 65 20 72 65 74 75 72 6e 65 20 6f 62 6a 65 63 74  e returne object
3070: 20 77 69 6c 6c 20 72 65 66 65 72 65 6e 63 65 20   will reference 
3080: 70 56 65 63 74 6f 72 20 61 6e 64 20 73 6f 20 70  pVector and so p
3090: 56 65 63 74 6f 72 20 6d 75 73 74 20 72 65 6d 61  Vector must rema
30a0: 69 6e 0a 2a 2a 20 76 61 6c 69 64 20 66 6f 72 20  in.** valid for 
30b0: 74 68 65 20 6c 69 66 65 20 6f 66 20 74 68 65 20  the life of the 
30c0: 72 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 2e  returned object.
30d0: 20 20 49 66 20 70 56 65 63 74 6f 72 20 69 73 20    If pVector is 
30e0: 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f  a TK_VECTOR.** o
30f0: 72 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65  r a scalar expre
3100: 73 73 69 6f 6e 2c 20 74 68 65 6e 20 69 74 20 63  ssion, then it c
3110: 61 6e 20 62 65 20 64 65 6c 65 74 65 64 20 61 73  an be deleted as
3120: 20 73 6f 6f 6e 20 61 73 20 74 68 69 73 20 72 6f   soon as this ro
3130: 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73  utine.** returns
3140: 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 69 63 6b 20  ..**.** A trick 
3150: 74 6f 20 63 61 75 73 65 20 61 20 54 4b 5f 53 45  to cause a TK_SE
3160: 4c 45 43 54 20 70 56 65 63 74 6f 72 20 74 6f 20  LECT pVector to 
3170: 62 65 20 64 65 6c 65 74 65 64 20 74 6f 67 65 74  be deleted toget
3180: 68 65 72 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  her with.** the 
3190: 72 65 74 75 72 6e 65 64 20 45 78 70 72 20 6f 62  returned Expr ob
31a0: 6a 65 63 74 20 69 73 20 74 6f 20 61 74 74 61 63  ject is to attac
31b0: 68 20 74 68 65 20 70 56 65 63 74 6f 72 20 74 6f  h the pVector to
31c0: 20 74 68 65 20 70 52 69 67 68 74 20 66 69 65 6c   the pRight fiel
31d0: 64 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 74 75  d.** of the retu
31e0: 72 6e 65 64 20 54 4b 5f 53 45 4c 45 43 54 5f 43  rned TK_SELECT_C
31f0: 4f 4c 55 4d 4e 20 45 78 70 72 20 6f 62 6a 65 63  OLUMN Expr objec
3200: 74 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  t..*/.Expr *sqli
3210: 74 65 33 45 78 70 72 46 6f 72 56 65 63 74 6f 72  te3ExprForVector
3220: 46 69 65 6c 64 28 0a 20 20 50 61 72 73 65 20 2a  Field(.  Parse *
3230: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
3240: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
3250: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63   */.  Expr *pVec
3260: 74 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  tor,       /* Th
3270: 65 20 76 65 63 74 6f 72 2e 20 20 4c 69 73 74 20  e vector.  List 
3280: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  of expressions o
3290: 72 20 61 20 73 75 62 2d 53 45 4c 45 43 54 20 2a  r a sub-SELECT *
32a0: 2f 0a 20 20 69 6e 74 20 69 46 69 65 6c 64 20 20  /.  int iField  
32b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63           /* Whic
32c0: 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  h column of the 
32d0: 76 65 63 74 6f 72 20 74 6f 20 72 65 74 75 72 6e  vector to return
32e0: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
32f0: 52 65 74 3b 0a 20 20 69 66 28 20 70 56 65 63 74  Ret;.  if( pVect
3300: 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  or->op==TK_SELEC
3310: 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  T ){.    assert(
3320: 20 70 56 65 63 74 6f 72 2d 3e 66 6c 61 67 73 20   pVector->flags 
3330: 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29  & EP_xIsSelect )
3340: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 54 4b 5f  ;.    /* The TK_
3350: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78  SELECT_COLUMN Ex
3360: 70 72 20 6e 6f 64 65 3a 0a 20 20 20 20 2a 2a 0a  pr node:.    **.
3370: 20 20 20 20 2a 2a 20 70 4c 65 66 74 3a 20 20 20      ** pLeft:   
3380: 20 20 20 20 20 20 20 20 70 56 65 63 74 6f 72 20          pVector 
3390: 63 6f 6e 74 61 69 6e 69 6e 67 20 54 4b 5f 53 45  containing TK_SE
33a0: 4c 45 43 54 0a 20 20 20 20 2a 2a 20 70 52 69 67  LECT.    ** pRig
33b0: 68 74 3a 20 20 20 20 20 20 20 20 20 20 6e 6f 74  ht:          not
33c0: 20 75 73 65 64 2e 20 20 42 75 74 20 72 65 63 75   used.  But recu
33d0: 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65 64 2e  rsively deleted.
33e0: 0a 20 20 20 20 2a 2a 20 69 43 6f 6c 75 6d 6e 3a  .    ** iColumn:
33f0: 20 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 6f           Index o
3400: 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 56  f a column in pV
3410: 65 63 74 6f 72 0a 20 20 20 20 2a 2a 20 70 4c 65  ector.    ** pLe
3420: 66 74 2d 3e 69 54 61 62 6c 65 3a 20 20 20 46 69  ft->iTable:   Fi
3430: 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20  rst in an array 
3440: 6f 66 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  of register hold
3450: 69 6e 67 20 72 65 73 75 6c 74 2c 20 6f 72 20 30  ing result, or 0
3460: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
3470: 20 20 20 20 20 20 20 20 20 69 66 20 74 68 65 20           if the 
3480: 72 65 73 75 6c 74 20 69 73 20 6e 6f 74 20 79 65  result is not ye
3490: 74 20 63 6f 6d 70 75 74 65 64 2e 0a 20 20 20 20  t computed..    
34a0: 2a 2a 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  **.    ** sqlite
34b0: 33 45 78 70 72 44 65 6c 65 74 65 28 29 20 73 70  3ExprDelete() sp
34c0: 65 63 69 66 69 63 61 6c 6c 79 20 73 6b 69 70 73  ecifically skips
34d0: 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 64   the recursive d
34e0: 65 6c 65 74 65 20 6f 66 0a 20 20 20 20 2a 2a 20  elete of.    ** 
34f0: 70 4c 65 66 74 20 6f 6e 20 54 4b 5f 53 45 4c 45  pLeft on TK_SELE
3500: 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 2e  CT_COLUMN nodes.
3510: 20 20 42 75 74 20 70 52 69 67 68 74 20 69 73 20    But pRight is 
3520: 66 6f 6c 6c 6f 77 65 64 2c 20 73 6f 20 70 56 65  followed, so pVe
3530: 63 74 6f 72 0a 20 20 20 20 2a 2a 20 63 61 6e 20  ctor.    ** can 
3540: 62 65 20 61 74 74 61 63 68 65 64 20 74 6f 20 70  be attached to p
3550: 52 69 67 68 74 20 74 6f 20 63 61 75 73 65 20 74  Right to cause t
3560: 68 69 73 20 6e 6f 64 65 20 74 6f 20 74 61 6b 65  his node to take
3570: 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 0a 20 20   ownership of.  
3580: 20 20 2a 2a 20 70 56 65 63 74 6f 72 2e 20 20 54    ** pVector.  T
3590: 79 70 69 63 61 6c 6c 79 20 74 68 65 72 65 20 77  ypically there w
35a0: 69 6c 6c 20 62 65 20 6d 75 6c 74 69 70 6c 65 20  ill be multiple 
35b0: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
35c0: 20 6e 6f 64 65 73 0a 20 20 20 20 2a 2a 20 77 69   nodes.    ** wi
35d0: 74 68 20 74 68 65 20 73 61 6d 65 20 70 4c 65 66  th the same pLef
35e0: 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  t pointer to the
35f0: 20 70 56 65 63 74 6f 72 2c 20 62 75 74 20 6f 6e   pVector, but on
3600: 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 6d 0a 20  ly one of them. 
3610: 20 20 20 2a 2a 20 77 69 6c 6c 20 6f 77 6e 20 74     ** will own t
3620: 68 65 20 70 56 65 63 74 6f 72 2e 0a 20 20 20 20  he pVector..    
3630: 2a 2f 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71  */.    pRet = sq
3640: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
3650: 65 2c 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  e, TK_SELECT_COL
3660: 55 4d 4e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  UMN, 0, 0, 0);. 
3670: 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20     if( pRet ){. 
3680: 20 20 20 20 20 70 52 65 74 2d 3e 69 43 6f 6c 75       pRet->iColu
3690: 6d 6e 20 3d 20 69 46 69 65 6c 64 3b 0a 20 20 20  mn = iField;.   
36a0: 20 20 20 70 52 65 74 2d 3e 70 4c 65 66 74 20 3d     pRet->pLeft =
36b0: 20 70 56 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a   pVector;.    }.
36c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 74      assert( pRet
36d0: 3d 3d 30 20 7c 7c 20 70 52 65 74 2d 3e 69 54 61  ==0 || pRet->iTa
36e0: 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73  ble==0 );.  }els
36f0: 65 7b 0a 20 20 20 20 69 66 28 20 70 56 65 63 74  e{.    if( pVect
3700: 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f  or->op==TK_VECTO
3710: 52 20 29 20 70 56 65 63 74 6f 72 20 3d 20 70 56  R ) pVector = pV
3720: 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  ector->x.pList->
3730: 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70 72 3b  a[iField].pExpr;
3740: 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69  .    pRet = sqli
3750: 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73  te3ExprDup(pPars
3760: 65 2d 3e 64 62 2c 20 70 56 65 63 74 6f 72 2c 20  e->db, pVector, 
3770: 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
3780: 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20   pRet;.}.#endif 
3790: 2f 2a 20 21 64 65 66 69 6e 65 28 53 51 4c 49 54  /* !define(SQLIT
37a0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
37b0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78   */../*.** If ex
37c0: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69  pression pExpr i
37d0: 73 20 6f 66 20 74 79 70 65 20 54 4b 5f 53 45 4c  s of type TK_SEL
37e0: 45 43 54 2c 20 67 65 6e 65 72 61 74 65 20 63 6f  ECT, generate co
37f0: 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a  de to evaluate.*
3800: 2a 20 69 74 2e 20 52 65 74 75 72 6e 20 74 68 65  * it. Return the
3810: 20 72 65 67 69 73 74 65 72 20 69 6e 20 77 68 69   register in whi
3820: 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  ch the result is
3830: 20 73 74 6f 72 65 64 20 28 6f 72 2c 20 69 66 20   stored (or, if 
3840: 74 68 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65  the .** sub-sele
3850: 63 74 20 72 65 74 75 72 6e 73 20 6d 6f 72 65 20  ct returns more 
3860: 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2c  than one column,
3870: 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e   the first in an
3880: 20 61 72 72 61 79 0a 2a 2a 20 6f 66 20 72 65 67   array.** of reg
3890: 69 73 74 65 72 73 20 69 6e 20 77 68 69 63 68 20  isters in which 
38a0: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74  the result is st
38b0: 6f 72 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ored)..**.** If 
38c0: 70 45 78 70 72 20 69 73 20 6e 6f 74 20 61 20 54  pExpr is not a T
38d0: 4b 5f 53 45 4c 45 43 54 20 65 78 70 72 65 73 73  K_SELECT express
38e0: 69 6f 6e 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a  ion, return 0..*
38f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
3900: 72 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 50  rCodeSubselect(P
3910: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
3920: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e  pr *pExpr){.  in
3930: 74 20 72 65 67 20 3d 20 30 3b 0a 23 69 66 6e 64  t reg = 0;.#ifnd
3940: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
3950: 55 42 51 55 45 52 59 0a 20 20 69 66 28 20 70 45  UBQUERY.  if( pE
3960: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
3970: 43 54 20 29 7b 0a 20 20 20 20 72 65 67 20 3d 20  CT ){.    reg = 
3980: 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
3990: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78  lect(pParse, pEx
39a0: 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23  pr, 0, 0);.  }.#
39b0: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72  endif.  return r
39c0: 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67  eg;.}../*.** Arg
39d0: 75 6d 65 6e 74 20 70 56 65 63 74 6f 72 20 70 6f  ument pVector po
39e0: 69 6e 74 73 20 74 6f 20 61 20 76 65 63 74 6f 72  ints to a vector
39f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 2d 20 65 69   expression - ei
3a00: 74 68 65 72 20 61 20 54 4b 5f 56 45 43 54 4f 52  ther a TK_VECTOR
3a10: 0a 2a 2a 20 6f 72 20 54 4b 5f 53 45 4c 45 43 54  .** or TK_SELECT
3a20: 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 6d 6f   that returns mo
3a30: 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75  re than one colu
3a40: 6d 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  mn. This functio
3a50: 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65  n returns.** the
3a60: 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
3a70: 20 6f 66 20 61 20 72 65 67 69 73 74 65 72 20 74   of a register t
3a80: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
3a90: 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 6c 65   value of.** ele
3aa0: 6d 65 6e 74 20 69 46 69 65 6c 64 20 6f 66 20 74  ment iField of t
3ab0: 68 65 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a  he vector..**.**
3ac0: 20 49 66 20 70 56 65 63 74 6f 72 20 69 73 20 61   If pVector is a
3ad0: 20 54 4b 5f 53 45 4c 45 43 54 20 65 78 70 72 65   TK_SELECT expre
3ae0: 73 73 69 6f 6e 2c 20 74 68 65 6e 20 63 6f 64 65  ssion, then code
3af0: 20 66 6f 72 20 69 74 20 6d 75 73 74 20 68 61 76   for it must hav
3b00: 65 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65  e .** already be
3b10: 65 6e 20 67 65 6e 65 72 61 74 65 64 20 75 73 69  en generated usi
3b20: 6e 67 20 74 68 65 20 65 78 70 72 43 6f 64 65 53  ng the exprCodeS
3b30: 75 62 73 65 6c 65 63 74 28 29 20 72 6f 75 74 69  ubselect() routi
3b40: 6e 65 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63  ne. In this.** c
3b50: 61 73 65 20 70 61 72 61 6d 65 74 65 72 20 72 65  ase parameter re
3b60: 67 53 65 6c 65 63 74 20 73 68 6f 75 6c 64 20 62  gSelect should b
3b70: 65 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61  e the first in a
3b80: 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73  n array of regis
3b90: 74 65 72 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69  ters.** containi
3ba0: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  ng the results o
3bb0: 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  f the sub-select
3bc0: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63  . .**.** If pVec
3bd0: 74 6f 72 20 69 73 20 6f 66 20 74 79 70 65 20 54  tor is of type T
3be0: 4b 5f 56 45 43 54 4f 52 2c 20 74 68 65 6e 20 63  K_VECTOR, then c
3bf0: 6f 64 65 20 66 6f 72 20 74 68 65 20 72 65 71 75  ode for the requ
3c00: 65 73 74 65 64 20 66 69 65 6c 64 0a 2a 2a 20 69  ested field.** i
3c10: 73 20 67 65 6e 65 72 61 74 65 64 2e 20 49 6e 20  s generated. In 
3c20: 74 68 69 73 20 63 61 73 65 20 28 2a 70 52 65 67  this case (*pReg
3c30: 46 72 65 65 29 20 6d 61 79 20 62 65 20 73 65 74  Free) may be set
3c40: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
3c50: 66 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79  f.** a temporary
3c60: 20 72 65 67 69 73 74 65 72 20 74 6f 20 62 65 20   register to be 
3c70: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
3c80: 6c 65 72 20 62 65 66 6f 72 65 20 72 65 74 75 72  ler before retur
3c90: 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f  ning..**.** Befo
3ca0: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 6f 75  re returning, ou
3cb0: 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 20 28  tput parameter (
3cc0: 2a 70 70 45 78 70 72 29 20 69 73 20 73 65 74 20  *ppExpr) is set 
3cd0: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a  to point to the.
3ce0: 2a 2a 20 45 78 70 72 20 6f 62 6a 65 63 74 20 63  ** Expr object c
3cf0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
3d00: 65 6c 65 6d 65 6e 74 20 69 45 6c 65 6d 20 6f 66  element iElem of
3d10: 20 74 68 65 20 76 65 63 74 6f 72 2e 0a 2a 2f 0a   the vector..*/.
3d20: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 56  static int exprV
3d30: 65 63 74 6f 72 52 65 67 69 73 74 65 72 28 0a 20  ectorRegister(. 
3d40: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
3d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d60: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
3d70: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 56 65  t */.  Expr *pVe
3d80: 63 74 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20  ctor,           
3d90: 20 20 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72         /* Vector
3da0: 20 74 6f 20 65 78 74 72 61 63 74 20 65 6c 65 6d   to extract elem
3db0: 65 6e 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ent from */.  in
3dc0: 74 20 69 46 69 65 6c 64 2c 20 20 20 20 20 20 20  t iField,       
3dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3de0: 20 46 69 65 6c 64 20 74 6f 20 65 78 74 72 61 63   Field to extrac
3df0: 74 20 66 72 6f 6d 20 70 56 65 63 74 6f 72 20 2a  t from pVector *
3e00: 2f 0a 20 20 69 6e 74 20 72 65 67 53 65 6c 65 63  /.  int regSelec
3e10: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
3e20: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 20      /* First in 
3e30: 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
3e40: 72 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70  rs */.  Expr **p
3e50: 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
3e60: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
3e70: 45 78 70 72 65 73 73 69 6f 6e 20 65 6c 65 6d 65  Expression eleme
3e80: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nt */.  int *pRe
3e90: 67 46 72 65 65 20 20 20 20 20 20 20 20 20 20 20  gFree           
3ea0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
3eb0: 54 65 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f  Temp register to
3ec0: 20 66 72 65 65 20 2a 2f 0a 29 7b 0a 20 20 61 73   free */.){.  as
3ed0: 73 65 72 74 28 20 70 56 65 63 74 6f 72 2d 3e 6f  sert( pVector->o
3ee0: 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 7c 7c 20  p==TK_VECTOR || 
3ef0: 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f  pVector->op==TK_
3f00: 53 45 4c 45 43 54 20 29 3b 0a 20 20 61 73 73 65  SELECT );.  asse
3f10: 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  rt( pParse->nErr
3f20: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
3f30: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 20  mallocFailed.   
3f40: 20 20 20 20 20 20 20 7c 7c 20 28 70 56 65 63 74         || (pVect
3f50: 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f  or->op==TK_VECTO
3f60: 52 29 3d 3d 28 72 65 67 53 65 6c 65 63 74 3d 3d  R)==(regSelect==
3f70: 30 29 20 29 3b 0a 20 20 69 66 28 20 70 56 65 63  0) );.  if( pVec
3f80: 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  tor->op==TK_SELE
3f90: 43 54 20 29 7b 0a 20 20 20 20 2a 70 70 45 78 70  CT ){.    *ppExp
3fa0: 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70  r = pVector->x.p
3fb0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
3fc0: 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70 72 3b  a[iField].pExpr;
3fd0: 0a 20 20 20 20 20 72 65 74 75 72 6e 20 72 65 67  .     return reg
3fe0: 53 65 6c 65 63 74 2b 69 46 69 65 6c 64 3b 0a 20  Select+iField;. 
3ff0: 20 7d 0a 20 20 2a 70 70 45 78 70 72 20 3d 20 70   }.  *ppExpr = p
4000: 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d  Vector->x.pList-
4010: 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70 72  >a[iField].pExpr
4020: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
4030: 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
4040: 50 61 72 73 65 2c 20 2a 70 70 45 78 70 72 2c 20  Parse, *ppExpr, 
4050: 70 52 65 67 46 72 65 65 29 3b 0a 7d 0a 0a 2f 2a  pRegFree);.}../*
4060: 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70  .** Expression p
4070: 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72  Expr is a compar
4080: 69 73 6f 6e 20 62 65 74 77 65 65 6e 20 74 77 6f  ison between two
4090: 20 76 65 63 74 6f 72 20 76 61 6c 75 65 73 2e 20   vector values. 
40a0: 43 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 72  Compute.** the r
40b0: 65 73 75 6c 74 20 6f 66 20 74 68 65 20 63 6f 6d  esult of the com
40c0: 70 61 72 69 73 6f 6e 20 28 31 2c 20 30 2c 20 6f  parison (1, 0, o
40d0: 72 20 4e 55 4c 4c 29 20 61 6e 64 20 77 72 69 74  r NULL) and writ
40e0: 65 20 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c 74  e that.** result
40f0: 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 64   into register d
4100: 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  est..**.** The c
4110: 61 6c 6c 65 72 20 6d 75 73 74 20 73 61 74 69 73  aller must satis
4120: 66 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  fy the following
4130: 20 70 72 65 63 6f 6e 64 69 74 69 6f 6e 73 3a 0a   preconditions:.
4140: 2a 2a 0a 2a 2a 20 20 20 20 69 66 20 70 45 78 70  **.**    if pExp
4150: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 3a 20 20 20  r->op==TK_IS:   
4160: 20 20 20 6f 70 3d 3d 54 4b 5f 45 51 20 61 6e 64     op==TK_EQ and
4170: 20 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c   p5==SQLITE_NULL
4180: 45 51 0a 2a 2a 20 20 20 20 69 66 20 70 45 78 70  EQ.**    if pExp
4190: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 3a  r->op==TK_ISNOT:
41a0: 20 20 20 6f 70 3d 3d 54 4b 5f 4e 45 20 61 6e 64     op==TK_NE and
41b0: 20 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c   p5==SQLITE_NULL
41c0: 45 51 0a 2a 2a 20 20 20 20 6f 74 68 65 72 77 69  EQ.**    otherwi
41d0: 73 65 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  se:             
41e0: 20 20 20 6f 70 3d 3d 70 45 78 70 72 2d 3e 6f 70     op==pExpr->op
41f0: 20 61 6e 64 20 70 35 3d 3d 30 0a 2a 2f 0a 73 74   and p5==0.*/.st
4200: 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 56 65  atic void codeVe
4210: 63 74 6f 72 43 6f 6d 70 61 72 65 28 0a 20 20 50  ctorCompare(.  P
4220: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4230: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 67 65 6e       /* Code gen
4240: 65 72 61 74 6f 72 20 63 6f 6e 74 65 78 74 20 2a  erator context *
4250: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
4260: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4270: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
4280: 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64  ation */.  int d
4290: 65 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  est,            
42a0: 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74   /* Write result
42b0: 73 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69  s into this regi
42c0: 73 74 65 72 20 2a 2f 0a 20 20 75 38 20 6f 70 2c  ster */.  u8 op,
42d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42e0: 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  /* Comparison op
42f0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 75 38 20 70  erator */.  u8 p
4300: 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  5               
4310: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 55 4c 4c    /* SQLITE_NULL
4320: 45 51 20 6f 72 20 7a 65 72 6f 20 2a 2f 0a 29 7b  EQ or zero */.){
4330: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
4340: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 45 78  rse->pVdbe;.  Ex
4350: 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
4360: 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 45 78 70 72  r->pLeft;.  Expr
4370: 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70 72   *pRight = pExpr
4380: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 69 6e 74 20  ->pRight;.  int 
4390: 6e 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  nLeft = sqlite3E
43a0: 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c  xprVectorSize(pL
43b0: 65 66 74 29 3b 0a 20 20 69 6e 74 20 6e 52 69 67  eft);.  int nRig
43c0: 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
43d0: 56 65 63 74 6f 72 53 69 7a 65 28 70 52 69 67 68  VectorSize(pRigh
43e0: 74 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  t);..  /* Check 
43f0: 74 68 61 74 20 62 6f 74 68 20 73 69 64 65 73 20  that both sides 
4400: 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  of the compariso
4410: 6e 20 61 72 65 20 76 65 63 74 6f 72 73 2c 20 61  n are vectors, a
4420: 6e 64 20 74 68 61 74 0a 20 20 2a 2a 20 62 6f 74  nd that.  ** bot
4430: 68 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 6c  h are the same l
4440: 65 6e 67 74 68 2e 20 20 2a 2f 0a 20 20 69 66 28  ength.  */.  if(
4450: 20 6e 4c 65 66 74 21 3d 6e 52 69 67 68 74 20 29   nLeft!=nRight )
4460: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
4470: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69  orMsg(pParse, "i
4480: 6e 76 61 6c 69 64 20 75 73 65 20 6f 66 20 72 6f  nvalid use of ro
4490: 77 20 76 61 6c 75 65 22 29 3b 0a 20 20 7d 65 6c  w value");.  }el
44a0: 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  se{.    int i;. 
44b0: 20 20 20 69 6e 74 20 72 65 67 4c 65 66 74 20 3d     int regLeft =
44c0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 52   0;.    int regR
44d0: 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 75 38  ight = 0;.    u8
44e0: 20 6f 70 78 20 3d 20 6f 70 3b 0a 20 20 20 20 69   opx = op;.    i
44f0: 6e 74 20 61 64 64 72 44 6f 6e 65 20 3d 20 73 71  nt addrDone = sq
4500: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
4510: 65 6c 28 76 29 3b 0a 0a 20 20 20 20 61 73 73 65  el(v);..    asse
4520: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
4530: 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_EQ || pExpr->o
4540: 70 3d 3d 54 4b 5f 4e 45 20 0a 20 20 20 20 20 20  p==TK_NE .      
4550: 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d     || pExpr->op=
4560: 3d 54 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d  =TK_IS || pExpr-
4570: 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 0a 20  >op==TK_ISNOT . 
4580: 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72          || pExpr
4590: 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70  ->op==TK_LT || p
45a0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20  Expr->op==TK_GT 
45b0: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78  .         || pEx
45c0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c  pr->op==TK_LE ||
45d0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
45e0: 45 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73  E .    );.    as
45f0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
4600: 3d 6f 70 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f  =op || (pExpr->o
4610: 70 3d 3d 54 4b 5f 49 53 20 26 26 20 6f 70 3d 3d  p==TK_IS && op==
4620: 54 4b 5f 45 51 29 0a 20 20 20 20 20 20 20 20 20  TK_EQ).         
4630: 20 20 20 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e       || (pExpr->
4640: 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 26 26 20  op==TK_ISNOT && 
4650: 6f 70 3d 3d 54 4b 5f 4e 45 29 20 29 3b 0a 20 20  op==TK_NE) );.  
4660: 20 20 61 73 73 65 72 74 28 20 70 35 3d 3d 30 20    assert( p5==0 
4670: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f 70  || pExpr->op!=op
4680: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
4690: 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  p5==SQLITE_NULLE
46a0: 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  Q || pExpr->op==
46b0: 6f 70 20 29 3b 0a 0a 20 20 20 20 70 35 20 7c 3d  op );..    p5 |=
46c0: 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 3b   SQLITE_STOREP2;
46d0: 0a 20 20 20 20 69 66 28 20 6f 70 78 3d 3d 54 4b  .    if( opx==TK
46e0: 5f 4c 45 20 29 20 6f 70 78 20 3d 20 54 4b 5f 4c  _LE ) opx = TK_L
46f0: 54 3b 0a 20 20 20 20 69 66 28 20 6f 70 78 3d 3d  T;.    if( opx==
4700: 54 4b 5f 47 45 20 29 20 6f 70 78 20 3d 20 54 4b  TK_GE ) opx = TK
4710: 5f 47 54 3b 0a 0a 20 20 20 20 72 65 67 4c 65 66  _GT;..    regLef
4720: 74 20 3d 20 65 78 70 72 43 6f 64 65 53 75 62 73  t = exprCodeSubs
4730: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 4c  elect(pParse, pL
4740: 65 66 74 29 3b 0a 20 20 20 20 72 65 67 52 69 67  eft);.    regRig
4750: 68 74 20 3d 20 65 78 70 72 43 6f 64 65 53 75 62  ht = exprCodeSub
4760: 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
4770: 52 69 67 68 74 29 3b 0a 0a 20 20 20 20 66 6f 72  Right);..    for
4780: 28 69 3d 30 3b 20 69 3c 6e 4c 65 66 74 3b 20 69  (i=0; i<nLeft; i
4790: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  ++){.      int r
47a0: 65 67 46 72 65 65 31 20 3d 20 30 2c 20 72 65 67  egFree1 = 0, reg
47b0: 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 20 20 20  Free2 = 0;.     
47c0: 20 45 78 70 72 20 2a 70 4c 2c 20 2a 70 52 3b 20   Expr *pL, *pR; 
47d0: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72  .      int r1, r
47e0: 32 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3e 30  2;.      if( i>0
47f0: 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 43 61   ) sqlite3ExprCa
4800: 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
4810: 0a 20 20 20 20 20 20 72 31 20 3d 20 65 78 70 72  .      r1 = expr
4820: 56 65 63 74 6f 72 52 65 67 69 73 74 65 72 28 70  VectorRegister(p
4830: 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 69 2c  Parse, pLeft, i,
4840: 20 72 65 67 4c 65 66 74 2c 20 26 70 4c 2c 20 26   regLeft, &pL, &
4850: 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
4860: 20 72 32 20 3d 20 65 78 70 72 56 65 63 74 6f 72   r2 = exprVector
4870: 52 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c  Register(pParse,
4880: 20 70 52 69 67 68 74 2c 20 69 2c 20 72 65 67 52   pRight, i, regR
4890: 69 67 68 74 2c 20 26 70 52 2c 20 26 72 65 67 46  ight, &pR, &regF
48a0: 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64  ree2);.      cod
48b0: 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
48c0: 20 70 4c 2c 20 70 52 2c 20 6f 70 78 2c 20 72 31   pL, pR, opx, r1
48d0: 2c 20 72 32 2c 20 64 65 73 74 2c 20 70 35 29 3b  , r2, dest, p5);
48e0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
48f0: 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65  op==OP_Lt); Vdbe
4900: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
4910: 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 74  =OP_Lt);.      t
4920: 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
4930: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
4940: 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  If(v,op==OP_Le);
4950: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
4960: 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65  op==OP_Gt); Vdbe
4970: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
4980: 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 74  =OP_Gt);.      t
4990: 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
49a0: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
49b0: 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b  If(v,op==OP_Ge);
49c0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
49d0: 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65  op==OP_Eq); Vdbe
49e0: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
49f0: 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 74  =OP_Eq);.      t
4a00: 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e  estcase(op==OP_N
4a10: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
4a20: 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  If(v,op==OP_Ne);
4a30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
4a40: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
4a50: 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
4a60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
4a70: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
4a80: 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20  se, regFree2);. 
4a90: 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 20 73       if( i>0 ) s
4aa0: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
4ab0: 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
4ac0: 20 20 69 66 28 20 69 3d 3d 6e 4c 65 66 74 2d 31    if( i==nLeft-1
4ad0: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
4ae0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
4af0: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 45 51 20   if( opx==TK_EQ 
4b00: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
4b10: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
4b20: 4f 50 5f 49 66 4e 6f 74 2c 20 64 65 73 74 2c 20  OP_IfNot, dest, 
4b30: 61 64 64 72 44 6f 6e 65 29 3b 20 56 64 62 65 43  addrDone); VdbeC
4b40: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
4b50: 20 20 20 20 70 35 20 7c 3d 20 53 51 4c 49 54 45      p5 |= SQLITE
4b60: 5f 4b 45 45 50 4e 55 4c 4c 3b 0a 20 20 20 20 20  _KEEPNULL;.     
4b70: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 78 3d 3d   }else if( opx==
4b80: 54 4b 5f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  TK_NE ){.       
4b90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4ba0: 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 64 65 73  p2(v, OP_If, des
4bb0: 74 2c 20 61 64 64 72 44 6f 6e 65 29 3b 20 56 64  t, addrDone); Vd
4bc0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
4bd0: 20 20 20 20 20 20 20 70 35 20 7c 3d 20 53 51 4c         p5 |= SQL
4be0: 49 54 45 5f 4b 45 45 50 4e 55 4c 4c 3b 0a 20 20  ITE_KEEPNULL;.  
4bf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4c00: 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54     assert( op==T
4c10: 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47  K_LT || op==TK_G
4c20: 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 4c 45 20 7c  T || op==TK_LE |
4c30: 7c 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20  | op==TK_GE );. 
4c40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4c50: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45  beAddOp2(v, OP_E
4c60: 6c 73 65 4e 6f 74 45 71 2c 20 30 2c 20 61 64 64  lseNotEq, 0, add
4c70: 72 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 20 20  rDone);.        
4c80: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
4c90: 2c 20 6f 70 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20  , op==TK_LT);.  
4ca0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
4cb0: 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 47  geIf(v, op==TK_G
4cc0: 54 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  T);.        Vdbe
4cd0: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
4ce0: 3d 3d 54 4b 5f 4c 45 29 3b 0a 20 20 20 20 20 20  ==TK_LE);.      
4cf0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
4d00: 28 76 2c 20 6f 70 3d 3d 54 4b 5f 47 45 29 3b 0a  (v, op==TK_GE);.
4d10: 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 6e          if( i==n
4d20: 4c 65 66 74 2d 32 20 29 20 6f 70 78 20 3d 20 6f  Left-2 ) opx = o
4d30: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  p;.      }.    }
4d40: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4d50: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
4d60: 61 64 64 72 44 6f 6e 65 29 3b 0a 20 20 7d 0a 7d  addrDone);.  }.}
4d70: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
4d80: 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 2f 2a  _EXPR_DEPTH>0./*
4d90: 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61  .** Check that a
4da0: 72 67 75 6d 65 6e 74 20 6e 48 65 69 67 68 74 20  rgument nHeight 
4db0: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
4dc0: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78  equal to the max
4dd0: 69 6d 75 6d 0a 2a 2a 20 65 78 70 72 65 73 73 69  imum.** expressi
4de0: 6f 6e 20 64 65 70 74 68 20 61 6c 6c 6f 77 65 64  on depth allowed
4df0: 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20  . If it is not, 
4e00: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
4e10: 65 73 73 61 67 65 20 69 6e 0a 2a 2a 20 70 50 61  essage in.** pPa
4e20: 72 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  rse..*/.int sqli
4e30: 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67  te3ExprCheckHeig
4e40: 68 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ht(Parse *pParse
4e50: 2c 20 69 6e 74 20 6e 48 65 69 67 68 74 29 7b 0a  , int nHeight){.
4e60: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
4e70: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6d 78 48 65  E_OK;.  int mxHe
4e80: 69 67 68 74 20 3d 20 70 50 61 72 73 65 2d 3e 64  ight = pParse->d
4e90: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
4ea0: 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54  _LIMIT_EXPR_DEPT
4eb0: 48 5d 3b 0a 20 20 69 66 28 20 6e 48 65 69 67 68  H];.  if( nHeigh
4ec0: 74 3e 6d 78 48 65 69 67 68 74 20 29 7b 0a 20 20  t>mxHeight ){.  
4ed0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
4ee0: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
4ef0: 20 20 22 45 78 70 72 65 73 73 69 6f 6e 20 74 72    "Expression tr
4f00: 65 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20  ee is too large 
4f10: 28 6d 61 78 69 6d 75 6d 20 64 65 70 74 68 20 25  (maximum depth %
4f20: 64 29 22 2c 20 6d 78 48 65 69 67 68 74 0a 20 20  d)", mxHeight.  
4f30: 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51    );.    rc = SQ
4f40: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
4f50: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4f60: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
4f70: 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73   three functions
4f80: 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 29  , heightOfExpr()
4f90: 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69  , heightOfExprLi
4fa0: 73 74 28 29 0a 2a 2a 20 61 6e 64 20 68 65 69 67  st().** and heig
4fb0: 68 74 4f 66 53 65 6c 65 63 74 28 29 2c 20 61 72  htOfSelect(), ar
4fc0: 65 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  e used to determ
4fd0: 69 6e 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  ine the maximum 
4fe0: 68 65 69 67 68 74 0a 2a 2a 20 6f 66 20 61 6e 79  height.** of any
4ff0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
5000: 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 74   referenced by t
5010: 68 65 20 73 74 72 75 63 74 75 72 65 20 70 61 73  he structure pas
5020: 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69  sed as the.** fi
5030: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  rst argument..**
5040: 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 61 78 69  .** If this maxi
5050: 6d 75 6d 20 68 65 69 67 68 74 20 69 73 20 67 72  mum height is gr
5060: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
5070: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 70 6f 69  urrent value poi
5080: 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 70 6e  nted.** to by pn
5090: 48 65 69 67 68 74 2c 20 74 68 65 20 73 65 63 6f  Height, the seco
50a0: 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 20 74 68  nd parameter, th
50b0: 65 6e 20 73 65 74 20 2a 70 6e 48 65 69 67 68 74  en set *pnHeight
50c0: 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75   to that.** valu
50d0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
50e0: 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 45  d heightOfExpr(E
50f0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48  xpr *p, int *pnH
5100: 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20  eight){.  if( p 
5110: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 48  ){.    if( p->nH
5120: 65 69 67 68 74 3e 2a 70 6e 48 65 69 67 68 74 20  eight>*pnHeight 
5130: 29 7b 0a 20 20 20 20 20 20 2a 70 6e 48 65 69 67  ){.      *pnHeig
5140: 68 74 20 3d 20 70 2d 3e 6e 48 65 69 67 68 74 3b  ht = p->nHeight;
5150: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61  .    }.  }.}.sta
5160: 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f  tic void heightO
5170: 66 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69  fExprList(ExprLi
5180: 73 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65  st *p, int *pnHe
5190: 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29  ight){.  if( p )
51a0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
51b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
51c0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
51d0: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
51e0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 6e  ->a[i].pExpr, pn
51f0: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20  Height);.    }. 
5200: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
5210: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
5220: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 2a  Select *p, int *
5230: 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28  pnHeight){.  if(
5240: 20 70 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74   p ){.    height
5250: 4f 66 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65  OfExpr(p->pWhere
5260: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
5270: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
5280: 3e 70 48 61 76 69 6e 67 2c 20 70 6e 48 65 69 67  >pHaving, pnHeig
5290: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
52a0: 66 45 78 70 72 28 70 2d 3e 70 4c 69 6d 69 74 2c  fExpr(p->pLimit,
52b0: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
52c0: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
52d0: 70 4f 66 66 73 65 74 2c 20 70 6e 48 65 69 67 68  pOffset, pnHeigh
52e0: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
52f0: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69  ExprList(p->pELi
5300: 73 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  st, pnHeight);. 
5310: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c     heightOfExprL
5320: 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c  ist(p->pGroupBy,
5330: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
5340: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
5350: 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e  (p->pOrderBy, pn
5360: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
5370: 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70  ghtOfSelect(p->p
5380: 50 72 69 6f 72 2c 20 70 6e 48 65 69 67 68 74 29  Prior, pnHeight)
5390: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
53a0: 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69  et the Expr.nHei
53b0: 67 68 74 20 76 61 72 69 61 62 6c 65 20 69 6e 20  ght variable in 
53c0: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70 61  the structure pa
53d0: 73 73 65 64 20 61 73 20 61 6e 20 0a 2a 2a 20 61  ssed as an .** a
53e0: 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65 78 70 72  rgument. An expr
53f0: 65 73 73 69 6f 6e 20 77 69 74 68 20 6e 6f 20 63  ession with no c
5400: 68 69 6c 64 72 65 6e 2c 20 45 78 70 72 2e 70 4c  hildren, Expr.pL
5410: 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78 70 72 2e  ist or .** Expr.
5420: 70 53 65 6c 65 63 74 20 6d 65 6d 62 65 72 20 68  pSelect member h
5430: 61 73 20 61 20 68 65 69 67 68 74 20 6f 66 20 31  as a height of 1
5440: 2e 20 41 6e 79 20 6f 74 68 65 72 20 65 78 70 72  . Any other expr
5450: 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73 20 61 20  ession.** has a 
5460: 68 65 69 67 68 74 20 65 71 75 61 6c 20 74 6f 20  height equal to 
5470: 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67  the maximum heig
5480: 68 74 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20  ht of any other 
5490: 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 64 20 45  .** referenced E
54a0: 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2a  xpr plus one..**
54b0: 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61 67 61  .** Also propaga
54c0: 74 65 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20  te EP_Propagate 
54d0: 66 6c 61 67 73 20 75 70 20 66 72 6f 6d 20 45 78  flags up from Ex
54e0: 70 72 2e 78 2e 70 4c 69 73 74 20 74 6f 20 45 78  pr.x.pList to Ex
54f0: 70 72 2e 66 6c 61 67 73 2c 0a 2a 2a 20 69 66 20  pr.flags,.** if 
5500: 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a  appropriate..*/.
5510: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
5520: 53 65 74 48 65 69 67 68 74 28 45 78 70 72 20 2a  SetHeight(Expr *
5530: 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68  p){.  int nHeigh
5540: 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f  t = 0;.  heightO
5550: 66 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20  fExpr(p->pLeft, 
5560: 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 68 65 69  &nHeight);.  hei
5570: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 52 69  ghtOfExpr(p->pRi
5580: 67 68 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  ght, &nHeight);.
5590: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
55a0: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
55b0: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 68 65  elect) ){.    he
55c0: 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e  ightOfSelect(p->
55d0: 78 2e 70 53 65 6c 65 63 74 2c 20 26 6e 48 65 69  x.pSelect, &nHei
55e0: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ght);.  }else if
55f0: 28 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a  ( p->x.pList ){.
5600: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
5610: 4c 69 73 74 28 70 2d 3e 78 2e 70 4c 69 73 74 2c  List(p->x.pList,
5620: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   &nHeight);.    
5630: 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50  p->flags |= EP_P
5640: 72 6f 70 61 67 61 74 65 20 26 20 73 71 6c 69 74  ropagate & sqlit
5650: 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28  e3ExprListFlags(
5660: 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d  p->x.pList);.  }
5670: 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74 20 3d 20  .  p->nHeight = 
5680: 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a  nHeight + 1;.}..
5690: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78  /*.** Set the Ex
56a0: 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61  pr.nHeight varia
56b0: 62 6c 65 20 75 73 69 6e 67 20 74 68 65 20 65 78  ble using the ex
56c0: 70 72 53 65 74 48 65 69 67 68 74 28 29 20 66 75  prSetHeight() fu
56d0: 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20 74 68  nction. If.** th
56e0: 65 20 68 65 69 67 68 74 20 69 73 20 67 72 65 61  e height is grea
56f0: 74 65 72 20 74 68 61 6e 20 74 68 65 20 6d 61 78  ter than the max
5700: 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 65 78 70  imum allowed exp
5710: 72 65 73 73 69 6f 6e 20 64 65 70 74 68 2c 0a 2a  ression depth,.*
5720: 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  * leave an error
5730: 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a   in pParse..**.*
5740: 2a 20 41 6c 73 6f 20 70 72 6f 70 61 67 61 74 65  * Also propagate
5750: 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61 67 61 74   all EP_Propagat
5760: 65 20 66 6c 61 67 73 20 66 72 6f 6d 20 74 68 65  e flags from the
5770: 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 69 6e   Expr.x.pList in
5780: 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c 61 67 73  to.** Expr.flags
5790: 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  . .*/.void sqlit
57a0: 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74 41  e3ExprSetHeightA
57b0: 6e 64 46 6c 61 67 73 28 50 61 72 73 65 20 2a 70  ndFlags(Parse *p
57c0: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 29 7b  Parse, Expr *p){
57d0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
57e0: 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Err ) return;.  
57f0: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 70 29  exprSetHeight(p)
5800: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
5810: 68 65 63 6b 48 65 69 67 68 74 28 70 50 61 72 73  heckHeight(pPars
5820: 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a  e, p->nHeight);.
5830: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
5840: 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67  the maximum heig
5850: 68 74 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73  ht of any expres
5860: 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65  sion tree refere
5870: 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73  nced.** by the s
5880: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
5890: 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
58a0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ument..*/.int sq
58b0: 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48  lite3SelectExprH
58c0: 65 69 67 68 74 28 53 65 6c 65 63 74 20 2a 70 29  eight(Select *p)
58d0: 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20  {.  int nHeight 
58e0: 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 53  = 0;.  heightOfS
58f0: 65 6c 65 63 74 28 70 2c 20 26 6e 48 65 69 67 68  elect(p, &nHeigh
5900: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 48 65  t);.  return nHe
5910: 69 67 68 74 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a  ight;.}.#else /*
5920: 20 41 42 4f 56 45 3a 20 20 48 65 69 67 68 74 20   ABOVE:  Height 
5930: 65 6e 66 6f 72 63 65 6d 65 6e 74 20 65 6e 61 62  enforcement enab
5940: 6c 65 64 2e 20 20 42 45 4c 4f 57 3a 20 48 65 69  led.  BELOW: Hei
5950: 67 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20  ght enforcement 
5960: 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f  off */./*.** Pro
5970: 70 61 67 61 74 65 20 61 6c 6c 20 45 50 5f 50 72  pagate all EP_Pr
5980: 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20 66 72  opagate flags fr
5990: 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c  om the Expr.x.pL
59a0: 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72  ist into.** Expr
59b0: 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64  .flags. .*/.void
59c0: 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48   sqlite3ExprSetH
59d0: 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28 50 61  eightAndFlags(Pa
59e0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
59f0: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 26  r *p){.  if( p &
5a00: 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20  & p->x.pList && 
5a10: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
5a20: 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  (p, EP_xIsSelect
5a30: 29 20 29 7b 0a 20 20 20 20 70 2d 3e 66 6c 61 67  ) ){.    p->flag
5a40: 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74  s |= EP_Propagat
5a50: 65 20 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c  e & sqlite3ExprL
5a60: 69 73 74 46 6c 61 67 73 28 70 2d 3e 78 2e 70 4c  istFlags(p->x.pL
5a70: 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66  ist);.  }.}.#def
5a80: 69 6e 65 20 65 78 70 72 53 65 74 48 65 69 67 68  ine exprSetHeigh
5a90: 74 28 79 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53  t(y).#endif /* S
5aa0: 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
5ab0: 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  EPTH>0 */../*.**
5ac0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
5ad0: 20 74 68 65 20 63 6f 72 65 20 61 6c 6c 6f 63 61   the core alloca
5ae0: 74 6f 72 20 66 6f 72 20 45 78 70 72 20 6e 6f 64  tor for Expr nod
5af0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 72  es..**.** Constr
5b00: 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65 73  uct a new expres
5b10: 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20 72 65  sion node and re
5b20: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
5b30: 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a  o it.  Memory.**
5b40: 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65 20 61   for this node a
5b50: 6e 64 20 66 6f 72 20 74 68 65 20 70 54 6f 6b 65  nd for the pToke
5b60: 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  n argument is a 
5b70: 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f  single allocatio
5b80: 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72  n.** obtained fr
5b90: 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  om sqlite3DbMall
5ba0: 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c 6c 69  oc().  The calli
5bb0: 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  ng function.** i
5bc0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
5bd0: 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 74 68  r making sure th
5be0: 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c  e node eventuall
5bf0: 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a 2a 2a  y gets freed..**
5c00: 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74 65 20 69  .** If dequote i
5c10: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
5c20: 20 74 6f 6b 65 6e 20 28 69 66 20 69 74 20 65 78   token (if it ex
5c30: 69 73 74 73 29 20 69 73 20 64 65 71 75 6f 74 65  ists) is dequote
5c40: 64 2e 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74 65  d..** If dequote
5c50: 20 69 73 20 66 61 6c 73 65 2c 20 6e 6f 20 64 65   is false, no de
5c60: 71 75 6f 74 69 6e 67 20 69 73 20 70 65 72 66 6f  quoting is perfo
5c70: 72 6d 65 64 2e 20 20 54 68 65 20 64 65 51 75 6f  rmed.  The deQuo
5c80: 74 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  te.** parameter 
5c90: 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20 70 54  is ignored if pT
5ca0: 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20 6f 72 20  oken is NULL or 
5cb0: 69 66 20 74 68 65 20 74 6f 6b 65 6e 20 64 6f 65  if the token doe
5cc0: 73 20 6e 6f 74 0a 2a 2a 20 61 70 70 65 61 72 20  s not.** appear 
5cd0: 74 6f 20 62 65 20 71 75 6f 74 65 64 2e 20 20 49  to be quoted.  I
5ce0: 66 20 74 68 65 20 71 75 6f 74 65 73 20 77 65 72  f the quotes wer
5cf0: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 2e  e of the form ".
5d00: 2e 2e 22 20 28 64 6f 75 62 6c 65 2d 71 75 6f 74  .." (double-quot
5d10: 65 73 29 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  es).** then the 
5d20: 45 50 5f 44 62 6c 51 75 6f 74 65 64 20 66 6c 61  EP_DblQuoted fla
5d30: 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20  g is set on the 
5d40: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 2e  expression node.
5d50: 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 61 6c 20 63  .**.** Special c
5d60: 61 73 65 3a 20 20 49 66 20 6f 70 3d 3d 54 4b 5f  ase:  If op==TK_
5d70: 49 4e 54 45 47 45 52 20 61 6e 64 20 70 54 6f 6b  INTEGER and pTok
5d80: 65 6e 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73  en points to a s
5d90: 74 72 69 6e 67 20 74 68 61 74 0a 2a 2a 20 63 61  tring that.** ca
5da0: 6e 20 62 65 20 74 72 61 6e 73 6c 61 74 65 64 20  n be translated 
5db0: 69 6e 74 6f 20 61 20 33 32 2d 62 69 74 20 69 6e  into a 32-bit in
5dc0: 74 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20  teger, then the 
5dd0: 74 6f 6b 65 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20  token is not.** 
5de0: 73 74 6f 72 65 64 20 69 6e 20 75 2e 7a 54 6f 6b  stored in u.zTok
5df0: 65 6e 2e 20 20 49 6e 73 74 65 61 64 2c 20 74 68  en.  Instead, th
5e00: 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73  e integer values
5e10: 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69   is written.** i
5e20: 6e 74 6f 20 75 2e 69 56 61 6c 75 65 20 61 6e 64  nto u.iValue and
5e30: 20 74 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65   the EP_IntValue
5e40: 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 20 4e   flag is set.  N
5e50: 6f 20 65 78 74 72 61 20 73 74 6f 72 61 67 65 0a  o extra storage.
5e60: 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ** is allocated 
5e70: 74 6f 20 68 6f 6c 64 20 74 68 65 20 69 6e 74 65  to hold the inte
5e80: 67 65 72 20 74 65 78 74 20 61 6e 64 20 74 68 65  ger text and the
5e90: 20 64 65 71 75 6f 74 65 20 66 6c 61 67 20 69 73   dequote flag is
5ea0: 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70   ignored..*/.Exp
5eb0: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6c  r *sqlite3ExprAl
5ec0: 6c 6f 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  loc(.  sqlite3 *
5ed0: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  db,            /
5ee0: 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c  * Handle for sql
5ef0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
5f00: 28 29 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29  () (may be null)
5f10: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
5f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5f30: 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f   Expression opco
5f40: 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f  de */.  const To
5f50: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20  ken *pToken,    
5f60: 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e  /* Token argumen
5f70: 74 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  t.  Might be NUL
5f80: 4c 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f  L */.  int dequo
5f90: 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  te             /
5fa0: 2a 20 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74  * True to dequot
5fb0: 65 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  e */.){.  Expr *
5fc0: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 45 78 74  pNew;.  int nExt
5fd0: 72 61 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56  ra = 0;.  int iV
5fe0: 61 6c 75 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73  alue = 0;..  ass
5ff0: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
6000: 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( pToken ){.  
6010: 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 54    if( op!=TK_INT
6020: 45 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e  EGER || pToken->
6030: 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c  z==0.          |
6040: 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33  | sqlite3GetInt3
6050: 32 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56  2(pToken->z, &iV
6060: 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  alue)==0 ){.    
6070: 20 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b 65    nExtra = pToke
6080: 6e 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20 20 61 73  n->n+1;.      as
6090: 73 65 72 74 28 20 69 56 61 6c 75 65 3e 3d 30 20  sert( iValue>=0 
60a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
60b0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
60c0: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
60d0: 69 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74  izeof(Expr)+nExt
60e0: 72 61 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  ra);.  if( pNew 
60f0: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e  ){.    memset(pN
6100: 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78  ew, 0, sizeof(Ex
6110: 70 72 29 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  pr));.    pNew->
6120: 6f 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20  op = (u8)op;.   
6130: 20 70 4e 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31   pNew->iAgg = -1
6140: 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e  ;.    if( pToken
6150: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 45   ){.      if( nE
6160: 78 74 72 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  xtra==0 ){.     
6170: 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c     pNew->flags |
6180: 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20  = EP_IntValue;. 
6190: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69         pNew->u.i
61a0: 56 61 6c 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a  Value = iValue;.
61b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
61c0: 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f       pNew->u.zTo
61d0: 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 70 4e  ken = (char*)&pN
61e0: 65 77 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61  ew[1];.        a
61f0: 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a  ssert( pToken->z
6200: 21 3d 30 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e  !=0 || pToken->n
6210: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ==0 );.        i
6220: 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d  f( pToken->n ) m
6230: 65 6d 63 70 79 28 70 4e 65 77 2d 3e 75 2e 7a 54  emcpy(pNew->u.zT
6240: 6f 6b 65 6e 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c  oken, pToken->z,
6250: 20 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20   pToken->n);.   
6260: 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f       pNew->u.zTo
6270: 6b 65 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d  ken[pToken->n] =
6280: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
6290: 64 65 71 75 6f 74 65 20 26 26 20 73 71 6c 69 74  dequote && sqlit
62a0: 65 33 49 73 71 75 6f 74 65 28 70 4e 65 77 2d 3e  e3Isquote(pNew->
62b0: 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 29 20 29 7b 0a  u.zToken[0]) ){.
62c0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e            if( pN
62d0: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d  ew->u.zToken[0]=
62e0: 3d 27 22 27 20 29 20 70 4e 65 77 2d 3e 66 6c 61  ='"' ) pNew->fla
62f0: 67 73 20 7c 3d 20 45 50 5f 44 62 6c 51 75 6f 74  gs |= EP_DblQuot
6300: 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  ed;.          sq
6310: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70 4e 65  lite3Dequote(pNe
6320: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  w->u.zToken);.  
6330: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
6340: 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45      }.#if SQLITE
6350: 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e  _MAX_EXPR_DEPTH>
6360: 30 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69  0.    pNew->nHei
6370: 67 68 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20  ght = 1;.#endif 
6380: 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70   .  }.  return p
6390: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  New;.}../*.** Al
63a0: 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 78 70  locate a new exp
63b0: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f  ression node fro
63c0: 6d 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61  m a zero-termina
63d0: 74 65 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  ted token that h
63e0: 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65  as.** already be
63f0: 65 6e 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a  en dequoted..*/.
6400: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
6410: 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
6420: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
6430: 48 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74  Handle for sqlit
6440: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29  e3DbMallocZero()
6450: 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a   (may be null) *
6460: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
6470: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
6480: 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65  xpression opcode
6490: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
64a0: 20 2a 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a   *zToken      /*
64b0: 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e   Token argument.
64c0: 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20    Might be NULL 
64d0: 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b  */.){.  Token x;
64e0: 0a 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b  .  x.z = zToken;
64f0: 0a 20 20 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20  .  x.n = zToken 
6500: 3f 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  ? sqlite3Strlen3
6510: 30 28 7a 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20  0(zToken) : 0;. 
6520: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
6530: 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c  xprAlloc(db, op,
6540: 20 26 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   &x, 0);.}../*.*
6550: 2a 20 41 74 74 61 63 68 20 73 75 62 74 72 65 65  * Attach subtree
6560: 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67  s pLeft and pRig
6570: 68 74 20 74 6f 20 74 68 65 20 45 78 70 72 20 6e  ht to the Expr n
6580: 6f 64 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a  ode pRoot..**.**
6590: 20 49 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20   If pRoot==NULL 
65a0: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
65b0: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
65c0: 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63  ion error has oc
65d0: 63 75 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68  curred..** In th
65e0: 61 74 20 63 61 73 65 2c 20 64 65 6c 65 74 65 20  at case, delete 
65f0: 74 68 65 20 73 75 62 74 72 65 65 73 20 70 4c 65  the subtrees pLe
6600: 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a  ft and pRight..*
6610: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
6620: 70 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73  prAttachSubtrees
6630: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
6640: 0a 20 20 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a  .  Expr *pRoot,.
6650: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20    Expr *pLeft,. 
6660: 20 45 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b   Expr *pRight.){
6670: 0a 20 20 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20  .  if( pRoot==0 
6680: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  ){.    assert( d
6690: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
66a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
66b0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65  prDelete(db, pLe
66c0: 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ft);.    sqlite3
66d0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
66e0: 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  Right);.  }else{
66f0: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 20  .    if( pRight 
6700: 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  ){.      pRoot->
6710: 70 52 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b  pRight = pRight;
6720: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c  .      pRoot->fl
6730: 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67  ags |= EP_Propag
6740: 61 74 65 20 26 20 70 52 69 67 68 74 2d 3e 66 6c  ate & pRight->fl
6750: 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ags;.    }.    i
6760: 66 28 20 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  f( pLeft ){.    
6770: 20 20 70 52 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d    pRoot->pLeft =
6780: 20 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 52   pLeft;.      pR
6790: 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  oot->flags |= EP
67a0: 5f 50 72 6f 70 61 67 61 74 65 20 26 20 70 4c 65  _Propagate & pLe
67b0: 66 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d  ft->flags;.    }
67c0: 0a 20 20 20 20 65 78 70 72 53 65 74 48 65 69 67  .    exprSetHeig
67d0: 68 74 28 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d  ht(pRoot);.  }.}
67e0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
67f0: 20 61 6e 20 45 78 70 72 20 6e 6f 64 65 20 77 68   an Expr node wh
6800: 69 63 68 20 6a 6f 69 6e 73 20 61 73 20 6d 61 6e  ich joins as man
6810: 79 20 61 73 20 74 77 6f 20 73 75 62 74 72 65 65  y as two subtree
6820: 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20  s..**.** One or 
6830: 62 6f 74 68 20 6f 66 20 74 68 65 20 73 75 62 74  both of the subt
6840: 72 65 65 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c  rees can be NULL
6850: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
6860: 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a  ter to the new.*
6870: 2a 20 45 78 70 72 20 6e 6f 64 65 2e 20 20 4f 72  * Expr node.  Or
6880: 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  , if an OOM erro
6890: 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 70 50  r occurs, set pP
68a0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
68b0: 46 61 69 6c 65 64 2c 0a 2a 2a 20 66 72 65 65 20  Failed,.** free 
68c0: 74 68 65 20 73 75 62 74 72 65 65 73 20 61 6e 64  the subtrees and
68d0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f   return NULL..*/
68e0: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 50 45  .Expr *sqlite3PE
68f0: 78 70 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50  xpr(.  Parse *pP
6900: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
6910: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
6920: 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  t */.  int op,  
6930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6940: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63  * Expression opc
6950: 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ode */.  Expr *p
6960: 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20  Left,           
6970: 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e 64   /* Left operand
6980: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67   */.  Expr *pRig
6990: 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ht,           /*
69a0: 20 52 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a   Right operand *
69b0: 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  /.  const Token 
69c0: 2a 70 54 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41  *pToken     /* A
69d0: 72 67 75 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f  rgument token */
69e0: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20  .){.  Expr *p;. 
69f0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20   if( op==TK_AND 
6a00: 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  && pParse->nErr=
6a10: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 61 6b  =0 ){.    /* Tak
6a20: 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 73  e advantage of s
6a30: 68 6f 72 74 2d 63 69 72 63 75 69 74 20 66 61 6c  hort-circuit fal
6a40: 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  se optimization 
6a50: 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20 20 20 70  for AND */.    p
6a60: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
6a70: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  d(pParse->db, pL
6a80: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
6a90: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 73  }else{.    p = s
6aa0: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
6ab0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 6f 70 20 26  pParse->db, op &
6ac0: 20 54 4b 46 4c 47 5f 4d 41 53 4b 2c 20 70 54 6f   TKFLG_MASK, pTo
6ad0: 6b 65 6e 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  ken, 1);.    sql
6ae0: 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53 75  ite3ExprAttachSu
6af0: 62 74 72 65 65 73 28 70 50 61 72 73 65 2d 3e 64  btrees(pParse->d
6b00: 62 2c 20 70 2c 20 70 4c 65 66 74 2c 20 70 52 69  b, p, pLeft, pRi
6b10: 67 68 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ght);.  }.  if( 
6b20: 70 20 29 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  p ) {.    sqlite
6b30: 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74  3ExprCheckHeight
6b40: 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69  (pParse, p->nHei
6b50: 67 68 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ght);.  }.  retu
6b60: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn p;.}../*.** A
6b70: 64 64 20 70 53 65 6c 65 63 74 20 74 6f 20 74 68  dd pSelect to th
6b80: 65 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74  e Expr.x.pSelect
6b90: 20 66 69 65 6c 64 2e 20 20 4f 72 2c 20 69 66 20   field.  Or, if 
6ba0: 70 45 78 70 72 20 69 73 20 4e 55 4c 4c 20 28 64  pExpr is NULL (d
6bb0: 75 65 0a 2a 2a 20 64 6f 20 61 20 6d 65 6d 6f 72  ue.** do a memor
6bc0: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
6bd0: 6c 75 72 65 29 20 74 68 65 6e 20 64 65 6c 65 74  lure) then delet
6be0: 65 20 74 68 65 20 70 53 65 6c 65 63 74 20 6f 62  e the pSelect ob
6bf0: 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ject..*/.void sq
6c00: 6c 69 74 65 33 50 45 78 70 72 41 64 64 53 65 6c  lite3PExprAddSel
6c10: 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ect(Parse *pPars
6c20: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
6c30: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
6c40: 7b 0a 20 20 69 66 28 20 70 45 78 70 72 20 29 7b  {.  if( pExpr ){
6c50: 0a 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 53  .    pExpr->x.pS
6c60: 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 3b  elect = pSelect;
6c70: 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
6c80: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
6c90: 49 73 53 65 6c 65 63 74 7c 45 50 5f 53 75 62 71  IsSelect|EP_Subq
6ca0: 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  uery);.    sqlit
6cb0: 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74 41  e3ExprSetHeightA
6cc0: 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65 2c 20  ndFlags(pParse, 
6cd0: 70 45 78 70 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  pExpr);.  }else{
6ce0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
6cf0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
6d00: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c  ailed );.    sql
6d10: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
6d20: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65  (pParse->db, pSe
6d30: 6c 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  lect);.  }.}.../
6d40: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
6d50: 65 73 73 69 6f 6e 20 69 73 20 61 6c 77 61 79 73  ession is always
6d60: 20 65 69 74 68 65 72 20 54 52 55 45 20 6f 72 20   either TRUE or 
6d70: 46 41 4c 53 45 20 28 72 65 73 70 65 63 74 69 76  FALSE (respectiv
6d80: 65 6c 79 29 2c 0a 2a 2a 20 74 68 65 6e 20 72 65  ely),.** then re
6d90: 74 75 72 6e 20 31 2e 20 20 49 66 20 6f 6e 65 20  turn 1.  If one 
6da0: 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65  cannot determine
6db0: 20 74 68 65 20 74 72 75 74 68 20 76 61 6c 75 65   the truth value
6dc0: 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   of the.** expre
6dd0: 73 73 69 6f 6e 20 61 74 20 63 6f 6d 70 69 6c 65  ssion at compile
6de0: 2d 74 69 6d 65 20 72 65 74 75 72 6e 20 30 2e 0a  -time return 0..
6df0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e  **.** This is an
6e00: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
6e10: 49 66 20 69 73 20 4f 4b 20 74 6f 20 72 65 74 75  If is OK to retu
6e20: 72 6e 20 30 20 68 65 72 65 20 65 76 65 6e 20 69  rn 0 here even i
6e30: 66 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73  f.** the express
6e40: 69 6f 6e 20 72 65 61 6c 6c 79 20 69 73 20 61 6c  ion really is al
6e50: 77 61 79 73 20 66 61 6c 73 65 20 6f 72 20 66 61  ways false or fa
6e60: 6c 73 65 20 28 61 20 66 61 6c 73 65 20 6e 65 67  lse (a false neg
6e70: 61 74 69 76 65 29 2e 0a 2a 2a 20 42 75 74 20 69  ative)..** But i
6e80: 74 20 69 73 20 61 20 62 75 67 20 74 6f 20 72 65  t is a bug to re
6e90: 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78  turn 1 if the ex
6ea0: 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 68  pression might h
6eb0: 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  ave different.**
6ec0: 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73 20   boolean values 
6ed0: 69 6e 20 64 69 66 66 65 72 65 6e 74 20 63 69 72  in different cir
6ee0: 63 75 6d 73 74 61 6e 63 65 73 20 28 61 20 66 61  cumstances (a fa
6ef0: 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 29 0a 2a  lse positive.).*
6f00: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69  *.** Note that i
6f10: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
6f20: 20 69 73 20 70 61 72 74 20 6f 66 20 63 6f 6e 64   is part of cond
6f30: 69 74 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a 2a  itional for a.**
6f40: 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e   LEFT JOIN, then
6f50: 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72   we cannot deter
6f60: 6d 69 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d  mine at compile-
6f70: 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20  time whether or 
6f80: 6e 6f 74 0a 2a 2a 20 69 73 20 69 74 20 74 72 75  not.** is it tru
6f90: 65 20 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20 61  e or false, so a
6fa0: 6c 77 61 79 73 20 72 65 74 75 72 6e 20 30 2e 0a  lways return 0..
6fb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
6fc0: 70 72 41 6c 77 61 79 73 54 72 75 65 28 45 78 70  prAlwaysTrue(Exp
6fd0: 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d  r *p){.  int v =
6fe0: 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61   0;.  if( ExprHa
6ff0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
7000: 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75  FromJoin) ) retu
7010: 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c  rn 0;.  if( !sql
7020: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
7030: 72 28 70 2c 20 26 76 29 20 29 20 72 65 74 75 72  r(p, &v) ) retur
7040: 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76 21  n 0;.  return v!
7050: 3d 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  =0;.}.static int
7060: 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65   exprAlwaysFalse
7070: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74  (Expr *p){.  int
7080: 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45 78   v = 0;.  if( Ex
7090: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
70a0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20   EP_FromJoin) ) 
70b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
70c0: 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e  !sqlite3ExprIsIn
70d0: 74 65 67 65 72 28 70 2c 20 26 76 29 20 29 20 72  teger(p, &v) ) r
70e0: 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
70f0: 6e 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n v==0;.}../*.**
7100: 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73   Join two expres
7110: 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41  sions using an A
7120: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66  ND operator.  If
7130: 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69   either expressi
7140: 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74  on is.** NULL, t
7150: 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
7160: 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73  the other expres
7170: 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f  sion..**.** If o
7180: 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 20 6f  ne side or the o
7190: 74 68 65 72 20 6f 66 20 74 68 65 20 41 4e 44 20  ther of the AND 
71a0: 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66  is known to be f
71b0: 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74 65  alse, then inste
71c0: 61 64 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69  ad.** of returni
71d0: 6e 67 20 61 6e 20 41 4e 44 20 65 78 70 72 65 73  ng an AND expres
71e0: 73 69 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75 72  sion, just retur
71f0: 6e 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70  n a constant exp
7200: 72 65 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20  ression with.** 
7210: 61 20 76 61 6c 75 65 20 6f 66 20 66 61 6c 73 65  a value of false
7220: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
7230: 65 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74 65  e3ExprAnd(sqlite
7240: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c 65  3 *db, Expr *pLe
7250: 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74  ft, Expr *pRight
7260: 29 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d  ){.  if( pLeft==
7270: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
7280: 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20  pRight;.  }else 
7290: 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b  if( pRight==0 ){
72a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66  .    return pLef
72b0: 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65  t;.  }else if( e
72c0: 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
72d0: 4c 65 66 74 29 20 7c 7c 20 65 78 70 72 41 6c 77  Left) || exprAlw
72e0: 61 79 73 46 61 6c 73 65 28 70 52 69 67 68 74 29  aysFalse(pRight)
72f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
7300: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  xprDelete(db, pL
7310: 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eft);.    sqlite
7320: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
7330: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74  pRight);.    ret
7340: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41  urn sqlite3ExprA
7350: 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45  lloc(db, TK_INTE
7360: 47 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74  GER, &sqlite3Int
7370: 54 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20  Tokens[0], 0);. 
7380: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70 72   }else{.    Expr
7390: 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
73a0: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
73b0: 5f 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _AND, 0, 0);.   
73c0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61   sqlite3ExprAtta
73d0: 63 68 53 75 62 74 72 65 65 73 28 64 62 2c 20 70  chSubtrees(db, p
73e0: 4e 65 77 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  New, pLeft, pRig
73f0: 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ht);.    return 
7400: 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  pNew;.  }.}../*.
7410: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e  ** Construct a n
7420: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ew expression no
7430: 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f  de for a functio
7440: 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a  n with multiple.
7450: 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f  ** arguments..*/
7460: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
7470: 70 72 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65  prFunction(Parse
7480: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69   *pParse, ExprLi
7490: 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
74a0: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70   *pToken){.  Exp
74b0: 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74  r *pNew;.  sqlit
74c0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
74d0: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
74e0: 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20  Token );.  pNew 
74f0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  = sqlite3ExprAll
7500: 6f 63 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49  oc(db, TK_FUNCTI
7510: 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a  ON, pToken, 1);.
7520: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
7530: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
7540: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
7550: 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20  List); /* Avoid 
7560: 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e  memory leak when
7570: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f   malloc fails */
7580: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
7590: 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69   }.  pNew->x.pLi
75a0: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73  st = pList;.  as
75b0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
75c0: 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
75d0: 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
75e0: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
75f0: 69 67 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61  ightAndFlags(pPa
7600: 72 73 65 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65  rse, pNew);.  re
7610: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
7620: 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72  .** Assign a var
7630: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20  iable number to 
7640: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
7650: 61 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c  at encodes a wil
7660: 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20  dcard.** in the 
7670: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
7680: 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  tement.  .**.** 
7690: 57 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73  Wildcards consis
76a0: 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65  ting of a single
76b0: 20 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65   "?" are assigne
76c0: 64 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  d the next seque
76d0: 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  ntial.** variabl
76e0: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
76f0: 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65  Wildcards of the
7700: 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65   form "?nnn" are
7710: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75   assigned the nu
7720: 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20  mber "nnn".  We 
7730: 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e  make.** sure "nn
7740: 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65  n" is not too be
7750: 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69   to avoid a deni
7760: 61 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74  al of service at
7770: 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65  tack when.** the
7780: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63   SQL statement c
7790: 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74  omes from an ext
77a0: 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a  ernal source..**
77b0: 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66  .** Wildcards of
77c0: 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22   the form ":aaa"
77d0: 2c 20 22 40 61 61 61 22 2c 20 6f 72 20 22 24 61  , "@aaa", or "$a
77e0: 61 61 22 20 61 72 65 20 61 73 73 69 67 6e 65 64  aa" are assigned
77f0: 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
7800: 0a 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76 69  .** as the previ
7810: 6f 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ous instance of 
7820: 74 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72  the same wildcar
7830: 64 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20 69  d.  Or if this i
7840: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  s the first.** i
7850: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77  nstance of the w
7860: 69 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78  ildcard, the nex
7870: 74 20 73 65 71 75 65 6e 74 69 61 6c 20 76 61 72  t sequential var
7880: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a  iable number is.
7890: 2a 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a  ** assigned..*/.
78a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
78b0: 41 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28  AssignVarNumber(
78c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
78d0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 73  xpr *pExpr){.  s
78e0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
78f0: 72 73 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74  rse->db;.  const
7900: 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28   char *z;..  if(
7910: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
7920: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45  rn;.  assert( !E
7930: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
7940: 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
7950: 65 7c 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  e|EP_Reduced|EP_
7960: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20  TokenOnly) );.  
7970: 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  z = pExpr->u.zTo
7980: 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  ken;.  assert( z
7990: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
79a0: 20 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66   z[0]!=0 );.  if
79b0: 28 20 7a 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20  ( z[1]==0 ){.   
79c0: 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20   /* Wildcard of 
79d0: 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41  the form "?".  A
79e0: 73 73 69 67 6e 20 74 68 65 20 6e 65 78 74 20 76  ssign the next v
79f0: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  ariable number *
7a00: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b  /.    assert( z[
7a10: 30 5d 3d 3d 27 3f 27 20 29 3b 0a 20 20 20 20 70  0]=='?' );.    p
7a20: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
7a30: 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65  (ynVar)(++pParse
7a40: 2d 3e 6e 56 61 72 29 3b 0a 20 20 7d 65 6c 73 65  ->nVar);.  }else
7a50: 7b 0a 20 20 20 20 79 6e 56 61 72 20 78 20 3d 20  {.    ynVar x = 
7a60: 30 3b 0a 20 20 20 20 75 33 32 20 6e 20 3d 20 73  0;.    u32 n = s
7a70: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
7a80: 29 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d  );.    if( z[0]=
7a90: 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ='?' ){.      /*
7aa0: 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65   Wildcard of the
7ab0: 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43   form "?nnn".  C
7ac0: 6f 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20  onvert "nnn" to 
7ad0: 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20  an integer and. 
7ae0: 20 20 20 20 20 2a 2a 20 75 73 65 20 69 74 20 61       ** use it a
7af0: 73 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e  s the variable n
7b00: 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 69  umber */.      i
7b10: 36 34 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20  64 i;.      int 
7b20: 62 4f 6b 20 3d 20 30 3d 3d 73 71 6c 69 74 65 33  bOk = 0==sqlite3
7b30: 41 74 6f 69 36 34 28 26 7a 5b 31 5d 2c 20 26 69  Atoi64(&z[1], &i
7b40: 2c 20 6e 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  , n-1, SQLITE_UT
7b50: 46 38 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  F8);.      pExpr
7b60: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20  ->iColumn = x = 
7b70: 28 79 6e 56 61 72 29 69 3b 0a 20 20 20 20 20 20  (ynVar)i;.      
7b80: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 30 20 29  testcase( i==0 )
7b90: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
7ba0: 28 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ( i==1 );.      
7bb0: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d  testcase( i==db-
7bc0: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
7bd0: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
7be0: 4d 42 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20 20  MBER]-1 );.     
7bf0: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62   testcase( i==db
7c00: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
7c10: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
7c20: 55 4d 42 45 52 5d 20 29 3b 0a 20 20 20 20 20 20  UMBER] );.      
7c30: 69 66 28 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c  if( bOk==0 || i<
7c40: 31 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69  1 || i>db->aLimi
7c50: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
7c60: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20  ARIABLE_NUMBER] 
7c70: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7c80: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7c90: 65 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75 6d  e, "variable num
7ca0: 62 65 72 20 6d 75 73 74 20 62 65 20 62 65 74 77  ber must be betw
7cb0: 65 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c  een ?1 and ?%d",
7cc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d  .            db-
7cd0: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
7ce0: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
7cf0: 4d 42 45 52 5d 29 3b 0a 20 20 20 20 20 20 20 20  MBER]);.        
7d00: 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  x = 0;.      }. 
7d10: 20 20 20 20 20 69 66 28 20 69 3e 70 50 61 72 73       if( i>pPars
7d20: 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20 20  e->nVar ){.     
7d30: 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20     pParse->nVar 
7d40: 3d 20 28 69 6e 74 29 69 3b 0a 20 20 20 20 20 20  = (int)i;.      
7d50: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
7d60: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 73 20     /* Wildcards 
7d70: 6c 69 6b 65 20 22 3a 61 61 61 22 2c 20 22 24 61  like ":aaa", "$a
7d80: 61 61 22 20 6f 72 20 22 40 61 61 61 22 2e 20 20  aa" or "@aaa".  
7d90: 52 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76  Reuse the same v
7da0: 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  ariable.      **
7db0: 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20 70   number as the p
7dc0: 72 69 6f 72 20 61 70 70 65 61 72 61 6e 63 65 20  rior appearance 
7dd0: 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  of the same name
7de0: 2c 20 6f 72 20 69 66 20 74 68 65 20 6e 61 6d 65  , or if the name
7df0: 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 65  .      ** has ne
7e00: 76 65 72 20 61 70 70 65 61 72 65 64 20 62 65 66  ver appeared bef
7e10: 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65 20 73  ore, reuse the s
7e20: 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ame variable num
7e30: 62 65 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ber.      */.   
7e40: 20 20 20 79 6e 56 61 72 20 69 3b 0a 20 20 20 20     ynVar i;.    
7e50: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
7e60: 72 73 65 2d 3e 6e 7a 56 61 72 3b 20 69 2b 2b 29  rse->nzVar; i++)
7e70: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
7e80: 61 72 73 65 2d 3e 61 7a 56 61 72 5b 69 5d 20 26  arse->azVar[i] &
7e90: 26 20 73 74 72 63 6d 70 28 70 50 61 72 73 65 2d  & strcmp(pParse-
7ea0: 3e 61 7a 56 61 72 5b 69 5d 2c 7a 29 3d 3d 30 20  >azVar[i],z)==0 
7eb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  ){.          pEx
7ec0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 20  pr->iColumn = x 
7ed0: 3d 20 28 79 6e 56 61 72 29 69 2b 31 3b 0a 20 20  = (ynVar)i+1;.  
7ee0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
7ef0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7f00: 0a 20 20 20 20 20 20 69 66 28 20 78 3d 3d 30 20  .      if( x==0 
7f10: 29 20 78 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  ) x = pExpr->iCo
7f20: 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b  lumn = (ynVar)(+
7f30: 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a  +pParse->nVar);.
7f40: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 78 3e      }.    if( x>
7f50: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 78  0 ){.      if( x
7f60: 3e 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 20 29  >pParse->nzVar )
7f70: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
7f80: 2a 61 3b 0a 20 20 20 20 20 20 20 20 61 20 3d 20  *a;.        a = 
7f90: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
7fa0: 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56  (db, pParse->azV
7fb0: 61 72 2c 20 78 2a 73 69 7a 65 6f 66 28 61 5b 30  ar, x*sizeof(a[0
7fc0: 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ]));.        if(
7fd0: 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   a==0 ){.       
7fe0: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
7ff0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 20 2f  allocFailed ); /
8000: 2a 20 45 72 72 6f 72 20 72 65 70 6f 72 74 65 64  * Error reported
8010: 20 74 68 72 6f 75 67 68 20 6d 61 6c 6c 6f 63 46   through mallocF
8020: 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  ailed */.       
8030: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
8040: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61     }.        pPa
8050: 72 73 65 2d 3e 61 7a 56 61 72 20 3d 20 61 3b 0a  rse->azVar = a;.
8060: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
8070: 61 5b 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 5d  a[pParse->nzVar]
8080: 2c 20 30 2c 20 28 78 2d 70 50 61 72 73 65 2d 3e  , 0, (x-pParse->
8090: 6e 7a 56 61 72 29 2a 73 69 7a 65 6f 66 28 61 5b  nzVar)*sizeof(a[
80a0: 30 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 70 50  0]));.        pP
80b0: 61 72 73 65 2d 3e 6e 7a 56 61 72 20 3d 20 78 3b  arse->nzVar = x;
80c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
80d0: 66 28 20 7a 5b 30 5d 21 3d 27 3f 27 20 7c 7c 20  f( z[0]!='?' || 
80e0: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d  pParse->azVar[x-
80f0: 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1]==0 ){.       
8100: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8110: 62 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  b, pParse->azVar
8120: 5b 78 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  [x-1]);.        
8130: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d  pParse->azVar[x-
8140: 31 5d 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  1] = sqlite3DbSt
8150: 72 4e 44 75 70 28 64 62 2c 20 7a 2c 20 6e 29 3b  rNDup(db, z, n);
8160: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8170: 20 7d 20 0a 20 20 69 66 28 20 21 70 50 61 72 73   } .  if( !pPars
8180: 65 2d 3e 6e 45 72 72 20 26 26 20 70 50 61 72 73  e->nErr && pPars
8190: 65 2d 3e 6e 56 61 72 3e 64 62 2d 3e 61 4c 69 6d  e->nVar>db->aLim
81a0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
81b0: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
81c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
81d0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
81e0: 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61  "too many SQL va
81f0: 72 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d  riables");.  }.}
8200: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76  ../*.** Recursiv
8210: 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20 65 78  ely delete an ex
8220: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a  pression tree..*
8230: 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
8240: 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 73 71  NOINLINE void sq
8250: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e  lite3ExprDeleteN
8260: 4e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  N(sqlite3 *db, E
8270: 78 70 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  xpr *p){.  asser
8280: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 2f 2a 20  t( p!=0 );.  /* 
8290: 53 61 6e 69 74 79 20 63 68 65 63 6b 3a 20 41 73  Sanity check: As
82a0: 73 65 72 74 20 74 68 61 74 20 74 68 65 20 49 6e  sert that the In
82b0: 74 56 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e 65  tValue is non-ne
82c0: 67 61 74 69 76 65 20 69 66 20 69 74 20 65 78 69  gative if it exi
82d0: 73 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  sts */.  assert(
82e0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
82f0: 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  y(p, EP_IntValue
8300: 29 20 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c 75 65  ) || p->u.iValue
8310: 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 45 78  >=0 );.  if( !Ex
8320: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8330: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
8340: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 45 78 70  {.    /* The Exp
8350: 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76  r.x union is nev
8360: 65 72 20 75 73 65 64 20 61 74 20 74 68 65 20 73  er used at the s
8370: 61 6d 65 20 74 69 6d 65 20 61 73 20 45 78 70 72  ame time as Expr
8380: 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20 20 20 61  .pRight */.    a
8390: 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 4c 69 73  ssert( p->x.pLis
83a0: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68  t==0 || p->pRigh
83b0: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  t==0 );.    if( 
83c0: 70 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54  p->op!=TK_SELECT
83d0: 5f 43 4f 4c 55 4d 4e 20 29 20 73 71 6c 69 74 65  _COLUMN ) sqlite
83e0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
83f0: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  p->pLeft);.    s
8400: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
8410: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b  (db, p->pRight);
8420: 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
8430: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d  Property(p, EP_M
8440: 65 6d 54 6f 6b 65 6e 29 20 29 20 73 71 6c 69 74  emToken) ) sqlit
8450: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
8460: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 69  u.zToken);.    i
8470: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
8480: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
8490: 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ct) ){.      sql
84a0: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
84b0: 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63  (db, p->x.pSelec
84c0: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
84d0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
84e0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
84f0: 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
8500: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 45 78 70  }.  }.  if( !Exp
8510: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
8520: 45 50 5f 53 74 61 74 69 63 29 20 29 7b 0a 20 20  EP_Static) ){.  
8530: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
8540: 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f  db, p);.  }.}.vo
8550: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  id sqlite3ExprDe
8560: 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
8570: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  , Expr *p){.  if
8580: 28 20 70 20 29 20 73 71 6c 69 74 65 33 45 78 70  ( p ) sqlite3Exp
8590: 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 29  rDeleteNN(db, p)
85a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
85b0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
85c0: 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  bytes allocated 
85d0: 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69  for the expressi
85e0: 6f 6e 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a  on structure .**
85f0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
8600: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54  irst argument. T
8610: 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e  his is always on
8620: 65 20 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53 49  e of EXPR_FULLSI
8630: 5a 45 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55  ZE,.** EXPR_REDU
8640: 43 45 44 53 49 5a 45 20 6f 72 20 45 58 50 52 5f  CEDSIZE or EXPR_
8650: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a  TOKENONLYSIZE..*
8660: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
8670: 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70 72  rStructSize(Expr
8680: 20 2a 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72   *p){.  if( Expr
8690: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
86a0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72  P_TokenOnly) ) r
86b0: 65 74 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e  eturn EXPR_TOKEN
86c0: 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28 20  ONLYSIZE;.  if( 
86d0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
86e0: 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20 29  p, EP_Reduced) )
86f0: 20 72 65 74 75 72 6e 20 45 58 50 52 5f 52 45 44   return EXPR_RED
8700: 55 43 45 44 53 49 5a 45 3b 0a 20 20 72 65 74 75  UCEDSIZE;.  retu
8710: 72 6e 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  rn EXPR_FULLSIZE
8720: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64  ;.}../*.** The d
8730: 75 70 65 64 45 78 70 72 2a 53 69 7a 65 28 29 20  upedExpr*Size() 
8740: 72 6f 75 74 69 6e 65 73 20 65 61 63 68 20 72 65  routines each re
8750: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
8760: 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65  of bytes require
8770: 64 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 61 20  d.** to store a 
8780: 63 6f 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65  copy of an expre
8790: 73 73 69 6f 6e 20 6f 72 20 65 78 70 72 65 73 73  ssion or express
87a0: 69 6f 6e 20 74 72 65 65 2e 20 20 54 68 65 79 20  ion tree.  They 
87b0: 64 69 66 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77  differ in.** how
87c0: 20 6d 75 63 68 20 6f 66 20 74 68 65 20 74 72 65   much of the tre
87d0: 65 20 69 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a  e is measured..*
87e0: 2a 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78  *.**     dupedEx
87f0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 20  prStructSize()  
8800: 20 20 20 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20     Size of only 
8810: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75  the Expr structu
8820: 72 65 20 0a 2a 2a 20 20 20 20 20 64 75 70 65 64  re .**     duped
8830: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 29 20 20  ExprNodeSize()  
8840: 20 20 20 20 20 53 69 7a 65 20 6f 66 20 45 78 70       Size of Exp
8850: 72 20 2b 20 73 70 61 63 65 20 66 6f 72 20 74 6f  r + space for to
8860: 6b 65 6e 0a 2a 2a 20 20 20 20 20 64 75 70 65 64  ken.**     duped
8870: 45 78 70 72 53 69 7a 65 28 29 20 20 20 20 20 20  ExprSize()      
8880: 20 20 20 20 20 45 78 70 72 20 2b 20 74 6f 6b 65       Expr + toke
8890: 6e 20 2b 20 73 75 62 74 72 65 65 20 63 6f 6d 70  n + subtree comp
88a0: 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  onents.**.******
88b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
88c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
88d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
88e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
88f0: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  *****.**.** The 
8900: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
8910: 69 7a 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 72  ize() function r
8920: 65 74 75 72 6e 73 20 74 77 6f 20 76 61 6c 75 65  eturns two value
8930: 73 20 4f 52 2d 65 64 20 74 6f 67 65 74 68 65 72  s OR-ed together
8940: 3a 20 20 0a 2a 2a 20 28 31 29 20 74 68 65 20 73  :  .** (1) the s
8950: 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f  pace required fo
8960: 72 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  r a copy of the 
8970: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20 6f  Expr structure o
8980: 6e 6c 79 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20  nly and .** (2) 
8990: 74 68 65 20 45 50 5f 78 78 78 20 66 6c 61 67 73  the EP_xxx flags
89a0: 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 20 77   that indicate w
89b0: 68 61 74 20 74 68 65 20 73 74 72 75 63 74 75 72  hat the structur
89c0: 65 20 73 69 7a 65 20 73 68 6f 75 6c 64 20 62 65  e size should be
89d0: 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
89e0: 76 61 6c 75 65 73 20 69 73 20 61 6c 77 61 79 73  values is always
89f0: 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20   one of:.**.**  
8a00: 20 20 20 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a      EXPR_FULLSIZ
8a10: 45 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 52  E.**      EXPR_R
8a20: 45 44 55 43 45 44 53 49 5a 45 20 20 20 7c 20 45  EDUCEDSIZE   | E
8a30: 50 5f 52 65 64 75 63 65 64 0a 2a 2a 20 20 20 20  P_Reduced.**    
8a40: 20 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59    EXPR_TOKENONLY
8a50: 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f  SIZE | EP_TokenO
8a60: 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69  nly.**.** The si
8a70: 7a 65 20 6f 66 20 74 68 65 20 73 74 72 75 63 74  ze of the struct
8a80: 75 72 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ure can be found
8a90: 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 20   by masking the 
8aa0: 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
8ab0: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
8ac0: 77 69 74 68 20 30 78 66 66 66 2e 20 20 54 68 65  with 0xfff.  The
8ad0: 20 66 6c 61 67 73 20 63 61 6e 20 62 65 20 66 6f   flags can be fo
8ae0: 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74  und by masking t
8af0: 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  he.** return val
8b00: 75 65 20 77 69 74 68 20 45 50 5f 52 65 64 75 63  ue with EP_Reduc
8b10: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e  ed|EP_TokenOnly.
8b20: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
8b30: 20 77 69 74 68 20 66 6c 61 67 73 3d 3d 45 58 50   with flags==EXP
8b40: 52 44 55 50 5f 52 45 44 55 43 45 2c 20 74 68 69  RDUP_REDUCE, thi
8b50: 73 20 72 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73  s routines works
8b60: 20 6f 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a   on full-size.**
8b70: 20 28 75 6e 72 65 64 75 63 65 64 29 20 45 78 70   (unreduced) Exp
8b80: 72 20 6f 62 6a 65 63 74 73 20 61 73 20 74 68 65  r objects as the
8b90: 79 20 6f 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20  y or originally 
8ba0: 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 74  constructed by t
8bb0: 68 65 20 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75  he parser..** Du
8bc0: 72 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20  ring expression 
8bd0: 61 6e 61 6c 79 73 69 73 2c 20 65 78 74 72 61 20  analysis, extra 
8be0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63  information is c
8bf0: 6f 6d 70 75 74 65 64 20 61 6e 64 20 6d 6f 76 65  omputed and move
8c00: 64 20 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20  d into.** later 
8c10: 70 61 72 74 73 20 6f 66 20 74 65 68 20 45 78 70  parts of teh Exp
8c20: 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 61  r object and tha
8c30: 74 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  t extra informat
8c40: 69 6f 6e 20 6d 69 67 68 74 20 67 65 74 20 63 68  ion might get ch
8c50: 6f 70 70 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20  opped.** off if 
8c60: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
8c70: 73 20 72 65 64 75 63 65 64 2e 20 20 4e 6f 74 65  s reduced.  Note
8c80: 20 61 6c 73 6f 20 74 68 61 74 20 69 74 20 64 6f   also that it do
8c90: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a  es not work to.*
8ca0: 2a 20 6d 61 6b 65 20 61 6e 20 45 58 50 52 44 55  * make an EXPRDU
8cb0: 50 5f 52 45 44 55 43 45 20 63 6f 70 79 20 6f 66  P_REDUCE copy of
8cc0: 20 61 20 72 65 64 75 63 65 64 20 65 78 70 72 65   a reduced expre
8cd0: 73 73 69 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e  ssion.  It is on
8ce0: 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72  ly legal.** to r
8cf0: 65 64 75 63 65 20 61 20 70 72 69 73 74 69 6e 65  educe a pristine
8d00: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
8d10: 20 66 72 6f 6d 20 74 68 65 20 70 61 72 73 65 72   from the parser
8d20: 2e 20 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  .  The implement
8d30: 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65  ation.** of dupe
8d40: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
8d50: 29 20 63 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70  ) contain multip
8d60: 6c 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74  le assert() stat
8d70: 65 6d 65 6e 74 73 20 74 68 61 74 20 61 74 74 65  ements that atte
8d80: 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63  mpt.** to enforc
8d90: 65 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  e this constrain
8da0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
8db0: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
8dc0: 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e  Size(Expr *p, in
8dd0: 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20  t flags){.  int 
8de0: 6e 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  nSize;.  assert(
8df0: 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f   flags==EXPRDUP_
8e00: 52 45 44 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d  REDUCE || flags=
8e10: 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e  =0 ); /* Only on
8e20: 65 20 66 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c  e flag value all
8e30: 6f 77 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  owed */.  assert
8e40: 28 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3c  ( EXPR_FULLSIZE<
8e50: 3d 30 78 66 66 66 20 29 3b 0a 20 20 61 73 73 65  =0xfff );.  asse
8e60: 72 74 28 20 28 30 78 66 66 66 20 26 20 28 45 50  rt( (0xfff & (EP
8e70: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
8e80: 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20  nOnly))==0 );.  
8e90: 69 66 28 20 30 3d 3d 66 6c 61 67 73 20 29 7b 0a  if( 0==flags ){.
8ea0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52      nSize = EXPR
8eb0: 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c  _FULLSIZE;.  }el
8ec0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
8ed0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
8ee0: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
8ef0: 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
8f00: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
8f10: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
8f20: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20  EP_FromJoin) ); 
8f30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
8f40: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8f50: 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b   EP_MemToken) );
8f60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
8f70: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8f80: 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 20 29 3b   EP_NoReduce) );
8f90: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66  .    if( p->pLef
8fa0: 74 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20  t || p->x.pList 
8fb0: 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  ){.      nSize =
8fc0: 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a   EXPR_REDUCEDSIZ
8fd0: 45 20 7c 20 45 50 5f 52 65 64 75 63 65 64 3b 0a  E | EP_Reduced;.
8fe0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8ff0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
9000: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e  ht==0 );.      n
9010: 53 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45  Size = EXPR_TOKE
9020: 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54  NONLYSIZE | EP_T
9030: 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a  okenOnly;.    }.
9040: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53 69    }.  return nSi
9050: 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ze;.}../*.** Thi
9060: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
9070: 6e 73 20 74 68 65 20 73 70 61 63 65 20 69 6e 20  ns the space in 
9080: 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74  bytes required t
9090: 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79  o store the copy
90a0: 20 0a 2a 2a 20 6f 66 20 74 68 65 20 45 78 70 72   .** of the Expr
90b0: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
90c0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70   copy of the Exp
90d0: 72 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e  r.u.zToken strin
90e0: 67 20 28 69 66 20 74 68 61 74 0a 2a 2a 20 73 74  g (if that.** st
90f0: 72 69 6e 67 20 69 73 20 64 65 66 69 6e 65 64 2e  ring is defined.
9100: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ).*/.static int 
9110: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
9120: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
9130: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79  lags){.  int nBy
9140: 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74  te = dupedExprSt
9150: 72 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67  ructSize(p, flag
9160: 73 29 20 26 20 30 78 66 66 66 3b 0a 20 20 69 66  s) & 0xfff;.  if
9170: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
9180: 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75  ty(p, EP_IntValu
9190: 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65  e) && p->u.zToke
91a0: 6e 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b  n ){.    nByte +
91b0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
91c0: 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31  0(p->u.zToken)+1
91d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 52  ;.  }.  return R
91e0: 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a  OUND8(nByte);.}.
91f0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
9200: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
9210: 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 72  s required to cr
9220: 65 61 74 65 20 61 20 64 75 70 6c 69 63 61 74 65  eate a duplicate
9230: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 65 78 70 72   of the .** expr
9240: 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73  ession passed as
9250: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
9260: 65 6e 74 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  ent. The second 
9270: 61 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a  argument is a.**
9280: 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67   mask containing
9290: 20 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61   EXPRDUP_XXX fla
92a0: 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  gs..**.** The va
92b0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 6e 63  lue returned inc
92c0: 6c 75 64 65 73 20 73 70 61 63 65 20 74 6f 20 63  ludes space to c
92d0: 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20  reate a copy of 
92e0: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 0a  the Expr struct.
92f0: 2a 2a 20 69 74 73 65 6c 66 20 61 6e 64 20 74 68  ** itself and th
9300: 65 20 62 75 66 66 65 72 20 72 65 66 65 72 72 65  e buffer referre
9310: 64 20 74 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a  d to by Expr.u.z
9320: 54 6f 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a  Token, if any..*
9330: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52  *.** If the EXPR
9340: 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20  DUP_REDUCE flag 
9350: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
9360: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
9370: 63 6c 75 64 65 73 20 0a 2a 2a 20 73 70 61 63 65  cludes .** space
9380: 20 74 6f 20 64 75 70 6c 69 63 61 74 65 20 61 6c   to duplicate al
9390: 6c 20 45 78 70 72 20 6e 6f 64 65 73 20 69 6e 20  l Expr nodes in 
93a0: 74 68 65 20 74 72 65 65 20 66 6f 72 6d 65 64 20  the tree formed 
93b0: 62 79 20 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a  by Expr.pLeft .*
93c0: 2a 20 61 6e 64 20 45 78 70 72 2e 70 52 69 67 68  * and Expr.pRigh
93d0: 74 20 76 61 72 69 61 62 6c 65 73 20 28 62 75 74  t variables (but
93e0: 20 6e 6f 74 20 66 6f 72 20 61 6e 79 20 73 74 72   not for any str
93f0: 75 63 74 75 72 65 73 20 70 6f 69 6e 74 65 64 20  uctures pointed 
9400: 74 6f 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e  to or .** descen
9410: 64 65 64 20 66 72 6f 6d 20 74 68 65 20 45 78 70  ded from the Exp
9420: 72 2e 78 2e 70 4c 69 73 74 20 6f 72 20 45 78 70  r.x.pList or Exp
9430: 72 2e 78 2e 70 53 65 6c 65 63 74 20 76 61 72 69  r.x.pSelect vari
9440: 61 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69  ables)..*/.stati
9450: 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53  c int dupedExprS
9460: 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ize(Expr *p, int
9470: 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e   flags){.  int n
9480: 42 79 74 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Byte = 0;.  if( 
9490: 70 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d  p ){.    nByte =
94a0: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
94b0: 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ze(p, flags);.  
94c0: 20 20 69 66 28 20 66 6c 61 67 73 26 45 58 50 52    if( flags&EXPR
94d0: 44 55 50 5f 52 45 44 55 43 45 20 29 7b 0a 20 20  DUP_REDUCE ){.  
94e0: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 64 75 70      nByte += dup
94f0: 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c  edExprSize(p->pL
9500: 65 66 74 2c 20 66 6c 61 67 73 29 20 2b 20 64 75  eft, flags) + du
9510: 70 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70  pedExprSize(p->p
9520: 52 69 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20  Right, flags);. 
9530: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
9540: 6e 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n nByte;.}../*.*
9550: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
9560: 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71  is similar to sq
9570: 6c 69 74 65 33 45 78 70 72 44 75 70 28 29 2c 20  lite3ExprDup(), 
9580: 65 78 63 65 70 74 20 74 68 61 74 20 69 66 20 70  except that if p
9590: 7a 42 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e  zBuffer .** is n
95a0: 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a  ot NULL then *pz
95b0: 42 75 66 66 65 72 20 69 73 20 61 73 73 75 6d 65  Buffer is assume
95c0: 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  d to point to a 
95d0: 62 75 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f  buffer large eno
95e0: 75 67 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65  ugh .** to store
95f0: 20 74 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70   the copy of exp
9600: 72 65 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63  ression p, the c
9610: 6f 70 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54  opies of p->u.zT
9620: 6f 6b 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c  oken.** (if appl
9630: 69 63 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65  icable), and the
9640: 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70   copies of the p
9650: 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70  ->pLeft and p->p
9660: 52 69 67 68 74 20 65 78 70 72 65 73 73 69 6f 6e  Right expression
9670: 73 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65  s,.** if any. Be
9680: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
9690: 2a 70 7a 42 75 66 66 65 72 20 69 73 20 73 65 74  *pzBuffer is set
96a0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
96b0: 74 65 20 70 61 73 74 20 74 68 65 0a 2a 2a 20 70  te past the.** p
96c0: 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75  ortion of the bu
96d0: 66 66 65 72 20 63 6f 70 69 65 64 20 69 6e 74 6f  ffer copied into
96e0: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
96f0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70  n..*/.static Exp
9700: 72 20 2a 65 78 70 72 44 75 70 28 73 71 6c 69 74  r *exprDup(sqlit
9710: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c  e3 *db, Expr *p,
9720: 20 69 6e 74 20 64 75 70 46 6c 61 67 73 2c 20 75   int dupFlags, u
9730: 38 20 2a 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20  8 **pzBuffer){. 
9740: 20 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20   Expr *pNew;    
9750: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
9760: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 75  to return */.  u
9770: 38 20 2a 7a 41 6c 6c 6f 63 3b 20 20 20 20 20 20  8 *zAlloc;      
9780: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 73       /* Memory s
9790: 70 61 63 65 20 66 72 6f 6d 20 77 68 69 63 68 20  pace from which 
97a0: 74 6f 20 62 75 69 6c 64 20 45 78 70 72 20 6f 62  to build Expr ob
97b0: 6a 65 63 74 20 2a 2f 0a 20 20 75 33 32 20 73 74  ject */.  u32 st
97c0: 61 74 69 63 46 6c 61 67 3b 20 20 20 20 20 20 20  aticFlag;       
97d0: 2f 2a 20 45 50 5f 53 74 61 74 69 63 20 69 66 20  /* EP_Static if 
97e0: 73 70 61 63 65 20 6e 6f 74 20 6f 62 74 61 69 6e  space not obtain
97f0: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 2a  ed from malloc *
9800: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  /..  assert( db!
9810: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
9820: 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  p );.  assert( d
9830: 75 70 46 6c 61 67 73 3d 3d 30 20 7c 7c 20 64 75  upFlags==0 || du
9840: 70 46 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f  pFlags==EXPRDUP_
9850: 52 45 44 55 43 45 20 29 3b 0a 20 20 61 73 73 65  REDUCE );.  asse
9860: 72 74 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20  rt( pzBuffer==0 
9870: 7c 7c 20 64 75 70 46 6c 61 67 73 3d 3d 45 58 50  || dupFlags==EXP
9880: 52 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 0a  RDUP_REDUCE );..
9890: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
98a0: 77 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 74  where to write t
98b0: 68 65 20 6e 65 77 20 45 78 70 72 20 73 74 72 75  he new Expr stru
98c0: 63 74 75 72 65 2e 20 2a 2f 0a 20 20 69 66 28 20  cture. */.  if( 
98d0: 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20  pzBuffer ){.    
98e0: 7a 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66  zAlloc = *pzBuff
98f0: 65 72 3b 0a 20 20 20 20 73 74 61 74 69 63 46 6c  er;.    staticFl
9900: 61 67 20 3d 20 45 50 5f 53 74 61 74 69 63 3b 0a  ag = EP_Static;.
9910: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41 6c    }else{.    zAl
9920: 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  loc = sqlite3DbM
9930: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 64  allocRawNN(db, d
9940: 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2c 20  upedExprSize(p, 
9950: 64 75 70 46 6c 61 67 73 29 29 3b 0a 20 20 20 20  dupFlags));.    
9960: 73 74 61 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a  staticFlag = 0;.
9970: 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20 28 45 78    }.  pNew = (Ex
9980: 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20  pr *)zAlloc;..  
9990: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
99a0: 2f 2a 20 53 65 74 20 6e 4e 65 77 53 69 7a 65 20  /* Set nNewSize 
99b0: 74 6f 20 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f  to the size allo
99c0: 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 74  cated for the st
99d0: 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20  ructure pointed 
99e0: 74 6f 0a 20 20 20 20 2a 2a 20 62 79 20 70 4e 65  to.    ** by pNe
99f0: 77 2e 20 54 68 69 73 20 69 73 20 65 69 74 68 65  w. This is eithe
9a00: 72 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c  r EXPR_FULLSIZE,
9a10: 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a   EXPR_REDUCEDSIZ
9a20: 45 20 6f 72 0a 20 20 20 20 2a 2a 20 45 58 50 52  E or.    ** EXPR
9a30: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20  _TOKENONLYSIZE. 
9a40: 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f  nToken is set to
9a50: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
9a60: 79 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20  ytes consumed.  
9a70: 20 20 2a 2a 20 62 79 20 74 68 65 20 63 6f 70 79    ** by the copy
9a80: 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f   of the p->u.zTo
9a90: 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20 61  ken string (if a
9aa0: 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ny)..    */.    
9ab0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 6e  const unsigned n
9ac0: 53 74 72 75 63 74 53 69 7a 65 20 3d 20 64 75 70  StructSize = dup
9ad0: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
9ae0: 28 70 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20  (p, dupFlags);. 
9af0: 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65     const int nNe
9b00: 77 53 69 7a 65 20 3d 20 6e 53 74 72 75 63 74 53  wSize = nStructS
9b10: 69 7a 65 20 26 20 30 78 66 66 66 3b 0a 20 20 20  ize & 0xfff;.   
9b20: 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20   int nToken;.   
9b30: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
9b40: 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56  perty(p, EP_IntV
9b50: 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54  alue) && p->u.zT
9b60: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 6e 54  oken ){.      nT
9b70: 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  oken = sqlite3St
9b80: 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b  rlen30(p->u.zTok
9b90: 65 6e 29 20 2b 20 31 3b 0a 20 20 20 20 7d 65 6c  en) + 1;.    }el
9ba0: 73 65 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e  se{.      nToken
9bb0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
9bc0: 69 66 28 20 64 75 70 46 6c 61 67 73 20 29 7b 0a  if( dupFlags ){.
9bd0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
9be0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
9bf0: 20 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 20   EP_Reduced)==0 
9c00: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
9c10: 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53  zAlloc, p, nNewS
9c20: 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ize);.    }else{
9c30: 0a 20 20 20 20 20 20 75 33 32 20 6e 53 69 7a 65  .      u32 nSize
9c40: 20 3d 20 28 75 33 32 29 65 78 70 72 53 74 72 75   = (u32)exprStru
9c50: 63 74 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 20  ctSize(p);.     
9c60: 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20   memcpy(zAlloc, 
9c70: 70 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20  p, nSize);.     
9c80: 20 69 66 28 20 6e 53 69 7a 65 3c 45 58 50 52 5f   if( nSize<EXPR_
9c90: 46 55 4c 4c 53 49 5a 45 20 29 7b 20 0a 20 20 20  FULLSIZE ){ .   
9ca0: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c       memset(&zAl
9cb0: 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45  loc[nSize], 0, E
9cc0: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69  XPR_FULLSIZE-nSi
9cd0: 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
9ce0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74   }..    /* Set t
9cf0: 68 65 20 45 50 5f 52 65 64 75 63 65 64 2c 20 45  he EP_Reduced, E
9d00: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64  P_TokenOnly, and
9d10: 20 45 50 5f 53 74 61 74 69 63 20 66 6c 61 67 73   EP_Static flags
9d20: 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 20   appropriately. 
9d30: 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  */.    pNew->fla
9d40: 67 73 20 26 3d 20 7e 28 45 50 5f 52 65 64 75 63  gs &= ~(EP_Reduc
9d50: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  ed|EP_TokenOnly|
9d60: 45 50 5f 53 74 61 74 69 63 7c 45 50 5f 4d 65 6d  EP_Static|EP_Mem
9d70: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 70 4e 65 77  Token);.    pNew
9d80: 2d 3e 66 6c 61 67 73 20 7c 3d 20 6e 53 74 72 75  ->flags |= nStru
9d90: 63 74 53 69 7a 65 20 26 20 28 45 50 5f 52 65 64  ctSize & (EP_Red
9da0: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
9db0: 79 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c  y);.    pNew->fl
9dc0: 61 67 73 20 7c 3d 20 73 74 61 74 69 63 46 6c 61  ags |= staticFla
9dd0: 67 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  g;..    /* Copy 
9de0: 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20  the p->u.zToken 
9df0: 73 74 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20  string, if any. 
9e00: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 54 6f 6b 65  */.    if( nToke
9e10: 6e 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  n ){.      char 
9e20: 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e  *zToken = pNew->
9e30: 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72  u.zToken = (char
9e40: 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69  *)&zAlloc[nNewSi
9e50: 7a 65 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ze];.      memcp
9e60: 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a  y(zToken, p->u.z
9e70: 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a  Token, nToken);.
9e80: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 30      }..    if( 0
9e90: 3d 3d 28 28 70 2d 3e 66 6c 61 67 73 7c 70 4e 65  ==((p->flags|pNe
9ea0: 77 2d 3e 66 6c 61 67 73 29 20 26 20 45 50 5f 54  w->flags) & EP_T
9eb0: 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  okenOnly) ){.   
9ec0: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
9ed0: 65 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63  e pNew->x.pSelec
9ee0: 74 20 6f 72 20 70 4e 65 77 2d 3e 78 2e 70 4c 69  t or pNew->x.pLi
9ef0: 73 74 20 6d 65 6d 62 65 72 2e 20 2a 2f 0a 20 20  st member. */.  
9f00: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
9f10: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49  roperty(p, EP_xI
9f20: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
9f30: 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c      pNew->x.pSel
9f40: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
9f50: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e  ectDup(db, p->x.
9f60: 70 53 65 6c 65 63 74 2c 20 64 75 70 46 6c 61 67  pSelect, dupFlag
9f70: 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  s);.      }else{
9f80: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78  .        pNew->x
9f90: 2e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  .pList = sqlite3
9fa0: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
9fb0: 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 64 75 70 46  p->x.pList, dupF
9fc0: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lags);.      }. 
9fd0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6c     }..    /* Fil
9fe0: 6c 20 69 6e 20 70 4e 65 77 2d 3e 70 4c 65 66 74  l in pNew->pLeft
9ff0: 20 61 6e 64 20 70 4e 65 77 2d 3e 70 52 69 67 68   and pNew->pRigh
a000: 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 45 78  t. */.    if( Ex
a010: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e  prHasProperty(pN
a020: 65 77 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45  ew, EP_Reduced|E
a030: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
a040: 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20        zAlloc += 
a050: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
a060: 65 28 70 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a  e(p, dupFlags);.
a070: 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
a080: 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20  sProperty(pNew, 
a090: 45 50 5f 52 65 64 75 63 65 64 29 20 29 7b 0a 20  EP_Reduced) ){. 
a0a0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65         pNew->pLe
a0b0: 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74 20 3f 0a  ft = p->pLeft ?.
a0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0d0: 20 20 20 20 20 20 65 78 70 72 44 75 70 28 64 62        exprDup(db
a0e0: 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50 52  , p->pLeft, EXPR
a0f0: 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c  DUP_REDUCE, &zAl
a100: 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20 20  loc) : 0;.      
a110: 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d    pNew->pRight =
a120: 20 70 2d 3e 70 52 69 67 68 74 20 3f 0a 20 20 20   p->pRight ?.   
a130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a140: 20 20 20 20 65 78 70 72 44 75 70 28 64 62 2c 20      exprDup(db, 
a150: 70 2d 3e 70 52 69 67 68 74 2c 20 45 58 50 52 44  p->pRight, EXPRD
a160: 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c  UP_REDUCE, &zAll
a170: 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 7d  oc) : 0;.      }
a180: 0a 20 20 20 20 20 20 69 66 28 20 70 7a 42 75 66  .      if( pzBuf
a190: 66 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  fer ){.        *
a1a0: 70 7a 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f  pzBuffer = zAllo
a1b0: 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
a1c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
a1d0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
a1e0: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
a1f0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
a200: 20 70 4e 65 77 2d 3e 6f 70 3d 3d 54 4b 5f 53 45   pNew->op==TK_SE
a210: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  LECT_COLUMN ){. 
a220: 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70           pNew->p
a230: 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74 3b  Left = p->pLeft;
a240: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
a250: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
a260: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
a270: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
a280: 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  eft, 0);.       
a290: 20 7d 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d   }.        pNew-
a2a0: 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  >pRight = sqlite
a2b0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
a2c0: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
a2d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
a2e0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
a2f0: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e 64  /*.** Create and
a300: 20 72 65 74 75 72 6e 20 61 20 64 65 65 70 20 63   return a deep c
a310: 6f 70 79 20 6f 66 20 74 68 65 20 6f 62 6a 65 63  opy of the objec
a320: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
a330: 73 65 63 6f 6e 64 20 0a 2a 2a 20 61 72 67 75 6d  second .** argum
a340: 65 6e 74 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 63  ent. If an OOM c
a350: 6f 6e 64 69 74 69 6f 6e 20 69 73 20 65 6e 63 6f  ondition is enco
a360: 75 6e 74 65 72 65 64 2c 20 4e 55 4c 4c 20 69 73  untered, NULL is
a370: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64   returned.** and
a380: 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   the db->mallocF
a390: 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74 2e 0a  ailed flag set..
a3a0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
a3b0: 45 5f 4f 4d 49 54 5f 43 54 45 0a 73 74 61 74 69  E_OMIT_CTE.stati
a3c0: 63 20 57 69 74 68 20 2a 77 69 74 68 44 75 70 28  c With *withDup(
a3d0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 74  sqlite3 *db, Wit
a3e0: 68 20 2a 70 29 7b 0a 20 20 57 69 74 68 20 2a 70  h *p){.  With *p
a3f0: 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Ret = 0;.  if( p
a400: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   ){.    int nByt
a410: 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b  e = sizeof(*p) +
a420: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29   sizeof(p->a[0])
a430: 20 2a 20 28 70 2d 3e 6e 43 74 65 2d 31 29 3b 0a   * (p->nCte-1);.
a440: 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74      pRet = sqlit
a450: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
a460: 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  b, nByte);.    i
a470: 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20  f( pRet ){.     
a480: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 70 52   int i;.      pR
a490: 65 74 2d 3e 6e 43 74 65 20 3d 20 70 2d 3e 6e 43  et->nCte = p->nC
a4a0: 74 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  te;.      for(i=
a4b0: 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b  0; i<p->nCte; i+
a4c0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74  +){.        pRet
a4d0: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20 3d  ->a[i].pSelect =
a4e0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
a4f0: 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 53  p(db, p->a[i].pS
a500: 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20  elect, 0);.     
a510: 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 43     pRet->a[i].pC
a520: 6f 6c 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ols = sqlite3Exp
a530: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
a540: 61 5b 69 5d 2e 70 43 6f 6c 73 2c 20 30 29 3b 0a  a[i].pCols, 0);.
a550: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b          pRet->a[
a560: 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  i].zName = sqlit
a570: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
a580: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
a590: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
a5a0: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
a5b0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
a5c0: 20 77 69 74 68 44 75 70 28 78 2c 79 29 20 30 0a   withDup(x,y) 0.
a5d0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
a5e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75  e following grou
a5f0: 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d 61  p of routines ma
a600: 6b 65 20 64 65 65 70 20 63 6f 70 69 65 73 20 6f  ke deep copies o
a610: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a  f expressions,.*
a620: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
a630: 74 73 2c 20 49 44 20 6c 69 73 74 73 2c 20 61 6e  ts, ID lists, an
a640: 64 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  d select stateme
a650: 6e 74 73 2e 20 20 54 68 65 20 63 6f 70 69 65 73  nts.  The copies
a660: 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74   can.** be delet
a670: 65 64 20 28 62 79 20 62 65 69 6e 67 20 70 61 73  ed (by being pas
a680: 73 65 64 20 74 6f 20 74 68 65 69 72 20 72 65 73  sed to their res
a690: 70 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74  pective ...Delet
a6a0: 65 28 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a  e() routines).**
a6b0: 20 77 69 74 68 6f 75 74 20 65 66 66 65 63 74 69   without effecti
a6c0: 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 73  ng the originals
a6d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72  ..**.** The expr
a6e0: 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c  ession list, ID,
a6f0: 20 61 6e 64 20 73 6f 75 72 63 65 20 6c 69 73 74   and source list
a700: 73 20 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69  s return by sqli
a710: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 29  te3ExprListDup()
a720: 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c 69  ,.** sqlite3IdLi
a730: 73 74 44 75 70 28 29 2c 20 61 6e 64 20 73 71 6c  stDup(), and sql
a740: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 29  ite3SrcListDup()
a750: 20 63 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74   can not be furt
a760: 68 65 72 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a  her expanded .**
a770: 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63   by subsequent c
a780: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c  alls to sqlite*L
a790: 69 73 74 41 70 70 65 6e 64 28 29 20 72 6f 75 74  istAppend() rout
a7a0: 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20  ines..**.** Any 
a7b0: 74 61 62 6c 65 73 20 74 68 61 74 20 74 68 65 20  tables that the 
a7c0: 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20 70 6f  SrcList might po
a7d0: 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74 20 64  int to are not d
a7e0: 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  uplicated..**.**
a7f0: 20 54 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   The flags param
a800: 65 74 65 72 20 63 6f 6e 74 61 69 6e 73 20 61 20  eter contains a 
a810: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74  combination of t
a820: 68 65 20 45 58 50 52 44 55 50 5f 58 58 58 20 66  he EXPRDUP_XXX f
a830: 6c 61 67 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20  lags..** If the 
a840: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 66  EXPRDUP_REDUCE f
a850: 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
a860: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 72   the structure r
a870: 65 74 75 72 6e 65 64 20 69 73 20 61 0a 2a 2a 20  eturned is a.** 
a880: 74 72 75 6e 63 61 74 65 64 20 76 65 72 73 69 6f  truncated versio
a890: 6e 20 6f 66 20 74 68 65 20 75 73 75 61 6c 20 45  n of the usual E
a8a0: 78 70 72 20 73 74 72 75 63 74 75 72 65 20 74 68  xpr structure th
a8b0: 61 74 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65  at will be store
a8c0: 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20  d as.** part of 
a8d0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
a8e0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
a8f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
a900: 65 6d 61 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ema..*/.Expr *sq
a910: 6c 69 74 65 33 45 78 70 72 44 75 70 28 73 71 6c  lite3ExprDup(sql
a920: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
a930: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
a940: 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
a950: 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 45 58 50 52  0 || flags==EXPR
a960: 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 20 20  DUP_REDUCE );.  
a970: 72 65 74 75 72 6e 20 70 20 3f 20 65 78 70 72 44  return p ? exprD
a980: 75 70 28 64 62 2c 20 70 2c 20 66 6c 61 67 73 2c  up(db, p, flags,
a990: 20 30 29 20 3a 20 30 3b 0a 7d 0a 45 78 70 72 4c   0) : 0;.}.ExprL
a9a0: 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72  ist *sqlite3Expr
a9b0: 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20  ListDup(sqlite3 
a9c0: 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *db, ExprList *p
a9d0: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
a9e0: 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a  ExprList *pNew;.
a9f0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
aa00: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a  t_item *pItem, *
aa10: 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20  pOldItem;.  int 
aa20: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  i;.  assert( db!
aa30: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  =0 );.  if( p==0
aa40: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
aa50: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
aa60: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
aa70: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a  izeof(*pNew) );.
aa80: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
aa90: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
aaa0: 2d 3e 6e 45 78 70 72 20 3d 20 69 20 3d 20 70 2d  ->nExpr = i = p-
aab0: 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 28 66  >nExpr;.  if( (f
aac0: 6c 61 67 73 20 26 20 45 58 50 52 44 55 50 5f 52  lags & EXPRDUP_R
aad0: 45 44 55 43 45 29 3d 3d 30 20 29 20 66 6f 72 28  EDUCE)==0 ) for(
aae0: 69 3d 31 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=1; i<p->nExpr;
aaf0: 20 69 2b 3d 69 29 7b 7d 0a 20 20 70 4e 65 77 2d   i+=i){}.  pNew-
ab00: 3e 61 20 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c  >a = pItem = sql
ab10: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
ab20: 4e 28 64 62 2c 20 20 69 2a 73 69 7a 65 6f 66 28  N(db,  i*sizeof(
ab30: 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66  p->a[0]) );.  if
ab40: 28 20 70 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20  ( pItem==0 ){.  
ab50: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
ab60: 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72  db, pNew);.    r
ab70: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20  eturn 0;.  } .  
ab80: 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b  pOldItem = p->a;
ab90: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
aba0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
abb0: 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b  em++, pOldItem++
abc0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 6c  ){.    Expr *pOl
abd0: 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d  dExpr = pOldItem
abe0: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 70 49 74  ->pExpr;.    pIt
abf0: 65 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69  em->pExpr = sqli
ac00: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
ac10: 4f 6c 64 45 78 70 72 2c 20 66 6c 61 67 73 29 3b  OldExpr, flags);
ac20: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  .    pItem->zNam
ac30: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
ac40: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
ac50: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49  ->zName);.    pI
ac60: 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c  tem->zSpan = sql
ac70: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
ac80: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 53 70 61 6e   pOldItem->zSpan
ac90: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f  );.    pItem->so
aca0: 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64 49 74  rtOrder = pOldIt
acb0: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  em->sortOrder;. 
acc0: 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d     pItem->done =
acd0: 20 30 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62   0;.    pItem->b
ace0: 53 70 61 6e 49 73 54 61 62 20 3d 20 70 4f 6c 64  SpanIsTab = pOld
acf0: 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62  Item->bSpanIsTab
ad00: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 20 3d  ;.    pItem->u =
ad10: 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20 20   pOldItem->u;.  
ad20: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
ad30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72  .}../*.** If cur
ad40: 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20  sors, triggers, 
ad50: 76 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65  views and subque
ad60: 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69  ries are all omi
ad70: 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  tted from.** the
ad80: 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e   build, then non
ad90: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
ada0: 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63  ng routines, exc
adb0: 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69  ept for .** sqli
adc0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20  te3SelectDup(), 
add0: 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73  can be called. s
ade0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
adf0: 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a  ) is sometimes.*
ae00: 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20  * called with a 
ae10: 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  NULL argument..*
ae20: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
ae30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
ae40: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
ae50: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
ae60: 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64  ) \. || !defined
ae70: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
ae80: 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a  QUERY).SrcList *
ae90: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
aea0: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  p(sqlite3 *db, S
aeb0: 72 63 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66  rcList *p, int f
aec0: 6c 61 67 73 29 7b 0a 20 20 53 72 63 4c 69 73 74  lags){.  SrcList
aed0: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b   *pNew;.  int i;
aee0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
aef0: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
af00: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
af10: 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20  turn 0;.  nByte 
af20: 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28  = sizeof(*p) + (
af30: 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65  p->nSrc>0 ? size
af40: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70  of(p->a[0]) * (p
af50: 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a  ->nSrc-1) : 0);.
af60: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
af70: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
af80: 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  , nByte );.  if(
af90: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
afa0: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72  n 0;.  pNew->nSr
afb0: 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63  c = pNew->nAlloc
afc0: 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f   = p->nSrc;.  fo
afd0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63  r(i=0; i<p->nSrc
afe0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
aff0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
b000: 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65  *pNewItem = &pNe
b010: 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72  w->a[i];.    str
b020: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
b030: 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d   *pOldItem = &p-
b040: 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65  >a[i];.    Table
b050: 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e 65 77   *pTab;.    pNew
b060: 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 20 3d 20  Item->pSchema = 
b070: 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 63 68 65 6d  pOldItem->pSchem
b080: 61 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  a;.    pNewItem-
b090: 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c  >zDatabase = sql
b0a0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
b0b0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61   pOldItem->zData
b0c0: 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  base);.    pNewI
b0d0: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
b0e0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
b0f0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pOldItem->zName
b100: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
b110: 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65  >zAlias = sqlite
b120: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
b130: 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  ldItem->zAlias);
b140: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 66  .    pNewItem->f
b150: 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 66 67  g = pOldItem->fg
b160: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
b170: 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74  iCursor = pOldIt
b180: 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
b190: 20 70 4e 65 77 49 74 65 6d 2d 3e 61 64 64 72 46   pNewItem->addrF
b1a0: 69 6c 6c 53 75 62 20 3d 20 70 4f 6c 64 49 74 65  illSub = pOldIte
b1b0: 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3b 0a  m->addrFillSub;.
b1c0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 72 65      pNewItem->re
b1d0: 67 52 65 74 75 72 6e 20 3d 20 70 4f 6c 64 49 74  gReturn = pOldIt
b1e0: 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20  em->regReturn;. 
b1f0: 20 20 20 69 66 28 20 70 4e 65 77 49 74 65 6d 2d     if( pNewItem-
b200: 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20  >fg.isIndexedBy 
b210: 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 49 74 65  ){.      pNewIte
b220: 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79  m->u1.zIndexedBy
b230: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
b240: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
b250: 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 29 3b  >u1.zIndexedBy);
b260: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49  .    }.    pNewI
b270: 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20  tem->pIBIndex = 
b280: 70 4f 6c 64 49 74 65 6d 2d 3e 70 49 42 49 6e 64  pOldItem->pIBInd
b290: 65 78 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  ex;.    if( pNew
b2a0: 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  Item->fg.isTabFu
b2b0: 6e 63 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  nc ){.      pNew
b2c0: 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72  Item->u1.pFuncAr
b2d0: 67 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 73  g = .          s
b2e0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
b2f0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
b300: 75 31 2e 70 46 75 6e 63 41 72 67 2c 20 66 6c 61  u1.pFuncArg, fla
b310: 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  gs);.    }.    p
b320: 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e  Tab = pNewItem->
b330: 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  pTab = pOldItem-
b340: 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70  >pTab;.    if( p
b350: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61  Tab ){.      pTa
b360: 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d  b->nRef++;.    }
b370: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
b380: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
b390: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 4f  SelectDup(db, pO
b3a0: 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c  ldItem->pSelect,
b3b0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
b3c0: 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c  wItem->pOn = sql
b3d0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
b3e0: 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66  pOldItem->pOn, f
b3f0: 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49  lags);.    pNewI
b400: 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71  tem->pUsing = sq
b410: 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 64  lite3IdListDup(d
b420: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73  b, pOldItem->pUs
b430: 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ing);.    pNewIt
b440: 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f  em->colUsed = pO
b450: 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b  ldItem->colUsed;
b460: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
b470: 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71  ew;.}.IdList *sq
b480: 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 73  lite3IdListDup(s
b490: 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69  qlite3 *db, IdLi
b4a0: 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74  st *p){.  IdList
b4b0: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b   *pNew;.  int i;
b4c0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
b4d0: 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
b4e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
b4f0: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
b500: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
b510: 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
b520: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
b530: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
b540: 6e 49 64 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20  nId = p->nId;.  
b550: 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65  pNew->a = sqlite
b560: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
b570: 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66  b, p->nId*sizeof
b580: 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69  (p->a[0]) );.  i
b590: 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b  f( pNew->a==0 ){
b5a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
b5b0: 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20  ee(db, pNew);.  
b5c0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
b5d0: 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20 62    /* Note that b
b5e0: 65 63 61 75 73 65 20 74 68 65 20 73 69 7a 65 20  ecause the size 
b5f0: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  of the allocatio
b600: 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d 20 69 73 20  n for p->a[] is 
b610: 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73 73 61  not.  ** necessa
b620: 72 69 6c 79 20 61 20 70 6f 77 65 72 20 6f 66 20  rily a power of 
b630: 74 77 6f 2c 20 73 71 6c 69 74 65 33 49 64 4c 69  two, sqlite3IdLi
b640: 73 74 41 70 70 65 6e 64 28 29 20 6d 61 79 20 6e  stAppend() may n
b650: 6f 74 20 62 65 20 63 61 6c 6c 65 64 0a 20 20 2a  ot be called.  *
b660: 2a 20 6f 6e 20 74 68 65 20 64 75 70 6c 69 63 61  * on the duplica
b670: 74 65 20 63 72 65 61 74 65 64 20 62 79 20 74 68  te created by th
b680: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a  is function. */.
b690: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
b6a0: 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nId; i++){.    s
b6b0: 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65  truct IdList_ite
b6c0: 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70  m *pNewItem = &p
b6d0: 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  New->a[i];.    s
b6e0: 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65  truct IdList_ite
b6f0: 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70  m *pOldItem = &p
b700: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77  ->a[i];.    pNew
b710: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
b720: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
b730: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  , pOldItem->zNam
b740: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
b750: 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d  ->idx = pOldItem
b760: 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74  ->idx;.  }.  ret
b770: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65  urn pNew;.}.Sele
b780: 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63  ct *sqlite3Selec
b790: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
b7a0: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
b7b0: 20 66 6c 61 67 73 29 7b 0a 20 20 53 65 6c 65 63   flags){.  Selec
b7c0: 74 20 2a 70 4e 65 77 2c 20 2a 70 50 72 69 6f 72  t *pNew, *pPrior
b7d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ;.  assert( db!=
b7e0: 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  0 );.  if( p==0 
b7f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
b800: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
b810: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
b820: 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66  zeof(*p) );.  if
b830: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
b840: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 45  rn 0;.  pNew->pE
b850: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
b860: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
b870: 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67 73 29 3b  >pEList, flags);
b880: 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20  .  pNew->pSrc = 
b890: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
b8a0: 70 28 64 62 2c 20 70 2d 3e 70 53 72 63 2c 20 66  p(db, p->pSrc, f
b8b0: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lags);.  pNew->p
b8c0: 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
b8d0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 57  xprDup(db, p->pW
b8e0: 68 65 72 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  here, flags);.  
b8f0: 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d  pNew->pGroupBy =
b900: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
b910: 44 75 70 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75  Dup(db, p->pGrou
b920: 70 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  pBy, flags);.  p
b930: 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  New->pHaving = s
b940: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
b950: 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 66 6c  , p->pHaving, fl
b960: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f  ags);.  pNew->pO
b970: 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33  rderBy = sqlite3
b980: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
b990: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 66 6c 61  p->pOrderBy, fla
b9a0: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20  gs);.  pNew->op 
b9b0: 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d  = p->op;.  pNew-
b9c0: 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
b9d0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
b9e0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f  Dup(db, p->pPrio
b9f0: 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28  r, flags);.  if(
ba00: 20 70 50 72 69 6f 72 20 29 20 70 50 72 69 6f 72   pPrior ) pPrior
ba10: 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a  ->pNext = pNew;.
ba20: 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20    pNew->pNext = 
ba30: 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69  0;.  pNew->pLimi
ba40: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
ba50: 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  up(db, p->pLimit
ba60: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
ba70: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 73 71 6c 69  ->pOffset = sqli
ba80: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
ba90: 2d 3e 70 4f 66 66 73 65 74 2c 20 66 6c 61 67 73  ->pOffset, flags
baa0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69  );.  pNew->iLimi
bab0: 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69  t = 0;.  pNew->i
bac0: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4e  Offset = 0;.  pN
bad0: 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 70  ew->selFlags = p
bae0: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e 53 46  ->selFlags & ~SF
baf0: 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
bb00: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
bb10: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
bb20: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
bb30: 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[1] = -1;.  pN
bb40: 65 77 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d  ew->nSelectRow =
bb50: 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a   p->nSelectRow;.
bb60: 20 20 70 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20    pNew->pWith = 
bb70: 77 69 74 68 44 75 70 28 64 62 2c 20 70 2d 3e 70  withDup(db, p->p
bb80: 57 69 74 68 29 3b 0a 20 20 73 71 6c 69 74 65 33  With);.  sqlite3
bb90: 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70 4e  SelectSetName(pN
bba0: 65 77 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29  ew, p->zSelName)
bbb0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
bbc0: 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74 20  .}.#else.Select 
bbd0: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75  *sqlite3SelectDu
bbe0: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  p(sqlite3 *db, S
bbf0: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c  elect *p, int fl
bc00: 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ags){.  assert( 
bc10: 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  p==0 );.  return
bc20: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f   0;.}.#endif.../
bc30: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
bc40: 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e  lement to the en
bc50: 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  d of an expressi
bc60: 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69  on list.  If pLi
bc70: 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c  st is.** initial
bc80: 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72  ly NULL, then cr
bc90: 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  eate a new expre
bca0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
bcb0: 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * If a memory al
bcc0: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
bcd0: 63 63 75 72 73 2c 20 74 68 65 20 65 6e 74 69 72  ccurs, the entir
bce0: 65 20 6c 69 73 74 20 69 73 20 66 72 65 65 64 20  e list is freed 
bcf0: 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72  and.** NULL is r
bd00: 65 74 75 72 6e 65 64 2e 20 20 49 66 20 6e 6f 6e  eturned.  If non
bd10: 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65  -NULL is returne
bd20: 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75  d, then it is gu
bd30: 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68 61 74  aranteed.** that
bd40: 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77   the new entry w
bd50: 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
bd60: 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70  appended..*/.Exp
bd70: 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78  rList *sqlite3Ex
bd80: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20  prListAppend(.  
bd90: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
bda0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
bdb0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
bdc0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
bdd0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
bde0: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65  to which to appe
bdf0: 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  nd. Might be NUL
be00: 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  L */.  Expr *pEx
be10: 70 72 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  pr             /
be20: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  * Expression to 
be30: 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69 67  be appended. Mig
be40: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  ht be NULL */.){
be50: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
be60: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
be70: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
be80: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
be90: 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
bea0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
beb0: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78  NN(db, sizeof(Ex
bec0: 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  prList) );.    i
bed0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
bee0: 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d       goto no_mem
bef0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
bf00: 74 2d 3e 6e 45 78 70 72 20 3d 20 30 3b 0a 20 20  t->nExpr = 0;.  
bf10: 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c    pList->a = sql
bf20: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
bf30: 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 4c 69  N(db, sizeof(pLi
bf40: 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20  st->a[0]));.    
bf50: 69 66 28 20 70 4c 69 73 74 2d 3e 61 3d 3d 30 20  if( pList->a==0 
bf60: 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20  ) goto no_mem;. 
bf70: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 69 73   }else if( (pLis
bf80: 74 2d 3e 6e 45 78 70 72 20 26 20 28 70 4c 69 73  t->nExpr & (pLis
bf90: 74 2d 3e 6e 45 78 70 72 2d 31 29 29 3d 3d 30 20  t->nExpr-1))==0 
bfa0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
bfb0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  prList_item *a;.
bfc0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
bfd0: 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  t->nExpr>0 );.  
bfe0: 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62 52    a = sqlite3DbR
bff0: 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74  ealloc(db, pList
c000: 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ->a, pList->nExp
c010: 72 2a 32 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74  r*2*sizeof(pList
c020: 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  ->a[0]));.    if
c030: 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( a==0 ){.      
c040: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
c050: 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20   }.    pList->a 
c060: 3d 20 61 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = a;.  }.  asser
c070: 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29  t( pList->a!=0 )
c080: 3b 0a 20 20 69 66 28 20 31 20 29 7b 0a 20 20 20  ;.  if( 1 ){.   
c090: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
c0a0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
c0b0: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
c0c0: 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65  nExpr++];.    me
c0d0: 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20 73  mset(pItem, 0, s
c0e0: 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b 0a  izeof(*pItem));.
c0f0: 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72      pItem->pExpr
c100: 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d 0a 20 20   = pExpr;.  }.  
c110: 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e  return pList;..n
c120: 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a  o_mem:     .  /*
c130: 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d   Avoid leaking m
c140: 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20  emory if malloc 
c150: 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20  has failed. */. 
c160: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
c170: 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20  te(db, pExpr);. 
c180: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
c190: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
c1a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
c1b0: 0a 0a 2f 2a 0a 2a 2a 20 70 43 6f 6c 75 6d 6e 73  ../*.** pColumns
c1c0: 20 61 6e 64 20 70 45 78 70 72 20 66 6f 72 6d 20   and pExpr form 
c1d0: 61 20 76 65 63 74 6f 72 20 61 73 73 69 67 6e 6d  a vector assignm
c1e0: 65 6e 74 20 77 68 69 63 68 20 69 73 20 70 61 72  ent which is par
c1f0: 74 20 6f 66 20 74 68 65 20 53 45 54 0a 2a 2a 20  t of the SET.** 
c200: 63 6c 61 75 73 65 20 6f 66 20 61 6e 20 55 50 44  clause of an UPD
c210: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ATE statement.  
c220: 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  Like this:.**.**
c230: 20 20 20 20 20 20 20 20 28 61 2c 62 2c 63 29 20          (a,b,c) 
c240: 3d 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65  = (expr1,expr2,e
c250: 78 70 72 33 29 0a 2a 2a 20 4f 72 3a 20 20 20 20  xpr3).** Or:    
c260: 28 61 2c 62 2c 63 29 20 3d 20 28 53 45 4c 45 43  (a,b,c) = (SELEC
c270: 54 20 78 2c 79 2c 7a 20 46 52 4f 4d 20 2e 2e 2e  T x,y,z FROM ...
c280: 2e 29 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63  .).**.** For eac
c290: 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 76 65  h term of the ve
c2a0: 63 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e 74 2c  ctor assignment,
c2b0: 20 61 70 70 65 6e 64 20 6e 65 77 20 65 6e 74 72   append new entr
c2c0: 69 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 65 78  ies to the.** ex
c2d0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 4c  pression list pL
c2e0: 69 73 74 2e 20 20 49 6e 20 74 68 65 20 63 61 73  ist.  In the cas
c2f0: 65 20 6f 66 20 61 20 73 75 62 71 75 65 72 79 20  e of a subquery 
c300: 6f 6e 20 74 68 65 20 4c 48 53 2c 20 61 70 70 65  on the LHS, appe
c310: 6e 64 0a 2a 2a 20 54 4b 5f 53 45 4c 45 43 54 5f  nd.** TK_SELECT_
c320: 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73 69 6f  COLUMN expressio
c330: 6e 73 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20  ns..*/.ExprList 
c340: 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  *sqlite3ExprList
c350: 41 70 70 65 6e 64 56 65 63 74 6f 72 28 0a 20 20  AppendVector(.  
c360: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
c370: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
c380: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
c390: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
c3a0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f        /* List to
c3b0: 20 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64   which to append
c3c0: 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  . Might be NULL 
c3d0: 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 43 6f  */.  IdList *pCo
c3e0: 6c 75 6d 6e 73 2c 20 20 20 20 20 20 2f 2a 20 4c  lumns,      /* L
c3f0: 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 6f 66 20  ist of names of 
c400: 4c 48 53 20 6f 66 20 74 68 65 20 61 73 73 69 67  LHS of the assig
c410: 6e 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20  nment */.  Expr 
c420: 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20  *pExpr          
c430: 20 20 2f 2a 20 56 65 63 74 6f 72 20 65 78 70 72    /* Vector expr
c440: 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70  ession to be app
c450: 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20  ended. Might be 
c460: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  NULL */.){.  sql
c470: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
c480: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 3b 0a  e->db;.  int n;.
c490: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
c4a0: 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29 20 67 6f 74  Columns==0 ) got
c4b0: 6f 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f  o vector_append_
c4c0: 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 70 45 78  error;.  if( pEx
c4d0: 70 72 3d 3d 30 20 29 20 67 6f 74 6f 20 76 65 63  pr==0 ) goto vec
c4e0: 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72  tor_append_error
c4f0: 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 45  ;.  n = sqlite3E
c500: 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45  xprVectorSize(pE
c510: 78 70 72 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c  xpr);.  if( pCol
c520: 75 6d 6e 73 2d 3e 6e 49 64 21 3d 6e 20 29 7b 0a  umns->nId!=n ){.
c530: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
c540: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 64 20  Msg(pParse, "%d 
c550: 63 6f 6c 75 6d 6e 73 20 61 73 73 69 67 6e 65 64  columns assigned
c560: 20 25 64 20 76 61 6c 75 65 73 22 2c 0a 20 20 20   %d values",.   
c570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c580: 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 2c 20   pColumns->nId, 
c590: 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 76 65 63  n);.    goto vec
c5a0: 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72  tor_append_error
c5b0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
c5c0: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
c5d0: 45 78 70 72 20 2a 70 53 75 62 45 78 70 72 20 3d  Expr *pSubExpr =
c5e0: 20 73 71 6c 69 74 65 33 45 78 70 72 46 6f 72 56   sqlite3ExprForV
c5f0: 65 63 74 6f 72 46 69 65 6c 64 28 70 50 61 72 73  ectorField(pPars
c600: 65 2c 20 70 45 78 70 72 2c 20 69 29 3b 0a 20 20  e, pExpr, i);.  
c610: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
c620: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
c630: 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70  pParse, pList, p
c640: 53 75 62 45 78 70 72 29 3b 0a 20 20 20 20 69 66  SubExpr);.    if
c650: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
c660: 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d   pList->a[pList-
c670: 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20  >nExpr-1].zName 
c680: 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d  = pColumns->a[i]
c690: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 70 43  .zName;.      pC
c6a0: 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61  olumns->a[i].zNa
c6b0: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  me = 0;.    }.  
c6c0: 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  }.  if( pExpr->o
c6d0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
c6e0: 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 26 26      if( pList &&
c6f0: 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78   pList->a[0].pEx
c700: 70 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  pr ){.      asse
c710: 72 74 28 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  rt( pList->a[0].
c720: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
c730: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  LECT_COLUMN );. 
c740: 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d       pList->a[0]
c750: 2e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d  .pExpr->pRight =
c760: 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 45   pExpr;.      pE
c770: 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  xpr = 0;.    }. 
c780: 20 7d 0a 0a 76 65 63 74 6f 72 5f 61 70 70 65 6e   }..vector_appen
c790: 64 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74  d_error:.  sqlit
c7a0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
c7b0: 20 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74   pExpr);.  sqlit
c7c0: 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
c7d0: 62 2c 20 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20  b, pColumns);.  
c7e0: 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
c7f0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73  ./*.** Set the s
c800: 6f 72 74 20 6f 72 64 65 72 20 66 6f 72 20 74 68  ort order for th
c810: 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f  e last element o
c820: 6e 20 74 68 65 20 67 69 76 65 6e 20 45 78 70 72  n the given Expr
c830: 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  List..*/.void sq
c840: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
c850: 53 6f 72 74 4f 72 64 65 72 28 45 78 70 72 4c 69  SortOrder(ExprLi
c860: 73 74 20 2a 70 2c 20 69 6e 74 20 69 53 6f 72 74  st *p, int iSort
c870: 4f 72 64 65 72 29 7b 0a 20 20 69 66 28 20 70 3d  Order){.  if( p=
c880: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  =0 ) return;.  a
c890: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 53 4f  ssert( SQLITE_SO
c8a0: 5f 55 4e 44 45 46 49 4e 45 44 3c 30 20 26 26 20  _UNDEFINED<0 && 
c8b0: 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3e 3d 30  SQLITE_SO_ASC>=0
c8c0: 20 26 26 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45   && SQLITE_SO_DE
c8d0: 53 43 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  SC>0 );.  assert
c8e0: 28 20 70 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ( p->nExpr>0 );.
c8f0: 20 20 69 66 28 20 69 53 6f 72 74 4f 72 64 65 72    if( iSortOrder
c900: 3c 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  <0 ){.    assert
c910: 28 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d  ( p->a[p->nExpr-
c920: 31 5d 2e 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51  1].sortOrder==SQ
c930: 4c 49 54 45 5f 53 4f 5f 41 53 43 20 29 3b 0a 20  LITE_SO_ASC );. 
c940: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
c950: 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31   p->a[p->nExpr-1
c960: 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  ].sortOrder = (u
c970: 38 29 69 53 6f 72 74 4f 72 64 65 72 3b 0a 7d 0a  8)iSortOrder;.}.
c980: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45  ./*.** Set the E
c990: 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d  xprList.a[].zNam
c9a0: 65 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  e element of the
c9b0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
c9c0: 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20  dded item.** on 
c9d0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
c9e0: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74  ist..**.** pList
c9f0: 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66   might be NULL f
ca00: 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20  ollowing an OOM 
ca10: 65 72 72 6f 72 2e 20 20 42 75 74 20 70 4e 61 6d  error.  But pNam
ca20: 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  e should never b
ca30: 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61  e.** NULL.  If a
ca40: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
ca50: 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50  on fails, the pP
ca60: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
ca70: 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69  Failed flag.** i
ca80: 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  s set..*/.void s
ca90: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
caa0: 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a  tName(.  Parse *
cab0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
cac0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
cad0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
cae0: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
caf0: 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63   /* List to whic
cb00: 68 20 74 6f 20 61 64 64 20 74 68 65 20 73 70 61  h to add the spa
cb10: 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  n. */.  Token *p
cb20: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Name,           
cb30: 2f 2a 20 4e 61 6d 65 20 74 6f 20 62 65 20 61 64  /* Name to be ad
cb40: 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71  ded */.  int deq
cb50: 75 6f 74 65 20 20 20 20 20 20 20 20 20 20 20 20  uote            
cb60: 20 2f 2a 20 54 72 75 65 20 74 6f 20 63 61 75 73   /* True to caus
cb70: 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 20 62 65  e the name to be
cb80: 20 64 65 71 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a   dequoted */.){.
cb90: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
cba0: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  =0 || pParse->db
cbb0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d  ->mallocFailed!=
cbc0: 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  0 );.  if( pList
cbd0: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
cbe0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
cbf0: 74 65 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  tem;.    assert(
cc00: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20   pList->nExpr>0 
cc10: 29 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d 20 26  );.    pItem = &
cc20: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
cc30: 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73  nExpr-1];.    as
cc40: 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61  sert( pItem->zNa
cc50: 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74  me==0 );.    pIt
cc60: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
cc70: 74 65 33 44 62 53 74 72 4e 44 75 70 28 70 50 61  te3DbStrNDup(pPa
cc80: 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e  rse->db, pName->
cc90: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
cca0: 20 20 69 66 28 20 64 65 71 75 6f 74 65 20 29 20    if( dequote ) 
ccb0: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70  sqlite3Dequote(p
ccc0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
ccd0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
cce0: 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e  he ExprList.a[].
ccf0: 7a 53 70 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66  zSpan element of
cd00: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
cd10: 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a  ly added item.**
cd20: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
cd30: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70  on list..**.** p
cd40: 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55  List might be NU
cd50: 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20  LL following an 
cd60: 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20  OOM error.  But 
cd70: 70 53 70 61 6e 20 73 68 6f 75 6c 64 20 6e 65 76  pSpan should nev
cd80: 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20  er be.** NULL.  
cd90: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
cda0: 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68  cation fails, th
cdb0: 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  e pParse->db->ma
cdc0: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a  llocFailed flag.
cdd0: 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f  ** is set..*/.vo
cde0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
cdf0: 73 74 53 65 74 53 70 61 6e 28 0a 20 20 50 61 72  stSetSpan(.  Par
ce00: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
ce10: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
ce20: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
ce30: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
ce40: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
ce50: 77 68 69 63 68 20 74 6f 20 61 64 64 20 74 68 65  which to add the
ce60: 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 45 78 70 72   span. */.  Expr
ce70: 53 70 61 6e 20 2a 70 53 70 61 6e 20 20 20 20 20  Span *pSpan     
ce80: 20 20 20 20 2f 2a 20 54 68 65 20 73 70 61 6e 20      /* The span 
ce90: 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 29  to be added */.)
cea0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
ceb0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
cec0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
ced0: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
cee0: 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28  iled!=0 );.  if(
cef0: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74   pList ){.    st
cf00: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
cf10: 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69  em *pItem = &pLi
cf20: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78  st->a[pList->nEx
cf30: 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72  pr-1];.    asser
cf40: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  t( pList->nExpr>
cf50: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
cf60: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
cf70: 64 20 7c 7c 20 70 49 74 65 6d 2d 3e 70 45 78 70  d || pItem->pExp
cf80: 72 3d 3d 70 53 70 61 6e 2d 3e 70 45 78 70 72 20  r==pSpan->pExpr 
cf90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
cfa0: 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
cfb0: 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65  zSpan);.    pIte
cfc0: 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74  m->zSpan = sqlit
cfd0: 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
cfe0: 28 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53  (char*)pSpan->zS
cff0: 74 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20  tart,.          
d000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d010: 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28            (int)(
d020: 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53  pSpan->zEnd - pS
d030: 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20  pan->zStart));. 
d040: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74   }.}../*.** If t
d050: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
d060: 73 74 20 70 45 4c 69 73 74 20 63 6f 6e 74 61 69  st pEList contai
d070: 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69  ns more than iLi
d080: 6d 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a  mit elements,.**
d090: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
d0a0: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
d0b0: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
d0c0: 65 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c  e3ExprListCheckL
d0d0: 65 6e 67 74 68 28 0a 20 20 50 61 72 73 65 20 2a  ength(.  Parse *
d0e0: 70 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69  pParse,.  ExprLi
d0f0: 73 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f  st *pEList,.  co
d100: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63  nst char *zObjec
d110: 74 0a 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20  t.){.  int mx = 
d120: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d  pParse->db->aLim
d130: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
d140: 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63  COLUMN];.  testc
d150: 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70  ase( pEList && p
d160: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78  EList->nExpr==mx
d170: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
d180: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
d190: 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b  ->nExpr==mx+1 );
d1a0: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26  .  if( pEList &&
d1b0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d   pEList->nExpr>m
d1c0: 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  x ){.    sqlite3
d1d0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
d1e0: 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d   "too many colum
d1f0: 6e 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65  ns in %s", zObje
d200: 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ct);.  }.}../*.*
d210: 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
d220: 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  re expression li
d230: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  st..*/.static SQ
d240: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f  LITE_NOINLINE vo
d250: 69 64 20 65 78 70 72 4c 69 73 74 44 65 6c 65 74  id exprListDelet
d260: 65 4e 4e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  eNN(sqlite3 *db,
d270: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
d280: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
d290: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
d2a0: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73  em *pItem;.  ass
d2b0: 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30  ert( pList->a!=0
d2c0: 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72   || pList->nExpr
d2d0: 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70 49 74  ==0 );.  for(pIt
d2e0: 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
d2f0: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
d300: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
d310: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
d320: 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d  Delete(db, pItem
d330: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71  ->pExpr);.    sq
d340: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
d350: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
d360: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
d370: 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61  (db, pItem->zSpa
d380: 6e 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  n);.  }.  sqlite
d390: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
d3a0: 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  t->a);.  sqlite3
d3b0: 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
d3c0: 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  );.}.void sqlite
d3d0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
d3e0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
d3f0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
d400: 20 69 66 28 20 70 4c 69 73 74 20 29 20 65 78 70   if( pList ) exp
d410: 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28 64 62  rListDeleteNN(db
d420: 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  , pList);.}../*.
d430: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62 69  ** Return the bi
d440: 74 77 69 73 65 2d 4f 52 20 6f 66 20 61 6c 6c 20  twise-OR of all 
d450: 45 78 70 72 2e 66 6c 61 67 73 20 66 69 65 6c 64  Expr.flags field
d460: 73 20 69 6e 20 74 68 65 20 67 69 76 65 6e 0a 2a  s in the given.*
d470: 2a 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 75  * ExprList..*/.u
d480: 33 32 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  32 sqlite3ExprLi
d490: 73 74 46 6c 61 67 73 28 63 6f 6e 73 74 20 45 78  stFlags(const Ex
d4a0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
d4b0: 20 20 69 6e 74 20 69 3b 0a 20 20 75 33 32 20 6d    int i;.  u32 m
d4c0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73   = 0;.  if( pLis
d4d0: 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t ){.    for(i=0
d4e0: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
d4f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 45  ; i++){.       E
d500: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69  xpr *pExpr = pLi
d510: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
d520: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
d530: 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
d540: 20 20 6d 20 7c 3d 20 70 45 78 70 72 2d 3e 66 6c    m |= pExpr->fl
d550: 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ags;.    }.  }. 
d560: 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a   return m;.}../*
d570: 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
d580: 65 73 20 61 72 65 20 57 61 6c 6b 65 72 20 63 61  es are Walker ca
d590: 6c 6c 62 61 63 6b 73 20 75 73 65 64 20 74 6f 20  llbacks used to 
d5a0: 63 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e  check expression
d5b0: 73 20 74 6f 0a 2a 2a 20 73 65 65 20 69 66 20 74  s to.** see if t
d5c0: 68 65 79 20 61 72 65 20 22 63 6f 6e 73 74 61 6e  hey are "constan
d5d0: 74 22 20 66 6f 72 20 73 6f 6d 65 20 64 65 66 69  t" for some defi
d5e0: 6e 69 74 69 6f 6e 20 6f 66 20 63 6f 6e 73 74 61  nition of consta
d5f0: 6e 74 2e 20 20 54 68 65 0a 2a 2a 20 57 61 6c 6b  nt.  The.** Walk
d600: 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 64  er.eCode value d
d610: 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 74 79  etermines the ty
d620: 70 65 20 6f 66 20 22 63 6f 6e 73 74 61 6e 74 22  pe of "constant"
d630: 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 0a   we are looking.
d640: 2a 2a 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ** for..**.** Th
d650: 65 73 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  ese callback rou
d660: 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
d670: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
d680: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
d690: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
d6a0: 49 73 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20  IsConstant()    
d6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57                pW
d6c0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 31 0a  alker->eCode==1.
d6d0: 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  **     sqlite3Ex
d6e0: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a  prIsConstantNotJ
d6f0: 6f 69 6e 28 29 20 20 20 20 20 20 20 20 20 20 20  oin()           
d700: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
d710: 32 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  2.**     sqlite3
d720: 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74  ExprIsTableConst
d730: 61 6e 74 28 29 20 20 20 20 20 20 20 20 20 20 20  ant()           
d740: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
d750: 3d 3d 33 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  ==3.**     sqlit
d760: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
d770: 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20 20 20 20  OrFunction()    
d780: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
d790: 64 65 3d 3d 34 20 6f 72 20 35 0a 2a 2a 0a 2a 2a  de==4 or 5.**.**
d7a0: 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 20 74   In all cases, t
d7b0: 68 65 20 63 61 6c 6c 62 61 63 6b 73 20 73 65 74  he callbacks set
d7c0: 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 3d 30 20   Walker.eCode=0 
d7d0: 61 6e 64 20 61 62 6f 72 74 20 69 66 20 74 68 65  and abort if the
d7e0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
d7f0: 73 20 66 6f 75 6e 64 20 74 6f 20 6e 6f 74 20 62  s found to not b
d800: 65 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a  e a constant..**
d810: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 45  .** The sqlite3E
d820: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46  xprIsConstantOrF
d830: 75 6e 63 74 69 6f 6e 28 29 20 69 73 20 75 73 65  unction() is use
d840: 64 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67  d for evaluating
d850: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
d860: 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  in a CREATE TABL
d870: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  E statement.  Th
d880: 65 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76  e Walker.eCode v
d890: 61 6c 75 65 20 69 73 20 35 20 77 68 65 6e 20 70  alue is 5 when p
d8a0: 61 72 73 69 6e 67 0a 2a 2a 20 61 6e 20 65 78 69  arsing.** an exi
d8b0: 73 74 69 6e 67 20 73 63 68 65 6d 61 20 61 6e 64  sting schema and
d8c0: 20 34 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69   4 when processi
d8d0: 6e 67 20 61 20 6e 65 77 20 73 74 61 74 65 6d 65  ng a new stateme
d8e0: 6e 74 2e 20 20 41 20 62 6f 75 6e 64 0a 2a 2a 20  nt.  A bound.** 
d8f0: 70 61 72 61 6d 65 74 65 72 20 72 61 69 73 65 73  parameter raises
d900: 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 6e 65   an error for ne
d910: 77 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 62 75  w statements, bu
d920: 74 20 69 73 20 73 69 6c 65 6e 74 6c 79 20 63 6f  t is silently co
d930: 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 4e 55  nverted.** to NU
d940: 4c 4c 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20  LL for existing 
d950: 73 63 68 65 6d 61 73 2e 20 20 54 68 69 73 20 61  schemas.  This a
d960: 6c 6c 6f 77 73 20 73 71 6c 69 74 65 5f 6d 61 73  llows sqlite_mas
d970: 74 65 72 20 74 61 62 6c 65 73 20 74 68 61 74 20  ter tables that 
d980: 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62 6f  .** contain a bo
d990: 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20 62 65  und parameter be
d9a0: 63 61 75 73 65 20 74 68 65 79 20 77 65 72 65 20  cause they were 
d9b0: 67 65 6e 65 72 61 74 65 64 20 62 79 20 6f 6c 64  generated by old
d9c0: 65 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f  er versions.** o
d9d0: 66 20 53 51 4c 69 74 65 20 74 6f 20 62 65 20 70  f SQLite to be p
d9e0: 61 72 73 65 64 20 62 79 20 6e 65 77 65 72 20 76  arsed by newer v
d9f0: 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
da00: 65 20 77 69 74 68 6f 75 74 20 72 61 69 73 69 6e  e without raisin
da10: 67 20 61 0a 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64  g a.** malformed
da20: 20 73 63 68 65 6d 61 20 65 72 72 6f 72 2e 0a 2a   schema error..*
da30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
da40: 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28  rNodeIsConstant(
da50: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
da60: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 0a   Expr *pExpr){..
da70: 20 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65 72 2d    /* If pWalker-
da80: 3e 65 43 6f 64 65 20 69 73 20 32 20 74 68 65 6e  >eCode is 2 then
da90: 20 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68 65   any term of the
daa0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
dab0: 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a   comes from.  **
dac0: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
dad0: 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6c 65   clauses of a le
dae0: 66 74 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69  ft join disquali
daf0: 66 69 65 73 20 74 68 65 20 65 78 70 72 65 73 73  fies the express
db00: 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65  ion.  ** from be
db10: 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 63  ing considered c
db20: 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66  onstant. */.  if
db30: 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  ( pWalker->eCode
db40: 3d 3d 32 20 26 26 20 45 78 70 72 48 61 73 50 72  ==2 && ExprHasPr
db50: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
db60: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20  _FromJoin) ){.  
db70: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
db80: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
db90: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
dba0: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
dbb0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43  ->op ){.    /* C
dbc0: 6f 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e  onsider function
dbd0: 73 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74  s to be constant
dbe0: 20 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72   if all their ar
dbf0: 67 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73  guments are cons
dc00: 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20  tant.    ** and 
dc10: 65 69 74 68 65 72 20 70 57 61 6c 6b 65 72 2d 3e  either pWalker->
dc20: 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35 20 6f 72  eCode==4 or 5 or
dc30: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 68 61   the function ha
dc40: 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c  s the.    ** SQL
dc50: 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 20 66  ITE_FUNC_CONST f
dc60: 6c 61 67 2e 20 2a 2f 0a 20 20 20 20 63 61 73 65  lag. */.    case
dc70: 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20   TK_FUNCTION:.  
dc80: 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d      if( pWalker-
dc90: 3e 65 43 6f 64 65 3e 3d 34 20 7c 7c 20 45 78 70  >eCode>=4 || Exp
dca0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
dcb0: 70 72 2c 45 50 5f 43 6f 6e 73 74 46 75 6e 63 29  pr,EP_ConstFunc)
dcc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
dcd0: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
dce0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
dcf0: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
dd00: 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Code = 0;.      
dd10: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
dd20: 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rt;.      }.    
dd30: 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20  case TK_ID:.    
dd40: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a  case TK_COLUMN:.
dd50: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
dd60: 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61  FUNCTION:.    ca
dd70: 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
dd80: 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
dd90: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
dda0: 49 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ID );.      test
ddb0: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
ddc0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
ddd0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
dde0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
ddf0: 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20  FUNCTION );.    
de00: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
de10: 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
de20: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 69 66  LUMN );.      if
de30: 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  ( pWalker->eCode
de40: 3d 3d 33 20 26 26 20 70 45 78 70 72 2d 3e 69 54  ==3 && pExpr->iT
de50: 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75  able==pWalker->u
de60: 2e 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20  .iCur ){.       
de70: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
de80: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  inue;.      }els
de90: 65 7b 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b  e{.        pWalk
dea0: 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20  er->eCode = 0;. 
deb0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
dec0: 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  C_Abort;.      }
ded0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52  .    case TK_VAR
dee0: 49 41 42 4c 45 3a 0a 20 20 20 20 20 20 69 66 28  IABLE:.      if(
def0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
df00: 3d 35 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =5 ){.        /*
df10: 20 53 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72   Silently conver
df20: 74 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65  t bound paramete
df30: 72 73 20 74 68 61 74 20 61 70 70 65 61 72 20 69  rs that appear i
df40: 6e 73 69 64 65 20 6f 66 20 43 52 45 41 54 45 0a  nside of CREATE.
df50: 20 20 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65          ** state
df60: 6d 65 6e 74 73 20 69 6e 74 6f 20 61 20 4e 55 4c  ments into a NUL
df70: 4c 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 74  L when parsing t
df80: 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d  he CREATE statem
df90: 65 6e 74 20 74 65 78 74 20 6f 75 74 0a 20 20 20  ent text out.   
dfa0: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73       ** of the s
dfb0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
dfc0: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45  le */.        pE
dfd0: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c  xpr->op = TK_NUL
dfe0: 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  L;.      }else i
dff0: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  f( pWalker->eCod
e000: 65 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20  e==4 ){.        
e010: 2f 2a 20 41 20 62 6f 75 6e 64 20 70 61 72 61 6d  /* A bound param
e020: 65 74 65 72 20 69 6e 20 61 20 43 52 45 41 54 45  eter in a CREATE
e030: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
e040: 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 0a  originates from.
e050: 20 20 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74          ** sqlit
e060: 65 33 5f 70 72 65 70 61 72 65 28 29 20 63 61 75  e3_prepare() cau
e070: 73 65 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a  ses an error */.
e080: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
e090: 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  >eCode = 0;.    
e0a0: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
e0b0: 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bort;.      }.  
e0c0: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f      /* Fall thro
e0d0: 75 67 68 20 2a 2f 0a 20 20 20 20 64 65 66 61 75  ugh */.    defau
e0e0: 6c 74 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61  lt:.      testca
e0f0: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
e100: 4b 5f 53 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73  K_SELECT ); /* s
e110: 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74  electNodeIsConst
e120: 61 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f  ant will disallo
e130: 77 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  w */.      testc
e140: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
e150: 54 4b 5f 45 58 49 53 54 53 20 29 3b 20 2f 2a 20  TK_EXISTS ); /* 
e160: 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73  selectNodeIsCons
e170: 74 61 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c  tant will disall
e180: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  ow */.      retu
e190: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
e1a0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e  .  }.}.static in
e1b0: 74 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f  t selectNodeIsCo
e1c0: 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70  nstant(Walker *p
e1d0: 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
e1e0: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53  NotUsed){.  UNUS
e1f0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
e200: 55 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72  Used);.  pWalker
e210: 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 72  ->eCode = 0;.  r
e220: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
e230: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  .}.static int ex
e240: 70 72 49 73 43 6f 6e 73 74 28 45 78 70 72 20 2a  prIsConst(Expr *
e250: 70 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 2c  p, int initFlag,
e260: 20 69 6e 74 20 69 43 75 72 29 7b 0a 20 20 57 61   int iCur){.  Wa
e270: 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74  lker w;.  memset
e280: 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  (&w, 0, sizeof(w
e290: 29 29 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20  ));.  w.eCode = 
e2a0: 69 6e 69 74 46 6c 61 67 3b 0a 20 20 77 2e 78 45  initFlag;.  w.xE
e2b0: 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78  xprCallback = ex
e2c0: 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  prNodeIsConstant
e2d0: 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
e2e0: 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f  lback = selectNo
e2f0: 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20  deIsConstant;.  
e300: 77 2e 75 2e 69 43 75 72 20 3d 20 69 43 75 72 3b  w.u.iCur = iCur;
e310: 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
e320: 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74  pr(&w, p);.  ret
e330: 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a  urn w.eCode;.}..
e340: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
e350: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
e360: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
e370: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
e380: 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  n is constant.**
e390: 20 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76   and 0 if it inv
e3a0: 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20  olves variables 
e3b0: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  or function call
e3c0: 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  s..**.** For the
e3d0: 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
e3e0: 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f  s function, a do
e3f0: 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  uble-quoted stri
e400: 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a  ng (ex: "abc").*
e410: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
e420: 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61  a variable but a
e430: 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73   single-quoted s
e440: 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27  tring (ex: 'abc'
e450: 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61  ) is.** a consta
e460: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
e470: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
e480: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74  (Expr *p){.  ret
e490: 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28  urn exprIsConst(
e4a0: 70 2c 20 31 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  p, 1, 0);.}../*.
e4b0: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
e4c0: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
e4d0: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  urn non-zero if 
e4e0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
e4f0: 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68  s constant.** th
e500: 61 74 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69  at does no origi
e510: 6e 61 74 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e  nate from the ON
e520: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
e530: 73 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20  s of a join..** 
e540: 52 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69  Return 0 if it i
e550: 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65  nvolves variable
e560: 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61  s or function ca
e570: 6c 6c 73 20 6f 72 20 74 65 72 6d 73 20 66 72 6f  lls or terms fro
e580: 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53  m.** an ON or US
e590: 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69  ING clause..*/.i
e5a0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
e5b0: 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
e5c0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
e5d0: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
e5e0: 2c 20 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , 2, 0);.}../*.*
e5f0: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
e600: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
e610: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  rn non-zero if t
e620: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
e630: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72   constant.** for
e640: 20 61 6e 79 20 73 69 6e 67 6c 65 20 72 6f 77 20   any single row 
e650: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  of the table wit
e660: 68 20 63 75 72 73 6f 72 20 69 43 75 72 2e 20 20  h cursor iCur.  
e670: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
e680: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
e690: 6e 20 6d 75 73 74 20 6e 6f 74 20 72 65 66 65 72  n must not refer
e6a0: 20 74 6f 20 61 6e 79 20 6e 6f 6e 2d 64 65 74 65   to any non-dete
e6b0: 72 6d 69 6e 69 73 74 69 63 20 66 75 6e 63 74 69  rministic functi
e6c0: 6f 6e 20 6e 6f 72 20 61 6e 79 0a 2a 2a 20 74 61  on nor any.** ta
e6d0: 62 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 69  ble other than i
e6e0: 43 75 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Cur..*/.int sqli
e6f0: 74 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f  te3ExprIsTableCo
e700: 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 2c 20  nstant(Expr *p, 
e710: 69 6e 74 20 69 43 75 72 29 7b 0a 20 20 72 65 74  int iCur){.  ret
e720: 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28  urn exprIsConst(
e730: 70 2c 20 33 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a  p, 3, iCur);.}..
e740: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
e750: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
e760: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
e770: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
e780: 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  n is constant.**
e790: 20 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 63   or a function c
e7a0: 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74 61 6e  all with constan
e7b0: 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65  t arguments.  Re
e7c0: 74 75 72 6e 20 61 6e 64 20 30 20 69 66 20 74 68  turn and 0 if th
e7d0: 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76  ere.** are any v
e7e0: 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ariables..**.** 
e7f0: 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
e800: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
e810: 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74  n, a double-quot
e820: 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22  ed string (ex: "
e830: 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73  abc").** is cons
e840: 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c  idered a variabl
e850: 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71  e but a single-q
e860: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
e870: 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61  : 'abc') is.** a
e880: 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e   constant..*/.in
e890: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
e8a0: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
e8b0: 6e 28 45 78 70 72 20 2a 70 2c 20 75 38 20 69 73  n(Expr *p, u8 is
e8c0: 49 6e 69 74 29 7b 0a 20 20 61 73 73 65 72 74 28  Init){.  assert(
e8d0: 20 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 69 73   isInit==0 || is
e8e0: 49 6e 69 74 3d 3d 31 20 29 3b 0a 20 20 72 65 74  Init==1 );.  ret
e8f0: 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28  urn exprIsConst(
e900: 70 2c 20 34 2b 69 73 49 6e 69 74 2c 20 30 29 3b  p, 4+isInit, 0);
e910: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
e920: 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f  E_ENABLE_CURSOR_
e930: 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  HINTS./*.** Walk
e940: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
e950: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69  ree.  Return 1 i
e960: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
e970: 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 73   contains a.** s
e980: 75 62 71 75 65 72 79 20 6f 66 20 73 6f 6d 65 20  ubquery of some 
e990: 6b 69 6e 64 2e 20 20 52 65 74 75 72 6e 20 30 20  kind.  Return 0 
e9a0: 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  if there are no 
e9b0: 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 69  subqueries..*/.i
e9c0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
e9d0: 6e 74 61 69 6e 73 53 75 62 71 75 65 72 79 28 45  ntainsSubquery(E
e9e0: 78 70 72 20 2a 70 29 7b 0a 20 20 57 61 6c 6b 65  xpr *p){.  Walke
e9f0: 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77  r w;.  memset(&w
ea00: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b  , 0, sizeof(w));
ea10: 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 31 3b 0a  .  w.eCode = 1;.
ea20: 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
ea30: 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57  k = sqlite3ExprW
ea40: 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 78 53 65  alkNoop;.  w.xSe
ea50: 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73  lectCallback = s
ea60: 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74  electNodeIsConst
ea70: 61 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  ant;.  sqlite3Wa
ea80: 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20  lkExpr(&w, p);. 
ea90: 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3d   return w.eCode=
eaa0: 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  =0;.}.#endif../*
eab0: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
eac0: 73 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20  ssion p codes a 
ead0: 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72  constant integer
eae0: 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65   that is small e
eaf0: 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20  nough.** to fit 
eb00: 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  in a 32-bit inte
eb10: 67 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e  ger, return 1 an
eb20: 64 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20  d put the value 
eb30: 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  of the integer.*
eb40: 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49  * in *pValue.  I
eb50: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
eb60: 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67   is not an integ
eb70: 65 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74  er or if it is t
eb80: 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74  oo big.** to fit
eb90: 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d   in a signed 32-
eba0: 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74  bit integer, ret
ebb0: 75 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20  urn 0 and leave 
ebc0: 2a 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65  *pValue unchange
ebd0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
ebe0: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45  3ExprIsInteger(E
ebf0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61  xpr *p, int *pVa
ec00: 6c 75 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  lue){.  int rc =
ec10: 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20   0;..  /* If an 
ec20: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e  expression is an
ec30: 20 69 6e 74 65 67 65 72 20 6c 69 74 65 72 61 6c   integer literal
ec40: 20 74 68 61 74 20 66 69 74 73 20 69 6e 20 61 20   that fits in a 
ec50: 73 69 67 6e 65 64 20 33 32 2d 62 69 74 0a 20 20  signed 32-bit.  
ec60: 2a 2a 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e  ** integer, then
ec70: 20 74 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65   the EP_IntValue
ec80: 20 66 6c 61 67 20 77 69 6c 6c 20 68 61 76 65 20   flag will have 
ec90: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 74  already been set
eca0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
ecb0: 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20  >op!=TK_INTEGER 
ecc0: 7c 7c 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45  || (p->flags & E
ecd0: 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 0a 20  P_IntValue)!=0. 
ece0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
ecf0: 69 74 65 33 47 65 74 49 6e 74 33 32 28 70 2d 3e  ite3GetInt32(p->
ed00: 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d  u.zToken, &rc)==
ed10: 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 66  0 );..  if( p->f
ed20: 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c  lags & EP_IntVal
ed30: 75 65 20 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75  ue ){.    *pValu
ed40: 65 20 3d 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b  e = p->u.iValue;
ed50: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
ed60: 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e   }.  switch( p->
ed70: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
ed80: 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20  K_UPLUS: {.     
ed90: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70   rc = sqlite3Exp
eda0: 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
edb0: 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20  eft, pValue);.  
edc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
edd0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
ede0: 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  NUS: {.      int
edf0: 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71   v;.      if( sq
ee00: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
ee10: 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29  er(p->pLeft, &v)
ee20: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
ee30: 72 74 28 20 76 21 3d 28 2d 32 31 34 37 34 38 33  rt( v!=(-2147483
ee40: 36 34 37 2d 31 29 20 29 3b 0a 20 20 20 20 20 20  647-1) );.      
ee50: 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a    *pValue = -v;.
ee60: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
ee70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
ee80: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
ee90: 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20  efault: break;. 
eea0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
eeb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
eec0: 46 41 4c 53 45 20 69 66 20 74 68 65 72 65 20 69  FALSE if there i
eed0: 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74  s no chance that
eee0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
eef0: 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a  can be NULL..**.
ef00: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
ef10: 73 69 6f 6e 20 6d 69 67 68 74 20 62 65 20 4e 55  sion might be NU
ef20: 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 65 78 70  LL or if the exp
ef30: 72 65 73 73 69 6f 6e 20 69 73 20 74 6f 6f 20 63  ression is too c
ef40: 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f 20 74 65 6c  omplex.** to tel
ef50: 6c 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20  l return TRUE.  
ef60: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
ef70: 69 6e 65 20 69 73 20 75 73 65 64 20 61 73 20 61  ine is used as a
ef80: 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20  n optimization, 
ef90: 74 6f 20 73 6b 69 70 20 4f 50 5f 49 73 4e 75 6c  to skip OP_IsNul
efa0: 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 77 68 65  l opcodes.** whe
efb0: 6e 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61  n we know that a
efc0: 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65   value cannot be
efd0: 20 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 61   NULL.  Hence, a
efe0: 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 0a   false positive.
eff0: 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 54 52  ** (returning TR
f000: 55 45 20 77 68 65 6e 20 69 6e 20 66 61 63 74 20  UE when in fact 
f010: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63  the expression c
f020: 61 6e 20 6e 65 76 65 72 20 62 65 20 4e 55 4c 4c  an never be NULL
f030: 29 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61 20  ) might.** be a 
f040: 73 6d 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e 63  small performanc
f050: 65 20 68 69 74 20 62 75 74 20 69 73 20 6f 74 68  e hit but is oth
f060: 65 72 77 69 73 65 20 68 61 72 6d 6c 65 73 73 2e  erwise harmless.
f070: 20 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a    On the other.*
f080: 2a 20 68 61 6e 64 2c 20 61 20 66 61 6c 73 65 20  * hand, a false 
f090: 6e 65 67 61 74 69 76 65 20 28 72 65 74 75 72 6e  negative (return
f0a0: 69 6e 67 20 46 41 4c 53 45 20 77 68 65 6e 20 74  ing FALSE when t
f0b0: 68 65 20 72 65 73 75 6c 74 20 63 6f 75 6c 64 20  he result could 
f0c0: 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c  be NULL).** will
f0d0: 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69   likely result i
f0e0: 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 61  n an incorrect a
f0f0: 6e 73 77 65 72 2e 20 20 53 6f 20 77 68 65 6e 20  nswer.  So when 
f100: 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e  in doubt, return
f110: 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74  .** TRUE..*/.int
f120: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42   sqlite3ExprCanB
f130: 65 4e 75 6c 6c 28 63 6f 6e 73 74 20 45 78 70 72  eNull(const Expr
f140: 20 2a 70 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20   *p){.  u8 op;. 
f150: 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54   while( p->op==T
f160: 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70  K_UPLUS || p->op
f170: 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70  ==TK_UMINUS ){ p
f180: 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20   = p->pLeft; }. 
f190: 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69   op = p->op;.  i
f1a0: 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  f( op==TK_REGIST
f1b0: 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32  ER ) op = p->op2
f1c0: 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
f1d0: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  {.    case TK_IN
f1e0: 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20  TEGER:.    case 
f1f0: 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 63  TK_STRING:.    c
f200: 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20  ase TK_FLOAT:.  
f210: 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a    case TK_BLOB:.
f220: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
f230: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
f240: 4d 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  MN:.      assert
f250: 28 20 70 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a  ( p->pTab!=0 );.
f260: 20 20 20 20 20 20 72 65 74 75 72 6e 20 45 78 70        return Exp
f270: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
f280: 45 50 5f 43 61 6e 42 65 4e 75 6c 6c 29 20 7c 7c  EP_CanBeNull) ||
f290: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70  .             (p
f2a0: 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20  ->iColumn>=0 && 
f2b0: 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d  p->pTab->aCol[p-
f2c0: 3e 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c  >iColumn].notNul
f2d0: 6c 3d 3d 30 29 3b 0a 20 20 20 20 64 65 66 61 75  l==0);.    defau
f2e0: 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  lt:.      return
f2f0: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
f300: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
f310: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
f320: 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61  sion is a consta
f330: 6e 74 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62  nt which would b
f340: 65 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 62  e.** unchanged b
f350: 79 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 77 69  y OP_Affinity wi
f360: 74 68 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  th the affinity 
f370: 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63  given in the sec
f380: 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  ond.** argument.
f390: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
f3a0: 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  ine is used to d
f3b0: 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
f3c0: 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 65 72  OP_Affinity oper
f3d0: 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20  ation.** can be 
f3e0: 6f 6d 69 74 74 65 64 2e 20 20 57 68 65 6e 20 69  omitted.  When i
f3f0: 6e 20 64 6f 75 62 74 20 72 65 74 75 72 6e 20 46  n doubt return F
f400: 41 4c 53 45 2e 20 20 41 20 66 61 6c 73 65 20 6e  ALSE.  A false n
f410: 65 67 61 74 69 76 65 0a 2a 2a 20 69 73 20 68 61  egative.** is ha
f420: 72 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c 73 65  rmless.  A false
f430: 20 70 6f 73 69 74 69 76 65 2c 20 68 6f 77 65 76   positive, howev
f440: 65 72 2c 20 63 61 6e 20 72 65 73 75 6c 74 20 69  er, can result i
f450: 6e 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61  n the wrong.** a
f460: 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  nswer..*/.int sq
f470: 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f  lite3ExprNeedsNo
f480: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 63  AffinityChange(c
f490: 6f 6e 73 74 20 45 78 70 72 20 2a 70 2c 20 63 68  onst Expr *p, ch
f4a0: 61 72 20 61 66 66 29 7b 0a 20 20 75 38 20 6f 70  ar aff){.  u8 op
f4b0: 3b 0a 20 20 69 66 28 20 61 66 66 3d 3d 53 51 4c  ;.  if( aff==SQL
f4c0: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 20 72  ITE_AFF_BLOB ) r
f4d0: 65 74 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65  eturn 1;.  while
f4e0: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55  ( p->op==TK_UPLU
f4f0: 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  S || p->op==TK_U
f500: 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e  MINUS ){ p = p->
f510: 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20  pLeft; }.  op = 
f520: 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  p->op;.  if( op=
f530: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f  =TK_REGISTER ) o
f540: 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77  p = p->op2;.  sw
f550: 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
f560: 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
f570: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
f580: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
f590: 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d  INTEGER || aff==
f5a0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
f5b0: 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  IC;.    }.    ca
f5c0: 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20  se TK_FLOAT: {. 
f5d0: 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d       return aff=
f5e0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
f5f0: 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
f600: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
f610: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53   }.    case TK_S
f620: 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72  TRING: {.      r
f630: 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54  eturn aff==SQLIT
f640: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
f650: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  }.    case TK_BL
f660: 4f 42 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  OB: {.      retu
f670: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
f680: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
f690: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
f6a0: 70 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20  p->iTable>=0 ); 
f6b0: 20 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65 20   /* p cannot be 
f6c0: 70 61 72 74 20 6f 66 20 61 20 43 48 45 43 4b 20  part of a CHECK 
f6d0: 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
f6e0: 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 43      return p->iC
f6f0: 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20  olumn<0.        
f700: 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54    && (aff==SQLIT
f710: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c  E_AFF_INTEGER ||
f720: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
f730: 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d  _NUMERIC);.    }
f740: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
f750: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
f760: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
f770: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
f780: 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  f the given stri
f790: 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63  ng is a row-id c
f7a0: 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69  olumn name..*/.i
f7b0: 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69  nt sqlite3IsRowi
f7c0: 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  d(const char *z)
f7d0: 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  {.  if( sqlite3S
f7e0: 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49  trICmp(z, "_ROWI
f7f0: 44 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  D_")==0 ) return
f800: 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
f810: 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57  3StrICmp(z, "ROW
f820: 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ID")==0 ) return
f830: 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
f840: 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44  3StrICmp(z, "OID
f850: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
f860: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
f870: 0a 2f 2a 0a 2a 2a 20 70 58 20 69 73 20 74 68 65  ./*.** pX is the
f880: 20 52 48 53 20 6f 66 20 61 6e 20 49 4e 20 6f 70   RHS of an IN op
f890: 65 72 61 74 6f 72 2e 20 20 49 66 20 70 58 20 69  erator.  If pX i
f8a0: 73 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  s a SELECT state
f8b0: 6d 65 6e 74 20 0a 2a 2a 20 74 68 61 74 20 63 61  ment .** that ca
f8c0: 6e 20 62 65 20 73 69 6d 70 6c 69 66 69 65 64 20  n be simplified 
f8d0: 74 6f 20 61 20 64 69 72 65 63 74 20 74 61 62 6c  to a direct tabl
f8e0: 65 20 61 63 63 65 73 73 2c 20 74 68 65 6e 20 72  e access, then r
f8f0: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
f900: 65 72 20 74 6f 20 74 68 65 20 53 45 4c 45 43 54  er to the SELECT
f910: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 66 20   statement.  If 
f920: 70 58 20 69 73 20 6e 6f 74 20 61 20 53 45 4c 45  pX is not a SELE
f930: 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a  CT statement,.**
f940: 20 6f 72 20 69 66 20 74 68 65 20 53 45 4c 45 43   or if the SELEC
f950: 54 20 73 74 61 74 65 6d 65 6e 74 20 6e 65 65 64  T statement need
f960: 73 20 74 6f 20 62 65 20 6d 61 6e 69 66 65 73 74  s to be manifest
f970: 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 69  ed into a transi
f980: 65 6e 74 0a 2a 2a 20 74 61 62 6c 65 2c 20 74 68  ent.** table, th
f990: 65 6e 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  en return NULL..
f9a0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
f9b0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
f9c0: 73 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 69  static Select *i
f9d0: 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
f9e0: 70 74 28 45 78 70 72 20 2a 70 58 29 7b 0a 20 20  pt(Expr *pX){.  
f9f0: 53 65 6c 65 63 74 20 2a 70 3b 0a 20 20 53 72 63  Select *p;.  Src
fa00: 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45 78  List *pSrc;.  Ex
fa10: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
fa20: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
fa30: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 45   int i;.  if( !E
fa40: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
fa50: 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  X, EP_xIsSelect)
fa60: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
fa70: 20 4e 6f 74 20 61 20 73 75 62 71 75 65 72 79 20   Not a subquery 
fa80: 2a 2f 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  */.  if( ExprHas
fa90: 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f  Property(pX, EP_
faa0: 56 61 72 53 65 6c 65 63 74 29 20 20 29 20 72 65  VarSelect)  ) re
fab0: 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72  turn 0;  /* Corr
fac0: 65 6c 61 74 65 64 20 73 75 62 71 20 2a 2f 0a 20  elated subq */. 
fad0: 20 70 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65   p = pX->x.pSele
fae0: 63 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  ct;.  if( p->pPr
faf0: 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ior ) return 0; 
fb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fb10: 4e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53  Not a compound S
fb20: 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70  ELECT */.  if( p
fb30: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
fb40: 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
fb50: 72 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74  regate) ){.    t
fb60: 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c  estcase( (p->sel
fb70: 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
fb80: 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
fb90: 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74  e))==SF_Distinct
fba0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
fbb0: 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
fbc0: 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
fbd0: 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
fbe0: 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20  _Aggregate );.  
fbf0: 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e    return 0; /* N
fc00: 6f 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  o DISTINCT keywo
fc10: 72 64 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67  rd and no aggreg
fc20: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
fc30: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
fc40: 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b  ->pGroupBy==0 );
fc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fc60: 20 48 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59   Has no GROUP BY
fc70: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28   clause */.  if(
fc80: 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74   p->pLimit ) ret
fc90: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
fca0: 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49      /* Has no LI
fcb0: 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  MIT clause */.  
fcc0: 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73  assert( p->pOffs
fcd0: 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20  et==0 );        
fce0: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d         /* No LIM
fcf0: 49 54 20 6d 65 61 6e 73 20 6e 6f 20 4f 46 46 53  IT means no OFFS
fd00: 45 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  ET */.  if( p->p
fd10: 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30  Where ) return 0
fd20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
fd30: 2a 20 48 61 73 20 6e 6f 20 57 48 45 52 45 20 63  * Has no WHERE c
fd40: 6c 61 75 73 65 20 2a 2f 0a 20 20 70 53 72 63 20  lause */.  pSrc 
fd50: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  = p->pSrc;.  ass
fd60: 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a  ert( pSrc!=0 );.
fd70: 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63    if( pSrc->nSrc
fd80: 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  !=1 ) return 0; 
fd90: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67           /* Sing
fda0: 6c 65 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20  le term in FROM 
fdb0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20  clause */.  if( 
fdc0: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
fdd0: 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ct ) return 0;  
fde0: 20 20 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f     /* FROM is no
fdf0: 74 20 61 20 73 75 62 71 75 65 72 79 20 6f 72 20  t a subquery or 
fe00: 76 69 65 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d  view */.  pTab =
fe10: 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62   pSrc->a[0].pTab
fe20: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
fe30: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
fe40: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d   pTab->pSelect==
fe50: 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0 );            
fe60: 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  /* FROM clause i
fe70: 73 20 6e 6f 74 20 61 20 76 69 65 77 20 2a 2f 0a  s not a view */.
fe80: 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
fe90: 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30  pTab) ) return 0
fea0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d  ;        /* FROM
feb0: 20 63 6c 61 75 73 65 20 6e 6f 74 20 61 20 76 69   clause not a vi
fec0: 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20  rtual table */. 
fed0: 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
fee0: 69 73 74 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 20 53  ist;..  /* All S
fef0: 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20 6d 75  ELECT results mu
ff00: 73 74 20 62 65 20 63 6f 6c 75 6d 6e 73 2e 20 2a  st be columns. *
ff10: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
ff20: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
ff30: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 52  +){.    Expr *pR
ff40: 65 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  es = pEList->a[i
ff50: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
ff60: 20 70 52 65 73 2d 3e 6f 70 21 3d 54 4b 5f 43 4f   pRes->op!=TK_CO
ff70: 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  LUMN ) return 0;
ff80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65  .    assert( pRe
ff90: 73 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d  s->iTable==pSrc-
ffa0: 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 29 3b  >a[0].iCursor );
ffb0: 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65    /* Not a corre
ffc0: 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 20 2a  lated subquery *
ffd0: 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  /.  }.  return p
ffe0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
fff0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
10000 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64  RY */../*.** Cod
10010 65 20 61 6e 20 4f 50 5f 4f 6e 63 65 20 69 6e 73  e an OP_Once ins
10020 74 72 75 63 74 69 6f 6e 20 61 6e 64 20 61 6c 6c  truction and all
10030 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
10040 69 74 73 20 66 6c 61 67 2e 20 52 65 74 75 72 6e  its flag. Return
10050 20 74 68 65 20 0a 2a 2a 20 61 64 64 72 65 73 73   the .** address
10060 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74   of the new inst
10070 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  ruction..*/.int 
10080 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
10090 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
100a0 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
100b0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
100c0 65 29 3b 20 20 20 20 20 20 2f 2a 20 56 69 72 74  e);      /* Virt
100d0 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e  ual machine bein
100e0 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 72 65 74  g coded */.  ret
100f0 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41  urn sqlite3VdbeA
10100 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4f 6e 63 65  ddOp1(v, OP_Once
10110 2c 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 2b  , pParse->nOnce+
10120 2b 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  +);.}..#ifndef S
10130 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
10140 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  ERY./*.** Genera
10150 74 65 20 63 6f 64 65 20 74 68 61 74 20 63 68 65  te code that che
10160 63 6b 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  cks the left-mos
10170 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65  t column of inde
10180 78 20 74 61 62 6c 65 20 69 43 75 72 20 74 6f 20  x table iCur to 
10190 73 65 65 20 69 66 0a 2a 2a 20 69 74 20 63 6f 6e  see if.** it con
101a0 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 65  tains any NULL e
101b0 6e 74 72 69 65 73 2e 20 20 43 61 75 73 65 20 74  ntries.  Cause t
101c0 68 65 20 72 65 67 69 73 74 65 72 20 61 74 20 72  he register at r
101d0 65 67 48 61 73 4e 75 6c 6c 20 74 6f 20 62 65 20  egHasNull to be 
101e0 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  set.** to a non-
101f0 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66 20 69 43  NULL value if iC
10200 75 72 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e  ur contains no N
10210 55 4c 4c 73 2e 20 20 43 61 75 73 65 20 72 65 67  ULLs.  Cause reg
10220 69 73 74 65 72 20 72 65 67 48 61 73 4e 75 6c 6c  ister regHasNull
10230 0a 2a 2a 20 74 6f 20 62 65 20 73 65 74 20 74 6f  .** to be set to
10240 20 4e 55 4c 4c 20 69 66 20 69 43 75 72 20 63 6f   NULL if iCur co
10250 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f  ntains one or mo
10260 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a  re NULL values..
10270 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
10280 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c  qlite3SetHasNull
10290 46 6c 61 67 28 56 64 62 65 20 2a 76 2c 20 69 6e  Flag(Vdbe *v, in
102a0 74 20 69 43 75 72 2c 20 69 6e 74 20 72 65 67 48  t iCur, int regH
102b0 61 73 4e 75 6c 6c 29 7b 0a 20 20 69 6e 74 20 61  asNull){.  int a
102c0 64 64 72 31 3b 0a 20 20 73 71 6c 69 74 65 33 56  ddr1;.  sqlite3V
102d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
102e0 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 48  Integer, 0, regH
102f0 61 73 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 31  asNull);.  addr1
10300 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
10310 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp1(v, OP_Rewin
10320 64 2c 20 69 43 75 72 29 3b 20 56 64 62 65 43 6f  d, iCur); VdbeCo
10330 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
10340 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
10350 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75  , OP_Column, iCu
10360 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c  r, 0, regHasNull
10370 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
10380 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
10390 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20  AG_TYPEOFARG);. 
103a0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
103b0 20 22 66 69 72 73 74 5f 65 6e 74 72 79 5f 69 6e   "first_entry_in
103c0 28 25 64 29 22 2c 20 69 43 75 72 29 29 3b 0a 20  (%d)", iCur));. 
103d0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
103e0 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
103f0 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64  }.#endif...#ifnd
10400 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
10410 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68  UBQUERY./*.** Th
10420 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e  e argument is an
10430 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74   IN operator wit
10440 68 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20  h a list (not a 
10450 73 75 62 71 75 65 72 79 29 20 6f 6e 20 74 68 65  subquery) on the
10460 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 20   .** right-hand 
10470 73 69 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52  side.  Return TR
10480 55 45 20 69 66 20 74 68 61 74 20 6c 69 73 74 20  UE if that list 
10490 69 73 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a  is constant..*/.
104a0 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
104b0 65 33 49 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e  e3InRhsIsConstan
104c0 74 28 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20  t(Expr *pIn){.  
104d0 45 78 70 72 20 2a 70 4c 48 53 3b 0a 20 20 69 6e  Expr *pLHS;.  in
104e0 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28  t res;.  assert(
104f0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
10500 79 28 70 49 6e 2c 20 45 50 5f 78 49 73 53 65 6c  y(pIn, EP_xIsSel
10510 65 63 74 29 20 29 3b 0a 20 20 70 4c 48 53 20 3d  ect) );.  pLHS =
10520 20 70 49 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20 70   pIn->pLeft;.  p
10530 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20  In->pLeft = 0;. 
10540 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 45 78   res = sqlite3Ex
10550 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 49 6e  prIsConstant(pIn
10560 29 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20  );.  pIn->pLeft 
10570 3d 20 70 4c 48 53 3b 0a 20 20 72 65 74 75 72 6e  = pLHS;.  return
10580 20 72 65 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   res;.}.#endif..
10590 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
105a0 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20 74  ion is used by t
105b0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
105c0 6e 20 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e  n of the IN (...
105d0 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 54  ) operator..** T
105e0 68 65 20 70 58 20 70 61 72 61 6d 65 74 65 72 20  he pX parameter 
105f0 69 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  is the expressio
10600 6e 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  n on the RHS of 
10610 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c  the IN operator,
10620 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20   which.** might 
10630 62 65 20 65 69 74 68 65 72 20 61 20 6c 69 73 74  be either a list
10640 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20   of expressions 
10650 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a 2a  or a subquery..*
10660 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20  *.** The job of 
10670 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
10680 74 6f 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74  to find or creat
10690 65 20 61 20 62 2d 74 72 65 65 20 6f 62 6a 65 63  e a b-tree objec
106a0 74 20 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65  t that can.** be
106b0 20 75 73 65 64 20 65 69 74 68 65 72 20 74 6f 20   used either to 
106c0 74 65 73 74 20 66 6f 72 20 6d 65 6d 62 65 72 73  test for members
106d0 68 69 70 20 69 6e 20 74 68 65 20 52 48 53 20 73  hip in the RHS s
106e0 65 74 20 6f 72 20 74 6f 20 69 74 65 72 61 74 65  et or to iterate
106f0 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20   through.** all 
10700 6d 65 6d 62 65 72 73 20 6f 66 20 74 68 65 20 52  members of the R
10710 48 53 20 73 65 74 2c 20 73 6b 69 70 70 69 6e 67  HS set, skipping
10720 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a   duplicates..**.
10730 2a 2a 20 41 20 63 75 72 73 6f 72 20 69 73 20 6f  ** A cursor is o
10740 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d 74  pened on the b-t
10750 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20  ree object that 
10760 69 73 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  is the RHS of th
10770 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  e IN operator.**
10780 20 61 6e 64 20 70 58 2d 3e 69 54 61 62 6c 65 20   and pX->iTable 
10790 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e  is set to the in
107a0 64 65 78 20 6f 66 20 74 68 61 74 20 63 75 72 73  dex of that curs
107b0 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  or..**.** The re
107c0 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6f 66 20  turned value of 
107d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e  this function in
107e0 64 69 63 61 74 65 73 20 74 68 65 20 62 2d 74 72  dicates the b-tr
107f0 65 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c  ee type, as foll
10800 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f  ows:.**.**   IN_
10810 49 4e 44 45 58 5f 52 4f 57 49 44 20 20 20 20 20  INDEX_ROWID     
10820 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61   - The cursor wa
10830 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61  s opened on a da
10840 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a  tabase table..**
10850 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45     IN_INDEX_INDE
10860 58 5f 41 53 43 20 20 2d 20 54 68 65 20 63 75 72  X_ASC  - The cur
10870 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
10880 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69  n an ascending i
10890 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e  ndex..**   IN_IN
108a0 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 2d  DEX_INDEX_DESC -
108b0 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20   The cursor was 
108c0 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 65 73 63  opened on a desc
108d0 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a  ending index..**
108e0 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20     IN_INDEX_EPH 
108f0 20 20 20 20 20 20 20 2d 20 54 68 65 20 63 75 72         - The cur
10900 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
10910 6e 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72  n a specially cr
10920 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20  eated and.**    
10930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10940 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20 65       populated e
10950 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a  pheremal table..
10960 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  **   IN_INDEX_NO
10970 4f 50 20 20 20 20 20 20 20 2d 20 4e 6f 20 63 75  OP       - No cu
10980 72 73 6f 72 20 77 61 73 20 61 6c 6c 6f 63 61 74  rsor was allocat
10990 65 64 2e 20 20 54 68 65 20 49 4e 20 6f 70 65 72  ed.  The IN oper
109a0 61 74 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20  ator must be.** 
109b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109c0 20 20 20 20 20 20 20 20 69 6d 70 6c 65 6d 65 6e          implemen
109d0 74 65 64 20 61 73 20 61 20 73 65 71 75 65 6e 63  ted as a sequenc
109e0 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73  e of comparisons
109f0 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74  ..**.** An exist
10a00 69 6e 67 20 62 2d 74 72 65 65 20 6d 69 67 68 74  ing b-tree might
10a10 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65 20   be used if the 
10a20 52 48 53 20 65 78 70 72 65 73 73 69 6f 6e 20 70  RHS expression p
10a30 58 20 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a  X is a simple.**
10a40 20 73 75 62 71 75 65 72 79 20 73 75 63 68 20 61   subquery such a
10a50 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
10a60 45 43 54 20 3c 63 6f 6c 75 6d 6e 31 3e 2c 20 3c  ECT <column1>, <
10a70 63 6f 6c 75 6d 6e 32 3e 2e 2e 2e 20 46 52 4f 4d  column2>... FROM
10a80 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49   <table>.**.** I
10a90 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  f the RHS of the
10aa0 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
10ab0 61 20 6c 69 73 74 20 6f 72 20 61 20 6d 6f 72 65  a list or a more
10ac0 20 63 6f 6d 70 6c 65 78 20 73 75 62 71 75 65 72   complex subquer
10ad0 79 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 65 70  y, then.** an ep
10ae0 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6d 69  hemeral table mi
10af0 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20 67  ght need to be g
10b00 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68  enerated from th
10b10 65 20 52 48 53 20 61 6e 64 20 74 68 65 6e 0a 2a  e RHS and then.*
10b20 2a 20 70 58 2d 3e 69 54 61 62 6c 65 20 6d 61 64  * pX->iTable mad
10b30 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  e to point to th
10b40 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  e ephemeral tabl
10b50 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6e 0a  e instead of an.
10b60 2a 2a 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c  ** existing tabl
10b70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 46  e..**.** The inF
10b80 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 6d  lags parameter m
10b90 75 73 74 20 63 6f 6e 74 61 69 6e 20 65 78 61 63  ust contain exac
10ba0 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 62  tly one of the b
10bb0 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f  its.** IN_INDEX_
10bc0 4d 45 4d 42 45 52 53 48 49 50 20 6f 72 20 49 4e  MEMBERSHIP or IN
10bd0 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2e 20 20 49 66  _INDEX_LOOP.  If
10be0 20 69 6e 46 6c 61 67 73 20 63 6f 6e 74 61 69 6e   inFlags contain
10bf0 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45  s.** IN_INDEX_ME
10c00 4d 42 45 52 53 48 49 50 2c 20 74 68 65 6e 20 74  MBERSHIP, then t
10c10 68 65 20 67 65 6e 65 72 61 74 65 64 20 74 61 62  he generated tab
10c20 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  le will be used 
10c30 66 6f 72 20 61 0a 2a 2a 20 66 61 73 74 20 6d 65  for a.** fast me
10c40 6d 62 65 72 73 68 69 70 20 74 65 73 74 2e 20 20  mbership test.  
10c50 57 68 65 6e 20 74 68 65 20 49 4e 5f 49 4e 44 45  When the IN_INDE
10c60 58 5f 4c 4f 4f 50 20 62 69 74 20 69 73 20 73 65  X_LOOP bit is se
10c70 74 2c 20 74 68 65 0a 2a 2a 20 49 4e 20 69 6e 64  t, the.** IN ind
10c80 65 78 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ex will be used 
10c90 74 6f 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c  to loop over all
10ca0 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 52   values of the R
10cb0 48 53 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 20  HS of the.** IN 
10cc0 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  operator..**.** 
10cd0 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f  When IN_INDEX_LO
10ce0 4f 50 20 69 73 20 75 73 65 64 20 28 61 6e 64 20  OP is used (and 
10cf0 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20  the b-tree will 
10d00 62 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61  be used to itera
10d10 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74 68  te.** through th
10d20 65 20 73 65 74 20 6d 65 6d 62 65 72 73 29 20 74  e set members) t
10d30 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6d  hen the b-tree m
10d40 75 73 74 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  ust not contain 
10d50 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 20 41  duplicates..** A
10d60 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  n epheremal tabl
10d70 65 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 75  e must be used u
10d80 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63 74  nless the select
10d90 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 67  ed columns are g
10da0 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20  uaranteed.** to 
10db0 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68  be unique - eith
10dc0 65 72 20 62 65 63 61 75 73 65 20 69 74 20 69 73  er because it is
10dd0 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
10de0 41 52 59 20 4b 45 59 20 6f 72 20 64 75 65 20 74  ARY KEY or due t
10df0 6f 0a 2a 2a 20 61 20 55 4e 49 51 55 45 20 63 6f  o.** a UNIQUE co
10e00 6e 73 74 72 61 69 6e 74 20 6f 72 20 69 6e 64 65  nstraint or inde
10e10 78 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e  x..**.** When IN
10e20 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49  _INDEX_MEMBERSHI
10e30 50 20 69 73 20 75 73 65 64 20 28 61 6e 64 20 74  P is used (and t
10e40 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62  he b-tree will b
10e50 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66  e used .** for f
10e60 61 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68  ast set membersh
10e70 69 70 20 74 65 73 74 73 29 20 74 68 65 6e 20 61  ip tests) then a
10e80 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  n epheremal tabl
10e90 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73  e must .** be us
10ea0 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d  ed unless <colum
10eb0 6e 73 3e 20 69 73 20 61 20 73 69 6e 67 6c 65 20  ns> is a single 
10ec0 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
10ed0 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f 72 20 61 6e  KEY column or an
10ee0 20 0a 2a 2a 20 69 6e 64 65 78 20 63 61 6e 20 62   .** index can b
10ef0 65 20 66 6f 75 6e 64 20 77 69 74 68 20 74 68 65  e found with the
10f00 20 73 70 65 63 69 66 69 65 64 20 3c 63 6f 6c 75   specified <colu
10f10 6d 6e 73 3e 20 61 73 20 69 74 73 20 6c 65 66 74  mns> as its left
10f20 2d 6d 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  -most..**.** If 
10f30 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  the IN_INDEX_NOO
10f40 50 5f 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e 44 45  P_OK and IN_INDE
10f50 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 61 72 65  X_MEMBERSHIP are
10f60 20 62 6f 74 68 20 73 65 74 20 61 6e 64 0a 2a 2a   both set and.**
10f70 20 69 66 20 74 68 65 20 52 48 53 20 6f 66 20 74   if the RHS of t
10f80 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  he IN operator i
10f90 73 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20  s a list (not a 
10fa0 73 75 62 71 75 65 72 79 29 20 74 68 65 6e 20 74  subquery) then t
10fb0 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6d  his.** routine m
10fc0 69 67 68 74 20 64 65 63 69 64 65 20 74 68 61 74  ight decide that
10fd0 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68   creating an eph
10fe0 65 6d 65 72 61 6c 20 62 2d 74 72 65 65 20 66 6f  emeral b-tree fo
10ff0 72 20 6d 65 6d 62 65 72 73 68 69 70 0a 2a 2a 20  r membership.** 
11000 74 65 73 74 69 6e 67 20 69 73 20 74 6f 6f 20 65  testing is too e
11010 78 70 65 6e 73 69 76 65 20 61 6e 64 20 72 65 74  xpensive and ret
11020 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  urn IN_INDEX_NOO
11030 50 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65  P.  In that case
11040 2c 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67  , the.** calling
11050 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
11060 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 4e  implement the IN
11070 20 6f 70 65 72 61 74 6f 72 20 75 73 69 6e 67 20   operator using 
11080 61 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 6f 66  a sequence.** of
11090 20 45 71 20 6f 72 20 4e 65 20 63 6f 6d 70 61 72   Eq or Ne compar
110a0 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73 2e  ison operations.
110b0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20  .**.** When the 
110c0 62 2d 74 72 65 65 20 69 73 20 62 65 69 6e 67 20  b-tree is being 
110d0 75 73 65 64 20 66 6f 72 20 6d 65 6d 62 65 72 73  used for members
110e0 68 69 70 20 74 65 73 74 73 2c 20 74 68 65 20 63  hip tests, the c
110f0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
11100 2a 2a 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  ** might need to
11110 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72   know whether or
11120 20 6e 6f 74 20 74 68 65 20 52 48 53 20 73 69 64   not the RHS sid
11130 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  e of the IN oper
11140 61 74 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  ator.** contains
11150 20 61 20 4e 55 4c 4c 2e 20 20 49 66 20 70 72 52   a NULL.  If prR
11160 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6e 6f 74  hsHasNull is not
11170 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20   a NULL pointer 
11180 61 6e 64 20 0a 2a 2a 20 69 66 20 74 68 65 72 65  and .** if there
11190 20 69 73 20 61 6e 79 20 63 68 61 6e 63 65 20 74   is any chance t
111a0 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69  hat the (...) mi
111b0 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55  ght contain a NU
111c0 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72  LL value at.** r
111d0 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61 20 72  untime, then a r
111e0 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63  egister is alloc
111f0 61 74 65 64 20 61 6e 64 20 74 68 65 20 72 65 67  ated and the reg
11200 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 72 69  ister number wri
11210 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52 68  tten.** to *prRh
11220 73 48 61 73 4e 75 6c 6c 2e 20 49 66 20 74 68 65  sHasNull. If the
11230 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
11240 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 63  that the (...) c
11250 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c  ontains a.** NUL
11260 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70  L value, then *p
11270 72 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6c  rRhsHasNull is l
11280 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  eft unchanged..*
11290 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74  *.** If a regist
112a0 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  er is allocated 
112b0 61 6e 64 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e  and its location
112c0 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 72 52 68   stored in *prRh
112d0 73 48 61 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a 2a  sHasNull, then.*
112e0 2a 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74  * the value in t
112f0 68 61 74 20 72 65 67 69 73 74 65 72 20 77 69 6c  hat register wil
11300 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 65  l be NULL if the
11310 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73   b-tree contains
11320 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   one or more.** 
11330 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 61 6e 64  NULL values, and
11340 20 69 74 20 77 69 6c 6c 20 62 65 20 73 6f 6d 65   it will be some
11350 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20   non-NULL value 
11360 69 66 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f  if the b-tree co
11370 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55 4c  ntains no.** NUL
11380 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20  L values..**.** 
11390 49 66 20 74 68 65 20 61 69 4d 61 70 20 70 61 72  If the aiMap par
113a0 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 4e 55  ameter is not NU
113b0 4c 4c 2c 20 69 74 20 6d 75 73 74 20 70 6f 69 6e  LL, it must poin
113c0 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20 63 6f  t to an array co
113d0 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65 20  ntaining.** one 
113e0 65 6c 65 6d 65 6e 74 20 66 6f 72 20 65 61 63 68  element for each
113f0 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64   column returned
11400 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 73   by the SELECT s
11410 74 61 74 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20  tatement on the 
11420 52 48 53 0a 2a 2a 20 6f 66 20 74 68 65 20 49 4e  RHS.** of the IN
11430 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 20  (...) operator. 
11440 54 68 65 20 69 27 74 68 20 65 6e 74 72 79 20 6f  The i'th entry o
11450 66 20 74 68 65 20 61 72 72 61 79 20 69 73 20 70  f the array is p
11460 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68  opulated with th
11470 65 0a 2a 2a 20 6f 66 66 73 65 74 20 6f 66 20 74  e.** offset of t
11480 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20  he index column 
11490 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68 65  that matches the
114a0 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 72 65 74   i'th column ret
114b0 75 72 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  urned by the.** 
114c0 53 45 4c 45 43 54 2e 20 46 6f 72 20 65 78 61 6d  SELECT. For exam
114d0 70 6c 65 2c 20 69 66 20 74 68 65 20 65 78 70 72  ple, if the expr
114e0 65 73 73 69 6f 6e 20 61 6e 64 20 73 65 6c 65 63  ession and selec
114f0 74 65 64 20 69 6e 64 65 78 20 61 72 65 3a 0a 2a  ted index are:.*
11500 2a 0a 2a 2a 20 20 20 28 3f 2c 3f 2c 3f 29 20 49  *.**   (?,?,?) I
11510 4e 20 28 53 45 4c 45 43 54 20 61 2c 20 62 2c 20  N (SELECT a, b, 
11520 63 20 46 52 4f 4d 20 74 31 29 0a 2a 2a 20 20 20  c FROM t1).**   
11530 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
11540 4f 4e 20 74 31 28 62 2c 20 63 2c 20 61 29 3b 0a  ON t1(b, c, a);.
11550 2a 2a 0a 2a 2a 20 74 68 65 6e 20 61 69 4d 61 70  **.** then aiMap
11560 5b 5d 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  [] is populated 
11570 77 69 74 68 20 7b 32 2c 20 30 2c 20 31 7d 2e 0a  with {2, 0, 1}..
11580 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
11590 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
115a0 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49  int sqlite3FindI
115b0 6e 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  nIndex(.  Parse 
115c0 2a 70 50 61 72 73 65 2c 20 0a 20 20 45 78 70 72  *pParse, .  Expr
115d0 20 2a 70 58 2c 20 0a 20 20 75 33 32 20 69 6e 46   *pX, .  u32 inF
115e0 6c 61 67 73 2c 20 0a 20 20 69 6e 74 20 2a 70 72  lags, .  int *pr
115f0 52 68 73 48 61 73 4e 75 6c 6c 2c 0a 20 20 69 6e  RhsHasNull,.  in
11600 74 20 2a 61 69 4d 61 70 0a 29 7b 0a 20 20 53 65  t *aiMap.){.  Se
11610 6c 65 63 74 20 2a 70 3b 20 20 20 20 20 20 20 20  lect *p;        
11620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11630 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f      /* SELECT to
11640 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 49 4e   the right of IN
11650 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   operator */.  i
11660 6e 74 20 65 54 79 70 65 20 3d 20 30 3b 20 20 20  nt eType = 0;   
11670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11680 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
11690 52 48 53 20 74 61 62 6c 65 2e 20 49 4e 5f 49 4e  RHS table. IN_IN
116a0 44 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69  DEX_* */.  int i
116b0 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
116c0 61 62 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20  ab++;           
116d0 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 74 68   /* Cursor of th
116e0 65 20 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20  e RHS table */. 
116f0 20 69 6e 74 20 6d 75 73 74 42 65 55 6e 69 71 75   int mustBeUniqu
11700 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
11710 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
11720 66 20 52 48 53 20 6d 75 73 74 20 62 65 20 75 6e  f RHS must be un
11730 69 71 75 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ique */.  Vdbe *
11740 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
11750 62 65 28 70 50 61 72 73 65 29 3b 20 20 20 20 20  be(pParse);     
11760 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63 68 69  /* Virtual machi
11770 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  ne being coded *
11780 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 58 2d  /..  assert( pX-
11790 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20  >op==TK_IN );.  
117a0 6d 75 73 74 42 65 55 6e 69 71 75 65 20 3d 20 28  mustBeUnique = (
117b0 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44  inFlags & IN_IND
117c0 45 58 5f 4c 4f 4f 50 29 21 3d 30 3b 0a 0a 20 20  EX_LOOP)!=0;..  
117d0 2f 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f 66  /* If the RHS of
117e0 20 74 68 69 73 20 49 4e 28 2e 2e 2e 29 20 6f 70   this IN(...) op
117f0 65 72 61 74 6f 72 20 69 73 20 61 20 53 45 4c 45  erator is a SELE
11800 43 54 2c 20 61 6e 64 20 69 66 20 69 74 20 6d 61  CT, and if it ma
11810 74 74 65 72 73 20 0a 20 20 2a 2a 20 77 68 65 74  tters .  ** whet
11820 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 53  her or not the S
11830 45 4c 45 43 54 20 72 65 73 75 6c 74 20 63 6f 6e  ELECT result con
11840 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65  tains NULL value
11850 73 2c 20 63 68 65 63 6b 20 77 68 65 74 68 65 72  s, check whether
11860 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 4e 55 4c  .  ** or not NUL
11870 4c 20 69 73 20 61 63 74 75 61 6c 6c 79 20 70 6f  L is actually po
11880 73 73 69 62 6c 65 20 28 69 74 20 6d 61 79 20 6e  ssible (it may n
11890 6f 74 20 62 65 2c 20 66 6f 72 20 65 78 61 6d 70  ot be, for examp
118a0 6c 65 2c 20 64 75 65 20 0a 20 20 2a 2a 20 74 6f  le, due .  ** to
118b0 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72   NOT NULL constr
118c0 61 69 6e 74 73 20 69 6e 20 74 68 65 20 73 63 68  aints in the sch
118d0 65 6d 61 29 2e 20 49 66 20 6e 6f 20 4e 55 4c 4c  ema). If no NULL
118e0 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f 73 73   values are poss
118f0 69 62 6c 65 2c 0a 20 20 2a 2a 20 73 65 74 20 70  ible,.  ** set p
11900 72 52 68 73 48 61 73 4e 75 6c 6c 20 74 6f 20 30  rRhsHasNull to 0
11910 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69   before continui
11920 6e 67 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 72  ng.  */.  if( pr
11930 52 68 73 48 61 73 4e 75 6c 6c 20 26 26 20 28 70  RhsHasNull && (p
11940 58 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49  X->flags & EP_xI
11950 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
11960 69 6e 74 20 69 3b 0a 20 20 20 20 45 78 70 72 4c  int i;.    ExprL
11970 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 58  ist *pEList = pX
11980 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
11990 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ist;.    for(i=0
119a0 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
119b0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  r; i++){.      i
119c0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  f( sqlite3ExprCa
119d0 6e 42 65 4e 75 6c 6c 28 70 45 4c 69 73 74 2d 3e  nBeNull(pEList->
119e0 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 20 62 72  a[i].pExpr) ) br
119f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
11a00 66 28 20 69 3d 3d 70 45 4c 69 73 74 2d 3e 6e 45  f( i==pEList->nE
11a10 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 72 52  xpr ){.      prR
11a20 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 0a 20  hsHasNull = 0;. 
11a30 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
11a40 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61  heck to see if a
11a50 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65  n existing table
11a60 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 62 65   or index can be
11a70 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61   used to.  ** sa
11a80 74 69 73 66 79 20 74 68 65 20 71 75 65 72 79 2e  tisfy the query.
11a90 20 20 54 68 69 73 20 69 73 20 70 72 65 66 65 72    This is prefer
11aa0 61 62 6c 65 20 74 6f 20 67 65 6e 65 72 61 74 69  able to generati
11ab0 6e 67 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65  ng a new .  ** e
11ac0 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20  phemeral table. 
11ad0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
11ae0 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 28 70 20  ->nErr==0 && (p 
11af0 3d 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72  = isCandidateFor
11b00 49 6e 4f 70 74 28 70 58 29 29 21 3d 30 20 29 7b  InOpt(pX))!=0 ){
11b10 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
11b20 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
11b30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
11b40 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
11b50 6f 6e 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20  on */.    Table 
11b60 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
11b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b80 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c 65   /* Table <table
11b90 3e 2e 20 2a 2f 0a 20 20 20 20 69 31 36 20 69 44  >. */.    i16 iD
11ba0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
11bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bc0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 64 78   /* Database idx
11bd0 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 20   for pTab */.   
11be0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
11bf0 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
11c00 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70     int nExpr = p
11c10 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20  EList->nExpr;.. 
11c20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
11c30 4c 69 73 74 21 3d 30 20 29 3b 20 20 20 20 20 20  List!=0 );      
11c40 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73         /* Becaus
11c50 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65  e of isCandidate
11c60 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20  ForInOpt(p) */. 
11c70 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
11c80 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
11c90 21 3d 30 20 29 3b 20 2f 2a 20 42 65 63 61 75 73  !=0 ); /* Becaus
11ca0 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65  e of isCandidate
11cb0 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20  ForInOpt(p) */. 
11cc0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53     assert( p->pS
11cd0 72 63 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20  rc!=0 );        
11ce0 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73         /* Becaus
11cf0 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65  e of isCandidate
11d00 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20  ForInOpt(p) */. 
11d10 20 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72     pTab = p->pSr
11d20 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20  c->a[0].pTab;.. 
11d30 20 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50     /* Code an OP
11d40 5f 54 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64  _Transaction and
11d50 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f   OP_TableLock fo
11d60 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20  r <table>. */.  
11d70 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
11d80 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
11d90 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
11da0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
11db0 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
11dc0 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  rse, iDb);.    s
11dd0 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
11de0 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
11df0 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62  b->tnum, 0, pTab
11e00 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f  ->zName);..    /
11e10 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
11e20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66  is only called f
11e30 72 6f 6d 20 74 77 6f 20 70 6c 61 63 65 73 2e 20  rom two places. 
11e40 49 6e 20 62 6f 74 68 20 63 61 73 65 73 20 74 68  In both cases th
11e50 65 20 76 64 62 65 0a 20 20 20 20 2a 2a 20 68 61  e vdbe.    ** ha
11e60 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
11e70 6c 6c 6f 63 61 74 65 64 2e 20 53 6f 20 61 73 73  llocated. So ass
11e80 75 6d 65 20 73 71 6c 69 74 65 33 47 65 74 56 64  ume sqlite3GetVd
11e90 62 65 28 29 20 69 73 20 61 6c 77 61 79 73 0a 20  be() is always. 
11ea0 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c     ** successful
11eb0 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   here..    */.  
11ec0 20 20 61 73 73 65 72 74 28 76 29 3b 0a 20 20 20    assert(v);.   
11ed0 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 26 26   if( nExpr==1 &&
11ee0 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
11ef0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  xpr->iColumn<0 )
11f00 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 41 64 64  {.      int iAdd
11f10 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f  r = sqlite3CodeO
11f20 6e 63 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  nce(pParse);.   
11f30 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
11f40 76 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  v);..      sqlit
11f50 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
11f60 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70  se, iTab, iDb, p
11f70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  Tab, OP_OpenRead
11f80 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d  );.      eType =
11f90 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b   IN_INDEX_ROWID;
11fa0 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ..      sqlite3V
11fb0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69  dbeJumpHere(v, i
11fc0 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Addr);.    }else
11fd0 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
11fe0 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
11ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12000 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
12010 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  e */.      int a
12020 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 31 3b 0a  ffinity_ok = 1;.
12030 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20        int i;..  
12040 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
12050 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74  t the affinity t
12060 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64  hat will be used
12070 20 74 6f 20 70 65 72 66 6f 72 6d 20 65 61 63 68   to perform each
12080 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61   .      ** compa
12090 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d  rison is the sam
120a0 65 20 61 73 20 74 68 65 20 61 66 66 69 6e 69 74  e as the affinit
120b0 79 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e  y of each column
120c0 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 69 74  . If.      ** it
120d0 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74 20   not, it is not 
120e0 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20  possible to use 
120f0 61 6e 79 20 69 6e 64 65 78 2e 20 20 2a 2f 0a 20  any index.  */. 
12100 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
12110 6e 45 78 70 72 20 26 26 20 61 66 66 69 6e 69 74  nExpr && affinit
12120 79 5f 6f 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  y_ok; i++){.    
12130 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d      Expr *pLhs =
12140 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69   sqlite3VectorFi
12150 65 6c 64 53 75 62 65 78 70 72 28 70 58 2d 3e 70  eldSubexpr(pX->p
12160 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Left, i);.      
12170 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 4c    int iCol = pEL
12180 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d  ist->a[i].pExpr-
12190 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
121a0 20 20 63 68 61 72 20 69 64 78 61 66 66 20 3d 20    char idxaff = 
121b0 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
121c0 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20  .affinity;.     
121d0 20 20 20 63 68 61 72 20 63 6d 70 61 66 66 20 3d     char cmpaff =
121e0 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
121f0 66 66 69 6e 69 74 79 28 70 4c 68 73 2c 20 69 64  ffinity(pLhs, id
12200 78 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 73  xaff);.        s
12210 77 69 74 63 68 28 20 63 6d 70 61 66 66 20 29 7b  witch( cmpaff ){
12220 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20  .          case 
12230 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3a  SQLITE_AFF_BLOB:
12240 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
12250 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 61  ak;.          ca
12260 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  se SQLITE_AFF_TE
12270 58 54 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  XT:.            
12280 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 28 69  affinity_ok = (i
12290 64 78 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  dxaff==SQLITE_AF
122a0 46 5f 54 45 58 54 29 3b 0a 20 20 20 20 20 20 20  F_TEXT);.       
122b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
122c0 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20        default:. 
122d0 20 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e             affin
122e0 69 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33  ity_ok = sqlite3
122f0 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
12300 79 28 69 64 78 61 66 66 29 3b 0a 20 20 20 20 20  y(idxaff);.     
12310 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
12320 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61      /* The colla
12330 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73  tion sequence us
12340 65 64 20 62 79 20 74 68 65 20 63 6f 6d 70 61 72  ed by the compar
12350 69 73 6f 6e 2e 20 49 66 20 61 6e 20 69 6e 64 65  ison. If an inde
12360 78 20 69 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a  x is to.      **
12370 20 62 65 20 75 73 65 64 20 69 6e 20 70 6c 61 63   be used in plac
12380 65 20 6f 66 20 61 20 74 65 6d 70 2d 74 61 62 6c  e of a temp-tabl
12390 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20 6f 72  e, it must be or
123a0 64 65 72 65 64 20 61 63 63 6f 72 64 69 6e 67 0a  dered according.
123b0 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73        ** to this
123c0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
123d0 6e 63 65 2e 20 20 2a 2f 0a 0a 20 20 20 20 20 20  nce.  */..      
123e0 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
123f0 49 6e 64 65 78 3b 20 70 49 64 78 20 26 26 20 65  Index; pIdx && e
12400 54 79 70 65 3d 3d 30 20 26 26 20 61 66 66 69 6e  Type==0 && affin
12410 69 74 79 5f 6f 6b 3b 20 70 49 64 78 3d 70 49 64  ity_ok; pIdx=pId
12420 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
12430 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b 65     if( pIdx->nKe
12440 79 43 6f 6c 3c 6e 45 78 70 72 20 29 20 63 6f 6e  yCol<nExpr ) con
12450 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
12460 66 28 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20  f( mustBeUnique 
12470 26 26 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  && (pIdx->nKeyCo
12480 6c 21 3d 6e 45 78 70 72 20 7c 7c 20 21 49 73 55  l!=nExpr || !IsU
12490 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29  niqueIndex(pIdx)
124a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  ) ){.          c
124b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
124c0 20 7d 0a 0a 20 20 20 20 20 20 20 20 66 6f 72 28   }..        for(
124d0 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b  i=0; i<nExpr; i+
124e0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78  +){.          Ex
124f0 70 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69 74  pr *pLhs = sqlit
12500 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62  e3VectorFieldSub
12510 65 78 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c 20  expr(pX->pLeft, 
12520 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78  i);.          Ex
12530 70 72 20 2a 70 52 68 73 20 3d 20 70 45 4c 69 73  pr *pRhs = pELis
12540 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
12550 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71           CollSeq
12560 20 2a 70 52 65 71 20 3d 20 73 71 6c 69 74 65 33   *pReq = sqlite3
12570 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
12580 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 68  lSeq(pParse, pLh
12590 73 2c 20 70 52 68 73 29 3b 0a 20 20 20 20 20 20  s, pRhs);.      
125a0 20 20 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 20 20      int j;..    
125b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
125c0 65 71 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  eq || pParse->nE
125d0 72 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rr );.          
125e0 69 66 28 20 70 52 65 71 3d 3d 30 20 29 20 62 72  if( pReq==0 ) br
125f0 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  eak;..          
12600 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 78 70 72  for(j=0; j<nExpr
12610 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
12620 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
12630 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70 52 68 73 2d  Column[j]!=pRhs-
12640 3e 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69  >iColumn ) conti
12650 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
12660 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
12670 7a 43 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20 20 20 20  zColl[j] );.    
12680 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
12690 74 65 33 53 74 72 49 43 6d 70 28 70 52 65 71 2d  te3StrICmp(pReq-
126a0 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a  >zName, pIdx->az
126b0 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63 6f  Coll[j])!=0 ) co
126c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
126d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
126e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
126f0 20 69 66 28 20 6a 3d 3d 6e 45 78 70 72 20 29 20   if( j==nExpr ) 
12700 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
12710 20 69 66 28 20 61 69 4d 61 70 20 29 20 61 69 4d   if( aiMap ) aiM
12720 61 70 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 20  ap[i] = j;.     
12730 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66     }..        if
12740 28 20 69 3d 3d 6e 45 78 70 72 20 29 7b 0a 20 20  ( i==nExpr ){.  
12750 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64 64          int iAdd
12760 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f  r = sqlite3CodeO
12770 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56 64 62  nce(pParse); Vdb
12780 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
12790 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
127a0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
127b0 4f 70 65 6e 52 65 61 64 2c 20 69 54 61 62 2c 20  OpenRead, iTab, 
127c0 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  pIdx->tnum, iDb)
127d0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
127e0 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49  te3VdbeSetP4KeyI
127f0 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78  nfo(pParse, pIdx
12800 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
12810 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
12820 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29  ", pIdx->zName))
12830 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
12840 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  rt( IN_INDEX_IND
12850 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e 5f 49 4e  EX_DESC == IN_IN
12860 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 2b 31 20  DEX_INDEX_ASC+1 
12870 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 54 79  );.          eTy
12880 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  pe = IN_INDEX_IN
12890 44 45 58 5f 41 53 43 20 2b 20 70 49 64 78 2d 3e  DEX_ASC + pIdx->
128a0 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 3b 0a 0a  aSortOrder[0];..
128b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 72            if( pr
128c0 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 20 20  RhsHasNull ){.  
128d0 20 20 20 20 20 20 20 20 20 20 2a 70 72 52 68 73            *prRhs
128e0 48 61 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72  HasNull = ++pPar
128f0 73 65 2d 3e 6e 4d 65 6d 3b 0a 23 69 66 64 65 66  se->nMem;.#ifdef
12900 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
12910 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a  OLUMN_USED_MASK.
12920 20 20 20 20 20 20 20 20 20 20 20 20 69 36 34 20              i64 
12930 6d 61 73 6b 20 3d 20 28 31 3c 3c 6e 45 78 70 72  mask = (1<<nExpr
12940 29 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  )-1;.           
12950 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12960 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c  p4Dup8(v, OP_Col
12970 75 6d 6e 73 55 73 65 64 2c 20 0a 20 20 20 20 20  umnsUsed, .     
12980 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62 2c             iTab,
12990 20 30 2c 20 30 2c 20 28 75 38 2a 29 26 6d 61 73   0, 0, (u8*)&mas
129a0 6b 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23 65  k, P4_INT64);.#e
129b0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  ndif.           
129c0 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 29 7b   if( nExpr==1 ){
129d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
129e0 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c  qlite3SetHasNull
129f0 46 6c 61 67 28 76 2c 20 69 54 61 62 2c 20 2a 70  Flag(v, iTab, *p
12a00 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20  rRhsHasNull);.  
12a10 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
12a20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12a30 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
12a40 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b  pHere(v, iAddr);
12a50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12a60 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
12a70 2f 2a 20 49 66 20 6e 6f 20 70 72 65 65 78 69 73  /* If no preexis
12a80 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 61 76  ting index is av
12a90 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20  ailable for the 
12aa0 49 4e 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 61  IN clause.  ** a
12ab0 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  nd IN_INDEX_NOOP
12ac0 20 69 73 20 61 6e 20 61 6c 6c 6f 77 65 64 20 72   is an allowed r
12ad0 65 70 6c 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68  eply.  ** and th
12ae0 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
12af0 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69  operator is a li
12b00 73 74 2c 20 6e 6f 74 20 61 20 73 75 62 71 75 65  st, not a subque
12b10 72 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ry.  ** and the 
12b20 52 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74  RHS is not const
12b30 61 6e 74 20 6f 72 20 68 61 73 20 74 77 6f 20 6f  ant or has two o
12b40 72 20 66 65 77 65 72 20 74 65 72 6d 73 2c 0a 20  r fewer terms,. 
12b50 20 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e   ** then it is n
12b60 6f 74 20 77 6f 72 74 68 20 63 72 65 61 74 69 6e  ot worth creatin
12b70 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  g an ephemeral t
12b80 61 62 6c 65 20 74 6f 20 65 76 61 6c 75 61 74 65  able to evaluate
12b90 0a 20 20 2a 2a 20 74 68 65 20 49 4e 20 6f 70 65  .  ** the IN ope
12ba0 72 61 74 6f 72 20 73 6f 20 72 65 74 75 72 6e 20  rator so return 
12bb0 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a 20  IN_INDEX_NOOP.. 
12bc0 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
12bd0 3d 30 0a 20 20 20 26 26 20 28 69 6e 46 6c 61 67  =0.   && (inFlag
12be0 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  s & IN_INDEX_NOO
12bf0 50 5f 4f 4b 29 0a 20 20 20 26 26 20 21 45 78 70  P_OK).   && !Exp
12c00 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c  rHasProperty(pX,
12c10 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 0a 20   EP_xIsSelect). 
12c20 20 20 26 26 20 28 21 73 71 6c 69 74 65 33 49 6e    && (!sqlite3In
12c30 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 70 58  RhsIsConstant(pX
12c40 29 20 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69 73 74  ) || pX->x.pList
12c50 2d 3e 6e 45 78 70 72 3c 3d 32 29 0a 20 20 29 7b  ->nExpr<=2).  ){
12c60 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f  .    eType = IN_
12c70 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a  INDEX_NOOP;.  }.
12c80 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20  .  if( eType==0 
12c90 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20  ){.    /* Could 
12ca0 6e 6f 74 20 66 69 6e 64 20 61 6e 20 65 78 69 73  not find an exis
12cb0 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e  ting table or in
12cc0 64 65 78 20 74 6f 20 75 73 65 20 61 73 20 74 68  dex to use as th
12cd0 65 20 52 48 53 20 62 2d 74 72 65 65 2e 0a 20 20  e RHS b-tree..  
12ce0 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61 76    ** We will hav
12cf0 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e  e to generate an
12d00 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
12d10 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a   to do the job..
12d20 20 20 20 20 2a 2f 0a 20 20 20 20 75 33 32 20 73      */.    u32 s
12d30 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d  avedNQueryLoop =
12d40 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
12d50 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 72 4d 61  oop;.    int rMa
12d60 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20  yHaveNull = 0;. 
12d70 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
12d80 44 45 58 5f 45 50 48 3b 0a 20 20 20 20 69 66 28  DEX_EPH;.    if(
12d90 20 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e   inFlags & IN_IN
12da0 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20 20  DEX_LOOP ){.    
12db0 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
12dc0 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  Loop = 0;.      
12dd0 69 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69  if( pX->pLeft->i
12de0 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78 70  Column<0 && !Exp
12df0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c  rHasProperty(pX,
12e00 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
12e10 7b 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 20  {.        eType 
12e20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  = IN_INDEX_ROWID
12e30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
12e40 6c 73 65 20 69 66 28 20 70 72 52 68 73 48 61 73  lse if( prRhsHas
12e50 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2a 70  Null ){.      *p
12e60 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 72 4d  rRhsHasNull = rM
12e70 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70  ayHaveNull = ++p
12e80 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
12e90 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f   }.    sqlite3Co
12ea0 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
12eb0 73 65 2c 20 70 58 2c 20 72 4d 61 79 48 61 76 65  se, pX, rMayHave
12ec0 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e 5f  Null, eType==IN_
12ed0 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20 20  INDEX_ROWID);.  
12ee0 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
12ef0 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e 51 75 65  Loop = savedNQue
12f00 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 7b  ryLoop;.  }else{
12f10 0a 20 20 20 20 70 58 2d 3e 69 54 61 62 6c 65 20  .    pX->iTable 
12f20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 0a 20 20 69  = iTab;.  }..  i
12f30 66 28 20 61 69 4d 61 70 20 26 26 20 65 54 79 70  f( aiMap && eTyp
12f40 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  e!=IN_INDEX_INDE
12f50 58 5f 41 53 43 20 26 26 20 65 54 79 70 65 21 3d  X_ASC && eType!=
12f60 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44  IN_INDEX_INDEX_D
12f70 45 53 43 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ESC ){.    int i
12f80 2c 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c  , n;.    n = sql
12f90 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
12fa0 7a 65 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20  ze(pX->pLeft);. 
12fb0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b     for(i=0; i<n;
12fc0 20 69 2b 2b 29 20 61 69 4d 61 70 5b 69 5d 20 3d   i++) aiMap[i] =
12fd0 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   i;.  }.  return
12fe0 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66   eType;.}.#endif
12ff0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
13000 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
13010 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 45  *.** Argument pE
13020 78 70 72 20 69 73 20 61 6e 20 28 3f 2c 20 3f 2e  xpr is an (?, ?.
13030 2e 2e 29 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72  ..) IN(...) expr
13040 65 73 73 69 6f 6e 2e 20 54 68 69 73 20 0a 2a 2a  ession. This .**
13050 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
13060 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20  tes and returns 
13070 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  a nul-terminated
13080 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
13090 6e 67 20 0a 2a 2a 20 74 68 65 20 61 66 66 69 6e  ng .** the affin
130a0 69 74 69 65 73 20 74 6f 20 62 65 20 75 73 65 64  ities to be used
130b0 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
130c0 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
130d0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  on..**.** It is 
130e0 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
130f0 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
13100 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
13110 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  the returned.** 
13120 73 74 72 69 6e 67 20 69 73 20 65 76 65 6e 74 75  string is eventu
13130 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67  ally freed using
13140 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29   sqlite3DbFree()
13150 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
13160 20 2a 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79   *exprINAffinity
13170 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
13180 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
13190 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
131a0 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69 6e  xpr->pLeft;.  in
131b0 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33  t nVal = sqlite3
131c0 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
131d0 4c 65 66 74 29 3b 0a 20 20 53 65 6c 65 63 74 20  Left);.  Select 
131e0 2a 70 53 65 6c 65 63 74 20 3d 20 28 70 45 78 70  *pSelect = (pExp
131f0 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49  r->flags & EP_xI
13200 73 53 65 6c 65 63 74 29 20 3f 20 70 45 78 70 72  sSelect) ? pExpr
13210 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3a 20 30 3b  ->x.pSelect : 0;
13220 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a  .  char *zRet;..
13230 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
13240 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20  >op==TK_IN );.  
13250 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62  zRet = sqlite3Db
13260 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73  MallocZero(pPars
13270 65 2d 3e 64 62 2c 20 6e 56 61 6c 2b 31 29 3b 0a  e->db, nVal+1);.
13280 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0a 20 20    if( zRet ){.  
13290 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
132a0 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b  (i=0; i<nVal; i+
132b0 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
132c0 70 41 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74  pA = sqlite3Vect
132d0 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70  orFieldSubexpr(p
132e0 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Left, i);.      
132f0 63 68 61 72 20 61 20 3d 20 73 71 6c 69 74 65 33  char a = sqlite3
13300 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 41 29  ExprAffinity(pA)
13310 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c  ;.      if( pSel
13320 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ect ){.        z
13330 52 65 74 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33  Ret[i] = sqlite3
13340 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
13350 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
13360 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 61 29 3b  >a[i].pExpr, a);
13370 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13380 20 20 20 20 20 20 7a 52 65 74 5b 69 5d 20 3d 20        zRet[i] = 
13390 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  a;.      }.    }
133a0 0a 20 20 20 20 7a 52 65 74 5b 6e 56 61 6c 5d 20  .    zRet[nVal] 
133b0 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 72 65  = '\0';.  }.  re
133c0 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e  turn zRet;.}.#en
133d0 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
133e0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
133f0 59 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65  Y./*.** Load the
13400 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 70 61   Parse object pa
13410 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
13420 74 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20  t argument with 
13430 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73  an error .** mes
13440 73 61 67 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  sage of the form
13450 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73  :.**.**   "sub-s
13460 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20 4e 20  elect returns N 
13470 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74  columns - expect
13480 65 64 20 4d 22 0a 2a 2f 20 20 20 0a 76 6f 69 64  ed M".*/   .void
13490 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63   sqlite3Subselec
134a0 74 45 72 72 6f 72 28 50 61 72 73 65 20 2a 70 50  tError(Parse *pP
134b0 61 72 73 65 2c 20 69 6e 74 20 6e 41 63 74 75 61  arse, int nActua
134c0 6c 2c 20 69 6e 74 20 6e 45 78 70 65 63 74 29 7b  l, int nExpect){
134d0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
134e0 46 6d 74 20 3d 20 22 73 75 62 2d 73 65 6c 65 63  Fmt = "sub-selec
134f0 74 20 72 65 74 75 72 6e 73 20 25 64 20 63 6f 6c  t returns %d col
13500 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20  umns - expected 
13510 25 64 22 3b 0a 20 20 73 71 6c 69 74 65 33 45 72  %d";.  sqlite3Er
13520 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 7a  rorMsg(pParse, z
13530 46 6d 74 2c 20 6e 41 63 74 75 61 6c 2c 20 6e 45  Fmt, nActual, nE
13540 78 70 65 63 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  xpect);.}.#endif
13550 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
13560 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72   code for scalar
13570 20 73 75 62 71 75 65 72 69 65 73 20 75 73 65 64   subqueries used
13580 20 61 73 20 61 20 73 75 62 71 75 65 72 79 20 65   as a subquery e
13590 78 70 72 65 73 73 69 6f 6e 2c 20 45 58 49 53 54  xpression, EXIST
135a0 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70 65 72  S,.** or IN oper
135b0 61 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65 73  ators.  Examples
135c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c  :.**.**     (SEL
135d0 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20  ECT a FROM b)   
135e0 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65         -- subque
135f0 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53  ry.**     EXISTS
13600 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
13610 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73  b)   -- EXISTS s
13620 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 78  ubquery.**     x
13630 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20   IN (4,5,11)    
13640 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20            -- IN 
13650 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69  operator with li
13660 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64  st on right-hand
13670 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49   side.**     x I
13680 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  N (SELECT a FROM
13690 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70   b)     -- IN op
136a0 65 72 61 74 6f 72 20 77 69 74 68 20 73 75 62 71  erator with subq
136b0 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68  uery on the righ
136c0 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70  t.**.** The pExp
136d0 72 20 70 61 72 61 6d 65 74 65 72 20 64 65 73 63  r parameter desc
136e0 72 69 62 65 73 20 74 68 65 20 65 78 70 72 65 73  ribes the expres
136f0 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69  sion that contai
13700 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65  ns the IN.** ope
13710 72 61 74 6f 72 20 6f 72 20 73 75 62 71 75 65 72  rator or subquer
13720 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  y..**.** If para
13730 6d 65 74 65 72 20 69 73 52 6f 77 69 64 20 69 73  meter isRowid is
13740 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
13750 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
13760 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a   is guaranteed.*
13770 2a 20 74 6f 20 62 65 20 6f 66 20 74 68 65 20 66  * to be of the f
13780 6f 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e 20  orm "<rowid> IN 
13790 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65 72  (?, ?, ?)", wher
137a0 65 20 3c 72 6f 77 69 64 3e 20 69 73 20 61 20 72  e <rowid> is a r
137b0 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 73  eference.** to s
137c0 6f 6d 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  ome integer key 
137d0 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c  column of a tabl
137e0 65 20 42 2d 54 72 65 65 2e 20 49 6e 20 74 68 69  e B-Tree. In thi
137f0 73 20 63 61 73 65 2c 20 75 73 65 20 61 6e 0a 2a  s case, use an.*
13800 2a 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 20  * intkey B-Tree 
13810 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74  to store the set
13820 20 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c 75   of IN(...) valu
13830 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  es instead of th
13840 65 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77  e usual.** (slow
13850 65 72 29 20 76 61 72 69 61 62 6c 65 20 6c 65 6e  er) variable len
13860 67 74 68 20 6b 65 79 73 20 42 2d 54 72 65 65 2e  gth keys B-Tree.
13870 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61  .**.** If rMayHa
13880 76 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65  veNull is non-ze
13890 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ro, that means t
138a0 68 61 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f  hat the operatio
138b0 6e 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e  n is an IN.** (n
138c0 6f 74 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45  ot a SELECT or E
138d0 58 49 53 54 53 29 20 61 6e 64 20 74 68 61 74 20  XISTS) and that 
138e0 74 68 65 20 52 48 53 20 6d 69 67 68 74 20 63 6f  the RHS might co
138f0 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a  ntains NULLs..**
13900 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e   All this routin
13910 65 20 64 6f 65 73 20 69 73 20 69 6e 69 74 69 61  e does is initia
13920 6c 69 7a 65 20 74 68 65 20 72 65 67 69 73 74 65  lize the registe
13930 72 20 67 69 76 65 6e 20 62 79 20 72 4d 61 79 48  r given by rMayH
13940 61 76 65 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 4e 55  aveNull.** to NU
13950 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67 20 72 6f 75  LL.  Calling rou
13960 74 69 6e 65 73 20 77 69 6c 6c 20 74 61 6b 65 20  tines will take 
13970 63 61 72 65 20 6f 66 20 63 68 61 6e 67 69 6e 67  care of changing
13980 20 74 68 69 73 20 72 65 67 69 73 74 65 72 0a 2a   this register.*
13990 2a 20 76 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e  * value to non-N
139a0 55 4c 4c 20 69 66 20 74 68 65 20 52 48 53 20 69  ULL if the RHS i
139b0 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a  s NULL-free..**.
139c0 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54 20  ** For a SELECT 
139d0 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61 74  or EXISTS operat
139e0 6f 72 2c 20 72 65 74 75 72 6e 20 74 68 65 20 72  or, return the r
139f0 65 67 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c  egister that hol
13a00 64 73 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  ds the.** result
13a10 2e 20 20 46 6f 72 20 61 20 6d 75 6c 74 69 2d 63  .  For a multi-c
13a20 6f 6c 75 6d 6e 20 53 45 4c 45 43 54 2c 20 74 68  olumn SELECT, th
13a30 65 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72  e result is stor
13a40 65 64 20 69 6e 20 61 20 63 6f 6e 74 69 67 75 6f  ed in a contiguo
13a50 75 73 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20 72  us.** array of r
13a60 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65  egisters and the
13a70 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
13a80 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6f 66   the register of
13a90 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a   the left-most.*
13aa0 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 2e  * result column.
13ab0 20 20 52 65 74 75 72 6e 20 30 20 66 6f 72 20 49    Return 0 for I
13ac0 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f 72 20 69  N operators or i
13ad0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
13ae0 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  s..*/.#ifndef SQ
13af0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
13b00 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f  RY.int sqlite3Co
13b10 64 65 53 75 62 73 65 6c 65 63 74 28 0a 20 20 50  deSubselect(.  P
13b20 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
13b30 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
13b40 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
13b50 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
13b60 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e         /* The IN
13b70 2c 20 53 45 4c 45 43 54 2c 20 6f 72 20 45 58 49  , SELECT, or EXI
13b80 53 54 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  STS operator */.
13b90 20 20 69 6e 74 20 72 48 61 73 4e 75 6c 6c 46 6c    int rHasNullFl
13ba0 61 67 2c 20 20 20 20 20 20 20 2f 2a 20 52 65 67  ag,       /* Reg
13bb0 69 73 74 65 72 20 74 68 61 74 20 72 65 63 6f 72  ister that recor
13bc0 64 73 20 77 68 65 74 68 65 72 20 4e 55 4c 4c 73  ds whether NULLs
13bd0 20 65 78 69 73 74 20 69 6e 20 52 48 53 20 2a 2f   exist in RHS */
13be0 0a 20 20 69 6e 74 20 69 73 52 6f 77 69 64 20 20  .  int isRowid  
13bf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
13c00 20 74 72 75 65 2c 20 4c 48 53 20 6f 66 20 49 4e   true, LHS of IN
13c10 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 72   operator is a r
13c20 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  owid */.){.  int
13c30 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20   jmpIfDynamic = 
13c40 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  -1;             
13c50 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d           /* One-
13c60 74 69 6d 65 20 74 65 73 74 20 61 64 64 72 65 73  time test addres
13c70 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67 20  s */.  int rReg 
13c80 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
13c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13ca0 2a 20 52 65 67 69 73 74 65 72 20 73 74 6f 72 69  * Register stori
13cb0 6e 67 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f 0a  ng resulting */.
13cc0 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
13cd0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
13ce0 65 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28  e);.  if( NEVER(
13cf0 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30  v==0) ) return 0
13d00 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
13d10 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
13d20 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 65 76 61 6c  ;..  /* The eval
13d30 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e  uation of the IN
13d40 2f 45 58 49 53 54 53 2f 53 45 4c 45 43 54 20 6d  /EXISTS/SELECT m
13d50 75 73 74 20 62 65 20 72 65 70 65 61 74 65 64 20  ust be repeated 
13d60 65 76 65 72 79 20 74 69 6d 65 20 69 74 0a 20 20  every time it.  
13d70 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  ** is encountere
13d80 64 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  d if any of the 
13d90 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75  following is tru
13da0 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  e:.  **.  **    
13db0 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  *  The right-han
13dc0 64 20 73 69 64 65 20 69 73 20 61 20 63 6f 72 72  d side is a corr
13dd0 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 0a  elated subquery.
13de0 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72    **    *  The r
13df0 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69  ight-hand side i
13e00 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s an expression 
13e10 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  list containing 
13e20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20  variables.  **  
13e30 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69    *  We are insi
13e40 64 65 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a  de a trigger.  *
13e50 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66  *.  ** If all of
13e60 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 66   the above are f
13e70 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61  alse, then we ca
13e80 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20  n run this code 
13e90 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73  just once.  ** s
13ea0 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c  ave the results,
13eb0 20 61 6e 64 20 72 65 75 73 65 20 74 68 65 20 73   and reuse the s
13ec0 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75  ame result on su
13ed0 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74  bsequent invocat
13ee0 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
13ef0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
13f00 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53  y(pExpr, EP_VarS
13f10 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6a 6d  elect) ){.    jm
13f20 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 73 71 6c  pIfDynamic = sql
13f30 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61  ite3CodeOnce(pPa
13f40 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  rse); VdbeCovera
13f50 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  ge(v);.  }..#ifn
13f60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13f70 45 58 50 4c 41 49 4e 0a 20 20 69 66 28 20 70 50  EXPLAIN.  if( pP
13f80 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
13f90 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d   ){.    char *zM
13fa0 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
13fb0 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ntf(pParse->db, 
13fc0 22 45 58 45 43 55 54 45 20 25 73 25 73 20 53 55  "EXECUTE %s%s SU
13fd0 42 51 55 45 52 59 20 25 64 22 2c 0a 20 20 20 20  BQUERY %d",.    
13fe0 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63      jmpIfDynamic
13ff0 3e 3d 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54  >=0?"":"CORRELAT
14000 45 44 20 22 2c 0a 20 20 20 20 20 20 20 20 70 45  ED ",.        pE
14010 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f 22  xpr->op==TK_IN?"
14020 4c 49 53 54 22 3a 22 53 43 41 4c 41 52 22 2c 0a  LIST":"SCALAR",.
14030 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
14040 69 4e 65 78 74 53 65 6c 65 63 74 49 64 0a 20 20  iNextSelectId.  
14050 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
14060 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
14070 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65  _Explain, pParse
14080 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20  ->iSelectId, 0, 
14090 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41  0, zMsg, P4_DYNA
140a0 4d 49 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  MIC);.  }.#endif
140b0 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
140c0 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
140d0 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
140e0 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20   int addr;      
140f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14100 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70  Address of OP_Op
14110 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
14120 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ruction */.     
14130 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
14140 45 78 70 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20  Expr->pLeft; /* 
14150 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  the LHS of the I
14160 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
14170 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
14180 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20  yInfo = 0;      
14190 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69  /* Key informati
141a0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  on */.      int 
141b0 6e 56 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nVal;           
141c0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
141d0 6f 66 20 76 65 63 74 6f 72 20 70 4c 65 66 74 20  of vector pLeft 
141e0 2a 2f 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20  */.      .      
141f0 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  nVal = sqlite3Ex
14200 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65  prVectorSize(pLe
14210 66 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ft);.      asser
14220 74 28 20 21 69 73 52 6f 77 69 64 20 7c 7c 20 6e  t( !isRowid || n
14230 56 61 6c 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20  Val==1 );..     
14240 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69 73   /* Whether this
14250 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c   is an 'x IN(SEL
14260 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27  ECT...)' or an '
14270 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29  x IN(<exprlist>)
14280 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65  '.      ** expre
14290 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64  ssion it is hand
142a0 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77 61 79  led the same way
142b0 2e 20 20 41 6e 20 65 70 68 65 6d 65 72 61 6c 20  .  An ephemeral 
142c0 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20  table is .      
142d0 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20 69  ** filled with i
142e0 6e 64 65 78 20 6b 65 79 73 20 72 65 70 72 65 73  ndex keys repres
142f0 65 6e 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c  enting the resul
14300 74 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20  ts from the .   
14310 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 6f 72 20     ** SELECT or 
14320 74 68 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a  the <exprlist>..
14330 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
14340 2a 20 49 66 20 74 68 65 20 27 78 27 20 65 78 70  * If the 'x' exp
14350 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
14360 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74 68  umn value, or th
14370 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20  e SELECT....    
14380 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72    ** statement r
14390 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20  eturns a column 
143a0 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20  value, then the 
143b0 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74  affinity of that
143c0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  .      ** column
143d0 20 69 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c   is used to buil
143e0 64 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73  d the index keys
143f0 2e 20 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e  . If both 'x' an
14400 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 53  d the.      ** S
14410 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65  ELECT... stateme
14420 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20  nt are columns, 
14430 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66  then numeric aff
14440 69 6e 69 74 79 20 69 73 20 75 73 65 64 0a 20 20  inity is used.  
14450 20 20 20 20 2a 2a 20 69 66 20 65 69 74 68 65 72      ** if either
14460 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45   column has NUME
14470 52 49 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61  RIC or INTEGER a
14480 66 66 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74  ffinity. If neit
14490 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 27 78 27  her.      ** 'x'
144a0 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e   nor the SELECT.
144b0 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65  .. statement are
144c0 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e   columns, then n
144d0 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a  umeric affinity.
144e0 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64        ** is used
144f0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14500 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
14510 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
14520 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
14530 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14540 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
14550 72 61 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ral, .          
14560 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 28  pExpr->iTable, (
14570 69 73 52 6f 77 69 64 3f 30 3a 6e 56 61 6c 29 29  isRowid?0:nVal))
14580 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  ;.      pKeyInfo
14590 20 3d 20 69 73 52 6f 77 69 64 20 3f 20 30 20 3a   = isRowid ? 0 :
145a0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
145b0 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  lloc(pParse->db,
145c0 20 6e 56 61 6c 2c 20 31 29 3b 0a 0a 20 20 20 20   nVal, 1);..    
145d0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
145e0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
145f0 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
14600 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a        /* Case 1:
14610 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53 45       expr IN (SE
14620 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20  LECT ...).      
14630 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
14640 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
14650 20 77 72 69 74 65 20 74 68 65 20 72 65 73 75 6c   write the resul
14660 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ts of the select
14670 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f 72   into the tempor
14680 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ary.        ** t
14690 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61  able allocated a
146a0 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e  nd opened above.
146b0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
146c0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
146d0 65 63 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ect = pExpr->x.p
146e0 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
146f0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
14700 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
14710 73 74 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73  st;..        ass
14720 65 72 74 28 20 21 69 73 52 6f 77 69 64 20 29 3b  ert( !isRowid );
14730 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 4c  .        if( pEL
14740 69 73 74 2d 3e 6e 45 78 70 72 21 3d 6e 56 61 6c  ist->nExpr!=nVal
14750 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
14760 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72  lite3SubselectEr
14770 72 6f 72 28 70 50 61 72 73 65 2c 20 70 45 4c 69  ror(pParse, pELi
14780 73 74 2d 3e 6e 45 78 70 72 2c 20 6e 56 61 6c 29  st->nExpr, nVal)
14790 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
147a0 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63  .          Selec
147b0 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20  tDest dest;.    
147c0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
147d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
147e0 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
147f0 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45 78  st, SRT_Set, pEx
14800 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20  pr->iTable);.   
14810 20 20 20 20 20 20 20 64 65 73 74 2e 7a 41 66 66         dest.zAff
14820 53 64 73 74 20 3d 20 65 78 70 72 49 4e 41 66 66  Sdst = exprINAff
14830 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 70 45  inity(pParse, pE
14840 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
14850 61 73 73 65 72 74 28 20 28 70 45 78 70 72 2d 3e  assert( (pExpr->
14860 69 54 61 62 6c 65 26 30 78 30 30 30 30 46 46 46  iTable&0x0000FFF
14870 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  F)==pExpr->iTabl
14880 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  e );.          p
14890 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d  Select->iLimit =
148a0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65   0;.          te
148b0 73 74 63 61 73 65 28 20 70 53 65 6c 65 63 74 2d  stcase( pSelect-
148c0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
148d0 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20  istinct );.     
148e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
148f0 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f 2a  KeyInfo==0 ); /*
14900 20 43 61 75 73 65 64 20 62 79 20 4f 4f 4d 20 69   Caused by OOM i
14910 6e 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  n sqlite3KeyInfo
14920 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20 20  Alloc() */.     
14930 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
14940 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
14950 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 20 29  Select, &dest) )
14960 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
14970 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
14980 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41 66  se->db, dest.zAf
14990 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20  fSdst);.        
149a0 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e      sqlite3KeyIn
149b0 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f  foUnref(pKeyInfo
149c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
149d0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
149e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
149f0 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
14a00 72 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41  rse->db, dest.zA
14a10 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20  ffSdst);.       
14a20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49     assert( pKeyI
14a30 6e 66 6f 21 3d 30 20 29 3b 20 2f 2a 20 4f 4f 4d  nfo!=0 ); /* OOM
14a40 20 77 69 6c 6c 20 63 61 75 73 65 20 65 78 69 74   will cause exit
14a50 20 61 66 74 65 72 20 73 71 6c 69 74 65 33 53 65   after sqlite3Se
14a60 6c 65 63 74 28 29 20 2a 2f 0a 20 20 20 20 20 20  lect() */.      
14a70 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
14a80 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  st!=0 );.       
14a90 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73     assert( pELis
14aa0 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  t->nExpr>0 );.  
14ab0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14ac0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
14ad0 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e  Writeable(pKeyIn
14ae0 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  fo) );.         
14af0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61 6c   for(i=0; i<nVal
14b00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
14b10 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 28 6e      Expr *p = (n
14b20 56 61 6c 3e 31 29 20 3f 20 73 71 6c 69 74 65 33  Val>1) ? sqlite3
14b30 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78  VectorFieldSubex
14b40 70 72 28 70 4c 65 66 74 2c 20 69 29 20 3a 20 70  pr(pLeft, i) : p
14b50 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Left;.          
14b60 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c    pKeyInfo->aCol
14b70 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 42 69  l[i] = sqlite3Bi
14b80 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
14b90 65 71 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  eq(.            
14ba0 20 20 20 20 70 50 61 72 73 65 2c 20 70 2c 20 70      pParse, p, p
14bb0 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
14bc0 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b  r.            );
14bd0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
14be0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
14bf0 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 45  se if( ALWAYS(pE
14c00 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29  xpr->x.pList!=0)
14c10 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
14c20 61 73 65 20 32 3a 20 20 20 20 20 65 78 70 72 20  ase 2:     expr 
14c30 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20  IN (exprlist).  
14c40 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
14c50 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70   ** For each exp
14c60 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61  ression, build a
14c70 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d  n index key from
14c80 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   the evaluation 
14c90 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  and.        ** s
14ca0 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20 74  tore it in the t
14cb0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
14cc0 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63  If <expr> is a c
14cd0 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a  olumn, then use.
14ce0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
14cf0 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79  columns affinity
14d00 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69   when building i
14d10 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65  ndex keys. If <e
14d20 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20  xpr> is not.    
14d30 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c      ** a column,
14d40 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66   use numeric aff
14d50 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a  inity..        *
14d60 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 61  /.        char a
14d70 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20  ffinity;        
14d80 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
14d90 6f 66 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  of the LHS of th
14da0 65 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20  e IN */.        
14db0 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45  int i;.        E
14dc0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
14dd0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
14de0 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
14df0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
14e00 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e  Item;.        in
14e10 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 0a 20  t r1, r2, r3;.. 
14e20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20         affinity 
14e30 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
14e40 69 6e 69 74 79 28 70 4c 65 66 74 29 3b 0a 20 20  inity(pLeft);.  
14e50 20 20 20 20 20 20 69 66 28 20 21 61 66 66 69 6e        if( !affin
14e60 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ity ){.         
14e70 20 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49   affinity = SQLI
14e80 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20  TE_AFF_BLOB;.   
14e90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
14ea0 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  f( pKeyInfo ){. 
14eb0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
14ec0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
14ed0 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49  sWriteable(pKeyI
14ee0 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20  nfo) );.        
14ef0 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c    pKeyInfo->aCol
14f00 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 45 78  l[0] = sqlite3Ex
14f10 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
14f20 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
14f30 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
14f40 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
14f50 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73  ugh each express
14f60 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74  ion in <exprlist
14f70 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 31  >. */.        r1
14f80 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
14f90 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
14fa0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
14fb0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
14fc0 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  rse);.        if
14fd0 28 20 69 73 52 6f 77 69 64 20 29 20 73 71 6c 69  ( isRowid ) sqli
14fe0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14ff0 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32 29   OP_Null, 0, r2)
15000 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
15010 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49  pList->nExpr, pI
15020 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e  tem=pList->a; i>
15030 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; i--, pItem++)
15040 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
15050 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70   *pE2 = pItem->p
15060 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
15070 69 6e 74 20 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a  int iValToIns;..
15080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
15090 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
150a0 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74  s not constant t
150b0 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  hen we will need
150c0 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   to.          **
150d0 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 73   disable the tes
150e0 74 20 74 68 61 74 20 77 61 73 20 67 65 6e 65 72  t that was gener
150f0 61 74 65 64 20 61 62 6f 76 65 20 74 68 61 74 20  ated above that 
15100 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20  makes sure.     
15110 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64       ** this cod
15120 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20  e only executes 
15130 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20 66  once.  Because f
15140 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e  or a non-constan
15150 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  t.          ** e
15160 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65  xpression we nee
15170 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20  d to rerun this 
15180 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a  code each time..
15190 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
151a0 20 20 20 20 20 20 20 69 66 28 20 6a 6d 70 49 66         if( jmpIf
151b0 44 79 6e 61 6d 69 63 3e 3d 30 20 26 26 20 21 73  Dynamic>=0 && !s
151c0 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
151d0 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20  tant(pE2) ){.   
151e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
151f0 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
15200 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63  (v, jmpIfDynamic
15210 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  );.            j
15220 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31  mpIfDynamic = -1
15230 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
15240 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c           /* Eval
15250 75 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73  uate the express
15260 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69  ion and insert i
15270 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20  t into the temp 
15280 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
15290 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 26     if( isRowid &
152a0 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  & sqlite3ExprIsI
152b0 6e 74 65 67 65 72 28 70 45 32 2c 20 26 69 56 61  nteger(pE2, &iVa
152c0 6c 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20 20  lToIns) ){.     
152d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
152e0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
152f0 6e 73 65 72 74 49 6e 74 2c 20 70 45 78 70 72 2d  nsertInt, pExpr-
15300 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 69 56 61  >iTable, r2, iVa
15310 6c 54 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20 20  lToIns);.       
15320 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15330 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74        r3 = sqlit
15340 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
15350 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20 72 31  (pParse, pE2, r1
15360 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
15370 66 28 20 69 73 52 6f 77 69 64 20 29 7b 0a 20 20  f( isRowid ){.  
15380 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
15390 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
153a0 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72   OP_MustBeInt, r
153b0 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  3,.             
153c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75     sqlite3VdbeCu
153e0 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b  rrentAddr(v)+2);
153f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56  .              V
15400 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
15410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
15420 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
15430 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 45  v, OP_Insert, pE
15440 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c  xpr->iTable, r2,
15450 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r3);.          
15460 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15470 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15480 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
15490 61 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31  akeRecord, r3, 1
154a0 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c  , r2, &affinity,
154b0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   1);.           
154c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
154d0 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
154e0 65 28 70 50 61 72 73 65 2c 20 72 33 2c 20 31 29  e(pParse, r3, 1)
154f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
15500 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15510 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
15520 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
15530 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 20  , r2);.         
15540 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
15550 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15560 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
15570 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
15580 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r1);.        sq
15590 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
155a0 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
155b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
155c0 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  f( pKeyInfo ){. 
155d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
155e0 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64  beChangeP4(v, ad
155f0 64 72 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65 79  dr, (void *)pKey
15600 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
15610 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
15620 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
15630 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
15640 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
15650 45 4c 45 43 54 3a 0a 20 20 20 20 64 65 66 61 75  ELECT:.    defau
15660 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 43  lt: {.      /* C
15670 61 73 65 20 33 3a 20 20 20 20 28 53 45 4c 45 43  ase 3:    (SELEC
15680 54 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29 0a  T ... FROM ...).
15690 20 20 20 20 20 20 2a 2a 20 20 20 20 20 6f 72 3a        **     or:
156a0 20 20 20 20 45 58 49 53 54 53 28 53 45 4c 45 43      EXISTS(SELEC
156b0 54 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29 0a  T ... FROM ...).
156c0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
156d0 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54 2c 20  * For a SELECT, 
156e0 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  generate code to
156f0 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 73 20   put the values 
15700 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20  for all columns 
15710 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  of.      ** the 
15720 66 69 72 73 74 20 72 6f 77 20 69 6e 74 6f 20 61  first row into a
15730 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73  n array of regis
15740 74 65 72 73 20 61 6e 64 20 72 65 74 75 72 6e 20  ters and return 
15750 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 20 20 20  the index of.   
15760 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20     ** the first 
15770 72 65 67 69 73 74 65 72 2e 0a 20 20 20 20 20 20  register..      
15780 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
15790 68 69 73 20 69 73 20 61 6e 20 45 58 49 53 54 53  his is an EXISTS
157a0 2c 20 77 72 69 74 65 20 61 6e 20 69 6e 74 65 67  , write an integ
157b0 65 72 20 30 20 28 6e 6f 74 20 65 78 69 73 74 73  er 0 (not exists
157c0 29 20 6f 72 20 31 20 28 65 78 69 73 74 73 29 0a  ) or 1 (exists).
157d0 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 20        ** into a 
157e0 72 65 67 69 73 74 65 72 20 61 6e 64 20 72 65 74  register and ret
157f0 75 72 6e 20 74 68 61 74 20 72 65 67 69 73 74 65  urn that registe
15800 72 20 6e 75 6d 62 65 72 2e 0a 20 20 20 20 20 20  r number..      
15810 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 62  **.      ** In b
15820 6f 74 68 20 63 61 73 65 73 2c 20 74 68 65 20 71  oth cases, the q
15830 75 65 72 79 20 69 73 20 61 75 67 6d 65 6e 74 65  uery is augmente
15840 64 20 77 69 74 68 20 22 4c 49 4d 49 54 20 31 22  d with "LIMIT 1"
15850 2e 20 20 41 6e 79 20 0a 20 20 20 20 20 20 2a 2a  .  Any .      **
15860 20 70 72 65 65 78 69 73 74 69 6e 67 20 6c 69 6d   preexisting lim
15870 69 74 20 69 73 20 64 69 73 63 61 72 64 65 64 20  it is discarded 
15880 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20  in place of the 
15890 6e 65 77 20 4c 49 4d 49 54 20 31 2e 0a 20 20 20  new LIMIT 1..   
158a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65     */.      Sele
158b0 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 20 20  ct *pSel;       
158c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158d0 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74    /* SELECT stat
158e0 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20  ement to encode 
158f0 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  */.      SelectD
15900 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 20  est dest;       
15910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15920 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c 20 77 69  * How to deal wi
15930 74 68 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74  th SELECT result
15940 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 52   */.      int nR
15950 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
15960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15970 2f 2a 20 52 65 67 69 73 74 65 72 73 20 74 6f 20  /* Registers to 
15980 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20 20 20  allocate */..   
15990 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
159a0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54  pr->op==TK_EXIST
159b0 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
159c0 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
159d0 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20  TK_SELECT );.   
159e0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
159f0 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20  ->op==TK_EXISTS 
15a00 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
15a10 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20  _SELECT );.     
15a20 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
15a30 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
15a40 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
15a50 0a 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70  ..      pSel = p
15a60 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b  Expr->x.pSelect;
15a70 0a 20 20 20 20 20 20 6e 52 65 67 20 3d 20 70 45  .      nReg = pE
15a80 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
15a90 43 54 20 3f 20 70 53 65 6c 2d 3e 70 45 4c 69 73  CT ? pSel->pELis
15aa0 74 2d 3e 6e 45 78 70 72 20 3a 20 31 3b 0a 20 20  t->nExpr : 1;.  
15ab0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
15ac0 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
15ad0 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d   0, pParse->nMem
15ae0 2b 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  +1);.      pPars
15af0 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b  e->nMem += nReg;
15b00 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
15b10 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
15b20 29 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e  ){.        dest.
15b30 65 44 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b  eDest = SRT_Mem;
15b40 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 69 53  .        dest.iS
15b50 64 73 74 20 3d 20 64 65 73 74 2e 69 53 44 50 61  dst = dest.iSDPa
15b60 72 6d 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74  rm;.        dest
15b70 2e 6e 53 64 73 74 20 3d 20 6e 52 65 67 3b 0a 20  .nSdst = nReg;. 
15b80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15b90 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
15ba0 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 53 44  ull, 0, dest.iSD
15bb0 50 61 72 6d 2c 20 64 65 73 74 2e 69 53 44 50 61  Parm, dest.iSDPa
15bc0 72 6d 2b 6e 52 65 67 2d 31 29 3b 0a 20 20 20 20  rm+nReg-1);.    
15bd0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
15be0 28 76 2c 20 22 49 6e 69 74 20 73 75 62 71 75 65  (v, "Init subque
15bf0 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20  ry result"));.  
15c00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15c10 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20     dest.eDest = 
15c20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20 20  SRT_Exists;.    
15c30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15c40 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
15c50 67 65 72 2c 20 30 2c 20 64 65 73 74 2e 69 53 44  ger, 0, dest.iSD
15c60 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56  Parm);.        V
15c70 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
15c80 49 6e 69 74 20 45 58 49 53 54 53 20 72 65 73 75  Init EXISTS resu
15c90 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lt"));.      }. 
15ca0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
15cb0 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
15cc0 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 29  b, pSel->pLimit)
15cd0 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c  ;.      pSel->pL
15ce0 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50 45  imit = sqlite3PE
15cf0 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49  xpr(pParse, TK_I
15d00 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c 0a 20 20  NTEGER, 0, 0,.  
15d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d30 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e  &sqlite3IntToken
15d40 73 5b 31 5d 29 3b 0a 20 20 20 20 20 20 70 53 65  s[1]);.      pSe
15d50 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  l->iLimit = 0;. 
15d60 20 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c       pSel->selFl
15d70 61 67 73 20 26 3d 20 7e 53 46 5f 4d 75 6c 74 69  ags &= ~SF_Multi
15d80 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 69 66 28  Value;.      if(
15d90 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
15da0 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 26 64 65  Parse, pSel, &de
15db0 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  st) ){.        r
15dc0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
15dd0 0a 20 20 20 20 20 20 72 52 65 67 20 3d 20 64 65  .      rReg = de
15de0 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20  st.iSDParm;.    
15df0 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70    ExprSetVVAProp
15e00 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e  erty(pExpr, EP_N
15e10 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20  oReduce);.      
15e20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
15e30 0a 0a 20 20 69 66 28 20 72 48 61 73 4e 75 6c 6c  ..  if( rHasNull
15e40 46 6c 61 67 20 29 7b 0a 20 20 20 20 73 71 6c 69  Flag ){.    sqli
15e50 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61  te3SetHasNullFla
15e60 67 28 76 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  g(v, pExpr->iTab
15e70 6c 65 2c 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67  le, rHasNullFlag
15e80 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6a 6d  );.  }..  if( jm
15e90 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20 29 7b  pIfDynamic>=0 ){
15ea0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15eb0 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 49  JumpHere(v, jmpI
15ec0 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20 7d 0a 20  fDynamic);.  }. 
15ed0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
15ee0 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 0a 20  ePop(pParse);.. 
15ef0 20 72 65 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a   return rReg;.}.
15f00 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
15f10 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
15f20 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
15f30 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
15f40 2f 2a 0a 2a 2a 20 45 78 70 72 20 70 49 6e 20 69  /*.** Expr pIn i
15f50 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 65 78 70  s an IN(...) exp
15f60 72 65 73 73 69 6f 6e 2e 20 54 68 69 73 20 66 75  ression. This fu
15f70 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 74 68  nction checks th
15f80 61 74 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d 73  at the .** sub-s
15f90 65 6c 65 63 74 20 6f 6e 20 74 68 65 20 52 48 53  elect on the RHS
15fa0 20 6f 66 20 74 68 65 20 49 4e 28 29 20 6f 70 65   of the IN() ope
15fb0 72 61 74 6f 72 20 68 61 73 20 74 68 65 20 73 61  rator has the sa
15fc0 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a  me number of .**
15fd0 20 63 6f 6c 75 6d 6e 73 20 61 73 20 74 68 65 20   columns as the 
15fe0 76 65 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48  vector on the LH
15ff0 53 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 52 48  S. Or, if the RH
16000 53 20 6f 66 20 74 68 65 20 49 4e 28 29 20 69 73  S of the IN() is
16010 20 6e 6f 74 20 0a 2a 2a 20 61 20 73 75 62 2d 71   not .** a sub-q
16020 75 65 72 79 2c 20 74 68 61 74 20 74 68 65 20 4c  uery, that the L
16030 48 53 20 69 73 20 61 20 76 65 63 74 6f 72 20 6f  HS is a vector o
16040 66 20 73 69 7a 65 20 31 2e 0a 2a 2f 0a 69 6e 74  f size 1..*/.int
16050 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
16060 6b 49 4e 28 50 61 72 73 65 20 2a 70 50 61 72 73  kIN(Parse *pPars
16070 65 2c 20 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20  e, Expr *pIn){. 
16080 20 69 6e 74 20 6e 56 65 63 74 6f 72 20 3d 20 73   int nVector = s
16090 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
160a0 53 69 7a 65 28 70 49 6e 2d 3e 70 4c 65 66 74 29  Size(pIn->pLeft)
160b0 3b 0a 20 20 69 66 28 20 28 70 49 6e 2d 3e 66 6c  ;.  if( (pIn->fl
160c0 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65  ags & EP_xIsSele
160d0 63 74 29 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ct) ){.    if( n
160e0 56 65 63 74 6f 72 21 3d 70 49 6e 2d 3e 78 2e 70  Vector!=pIn->x.p
160f0 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
16100 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73  nExpr ){.      s
16110 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45  qlite3SubselectE
16120 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 49 6e  rror(pParse, pIn
16130 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
16140 69 73 74 2d 3e 6e 45 78 70 72 2c 20 6e 56 65 63  ist->nExpr, nVec
16150 74 6f 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  tor);.      retu
16160 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  rn 1;.    }.  }e
16170 6c 73 65 20 69 66 28 20 6e 56 65 63 74 6f 72 21  lse if( nVector!
16180 3d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70  =1 ){.    if( (p
16190 49 6e 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73  In->pLeft->flags
161a0 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29   & EP_xIsSelect)
161b0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
161c0 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28  3SubselectError(
161d0 70 50 61 72 73 65 2c 20 6e 56 65 63 74 6f 72 2c  pParse, nVector,
161e0 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   1);.    }else{.
161f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
16200 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69  orMsg(pParse, "i
16210 6e 76 61 6c 69 64 20 75 73 65 20 6f 66 20 72 6f  nvalid use of ro
16220 77 20 76 61 6c 75 65 22 29 3b 0a 20 20 20 20 7d  w value");.    }
16230 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
16240 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
16250 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
16260 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
16270 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  QUERY./*.** Gene
16280 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e  rate code for an
16290 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a   IN expression..
162a0 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20  **.**      x IN 
162b0 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20  (SELECT ...).** 
162c0 20 20 20 20 20 78 20 49 4e 20 28 76 61 6c 75 65       x IN (value
162d0 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a  , value, ...).**
162e0 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68 61 6e  .** The left-han
162f0 64 20 73 69 64 65 20 28 4c 48 53 29 20 69 73 20  d side (LHS) is 
16300 61 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73  a scalar express
16310 69 6f 6e 2e 20 20 54 68 65 20 72 69 67 68 74 2d  ion.  The right-
16320 68 61 6e 64 20 73 69 64 65 20 28 52 48 53 29 0a  hand side (RHS).
16330 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f  ** is an array o
16340 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 76  f zero or more v
16350 61 6c 75 65 73 2e 20 20 54 68 65 20 65 78 70 72  alues.  The expr
16360 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 69  ession is true i
16370 66 20 74 68 65 20 4c 48 53 20 69 73 0a 2a 2a 20  f the LHS is.** 
16380 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
16390 20 74 68 65 20 52 48 53 2e 20 20 54 68 65 20 76   the RHS.  The v
163a0 61 6c 75 65 20 6f 66 20 74 68 65 20 65 78 70 72  alue of the expr
163b0 65 73 73 69 6f 6e 20 69 73 20 75 6e 6b 6e 6f 77  ession is unknow
163c0 6e 20 28 4e 55 4c 4c 29 0a 2a 2a 20 69 66 20 74  n (NULL).** if t
163d0 68 65 20 4c 48 53 20 69 73 20 4e 55 4c 4c 20 6f  he LHS is NULL o
163e0 72 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20  r if the LHS is 
163f0 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  not contained wi
16400 74 68 69 6e 20 74 68 65 20 52 48 53 20 61 6e 64  thin the RHS and
16410 20 74 68 65 0a 2a 2a 20 52 48 53 20 63 6f 6e 74   the.** RHS cont
16420 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
16430 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a   NULL values..**
16440 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
16450 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
16460 74 68 61 74 20 6a 75 6d 70 73 20 74 6f 20 64 65  that jumps to de
16470 73 74 49 66 46 61 6c 73 65 20 69 66 20 74 68 65  stIfFalse if the
16480 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a 2a 20   LHS is not .** 
16490 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
164a0 20 74 68 65 20 52 48 53 2e 20 20 49 66 20 64 75   the RHS.  If du
164b0 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20 63 61  e to NULLs we ca
164c0 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 69  nnot determine i
164d0 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69 73 20  f the LHS.** is 
164e0 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
164f0 20 52 48 53 20 74 68 65 6e 20 6a 75 6d 70 20 74   RHS then jump t
16500 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49  o destIfNull.  I
16510 66 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e  f the LHS is con
16520 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e  tained.** within
16530 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 66 61   the RHS then fa
16540 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 73  ll through..*/.s
16550 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
16560 65 33 45 78 70 72 43 6f 64 65 49 4e 28 0a 20 20  e3ExprCodeIN(.  
16570 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
16580 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
16590 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
165a0 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
165b0 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
165c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49          /* The I
165d0 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  N expression */.
165e0 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73    int destIfFals
165f0 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  e,      /* Jump 
16600 68 65 72 65 20 69 66 20 4c 48 53 20 69 73 20 6e  here if LHS is n
16610 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
16620 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74  the RHS */.  int
16630 20 64 65 73 74 49 66 4e 75 6c 6c 20 20 20 20 20   destIfNull     
16640 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
16650 69 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 61  if the results a
16660 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74  re unknown due t
16670 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20  o NULLs */.){.  
16680 69 6e 74 20 72 52 68 73 48 61 73 4e 75 6c 6c 20  int rRhsHasNull 
16690 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69 73 74 65  = 0;  /* Registe
166a0 72 20 74 68 61 74 20 69 73 20 74 72 75 65 20 69  r that is true i
166b0 66 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e  f RHS contains N
166c0 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  ULL values */.  
166d0 69 6e 74 20 65 54 79 70 65 3b 20 20 20 20 20 20  int eType;      
166e0 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
166f0 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e   the RHS */.  in
16700 74 20 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  t r1;           
16710 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
16720 20 75 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f   use register */
16730 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
16740 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
16750 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73  ement under cons
16760 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
16770 74 20 2a 61 69 4d 61 70 20 3d 20 30 3b 20 20 20  t *aiMap = 0;   
16780 20 20 20 20 2f 2a 20 4d 61 70 20 66 72 6f 6d 20      /* Map from 
16790 76 65 63 74 6f 72 20 66 69 65 6c 64 20 74 6f 20  vector field to 
167a0 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  index column */.
167b0 20 20 63 68 61 72 20 2a 7a 41 66 66 20 3d 20 30    char *zAff = 0
167c0 3b 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e  ;       /* Affin
167d0 69 74 79 20 73 74 72 69 6e 67 20 66 6f 72 20 63  ity string for c
167e0 6f 6d 70 61 72 69 73 6f 6e 73 20 2a 2f 0a 20 20  omparisons */.  
167f0 69 6e 74 20 6e 56 65 63 74 6f 72 3b 20 20 20 20  int nVector;    
16800 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
16810 20 76 65 63 74 6f 72 73 20 66 6f 72 20 74 68 69   vectors for thi
16820 73 20 49 4e 28 2e 2e 2e 29 20 6f 70 20 2a 2f 0a  s IN(...) op */.
16830 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
16840 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
16850 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 73 71  int i;..  if( sq
16860 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 49 4e  lite3ExprCheckIN
16870 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 20  (pParse, pExpr) 
16880 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 41 66 66  ) return;.  zAff
16890 20 3d 20 65 78 70 72 49 4e 41 66 66 69 6e 69 74   = exprINAffinit
168a0 79 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  y(pParse, pExpr)
168b0 3b 0a 20 20 69 66 28 20 7a 41 66 66 3d 3d 30 20  ;.  if( zAff==0 
168c0 29 20 72 65 74 75 72 6e 3b 0a 20 20 6e 56 65 63  ) return;.  nVec
168d0 74 6f 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  tor = sqlite3Exp
168e0 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70  rVectorSize(pExp
168f0 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 61 69 4d  r->pLeft);.  aiM
16900 61 70 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74  ap = (int*)sqlit
16910 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a  e3DbMallocZero(.
16920 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62        pParse->db
16930 2c 20 6e 56 65 63 74 6f 72 2a 28 73 69 7a 65 6f  , nVector*(sizeo
16940 66 28 69 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28  f(int) + sizeof(
16950 63 68 61 72 29 29 20 2b 20 31 0a 20 20 29 3b 0a  char)) + 1.  );.
16960 20 20 69 66 28 20 61 69 4d 61 70 3d 3d 30 20 29    if( aiMap==0 )
16970 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
16980 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
16990 7a 41 66 66 29 3b 0a 20 20 20 20 72 65 74 75 72  zAff);.    retur
169a0 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 74  n;.  }..  /* Att
169b0 65 6d 70 74 20 74 6f 20 63 6f 6d 70 75 74 65 20  empt to compute 
169c0 74 68 65 20 52 48 53 2e 20 41 66 74 65 72 20 74  the RHS. After t
169d0 68 69 73 20 73 74 65 70 2c 20 69 66 20 61 6e 79  his step, if any
169e0 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
169f0 0a 20 20 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4e  .  ** IN_INDEX_N
16a00 4f 4f 50 20 69 73 20 72 65 74 75 72 6e 65 64 2c  OOP is returned,
16a10 20 74 68 65 20 74 61 62 6c 65 20 6f 70 65 6e 65   the table opene
16a20 64 20 69 74 68 20 63 75 72 73 6f 72 20 70 45 78  d ith cursor pEx
16a30 70 72 2d 3e 69 54 61 62 6c 65 20 0a 20 20 2a 2a  pr->iTable .  **
16a40 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
16a50 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75  lues that make u
16a60 70 20 74 68 65 20 52 48 53 2e 20 49 66 20 49 4e  p the RHS. If IN
16a70 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72  _INDEX_NOOP is r
16a80 65 74 75 72 6e 65 64 2c 0a 20 20 2a 2a 20 74 68  eturned,.  ** th
16a90 65 20 52 48 53 20 68 61 73 20 6e 6f 74 20 79 65  e RHS has not ye
16aa0 74 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 20 2a  t been coded.  *
16ab0 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  /.  v = pParse->
16ac0 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
16ad0 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f   v!=0 );       /
16ae0 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65 64 20 70  * OOM detected p
16af0 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75  rior to this rou
16b00 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  tine */.  VdbeNo
16b10 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62  opComment((v, "b
16b20 65 67 69 6e 20 49 4e 20 65 78 70 72 22 29 29 3b  egin IN expr"));
16b30 0a 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74  .  eType = sqlit
16b40 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50  e3FindInIndex(pP
16b50 61 72 73 65 2c 20 70 45 78 70 72 2c 0a 20 20 20  arse, pExpr,.   
16b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b70 20 20 20 20 20 20 20 20 20 20 49 4e 5f 49 4e 44            IN_IND
16b80 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 7c 20  EX_MEMBERSHIP | 
16b90 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b  IN_INDEX_NOOP_OK
16ba0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
16bc0 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74  estIfFalse==dest
16bd0 49 66 4e 75 6c 6c 20 3f 20 30 20 3a 20 26 72 52  IfNull ? 0 : &rR
16be0 68 73 48 61 73 4e 75 6c 6c 2c 20 61 69 4d 61 70  hsHasNull, aiMap
16bf0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
16c00 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 6e 56  arse->nErr || nV
16c10 65 63 74 6f 72 3d 3d 31 20 7c 7c 20 65 54 79 70  ector==1 || eTyp
16c20 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 45 50 48 0a  e==IN_INDEX_EPH.
16c30 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
16c40 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f  =IN_INDEX_INDEX_
16c50 41 53 43 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e  ASC || eType==IN
16c60 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53  _INDEX_INDEX_DES
16c70 43 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f  C .  );..  /* Co
16c80 64 65 20 74 68 65 20 4c 48 53 2c 20 74 68 65 20  de the LHS, the 
16c90 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78  <expr> from "<ex
16ca0 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 49  pr> IN (...)". I
16cb0 66 20 74 68 65 20 4c 48 53 20 69 73 20 61 20 0a  f the LHS is a .
16cc0 20 20 2a 2a 20 76 65 63 74 6f 72 2c 20 74 68 65    ** vector, the
16cd0 6e 20 69 74 20 69 73 20 73 74 6f 72 65 64 20 69  n it is stored i
16ce0 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6e 56  n an array of nV
16cf0 65 63 74 6f 72 20 72 65 67 69 73 74 65 72 73 20  ector registers 
16d00 73 74 61 72 74 69 6e 67 20 0a 20 20 2a 2a 20 61  starting .  ** a
16d10 74 20 72 31 2e 0a 20 20 2a 2f 0a 20 20 72 31 20  t r1..  */.  r1 
16d20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
16d30 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 56  Range(pParse, nV
16d40 65 63 74 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65  ector);.  sqlite
16d50 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
16d60 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 6e 56  Parse);.  if( nV
16d70 65 63 74 6f 72 3e 31 20 26 26 20 28 70 4c 65 66  ector>1 && (pLef
16d80 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49  t->flags & EP_xI
16d90 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
16da0 69 6e 74 20 72 65 67 53 65 6c 65 63 74 20 3d 20  int regSelect = 
16db0 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
16dc0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 4c 65  lect(pParse, pLe
16dd0 66 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 66  ft, 0, 0);.    f
16de0 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f  or(i=0; i<nVecto
16df0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  r; i++){.      s
16e00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
16e10 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67  (v, OP_Copy, reg
16e20 53 65 6c 65 63 74 2b 69 2c 20 72 31 2b 61 69 4d  Select+i, r1+aiM
16e30 61 70 5b 69 5d 2c 20 30 29 3b 0a 20 20 20 20 7d  ap[i], 0);.    }
16e40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
16e50 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72  r(i=0; i<nVector
16e60 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
16e70 70 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69 74  pr *pLhs = sqlit
16e80 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62  e3VectorFieldSub
16e90 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a  expr(pLeft, i);.
16ea0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
16eb0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c  rCode(pParse, pL
16ec0 68 73 2c 20 72 31 2b 61 69 4d 61 70 5b 69 5d 29  hs, r1+aiMap[i])
16ed0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
16ee0 2a 20 49 66 20 73 71 6c 69 74 65 33 46 69 6e 64  * If sqlite3Find
16ef0 49 6e 49 6e 64 65 78 28 29 20 64 69 64 20 6e 6f  InIndex() did no
16f00 74 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65  t find or create
16f10 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69   an index that i
16f20 73 0a 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20  s.  ** suitable 
16f30 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20 74  for evaluating t
16f40 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20  he IN operator, 
16f50 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20 75 73  then evaluate us
16f60 69 6e 67 20 61 0a 20 20 2a 2a 20 73 65 71 75 65  ing a.  ** seque
16f70 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  nce of compariso
16f80 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ns..  */.  if( e
16f90 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 4e  Type==IN_INDEX_N
16fa0 4f 4f 50 20 29 7b 0a 20 20 20 20 45 78 70 72 4c  OOP ){.    ExprL
16fb0 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
16fc0 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
16fd0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
16fe0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
16ff0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
17000 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
17010 69 6e 74 20 6c 61 62 65 6c 4f 6b 20 3d 20 73 71  int labelOk = sq
17020 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
17030 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74 20 72  el(v);.    int r
17040 32 2c 20 72 65 67 54 6f 46 72 65 65 3b 0a 20 20  2, regToFree;.  
17050 20 20 69 6e 74 20 72 65 67 43 6b 4e 75 6c 6c 20    int regCkNull 
17060 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b  = 0;.    int ii;
17070 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
17080 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
17090 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
170a0 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 64 65  t) );.    if( de
170b0 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66  stIfNull!=destIf
170c0 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 72  False ){.      r
170d0 65 67 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c 69 74  egCkNull = sqlit
170e0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
170f0 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
17100 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
17110 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 31 2c 20   OP_BitAnd, r1, 
17120 72 31 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a  r1, regCkNull);.
17130 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
17140 3d 30 3b 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45  =0; ii<pList->nE
17150 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  xpr; ii++){.    
17160 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
17170 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
17180 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e  e, pList->a[ii].
17190 70 45 78 70 72 2c 20 26 72 65 67 54 6f 46 72 65  pExpr, &regToFre
171a0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65  e);.      if( re
171b0 67 43 6b 4e 75 6c 6c 20 26 26 20 73 71 6c 69 74  gCkNull && sqlit
171c0 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28  e3ExprCanBeNull(
171d0 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78  pList->a[ii].pEx
171e0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pr) ){.        s
171f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
17200 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72  (v, OP_BitAnd, r
17210 65 67 43 6b 4e 75 6c 6c 2c 20 72 32 2c 20 72 65  egCkNull, r2, re
17220 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  gCkNull);.      
17230 7d 0a 20 20 20 20 20 20 69 66 28 20 69 69 3c 70  }.      if( ii<p
17240 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 7c 7c  List->nExpr-1 ||
17250 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73   destIfNull!=des
17260 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20  tIfFalse ){.    
17270 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17280 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 71 2c 20  ddOp4(v, OP_Eq, 
17290 72 31 2c 20 6c 61 62 65 6c 4f 6b 2c 20 72 32 2c  r1, labelOk, r2,
172a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
172b0 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
172c0 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
172d0 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 56 64  SEQ);.        Vd
172e0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
172f0 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  ii<pList->nExpr-
17300 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  1);.        Vdbe
17310 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 69 69  CoverageIf(v, ii
17320 3d 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  ==pList->nExpr-1
17330 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
17340 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
17350 2c 20 7a 41 66 66 5b 30 5d 29 3b 0a 20 20 20 20  , zAff[0]);.    
17360 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17370 20 61 73 73 65 72 74 28 20 64 65 73 74 49 66 4e   assert( destIfN
17380 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73 65  ull==destIfFalse
17390 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
173a0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
173b0 20 4f 50 5f 4e 65 2c 20 72 31 2c 20 64 65 73 74   OP_Ne, r1, dest
173c0 49 66 46 61 6c 73 65 2c 20 72 32 2c 0a 20 20 20  IfFalse, r2,.   
173d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173e0 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43         (void*)pC
173f0 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
17400 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
17410 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
17420 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
17430 2c 20 7a 41 66 66 5b 30 5d 20 7c 20 53 51 4c 49  , zAff[0] | SQLI
17440 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
17450 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
17460 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
17470 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 54  Reg(pParse, regT
17480 6f 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20  oFree);.    }.  
17490 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20    if( regCkNull 
174a0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
174b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
174c0 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 43 6b 4e 75  _IsNull, regCkNu
174d0 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  ll, destIfNull);
174e0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
174f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
17500 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 49  dbeGoto(v, destI
17510 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 7d 0a 20  fFalse);.    }. 
17520 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
17530 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61  solveLabel(v, la
17540 62 65 6c 4f 6b 29 3b 0a 20 20 20 20 73 71 6c 69  belOk);.    sqli
17550 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
17560 67 28 70 50 61 72 73 65 2c 20 72 65 67 43 6b 4e  g(pParse, regCkN
17570 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ull);.  }else{. 
17580 20 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20   .    /* If any 
17590 76 61 6c 75 65 20 6f 6e 20 74 68 65 20 4c 48 53  value on the LHS
175a0 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65   is NULL, the re
175b0 73 75 6c 74 20 6f 66 20 74 68 65 20 49 4e 28 2e  sult of the IN(.
175c0 2e 2e 29 20 6f 70 65 72 61 74 6f 72 0a 20 20 20  ..) operator.   
175d0 20 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68   ** must be eith
175e0 65 72 20 66 61 6c 73 65 20 6f 72 20 4e 55 4c 4c  er false or NULL
175f0 2e 20 49 66 20 74 68 65 73 65 20 74 77 6f 20 61  . If these two a
17600 72 65 20 68 61 6e 64 6c 65 64 20 69 64 65 6e 74  re handled ident
17610 69 63 61 6c 6c 79 2c 0a 20 20 20 20 2a 2a 20 74  ically,.    ** t
17620 65 73 74 20 74 68 65 20 4c 48 53 20 66 6f 72 20  est the LHS for 
17630 4e 55 4c 4c 73 20 61 6e 64 20 6a 75 6d 70 20 64  NULLs and jump d
17640 69 72 65 63 74 6c 79 20 74 6f 20 64 65 73 74 49  irectly to destI
17650 66 4e 75 6c 6c 20 69 66 20 61 6e 79 20 61 72 65  fNull if any are
17660 0a 20 20 20 20 2a 2a 20 66 6f 75 6e 64 2e 20 0a  .    ** found. .
17670 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 74      **.    ** Ot
17680 68 65 72 77 69 73 65 2c 20 69 66 20 4e 55 4c 4c  herwise, if NULL
17690 20 61 6e 64 20 66 61 6c 73 65 20 61 72 65 20 68   and false are h
176a0 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74  andled different
176b0 6c 79 2c 20 61 6e 64 20 74 68 65 0a 20 20 20 20  ly, and the.    
176c0 2a 2a 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61  ** IN(...) opera
176d0 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61 20 76 65  tion is not a ve
176e0 63 74 6f 72 20 6f 70 65 72 61 74 69 6f 6e 2c 20  ctor operation, 
176f0 61 6e 64 20 74 68 65 20 4c 48 53 20 6f 66 20 74  and the LHS of t
17700 68 65 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  he.    ** operat
17710 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  or is NULL, then
17720 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 66   the result is f
17730 61 6c 73 65 20 69 66 20 74 68 65 20 69 6e 64 65  alse if the inde
17740 78 20 69 73 20 0a 20 20 20 20 2a 2a 20 63 6f 6d  x is .    ** com
17750 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2c 20 6f  pletely empty, o
17760 72 20 4e 55 4c 4c 20 6f 74 68 65 72 77 69 73 65  r NULL otherwise
17770 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 65  .  */.    if( de
17780 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66  stIfNull==destIf
17790 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 66  False ){.      f
177a0 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f  or(i=0; i<nVecto
177b0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
177c0 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74   Expr *p = sqlit
177d0 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62  e3VectorFieldSub
177e0 65 78 70 72 28 70 45 78 70 72 2d 3e 70 4c 65 66  expr(pExpr->pLef
177f0 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69  t, i);.        i
17800 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  f( sqlite3ExprCa
17810 6e 42 65 4e 75 6c 6c 28 70 29 20 29 7b 0a 20 20  nBeNull(p) ){.  
17820 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
17830 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17840 49 73 4e 75 6c 6c 2c 20 72 31 2b 61 69 4d 61 70  IsNull, r1+aiMap
17850 5b 69 5d 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  [i], destIfNull)
17860 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
17870 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
17880 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
17890 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 65     }else if( nVe
178a0 63 74 6f 72 3d 3d 31 20 26 26 20 73 71 6c 69 74  ctor==1 && sqlit
178b0 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28  e3ExprCanBeNull(
178c0 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 7b  pExpr->pLeft) ){
178d0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 31  .      int addr1
178e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
178f0 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  dOp1(v, OP_NotNu
17900 6c 6c 2c 20 72 31 29 3b 20 56 64 62 65 43 6f 76  ll, r1); VdbeCov
17910 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
17920 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17930 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
17940 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64  pExpr->iTable, d
17950 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20  estIfFalse);.   
17960 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
17970 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
17980 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73  3VdbeGoto(v, des
17990 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
179a0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
179b0 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
179c0 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
179d0 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
179e0 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 2f  ROWID ){.      /
179f0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  * In this case, 
17a00 74 68 65 20 52 48 53 20 69 73 20 74 68 65 20 52  the RHS is the R
17a10 4f 57 49 44 20 6f 66 20 74 61 62 6c 65 20 62 2d  OWID of table b-
17a20 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 73 71  tree */.      sq
17a30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
17a40 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c  v, OP_SeekRowid,
17a50 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
17a60 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31 29  destIfFalse, r1)
17a70 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
17a80 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 65 6c  rage(v);.    }el
17a90 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20  se{.      /* In 
17aa0 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 52  this case, the R
17ab0 48 53 20 69 73 20 61 6e 20 69 6e 64 65 78 20 62  HS is an index b
17ac0 2d 74 72 65 65 2e 20 41 70 70 6c 79 20 74 68 65  -tree. Apply the
17ad0 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20   comparison.    
17ae0 20 20 2a 2a 20 61 66 66 69 6e 69 74 69 65 73 20    ** affinities 
17af0 74 6f 20 65 61 63 68 20 76 61 6c 75 65 20 6f 6e  to each value on
17b00 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   the LHS of the 
17b10 6f 70 65 72 61 74 6f 72 2e 20 20 2a 2f 0a 20 20  operator.  */.  
17b20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17b30 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69  ddOp4(v, OP_Affi
17b40 6e 69 74 79 2c 20 72 31 2c 20 6e 56 65 63 74 6f  nity, r1, nVecto
17b50 72 2c 20 30 2c 20 7a 41 66 66 2c 20 6e 56 65 63  r, 0, zAff, nVec
17b60 74 6f 72 29 3b 0a 20 20 20 20 20 20 0a 20 20 20  tor);.      .   
17b70 20 20 20 69 66 28 20 6e 56 65 63 74 6f 72 3e 31     if( nVector>1
17b80 20 26 26 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d   && destIfNull!=
17b90 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20  destIfFalse ){. 
17ba0 20 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 20         int iIdx 
17bb0 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  = pExpr->iTable;
17bc0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64  .        int add
17bd0 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  r;.        int a
17be0 64 64 72 4e 65 78 74 3b 0a 0a 20 20 20 20 20 20  ddrNext;..      
17bf0 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20    /* Search the 
17c00 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65  index for the ke
17c10 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 64  y. */.        ad
17c20 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
17c30 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
17c40 46 6f 75 6e 64 2c 20 69 49 64 78 2c 20 30 2c 20  Found, iIdx, 0, 
17c50 72 31 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20  r1, nVector);.  
17c60 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
17c70 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 20 20  ge(v);..        
17c80 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
17c90 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6b   the specified k
17ca0 65 79 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e  ey is not presen
17cb0 74 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20  t in the index, 
17cc0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74  .        ** so t
17cd0 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
17ce0 20 49 4e 28 2e 2e 29 20 6f 70 65 72 61 74 6f 72   IN(..) operator
17cf0 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
17d00 4e 55 4c 4c 20 6f 72 0a 20 20 20 20 20 20 20 20  NULL or.        
17d10 2a 2a 20 30 2e 20 54 68 65 20 76 64 62 65 20 63  ** 0. The vdbe c
17d20 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 65  ode generated be
17d30 6c 6f 77 20 66 69 67 75 72 65 73 20 6f 75 74 20  low figures out 
17d40 77 68 69 63 68 2e 20 20 2a 2f 0a 20 20 20 20 20  which.  */.     
17d50 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20 31 2b     addrNext = 1+
17d60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17d70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
17d80 69 49 64 78 2c 20 64 65 73 74 49 66 46 61 6c 73  iIdx, destIfFals
17d90 65 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  e);.        Vdbe
17da0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
17db0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
17dc0 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a  <nVector; i++){.
17dd0 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
17de0 70 3b 0a 20 20 20 20 20 20 20 20 20 20 43 6f 6c  p;.          Col
17df0 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20  lSeq *pColl;.   
17e00 20 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20         int r2 = 
17e10 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
17e20 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
17e30 20 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33       p = sqlite3
17e40 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78  VectorFieldSubex
17e50 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20  pr(pLeft, i);.  
17e60 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
17e70 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
17e80 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 0a  eq(pParse, p);..
17e90 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17ea0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
17eb0 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 2c 20  P_Column, iIdx, 
17ec0 69 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20  i, r2);.        
17ed0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17ee0 4f 70 34 28 76 2c 20 4f 50 5f 45 71 2c 20 72 31  Op4(v, OP_Eq, r1
17ef0 2b 69 2c 20 30 2c 20 72 32 2c 20 28 76 6f 69 64  +i, 0, r2, (void
17f00 2a 29 70 43 6f 6c 6c 2c 50 34 5f 43 4f 4c 4c 53  *)pColl,P4_COLLS
17f10 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  EQ);.          s
17f20 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
17f30 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  P5(v, SQLITE_JUM
17f40 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
17f50 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
17f60 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  (v);.          s
17f70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17f80 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 49 64  (v, OP_Next, iId
17f90 78 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20  x, addrNext);.  
17fa0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
17fb0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
17fc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17fd0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
17fe0 20 30 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29   0, destIfFalse)
17ff0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
18000 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
18010 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  v, sqlite3VdbeCu
18020 72 72 65 6e 74 41 64 64 72 28 76 29 2d 33 29 3b  rrentAddr(v)-3);
18030 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
18040 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
18050 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
18060 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18070 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18080 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
18090 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 0a 20   destIfNull);.. 
180a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65         /* The ke
180b0 79 20 77 61 73 20 66 6f 75 6e 64 20 69 6e 20 74  y was found in t
180c0 68 65 20 69 6e 64 65 78 2e 20 49 66 20 69 74 20  he index. If it 
180d0 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c  contains any NUL
180e0 4c 20 76 61 6c 75 65 73 2c 0a 20 20 20 20 20 20  L values,.      
180f0 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65    ** then the re
18100 73 75 6c 74 20 6f 66 20 74 68 65 20 49 4e 28 2e  sult of the IN(.
18110 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20 69 73 20  ..) operator is 
18120 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73 65 2c  NULL. Otherwise,
18130 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
18140 72 65 73 75 6c 74 20 69 73 20 31 2e 20 20 2a 2f  result is 1.  */
18150 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18160 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
18170 61 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 66  addr);.        f
18180 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f  or(i=0; i<nVecto
18190 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
181a0 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c     Expr *p = sql
181b0 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53  ite3VectorFieldS
181c0 75 62 65 78 70 72 28 70 45 78 70 72 2d 3e 70 4c  ubexpr(pExpr->pL
181d0 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  eft, i);.       
181e0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
181f0 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 29 20 29  prCanBeNull(p) )
18200 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
18210 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18220 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31  v, OP_IsNull, r1
18230 2b 61 69 4d 61 70 5b 69 5d 2c 20 64 65 73 74 49  +aiMap[i], destI
18240 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  fNull);.        
18250 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
18260 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  (v);.          }
18270 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
18280 20 20 7d 65 6c 73 65 20 69 66 28 20 72 52 68 73    }else if( rRhs
18290 48 61 73 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20  HasNull==0 ){.  
182a0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
182b0 61 6e 63 68 20 72 75 6e 73 20 69 66 20 69 74 20  anch runs if it 
182c0 69 73 20 6b 6e 6f 77 6e 20 61 74 20 63 6f 6d 70  is known at comp
182d0 69 6c 65 20 74 69 6d 65 20 74 68 61 74 20 74 68  ile time that th
182e0 65 20 52 48 53 0a 20 20 20 20 20 20 20 20 2a 2a  e RHS.        **
182f0 20 63 61 6e 6e 6f 74 20 63 6f 6e 74 61 69 6e 20   cannot contain 
18300 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 20 54 68 69  NULL values. Thi
18310 73 20 68 61 70 70 65 6e 73 20 61 73 20 61 20 72  s happens as a r
18320 65 73 75 6c 74 0a 20 20 20 20 20 20 20 20 2a 2a  esult.        **
18330 20 6f 66 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63   of "NOT NULL" c
18340 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68  onstraints in th
18350 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
18360 61 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  a..        **.  
18370 20 20 20 20 20 20 2a 2a 20 41 6c 73 6f 20 72 75        ** Also ru
18380 6e 20 74 68 69 73 20 62 72 61 6e 63 68 20 69 66  n this branch if
18390 20 4e 55 4c 4c 20 69 73 20 65 71 75 69 76 61 6c   NULL is equival
183a0 65 6e 74 20 74 6f 20 46 41 4c 53 45 0a 20 20 20  ent to FALSE.   
183b0 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 69 73       ** for this
183c0 20 70 61 72 74 69 63 75 6c 61 72 20 49 4e 20 6f   particular IN o
183d0 70 65 72 61 74 6f 72 2e 20 20 2a 2f 0a 20 20 20  perator.  */.   
183e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
183f0 41 64 64 4f 70 34 49 6e 74 28 0a 20 20 20 20 20  AddOp4Int(.     
18400 20 20 20 20 20 20 20 76 2c 20 4f 50 5f 4e 6f 74         v, OP_Not
18410 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54  Found, pExpr->iT
18420 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73  able, destIfFals
18430 65 2c 20 72 31 2c 20 6e 56 65 63 74 6f 72 0a 20  e, r1, nVector. 
18440 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
18450 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
18460 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
18470 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68          /* In th
18480 69 73 20 62 72 61 6e 63 68 2c 20 74 68 65 20 52  is branch, the R
18490 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6d 69 67  HS of the IN mig
184a0 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c  ht contain a NUL
184b0 4c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  L and.        **
184c0 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66   the presence of
184d0 20 61 20 4e 55 4c 4c 20 6f 6e 20 74 68 65 20 52   a NULL on the R
184e0 48 53 20 6d 61 6b 65 73 20 61 20 64 69 66 66 65  HS makes a diffe
184f0 72 65 6e 63 65 20 69 6e 20 74 68 65 0a 20 20 20  rence in the.   
18500 20 20 20 20 20 2a 2a 20 6f 75 74 63 6f 6d 65 2e       ** outcome.
18510 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
18520 20 20 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 0a      int addr1;..
18530 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
18540 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
18550 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e 74   the LHS is cont
18560 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53  ained in the RHS
18570 2e 20 20 49 66 20 73 6f 2c 0a 20 20 20 20 20 20  .  If so,.      
18580 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 61 6e    ** then the an
18590 73 77 65 72 20 69 73 20 54 52 55 45 20 74 68 65  swer is TRUE the
185a0 20 70 72 65 73 65 6e 63 65 20 6f 66 20 4e 55 4c   presence of NUL
185b0 4c 73 20 69 6e 20 74 68 65 20 52 48 53 20 64 6f  Ls in the RHS do
185c0 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  es.        ** no
185d0 74 20 6d 61 74 74 65 72 2e 20 20 49 66 20 74 68  t matter.  If th
185e0 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e  e LHS is not con
185f0 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48  tained in the RH
18600 53 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  S, then the.    
18610 20 20 20 20 2a 2a 20 61 6e 73 77 65 72 20 69 73      ** answer is
18620 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 52 48 53   NULL if the RHS
18630 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 20   contains NULLs 
18640 61 6e 64 20 74 68 65 20 61 6e 73 77 65 72 20 69  and the answer i
18650 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 41 4c  s.        ** FAL
18660 53 45 20 69 66 20 74 68 65 20 52 48 53 20 69 73  SE if the RHS is
18670 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 20 20 20 20   NULL-free..    
18680 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
18690 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
186a0 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
186b0 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e  P_Found, pExpr->
186c0 69 54 61 62 6c 65 2c 20 30 2c 20 72 31 2c 20 31  iTable, 0, r1, 1
186d0 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
186e0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
186f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18700 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
18710 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c  ll, rRhsHasNull,
18720 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
18730 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
18740 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
18750 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
18760 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
18770 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18780 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
18790 64 64 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ddr1);.      }. 
187a0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
187b0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
187c0 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
187d0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
187e0 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 73  Pop(pParse);.  s
187f0 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
18800 72 73 65 2d 3e 64 62 2c 20 61 69 4d 61 70 29 3b  rse->db, aiMap);
18810 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
18820 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 41 66  (pParse->db, zAf
18830 66 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  f);.  VdbeCommen
18840 74 28 28 76 2c 20 22 65 6e 64 20 49 4e 20 65 78  t((v, "end IN ex
18850 70 72 22 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  pr"));.}.#endif 
18860 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
18870 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e  UBQUERY */..#ifn
18880 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18890 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f  FLOATING_POINT./
188a0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
188b0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
188c0 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66  t will put the f
188d0 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a  loating point.**
188e0 20 76 61 6c 75 65 20 64 65 73 63 72 69 62 65 64   value described
188f0 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e   by z[0..n-1] in
18900 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d  to register iMem
18910 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20  ..**.** The z[] 
18920 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62  string will prob
18930 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f  ably not be zero
18940 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75  -terminated.  Bu
18950 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63  t the .** z[n] c
18960 68 61 72 61 63 74 65 72 20 69 73 20 67 75 61 72  haracter is guar
18970 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d  anteed to be som
18980 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73  ething that does
18990 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b   not look.** lik
189a0 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69  e the continuati
189b0 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  on of the number
189c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
189d0 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a   codeReal(Vdbe *
189e0 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  v, const char *z
189f0 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67  , int negateFlag
18a00 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69  , int iMem){.  i
18a10 66 28 20 41 4c 57 41 59 53 28 7a 21 3d 30 29 20  f( ALWAYS(z!=0) 
18a20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61  ){.    double va
18a30 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  lue;.    sqlite3
18a40 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20  AtoF(z, &value, 
18a50 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
18a60 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  z), SQLITE_UTF8)
18a70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 73  ;.    assert( !s
18a80 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75  qlite3IsNaN(valu
18a90 65 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77  e) ); /* The new
18aa0 20 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74 75   AtoF never retu
18ab0 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69  rns NaN */.    i
18ac0 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20  f( negateFlag ) 
18ad0 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a  value = -value;.
18ae0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18af0 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
18b00 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30  Real, 0, iMem, 0
18b10 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50  , (u8*)&value, P
18b20 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23  4_REAL);.  }.}.#
18b30 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  endif.../*.** Ge
18b40 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75  nerate an instru
18b50 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20  ction that will 
18b60 70 75 74 20 74 68 65 20 69 6e 74 65 67 65 72 20  put the integer 
18b70 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74  describe by.** t
18b80 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e  ext z[0..n-1] in
18b90 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d  to register iMem
18ba0 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a  ..**.** Expr.u.z
18bb0 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79 73 20  Token is always 
18bc0 55 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65  UTF8 and zero-te
18bd0 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61  rminated..*/.sta
18be0 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74  tic void codeInt
18bf0 65 67 65 72 28 50 61 72 73 65 20 2a 70 50 61 72  eger(Parse *pPar
18c00 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
18c10 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e   int negFlag, in
18c20 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20  t iMem){.  Vdbe 
18c30 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
18c40 62 65 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  be;.  if( pExpr-
18c50 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  >flags & EP_IntV
18c60 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  alue ){.    int 
18c70 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56 61  i = pExpr->u.iVa
18c80 6c 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  lue;.    assert(
18c90 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28   i>=0 );.    if(
18ca0 20 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d   negFlag ) i = -
18cb0 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  i;.    sqlite3Vd
18cc0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
18cd0 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29  nteger, i, iMem)
18ce0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
18cf0 6e 74 20 63 3b 0a 20 20 20 20 69 36 34 20 76 61  nt c;.    i64 va
18d00 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  lue;.    const c
18d10 68 61 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e  har *z = pExpr->
18d20 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73  u.zToken;.    as
18d30 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20  sert( z!=0 );.  
18d40 20 20 63 20 3d 20 73 71 6c 69 74 65 33 44 65 63    c = sqlite3Dec
18d50 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26 76  OrHexToI64(z, &v
18d60 61 6c 75 65 29 3b 0a 20 20 20 20 69 66 28 20 63  alue);.    if( c
18d70 3d 3d 30 20 7c 7c 20 28 63 3d 3d 32 20 26 26 20  ==0 || (c==2 && 
18d80 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20 20 20 20  negFlag) ){.    
18d90 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 7b    if( negFlag ){
18da0 20 76 61 6c 75 65 20 3d 20 63 3d 3d 32 20 3f 20   value = c==2 ? 
18db0 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a  SMALLEST_INT64 :
18dc0 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20 20 20 20   -value; }.     
18dd0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18de0 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 49 6e 74  p4Dup8(v, OP_Int
18df0 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20  64, 0, iMem, 0, 
18e00 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f  (u8*)&value, P4_
18e10 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c 73  INT64);.    }els
18e20 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e{.#ifdef SQLITE
18e30 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
18e40 4f 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74  OINT.      sqlit
18e50 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
18e60 65 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e  e, "oversized in
18e70 74 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65  teger: %s%s", ne
18e80 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22  gFlag ? "-" : ""
18e90 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 23 69 66 6e  , z);.#else.#ifn
18ea0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18eb0 48 45 58 5f 49 4e 54 45 47 45 52 0a 20 20 20 20  HEX_INTEGER.    
18ec0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
18ed0 72 6e 69 63 6d 70 28 7a 2c 22 30 78 22 2c 32 29  rnicmp(z,"0x",2)
18ee0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
18ef0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
18f00 50 61 72 73 65 2c 20 22 68 65 78 20 6c 69 74 65  Parse, "hex lite
18f10 72 61 6c 20 74 6f 6f 20 62 69 67 3a 20 25 73 22  ral too big: %s"
18f20 2c 20 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , z);.      }els
18f30 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b  e.#endif.      {
18f40 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61  .        codeRea
18f50 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c  l(v, z, negFlag,
18f60 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a   iMem);.      }.
18f70 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
18f80 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
18f90 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a  SQLITE_DEBUG)./*
18fa0 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 65 20 63  .** Verify the c
18fb0 6f 6e 73 69 73 74 65 6e 63 79 20 6f 66 20 74 68  onsistency of th
18fc0 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 0a 2a  e column cache.*
18fd0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63  /.static int cac
18fe0 68 65 49 73 56 61 6c 69 64 28 50 61 72 73 65 20  heIsValid(Parse 
18ff0 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20  *pParse){.  int 
19000 69 2c 20 6e 3b 0a 20 20 66 6f 72 28 69 3d 6e 3d  i, n;.  for(i=n=
19010 30 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  0; i<SQLITE_N_CO
19020 4c 43 41 43 48 45 3b 20 69 2b 2b 29 7b 0a 20 20  LCACHE; i++){.  
19030 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 43    if( pParse->aC
19040 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 3e  olCache[i].iReg>
19050 30 20 29 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 72  0 ) n++;.  }.  r
19060 65 74 75 72 6e 20 6e 3d 3d 70 50 61 72 73 65 2d  eturn n==pParse-
19070 3e 6e 43 6f 6c 43 61 63 68 65 3b 0a 7d 0a 23 65  >nColCache;.}.#e
19080 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ndif../*.** Clea
19090 72 20 61 20 63 61 63 68 65 20 65 6e 74 72 79 2e  r a cache entry.
190a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
190b0 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28  cacheEntryClear(
190c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73  Parse *pParse, s
190d0 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
190e0 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74 65  *p){.  if( p->te
190f0 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 69 66 28  mpReg ){.    if(
19100 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
19110 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72  g<ArraySize(pPar
19120 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b  se->aTempReg) ){
19130 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61  .      pParse->a
19140 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e  TempReg[pParse->
19150 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 2d  nTempReg++] = p-
19160 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20  >iReg;.    }.   
19170 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b   p->tempReg = 0;
19180 0a 20 20 7d 0a 20 20 70 2d 3e 69 52 65 67 20 3d  .  }.  p->iReg =
19190 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 43   0;.  pParse->nC
191a0 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 61 73 73  olCache--;.  ass
191b0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
191c0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
191d0 20 63 61 63 68 65 49 73 56 61 6c 69 64 28 70 50   cacheIsValid(pP
191e0 61 72 73 65 29 20 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  arse) );.}.../*.
191f0 2a 2a 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65  ** Record in the
19200 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 74 68   column cache th
19210 61 74 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  at a particular 
19220 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a  column from a.**
19230 20 70 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c   particular tabl
19240 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  e is stored in a
19250 20 70 61 72 74 69 63 75 6c 61 72 20 72 65 67 69   particular regi
19260 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ster..*/.void sq
19270 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74  lite3ExprCacheSt
19280 6f 72 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ore(Parse *pPars
19290 65 2c 20 69 6e 74 20 69 54 61 62 2c 20 69 6e 74  e, int iTab, int
192a0 20 69 43 6f 6c 2c 20 69 6e 74 20 69 52 65 67 29   iCol, int iReg)
192b0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
192c0 20 6d 69 6e 4c 72 75 3b 0a 20 20 69 6e 74 20 69   minLru;.  int i
192d0 64 78 4c 72 75 3b 0a 20 20 73 74 72 75 63 74 20  dxLru;.  struct 
192e0 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20  yColCache *p;.. 
192f0 20 2f 2a 20 55 6e 6c 65 73 73 20 61 6e 20 65 72   /* Unless an er
19300 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
19310 2c 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  , register numbe
19320 72 73 20 61 72 65 20 61 6c 77 61 79 73 20 70 6f  rs are always po
19330 73 69 74 69 76 65 2e 20 2a 2f 0a 20 20 61 73 73  sitive. */.  ass
19340 65 72 74 28 20 69 52 65 67 3e 30 20 7c 7c 20 70  ert( iReg>0 || p
19350 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70  Parse->nErr || p
19360 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
19370 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 61 73 73  cFailed );.  ass
19380 65 72 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26 26  ert( iCol>=-1 &&
19390 20 69 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20 20   iCol<32768 );  
193a0 2f 2a 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d 6e  /* Finite column
193b0 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 2f   numbers */..  /
193c0 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 43 6f 6c  * The SQLITE_Col
193d0 75 6d 6e 43 61 63 68 65 20 66 6c 61 67 20 64 69  umnCache flag di
193e0 73 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 75 6d  sables the colum
193f0 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 69  n cache.  This i
19400 73 20 75 73 65 64 0a 20 20 2a 2a 20 66 6f 72 20  s used.  ** for 
19410 74 65 73 74 69 6e 67 20 6f 6e 6c 79 20 2d 20 74  testing only - t
19420 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 53 51  o verify that SQ
19430 4c 69 74 65 20 61 6c 77 61 79 73 20 67 65 74 73  Lite always gets
19440 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72   the same answer
19450 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e 64 20 77  .  ** with and w
19460 69 74 68 6f 75 74 20 74 68 65 20 63 6f 6c 75 6d  ithout the colum
19470 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20  n cache..  */.  
19480 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
19490 44 69 73 61 62 6c 65 64 28 70 50 61 72 73 65 2d  Disabled(pParse-
194a0 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 6c 75  >db, SQLITE_Colu
194b0 6d 6e 43 61 63 68 65 29 20 29 20 72 65 74 75 72  mnCache) ) retur
194c0 6e 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 72  n;..  /* First r
194d0 65 70 6c 61 63 65 20 61 6e 79 20 65 78 69 73 74  eplace any exist
194e0 69 6e 67 20 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a  ing entry..  **.
194f0 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74    ** Actually, t
19500 68 65 20 77 61 79 20 74 68 65 20 63 6f 6c 75 6d  he way the colum
19510 6e 20 63 61 63 68 65 20 69 73 20 63 75 72 72 65  n cache is curre
19520 6e 74 6c 79 20 75 73 65 64 2c 20 77 65 20 61 72  ntly used, we ar
19530 65 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20 2a  e guaranteed.  *
19540 2a 20 74 68 61 74 20 74 68 65 20 6f 62 6a 65 63  * that the objec
19550 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 6c 72  t will never alr
19560 65 61 64 79 20 62 65 20 69 6e 20 63 61 63 68 65  eady be in cache
19570 2e 20 20 56 65 72 69 66 79 20 74 68 69 73 20 67  .  Verify this g
19580 75 61 72 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a 23  uarantee..  */.#
19590 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
195a0 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
195b0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
195c0 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
195d0 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
195e0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 52 65    assert( p->iRe
195f0 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 54 61 62 6c  g==0 || p->iTabl
19600 65 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e 69 43  e!=iTab || p->iC
19610 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20  olumn!=iCol );. 
19620 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
19630 46 69 6e 64 20 61 6e 20 65 6d 70 74 79 20 73 6c  Find an empty sl
19640 6f 74 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69  ot and replace i
19650 74 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20  t */.  for(i=0, 
19660 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
19670 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
19680 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
19690 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
196a0 69 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iReg==0 ){.     
196b0 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61   p->iLevel = pPa
196c0 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
196d0 3b 0a 20 20 20 20 20 20 70 2d 3e 69 54 61 62 6c  ;.      p->iTabl
196e0 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20  e = iTab;.      
196f0 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f  p->iColumn = iCo
19700 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67  l;.      p->iReg
19710 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 20 20 70   = iReg;.      p
19720 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20  ->tempReg = 0;. 
19730 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50       p->lru = pP
19740 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b  arse->iCacheCnt+
19750 2b 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  +;.      pParse-
19760 3e 6e 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20  >nColCache++;.  
19770 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
19780 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
19790 69 6c 65 64 20 7c 7c 20 63 61 63 68 65 49 73 56  iled || cacheIsV
197a0 61 6c 69 64 28 70 50 61 72 73 65 29 20 29 3b 0a  alid(pParse) );.
197b0 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
197c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
197d0 70 6c 61 63 65 20 74 68 65 20 6c 61 73 74 20 72  place the last r
197e0 65 63 65 6e 74 6c 79 20 75 73 65 64 20 2a 2f 0a  ecently used */.
197f0 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66 66    minLru = 0x7ff
19800 66 66 66 66 66 3b 0a 20 20 69 64 78 4c 72 75 20  fffff;.  idxLru 
19810 3d 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  = -1;.  for(i=0,
19820 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
19830 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
19840 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
19850 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
19860 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20 29 7b 0a 20  >lru<minLru ){. 
19870 20 20 20 20 20 69 64 78 4c 72 75 20 3d 20 69 3b       idxLru = i;
19880 0a 20 20 20 20 20 20 6d 69 6e 4c 72 75 20 3d 20  .      minLru = 
19890 70 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d 0a 20 20  p->lru;.    }.  
198a0 7d 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 69  }.  if( ALWAYS(i
198b0 64 78 4c 72 75 3e 3d 30 29 20 29 7b 0a 20 20 20  dxLru>=0) ){.   
198c0 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43   p = &pParse->aC
198d0 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72 75 5d 3b  olCache[idxLru];
198e0 0a 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d  .    p->iLevel =
198f0 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
19900 65 76 65 6c 3b 0a 20 20 20 20 70 2d 3e 69 54 61  evel;.    p->iTa
19910 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  ble = iTab;.    
19920 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f  p->iColumn = iCo
19930 6c 3b 0a 20 20 20 20 70 2d 3e 69 52 65 67 20 3d  l;.    p->iReg =
19940 20 69 52 65 67 3b 0a 20 20 20 20 70 2d 3e 74 65   iReg;.    p->te
19950 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 70  mpReg = 0;.    p
19960 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e  ->lru = pParse->
19970 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20  iCacheCnt++;.   
19980 20 61 73 73 65 72 74 28 20 63 61 63 68 65 49 73   assert( cacheIs
19990 56 61 6c 69 64 28 70 50 61 72 73 65 29 20 29 3b  Valid(pParse) );
199a0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
199b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61  .}../*.** Indica
199c0 74 65 20 74 68 61 74 20 72 65 67 69 73 74 65 72  te that register
199d0 73 20 62 65 74 77 65 65 6e 20 69 52 65 67 2e 2e  s between iReg..
199e0 69 52 65 67 2b 6e 52 65 67 2d 31 20 61 72 65 20  iReg+nReg-1 are 
199f0 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65  being overwritte
19a00 6e 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20  n..** Purge the 
19a10 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65  range of registe
19a20 72 73 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75  rs from the colu
19a30 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69  mn cache..*/.voi
19a40 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
19a50 68 65 52 65 6d 6f 76 65 28 50 61 72 73 65 20 2a  heRemove(Parse *
19a60 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
19a70 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 73  , int nReg){.  s
19a80 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
19a90 2a 70 3b 0a 20 20 69 66 28 20 69 52 65 67 3c 3d  *p;.  if( iReg<=
19aa0 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 43 6f  0 || pParse->nCo
19ab0 6c 43 61 63 68 65 3d 3d 30 20 29 20 72 65 74 75  lCache==0 ) retu
19ac0 72 6e 3b 0a 20 20 70 20 3d 20 26 70 50 61 72 73  rn;.  p = &pPars
19ad0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 53 51 4c  e->aColCache[SQL
19ae0 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 2d 31  ITE_N_COLCACHE-1
19af0 5d 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a 20  ];.  while(1){. 
19b00 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20 3e     if( p->iReg >
19b10 3d 20 69 52 65 67 20 26 26 20 70 2d 3e 69 52 65  = iReg && p->iRe
19b20 67 20 3c 20 69 52 65 67 2b 6e 52 65 67 20 29 20  g < iReg+nReg ) 
19b30 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28  cacheEntryClear(
19b40 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
19b50 69 66 28 20 70 3d 3d 70 50 61 72 73 65 2d 3e 61  if( p==pParse->a
19b60 43 6f 6c 43 61 63 68 65 20 29 20 62 72 65 61 6b  ColCache ) break
19b70 3b 0a 20 20 20 20 70 2d 2d 3b 0a 20 20 7d 0a 7d  ;.    p--;.  }.}
19b80 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72  ../*.** Remember
19b90 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c   the current col
19ba0 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74 65 78  umn cache contex
19bb0 74 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e 74 72  t.  Any new entr
19bc0 69 65 73 20 61 64 64 65 64 0a 2a 2a 20 61 64 64  ies added.** add
19bd0 65 64 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e  ed to the column
19be0 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
19bf0 73 20 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f 76  s call are remov
19c00 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 63  ed when the.** c
19c10 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 70  orresponding pop
19c20 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64   occurs..*/.void
19c30 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
19c40 65 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61  ePush(Parse *pPa
19c50 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e  rse){.  pParse->
19c60 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a 23  iCacheLevel++;.#
19c70 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
19c80 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  UG.  if( pParse-
19c90 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
19ca0 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61  ITE_VdbeAddopTra
19cb0 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  ce ){.    printf
19cc0 28 22 50 55 53 48 20 74 6f 20 25 64 5c 6e 22 2c  ("PUSH to %d\n",
19cd0 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
19ce0 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  evel);.  }.#endi
19cf0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  f.}../*.** Remov
19d00 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d  e from the colum
19d10 6e 20 63 61 63 68 65 20 61 6e 79 20 65 6e 74 72  n cache any entr
19d20 69 65 73 20 74 68 61 74 20 77 65 72 65 20 61 64  ies that were ad
19d30 64 65 64 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a  ded since the.**
19d40 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 71   the previous sq
19d50 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
19d60 73 68 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 49  sh operation.  I
19d70 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
19d80 65 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20 63 61  estore.** the ca
19d90 63 68 65 20 74 6f 20 74 68 65 20 73 74 61 74 65  che to the state
19da0 20 69 74 20 77 61 73 20 69 6e 20 70 72 69 6f 72   it was in prior
19db0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
19dc0 20 50 75 73 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73   Push..*/.void s
19dd0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
19de0 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  op(Parse *pParse
19df0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
19e00 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
19e10 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  p;.  assert( pPa
19e20 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
19e30 3e 3d 31 20 29 3b 0a 20 20 70 50 61 72 73 65 2d  >=1 );.  pParse-
19e40 3e 69 43 61 63 68 65 4c 65 76 65 6c 2d 2d 3b 0a  >iCacheLevel--;.
19e50 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
19e60 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65  BUG.  if( pParse
19e70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
19e80 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72  LITE_VdbeAddopTr
19e90 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  ace ){.    print
19ea0 66 28 22 50 4f 50 20 20 74 6f 20 25 64 5c 6e 22  f("POP  to %d\n"
19eb0 2c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  , pParse->iCache
19ec0 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64  Level);.  }.#end
19ed0 69 66 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  if.  for(i=0, p=
19ee0 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
19ef0 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
19f00 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
19f10 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52  ){.    if( p->iR
19f20 65 67 20 26 26 20 70 2d 3e 69 4c 65 76 65 6c 3e  eg && p->iLevel>
19f30 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
19f40 76 65 6c 20 29 7b 0a 20 20 20 20 20 20 63 61 63  vel ){.      cac
19f50 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61  heEntryClear(pPa
19f60 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20  rse, p);.    }. 
19f70 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e   }.}../*.** When
19f80 20 61 20 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e   a cached column
19f90 20 69 73 20 72 65 75 73 65 64 2c 20 6d 61 6b 65   is reused, make
19fa0 20 73 75 72 65 20 74 68 61 74 20 69 74 73 20 72   sure that its r
19fb0 65 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f  egister is.** no
19fc0 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c 61 62 6c   longer availabl
19fd0 65 20 61 73 20 61 20 74 65 6d 70 20 72 65 67 69  e as a temp regi
19fe0 73 74 65 72 2e 20 20 74 69 63 6b 65 74 20 23 33  ster.  ticket #3
19ff0 38 37 39 3a 20 20 74 68 61 74 20 73 61 6d 65 0a  879:  that same.
1a000 2a 2a 20 72 65 67 69 73 74 65 72 20 6d 69 67 68  ** register migh
1a010 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
1a020 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c  e in multiple pl
1a030 61 63 65 73 2c 20 73 6f 20 62 65 20 73 75 72 65  aces, so be sure
1a040 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20   to.** get them 
1a050 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  all..*/.static v
1a060 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1a070 61 63 68 65 50 69 6e 52 65 67 69 73 74 65 72 28  achePinRegister(
1a080 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1a090 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt iReg){.  int 
1a0a0 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
1a0b0 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28  Cache *p;.  for(
1a0c0 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
1a0d0 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
1a0e0 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
1a0f0 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
1a100 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20  ( p->iReg==iReg 
1a110 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70  ){.      p->temp
1a120 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Reg = 0;.    }. 
1a130 20 7d 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74   }.}../* Generat
1a140 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
1a150 20 6c 6f 61 64 20 69 6e 74 6f 20 72 65 67 69 73   load into regis
1a160 74 65 72 20 72 65 67 4f 75 74 20 61 20 76 61 6c  ter regOut a val
1a170 75 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 70  ue that is.** ap
1a180 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
1a190 65 20 69 49 64 78 43 6f 6c 2d 74 68 20 63 6f 6c  e iIdxCol-th col
1a1a0 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64  umn of index pId
1a1b0 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  x..*/.void sqlit
1a1c0 65 33 45 78 70 72 43 6f 64 65 4c 6f 61 64 49 6e  e3ExprCodeLoadIn
1a1d0 64 65 78 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72  dexColumn(.  Par
1a1e0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 2f 2a 20  se *pParse,  /* 
1a1f0 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
1a200 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ext */.  Index *
1a210 70 49 64 78 2c 20 20 20 20 2f 2a 20 54 68 65 20  pIdx,    /* The 
1a220 69 6e 64 65 78 20 77 68 6f 73 65 20 63 6f 6c 75  index whose colu
1a230 6d 6e 20 69 73 20 74 6f 20 62 65 20 6c 6f 61 64  mn is to be load
1a240 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ed */.  int iTab
1a250 43 75 72 2c 20 20 20 20 2f 2a 20 43 75 72 73 6f  Cur,    /* Curso
1a260 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  r pointing to a 
1a270 74 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20 69  table row */.  i
1a280 6e 74 20 69 49 64 78 43 6f 6c 2c 20 20 20 20 2f  nt iIdxCol,    /
1a290 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  * The column of 
1a2a0 74 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  the index to be 
1a2b0 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20  loaded */.  int 
1a2c0 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 53  regOut      /* S
1a2d0 74 6f 72 65 20 74 68 65 20 69 6e 64 65 78 20 63  tore the index c
1a2e0 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 74  olumn value in t
1a2f0 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
1a300 29 7b 0a 20 20 69 31 36 20 69 54 61 62 43 6f 6c  ){.  i16 iTabCol
1a310 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
1a320 6e 5b 69 49 64 78 43 6f 6c 5d 3b 0a 20 20 69 66  n[iIdxCol];.  if
1a330 28 20 69 54 61 62 43 6f 6c 3d 3d 58 4e 5f 45 58  ( iTabCol==XN_EX
1a340 50 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  PR ){.    assert
1a350 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72  ( pIdx->aColExpr
1a360 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1a370 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e  pIdx->aColExpr->
1a380 6e 45 78 70 72 3e 69 49 64 78 43 6f 6c 20 29 3b  nExpr>iIdxCol );
1a390 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65  .    pParse->iSe
1a3a0 6c 66 54 61 62 20 3d 20 69 54 61 62 43 75 72 3b  lfTab = iTabCur;
1a3b0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1a3c0 43 6f 64 65 43 6f 70 79 28 70 50 61 72 73 65 2c  CodeCopy(pParse,
1a3d0 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d   pIdx->aColExpr-
1a3e0 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e 70 45 78 70  >a[iIdxCol].pExp
1a3f0 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65  r, regOut);.  }e
1a400 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
1a410 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
1a420 6e 4f 66 54 61 62 6c 65 28 70 50 61 72 73 65 2d  nOfTable(pParse-
1a430 3e 70 56 64 62 65 2c 20 70 49 64 78 2d 3e 70 54  >pVdbe, pIdx->pT
1a440 61 62 6c 65 2c 20 69 54 61 62 43 75 72 2c 0a 20  able, iTabCur,. 
1a450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a470 20 20 20 69 54 61 62 43 6f 6c 2c 20 72 65 67 4f     iTabCol, regO
1a480 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ut);.  }.}../*.*
1a490 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1a4a0 74 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 76  to extract the v
1a4b0 61 6c 75 65 20 6f 66 20 74 68 65 20 69 43 6f 6c  alue of the iCol
1a4c0 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20  -th column of a 
1a4d0 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  table..*/.void s
1a4e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
1a4f0 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 0a  tColumnOfTable(.
1a500 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
1a510 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 75 6e    /* The VDBE un
1a520 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
1a530 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
1a540 62 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62  b,    /* The tab
1a550 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
1a560 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  e value */.  int
1a570 20 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20   iTabCur,    /* 
1a580 54 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72  The table cursor
1a590 2e 20 20 4f 72 20 74 68 65 20 50 4b 20 63 75 72  .  Or the PK cur
1a5a0 73 6f 72 20 66 6f 72 20 57 49 54 48 4f 55 54 20  sor for WITHOUT 
1a5b0 52 4f 57 49 44 20 2a 2f 0a 20 20 69 6e 74 20 69  ROWID */.  int i
1a5c0 43 6f 6c 2c 20 20 20 20 20 20 20 2f 2a 20 49 6e  Col,       /* In
1a5d0 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  dex of the colum
1a5e0 6e 20 74 6f 20 65 78 74 72 61 63 74 20 2a 2f 0a  n to extract */.
1a5f0 20 20 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20    int regOut    
1a600 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
1a610 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 69 73   value into this
1a620 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a   register */.){.
1a630 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20    if( iCol<0 || 
1a640 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b 65  iCol==pTab->iPKe
1a650 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
1a660 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a670 5f 52 6f 77 69 64 2c 20 69 54 61 62 43 75 72 2c  _Rowid, iTabCur,
1a680 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73   regOut);.  }els
1a690 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  e{.    int op = 
1a6a0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
1a6b0 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f  ? OP_VColumn : O
1a6c0 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 6e  P_Column;.    in
1a6d0 74 20 78 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  t x = iCol;.    
1a6e0 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
1a6f0 61 62 29 20 26 26 20 21 49 73 56 69 72 74 75 61  ab) && !IsVirtua
1a700 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
1a710 20 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75   x = sqlite3Colu
1a720 6d 6e 4f 66 49 6e 64 65 78 28 73 71 6c 69 74 65  mnOfIndex(sqlite
1a730 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
1a740 28 70 54 61 62 29 2c 20 69 43 6f 6c 29 3b 0a 20  (pTab), iCol);. 
1a750 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1a760 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70  VdbeAddOp3(v, op
1a770 2c 20 69 54 61 62 43 75 72 2c 20 78 2c 20 72 65  , iTabCur, x, re
1a780 67 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  gOut);.  }.  if(
1a790 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20   iCol>=0 ){.    
1a7a0 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66  sqlite3ColumnDef
1a7b0 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43  ault(v, pTab, iC
1a7c0 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d  ol, regOut);.  }
1a7d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1a7e0 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
1a7f0 6c 20 65 78 74 72 61 63 74 20 74 68 65 20 69 43  l extract the iC
1a800 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20  olumn-th column 
1a810 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54  from.** table pT
1a820 61 62 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ab and store the
1a830 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e   column value in
1a840 20 61 20 72 65 67 69 73 74 65 72 2e 20 0a 2a 2a   a register. .**
1a850 0a 2a 2a 20 41 6e 20 65 66 66 6f 72 74 20 69 73  .** An effort is
1a860 20 6d 61 64 65 20 74 6f 20 73 74 6f 72 65 20 74   made to store t
1a870 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  he column value 
1a880 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67  in register iReg
1a890 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6e 6f  .  This.** is no
1a8a0 74 20 67 61 72 61 6e 74 65 65 65 64 20 66 6f 72  t garanteeed for
1a8b0 20 47 65 74 43 6f 6c 75 6d 6e 28 29 20 2d 20 74   GetColumn() - t
1a8c0 68 65 20 72 65 73 75 6c 74 20 63 61 6e 20 62 65  he result can be
1a8d0 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 61 6e   stored in.** an
1a8e0 79 20 72 65 67 69 73 74 65 72 2e 20 20 42 75 74  y register.  But
1a8f0 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 67   the result is g
1a900 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 61 6e  uaranteed to lan
1a910 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52  d in register iR
1a920 65 67 0a 2a 2a 20 66 6f 72 20 47 65 74 43 6f 6c  eg.** for GetCol
1a930 75 6d 6e 54 6f 52 65 67 28 29 2e 0a 2a 2a 0a 2a  umnToReg()..**.*
1a940 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20  * There must be 
1a950 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74  an open cursor t
1a960 6f 20 70 54 61 62 20 69 6e 20 69 54 61 62 6c 65  o pTab in iTable
1a970 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
1a980 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e  ne.** is called.
1a990 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74    If iColumn<0 t
1a9a0 68 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e 65  hen code is gene
1a9b0 72 61 74 65 64 20 74 68 61 74 20 65 78 74 72 61  rated that extra
1a9c0 63 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a  cts the rowid..*
1a9d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
1a9e0 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a  rCodeGetColumn(.
1a9f0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1aa00 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
1aa10 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
1aa20 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
1aa30 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
1aa40 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f  /* Description o
1aa50 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61  f the table we a
1aa60 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  re reading from 
1aa70 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
1aa80 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f  ,     /* Index o
1aa90 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75  f the table colu
1aaa0 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  mn */.  int iTab
1aab0 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  le,      /* The 
1aac0 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  cursor pointing 
1aad0 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  to the table */.
1aae0 20 20 69 6e 74 20 69 52 65 67 2c 20 20 20 20 20    int iReg,     
1aaf0 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75     /* Store resu
1ab00 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 75 38  lts here */.  u8
1ab10 20 70 35 20 20 20 20 20 20 20 20 20 20 20 20 2f   p5            /
1ab20 2a 20 50 35 20 76 61 6c 75 65 20 66 6f 72 20 4f  * P5 value for O
1ab30 50 5f 43 6f 6c 75 6d 6e 20 2b 20 46 4c 41 47 53  P_Column + FLAGS
1ab40 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
1ab50 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
1ab60 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
1ab70 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
1ab80 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  ;..  for(i=0, p=
1ab90 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
1aba0 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
1abb0 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
1abc0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52  ){.    if( p->iR
1abd0 65 67 3e 30 20 26 26 20 70 2d 3e 69 54 61 62 6c  eg>0 && p->iTabl
1abe0 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 2d 3e  e==iTable && p->
1abf0 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e  iColumn==iColumn
1ac00 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75   ){.      p->lru
1ac10 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
1ac20 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71  eCnt++;.      sq
1ac30 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69  lite3ExprCachePi
1ac40 6e 52 65 67 69 73 74 65 72 28 70 50 61 72 73 65  nRegister(pParse
1ac50 2c 20 70 2d 3e 69 52 65 67 29 3b 0a 20 20 20 20  , p->iReg);.    
1ac60 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 52 65 67    return p->iReg
1ac70 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20  ;.    }.  }  .  
1ac80 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
1ac90 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1aca0 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
1acb0 65 28 76 2c 20 70 54 61 62 2c 20 69 54 61 62 6c  e(v, pTab, iTabl
1acc0 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67  e, iColumn, iReg
1acd0 29 3b 0a 20 20 69 66 28 20 70 35 20 29 7b 0a 20  );.  if( p5 ){. 
1ace0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
1acf0 61 6e 67 65 50 35 28 76 2c 20 70 35 29 3b 0a 20  angeP5(v, p5);. 
1ad00 20 7d 65 6c 73 65 7b 20 20 20 0a 20 20 20 20 73   }else{   .    s
1ad10 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53  qlite3ExprCacheS
1ad20 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 54 61  tore(pParse, iTa
1ad30 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52  ble, iColumn, iR
1ad40 65 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eg);.  }.  retur
1ad50 6e 20 69 52 65 67 3b 0a 7d 0a 76 6f 69 64 20 73  n iReg;.}.void s
1ad60 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
1ad70 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 0a 20 20  tColumnToReg(.  
1ad80 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1ad90 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
1ada0 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
1adb0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62  context */.  Tab
1adc0 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a  le *pTab,     /*
1add0 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
1ade0 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65  the table we are
1adf0 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f   reading from */
1ae00 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20  .  int iColumn, 
1ae10 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1ae20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  the table column
1ae30 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
1ae40 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75  ,      /* The cu
1ae50 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
1ae60 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
1ae70 69 6e 74 20 69 52 65 67 20 20 20 20 20 20 20 20  int iReg        
1ae80 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74   /* Store result
1ae90 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
1aea0 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45  nt r1 = sqlite3E
1aeb0 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
1aec0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69  (pParse, pTab, i
1aed0 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 6c 65 2c 20  Column, iTable, 
1aee0 69 52 65 67 2c 20 30 29 3b 0a 20 20 69 66 28 20  iReg, 0);.  if( 
1aef0 72 31 21 3d 69 52 65 67 20 29 20 73 71 6c 69 74  r1!=iReg ) sqlit
1af00 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
1af10 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53  rse->pVdbe, OP_S
1af20 43 6f 70 79 2c 20 72 31 2c 20 69 52 65 67 29 3b  Copy, r1, iReg);
1af30 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  .}.../*.** Clear
1af40 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68   all column cach
1af50 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f  e entries..*/.vo
1af60 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
1af70 63 68 65 43 6c 65 61 72 28 50 61 72 73 65 20 2a  cheClear(Parse *
1af80 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69  pParse){.  int i
1af90 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
1afa0 61 63 68 65 20 2a 70 3b 0a 0a 23 69 66 20 53 51  ache *p;..#if SQ
1afb0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
1afc0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
1afd0 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
1afe0 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
1aff0 20 20 70 72 69 6e 74 66 28 22 43 4c 45 41 52 5c    printf("CLEAR\
1b000 6e 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n");.  }.#endif.
1b010 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
1b020 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
1b030 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
1b040 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
1b050 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20      if( p->iReg 
1b060 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e  ){.      cacheEn
1b070 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c  tryClear(pParse,
1b080 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d   p);.    }.  }.}
1b090 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74  ../*.** Record t
1b0a0 68 65 20 66 61 63 74 20 74 68 61 74 20 61 6e 20  he fact that an 
1b0b0 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20  affinity change 
1b0c0 68 61 73 20 6f 63 63 75 72 72 65 64 20 6f 6e 20  has occurred on 
1b0d0 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74  iCount.** regist
1b0e0 65 72 73 20 73 74 61 72 74 69 6e 67 20 77 69 74  ers starting wit
1b0f0 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69  h iStart..*/.voi
1b100 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
1b110 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
1b120 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1b130 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20  int iStart, int 
1b140 69 43 6f 75 6e 74 29 7b 0a 20 20 73 71 6c 69 74  iCount){.  sqlit
1b150 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
1b160 65 28 70 50 61 72 73 65 2c 20 69 53 74 61 72 74  e(pParse, iStart
1b170 2c 20 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a  , iCount);.}../*
1b180 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1b190 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e  e to move conten
1b1a0 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73  t from registers
1b1b0 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e   iFrom...iFrom+n
1b1c0 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f  Reg-1.** over to
1b1d0 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31   iTo..iTo+nReg-1
1b1e0 2e 20 4b 65 65 70 20 74 68 65 20 63 6f 6c 75 6d  . Keep the colum
1b1f0 6e 20 63 61 63 68 65 20 75 70 2d 74 6f 2d 64 61  n cache up-to-da
1b200 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  te..*/.void sqli
1b210 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
1b220 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1b230 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54  nt iFrom, int iT
1b240 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  o, int nReg){.  
1b250 61 73 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d 69  assert( iFrom>=i
1b260 54 6f 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f 6d  To+nReg || iFrom
1b270 2b 6e 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20 20  +nReg<=iTo );.  
1b280 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b290 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  3(pParse->pVdbe,
1b2a0 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c   OP_Move, iFrom,
1b2b0 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 20 20 73   iTo, nReg);.  s
1b2c0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52  qlite3ExprCacheR
1b2d0 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 46  emove(pParse, iF
1b2e0 72 6f 6d 2c 20 6e 52 65 67 29 3b 0a 7d 0a 0a 23  rom, nReg);.}..#
1b2f0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1b300 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  E_DEBUG) || defi
1b310 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45 52  ned(SQLITE_COVER
1b320 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  AGE_TEST)./*.** 
1b330 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61  Return true if a
1b340 6e 79 20 72 65 67 69 73 74 65 72 20 69 6e 20 74  ny register in t
1b350 68 65 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e  he range iFrom..
1b360 69 54 6f 20 28 69 6e 63 6c 75 73 69 76 65 29 0a  iTo (inclusive).
1b370 2a 2a 20 69 73 20 75 73 65 64 20 61 73 20 70 61  ** is used as pa
1b380 72 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  rt of the column
1b390 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
1b3a0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
1b3b0 65 64 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  ed within assert
1b3c0 28 29 20 61 6e 64 20 74 65 73 74 63 61 73 65 28  () and testcase(
1b3d0 29 20 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a  ) macros only.**
1b3e0 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61 70   and does not ap
1b3f0 70 65 61 72 20 69 6e 20 61 20 6e 6f 72 6d 61 6c  pear in a normal
1b400 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69   build..*/.stati
1b410 63 20 69 6e 74 20 75 73 65 64 41 73 43 6f 6c 75  c int usedAsColu
1b420 6d 6e 43 61 63 68 65 28 50 61 72 73 65 20 2a 70  mnCache(Parse *p
1b430 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d  Parse, int iFrom
1b440 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e  , int iTo){.  in
1b450 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
1b460 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f  olCache *p;.  fo
1b470 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
1b480 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
1b490 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
1b4a0 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
1b4b0 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b  int r = p->iReg;
1b4c0 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 46 72 6f  .    if( r>=iFro
1b4d0 6d 20 26 26 20 72 3c 3d 69 54 6f 20 29 20 72 65  m && r<=iTo ) re
1b4e0 74 75 72 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f  turn 1;    /*NO_
1b4f0 54 45 53 54 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  TEST*/.  }.  ret
1b500 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b510 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b520 7c 7c 20 53 51 4c 49 54 45 5f 43 4f 56 45 52 41  || SQLITE_COVERA
1b530 47 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a  GE_TEST */.../*.
1b540 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 65 78  ** Convert an ex
1b550 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74 6f  pression node to
1b560 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 2a   a TK_REGISTER.*
1b570 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
1b580 70 72 54 6f 52 65 67 69 73 74 65 72 28 45 78 70  prToRegister(Exp
1b590 72 20 2a 70 2c 20 69 6e 74 20 69 52 65 67 29 7b  r *p, int iReg){
1b5a0 0a 20 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f  .  p->op2 = p->o
1b5b0 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f  p;.  p->op = TK_
1b5c0 52 45 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e 69  REGISTER;.  p->i
1b5d0 54 61 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20 20  Table = iReg;.  
1b5e0 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74  ExprClearPropert
1b5f0 79 28 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a 7d  y(p, EP_Skip);.}
1b600 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  ..static void ex
1b610 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 50 61  prCodeBetween(Pa
1b620 72 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 76  rse*,Expr*,int,v
1b630 6f 69 64 28 2a 29 28 50 61 72 73 65 2a 2c 45 78  oid(*)(Parse*,Ex
1b640 70 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69 6e 74  pr*,int,int),int
1b650 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  );../*.** Genera
1b660 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65  te code into the
1b670 20 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f   current Vdbe to
1b680 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69   evaluate the gi
1b690 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
1b6a0 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73  n.  Attempt to s
1b6b0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
1b6c0 20 69 6e 20 72 65 67 69 73 74 65 72 20 22 74 61   in register "ta
1b6d0 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e  rget"..** Return
1b6e0 20 74 68 65 20 72 65 67 69 73 74 65 72 20 77 68   the register wh
1b6f0 65 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  ere results are 
1b700 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69  stored..**.** Wi
1b710 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  th this routine,
1b720 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61   there is no gua
1b730 72 61 6e 74 65 65 20 74 68 61 74 20 72 65 73 75  rantee that resu
1b740 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73  lts will.** be s
1b750 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e  tored in target.
1b760 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67    The result mig
1b770 68 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ht be stored in 
1b780 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65  some other.** re
1b790 67 69 73 74 65 72 20 69 66 20 69 74 20 69 73 20  gister if it is 
1b7a0 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f  convenient to do
1b7b0 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e   so.  The callin
1b7c0 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  g function.** mu
1b7d0 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74  st check the ret
1b7e0 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76  urn code and mov
1b7f0 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f  e the results to
1b800 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20   the desired.** 
1b810 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74  register..*/.int
1b820 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1b830 54 61 72 67 65 74 28 50 61 72 73 65 20 2a 70 50  Target(Parse *pP
1b840 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1b850 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
1b860 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1b870 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54  se->pVdbe;  /* T
1b880 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73  he VM under cons
1b890 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
1b8a0 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
1b8b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
1b8c0 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65  pcode being code
1b8d0 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67  d */.  int inReg
1b8e0 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20 20 20   = target;      
1b8f0 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72   /* Results stor
1b900 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ed in register i
1b910 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65  nReg */.  int re
1b920 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20  gFree1 = 0;     
1b930 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
1b940 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d  ro free this tem
1b950 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
1b960 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  */.  int regFree
1b970 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  2 = 0;         /
1b980 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72  * If non-zero fr
1b990 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  ee this temporar
1b9a0 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  y register */.  
1b9b0 69 6e 74 20 72 31 2c 20 72 32 3b 20 20 20 20 20  int r1, r2;     
1b9c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 72            /* Var
1b9d0 69 6f 75 73 20 72 65 67 69 73 74 65 72 20 6e 75  ious register nu
1b9e0 6d 62 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74  mbers */.  sqlit
1b9f0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1ba00 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61  >db; /* The data
1ba10 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1ba20 2a 2f 0a 20 20 45 78 70 72 20 74 65 6d 70 58 3b  */.  Expr tempX;
1ba30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ba40 2a 20 54 65 6d 70 6f 72 61 72 79 20 65 78 70 72  * Temporary expr
1ba50 65 73 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f 0a 20  ession node */. 
1ba60 20 69 6e 74 20 70 35 20 3d 20 30 3b 0a 0a 20 20   int p5 = 0;..  
1ba70 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
1ba80 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72   && target<=pPar
1ba90 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66  se->nMem );.  if
1baa0 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ( v==0 ){.    as
1bab0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
1bac0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1bad0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1bae0 20 20 7d 0a 0a 20 20 69 66 28 20 70 45 78 70 72    }..  if( pExpr
1baf0 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20  ==0 ){.    op = 
1bb00 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65  TK_NULL;.  }else
1bb10 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72  {.    op = pExpr
1bb20 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74  ->op;.  }.  swit
1bb30 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
1bb40 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
1bb50 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66  : {.      AggInf
1bb60 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45  o *pAggInfo = pE
1bb70 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20  xpr->pAggInfo;. 
1bb80 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
1bb90 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20  nfo_col *pCol = 
1bba0 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  &pAggInfo->aCol[
1bbb0 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20  pExpr->iAgg];.  
1bbc0 20 20 20 20 69 66 28 20 21 70 41 67 67 49 6e 66      if( !pAggInf
1bbd0 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b  o->directMode ){
1bbe0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1bbf0 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b   pCol->iMem>0 );
1bc00 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
1bc10 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20   pCol->iMem;.   
1bc20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1bc30 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67    }else if( pAgg
1bc40 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67  Info->useSorting
1bc50 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Idx ){.        s
1bc60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1bc70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70  (v, OP_Column, p
1bc80 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67  AggInfo->sorting
1bc90 49 64 78 50 54 61 62 2c 0a 20 20 20 20 20 20 20  IdxPTab,.       
1bca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bcb0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
1bcc0 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67  rterColumn, targ
1bcd0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  et);.        bre
1bce0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1bcf0 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    /* Otherwise, 
1bd00 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74  fall thru into t
1bd10 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73  he TK_COLUMN cas
1bd20 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63  e */.    }.    c
1bd30 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
1bd40 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61 62 20  .      int iTab 
1bd50 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  = pExpr->iTable;
1bd60 0a 20 20 20 20 20 20 69 66 28 20 69 54 61 62 3c  .      if( iTab<
1bd70 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
1bd80 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e   pParse->ckBase>
1bd90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
1bda0 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 43 48 45  * Generating CHE
1bdb0 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  CK constraints o
1bdc0 72 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f  r inserting into
1bdd0 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 2a   partial index *
1bde0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 52 65  /.          inRe
1bdf0 67 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  g = pExpr->iColu
1be00 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b 42  mn + pParse->ckB
1be10 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ase;.          b
1be20 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
1be30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
1be40 2a 20 43 6f 64 69 6e 67 20 61 6e 20 65 78 70 72  * Coding an expr
1be50 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 70  ession that is p
1be60 61 72 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  art of an index 
1be70 77 68 65 72 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  where column nam
1be80 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
1be90 69 6e 20 74 68 65 20 69 6e 64 65 78 20 72 65 66  in the index ref
1bea0 65 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  er to the table 
1beb0 74 6f 20 77 68 69 63 68 20 74 68 65 20 69 6e 64  to which the ind
1bec0 65 78 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20  ex belongs */.  
1bed0 20 20 20 20 20 20 20 20 69 54 61 62 20 3d 20 70          iTab = p
1bee0 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 3b  Parse->iSelfTab;
1bef0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1bf00 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   }.      inReg =
1bf10 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1bf20 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  GetColumn(pParse
1bf30 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20  , pExpr->pTab,. 
1bf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1bf60 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54  xpr->iColumn, iT
1bf70 61 62 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20  ab, target,.    
1bf80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf90 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1bfa0 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 20 20 62 72  ->op2);.      br
1bfb0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1bfc0 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
1bfd0 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65  {.      codeInte
1bfe0 67 65 72 28 70 50 61 72 73 65 2c 20 70 45 78 70  ger(pParse, pExp
1bff0 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 0, target);. 
1c000 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c010 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1c020 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
1c030 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b  OINT.    case TK
1c040 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
1c050 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1c060 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1c070 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1c080 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
1c090 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1c0a0 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  n, 0, target);. 
1c0b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c0c0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
1c0d0 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20  e TK_STRING: {. 
1c0e0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1c0f0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1c100 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1c110 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) );.      sqlit
1c120 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67  e3VdbeLoadString
1c130 28 76 2c 20 74 61 72 67 65 74 2c 20 70 45 78 70  (v, target, pExp
1c140 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
1c150 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c160 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c  .    case TK_NUL
1c170 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
1c180 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1c190 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67  OP_Null, 0, targ
1c1a0 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  et);.      break
1c1b0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1c1c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42  SQLITE_OMIT_BLOB
1c1d0 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73  _LITERAL.    cas
1c1e0 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_BLOB: {.   
1c1f0 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
1c200 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
1c210 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62       char *zBlob
1c220 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1c230 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1c240 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1c250 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73  lue) );.      as
1c260 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
1c270 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c  Token[0]=='x' ||
1c280 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1c290 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20  [0]=='X' );.    
1c2a0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1c2b0 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c  >u.zToken[1]=='\
1c2c0 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20  '' );.      z = 
1c2d0 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  &pExpr->u.zToken
1c2e0 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73  [2];.      n = s
1c2f0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1c300 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73  ) - 1;.      ass
1c310 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20  ert( z[n]=='\'' 
1c320 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d  );.      zBlob =
1c330 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f   sqlite3HexToBlo
1c340 62 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  b(sqlite3VdbeDb(
1c350 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  v), z, n);.     
1c360 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c370 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e  p4(v, OP_Blob, n
1c380 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a  /2, target, 0, z
1c390 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43  Blob, P4_DYNAMIC
1c3a0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1c3b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1c3c0 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
1c3d0 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  E: {.      asser
1c3e0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1c3f0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1c400 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1c410 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1c420 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20  u.zToken!=0 );. 
1c430 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
1c440 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21  pr->u.zToken[0]!
1c450 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1c460 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1c470 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45   OP_Variable, pE
1c480 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61  xpr->iColumn, ta
1c490 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28  rget);.      if(
1c4a0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1c4b0 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  [1]!=0 ){.      
1c4c0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1c4d0 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f  >u.zToken[0]=='?
1c4e0 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ' .             
1c4f0 7c 7c 20 73 74 72 63 6d 70 28 70 45 78 70 72 2d  || strcmp(pExpr-
1c500 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 50 61 72 73  >u.zToken, pPars
1c510 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72 2d 3e  e->azVar[pExpr->
1c520 69 43 6f 6c 75 6d 6e 2d 31 5d 29 3d 3d 30 20 29  iColumn-1])==0 )
1c530 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1c540 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
1c550 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56   -1, pParse->azV
1c560 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ar[pExpr->iColum
1c570 6e 2d 31 5d 2c 20 50 34 5f 53 54 41 54 49 43 29  n-1], P4_STATIC)
1c580 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c590 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1c5a0 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
1c5b0 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67  R: {.      inReg
1c5c0 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
1c5d0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1c5e0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1c5f0 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20  ITE_OMIT_CAST.  
1c600 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20    case TK_CAST: 
1c610 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65  {.      /* Expre
1c620 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f  ssions of the fo
1c630 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74  rm:   CAST(pLeft
1c640 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20   AS token) */.  
1c650 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
1c660 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
1c670 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
1c680 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b  >pLeft, target);
1c690 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67  .      if( inReg
1c6a0 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20  !=target ){.    
1c6b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c6c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
1c6d0 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74  y, inReg, target
1c6e0 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  );.        inReg
1c6f0 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20   = target;.     
1c700 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1c710 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1c720 5f 43 61 73 74 2c 20 74 61 72 67 65 74 2c 0a 20  _Cast, target,. 
1c730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c740 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 66         sqlite3Af
1c750 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70 72  finityType(pExpr
1c760 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 29 3b  ->u.zToken, 0));
1c770 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1c780 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63   usedAsColumnCac
1c790 68 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67  he(pParse, inReg
1c7a0 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20 20 20 20  , inReg) );.    
1c7b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1c7c0 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
1c7d0 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20  (pParse, inReg, 
1c7e0 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
1c7f0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
1c800 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53   SQLITE_OMIT_CAS
1c810 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  T */.    case TK
1c820 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
1c830 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 6f 70  _ISNOT:.      op
1c840 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f   = (op==TK_IS) ?
1c850 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a   TK_EQ : TK_NE;.
1c860 20 20 20 20 20 20 70 35 20 3d 20 53 51 4c 49 54        p5 = SQLIT
1c870 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20  E_NULLEQ;.      
1c880 2f 2a 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68 20  /* fall-through 
1c890 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  */.    case TK_L
1c8a0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
1c8b0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
1c8c0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
1c8d0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
1c8e0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
1c8f0 51 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20  Q: {.      Expr 
1c900 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
1c910 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 69 66 28  pLeft;.      if(
1c920 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65   sqlite3ExprIsVe
1c930 63 74 6f 72 28 70 4c 65 66 74 29 20 29 7b 0a 20  ctor(pLeft) ){. 
1c940 20 20 20 20 20 20 20 63 6f 64 65 56 65 63 74 6f         codeVecto
1c950 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  rCompare(pParse,
1c960 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20   pExpr, target, 
1c970 6f 70 2c 20 70 35 29 3b 0a 20 20 20 20 20 20 7d  op, p5);.      }
1c980 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31  else{.        r1
1c990 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1c9a0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1c9b0 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1c9c0 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73  ;.        r2 = s
1c9d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1c9e0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1c9f0 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
1ca00 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  ee2);.        co
1ca10 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
1ca20 2c 20 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  , pLeft, pExpr->
1ca30 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
1ca40 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
1ca50 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54  inReg, SQLITE_ST
1ca60 4f 52 45 50 32 20 7c 20 70 35 29 3b 0a 20 20 20  OREP2 | p5);.   
1ca70 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
1ca80 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63  T==OP_Lt); testc
1ca90 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20  ase(op==OP_Lt); 
1caa0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1cab0 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20  ,op==OP_Lt);.   
1cac0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
1cad0 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63  E==OP_Le); testc
1cae0 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20  ase(op==OP_Le); 
1caf0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1cb00 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20  ,op==OP_Le);.   
1cb10 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
1cb20 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63  T==OP_Gt); testc
1cb30 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20  ase(op==OP_Gt); 
1cb40 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1cb50 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20  ,op==OP_Gt);.   
1cb60 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
1cb70 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63  E==OP_Ge); testc
1cb80 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20  ase(op==OP_Ge); 
1cb90 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1cba0 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20  ,op==OP_Ge);.   
1cbb0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45       assert(TK_E
1cbc0 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63  Q==OP_Eq); testc
1cbd0 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20  ase(op==OP_Eq); 
1cbe0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1cbf0 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20  ,op==OP_Eq);.   
1cc00 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e       assert(TK_N
1cc10 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63  E==OP_Ne); testc
1cc20 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20  ase(op==OP_Ne); 
1cc30 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1cc40 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20  ,op==OP_Ne);.   
1cc50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1cc60 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1cc70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1cc80 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
1cc90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
1cca0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1ccb0 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63  se TK_AND:.    c
1ccc0 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63  ase TK_OR:.    c
1ccd0 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20  ase TK_PLUS:.   
1cce0 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20   case TK_STAR:. 
1ccf0 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53     case TK_MINUS
1cd00 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  :.    case TK_RE
1cd10 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  M:.    case TK_B
1cd20 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20  ITAND:.    case 
1cd30 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61  TK_BITOR:.    ca
1cd40 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20  se TK_SLASH:.   
1cd50 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a   case TK_LSHIFT:
1cd60 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48  .    case TK_RSH
1cd70 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54  IFT: .    case T
1cd80 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20  K_CONCAT: {.    
1cd90 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44    assert( TK_AND
1cda0 3d 3d 4f 50 5f 41 6e 64 20 29 3b 20 20 20 20 20  ==OP_And );     
1cdb0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1cdc0 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20   op==TK_AND );. 
1cdd0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1cde0 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20 20 20  OR==OP_Or );    
1cdf0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
1ce00 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b  se( op==TK_OR );
1ce10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1ce20 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29  K_PLUS==OP_Add )
1ce30 3b 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;           test
1ce40 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55  case( op==TK_PLU
1ce50 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  S );.      asser
1ce60 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f  t( TK_MINUS==OP_
1ce70 53 75 62 74 72 61 63 74 20 29 3b 20 20 20 20 20  Subtract );     
1ce80 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1ce90 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20 20 20  _MINUS );.      
1cea0 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d  assert( TK_REM==
1ceb0 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 20  OP_Remainder ); 
1cec0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1ced0 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20  p==TK_REM );.   
1cee0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
1cef0 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20  TAND==OP_BitAnd 
1cf00 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65  );      testcase
1cf10 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20  ( op==TK_BITAND 
1cf20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1cf30 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69   TK_BITOR==OP_Bi
1cf40 74 4f 72 20 29 3b 20 20 20 20 20 20 20 20 74 65  tOr );        te
1cf50 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42  stcase( op==TK_B
1cf60 49 54 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73  ITOR );.      as
1cf70 73 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d  sert( TK_SLASH==
1cf80 4f 50 5f 44 69 76 69 64 65 20 29 3b 20 20 20 20  OP_Divide );    
1cf90 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1cfa0 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20  =TK_SLASH );.   
1cfb0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53     assert( TK_LS
1cfc0 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65  HIFT==OP_ShiftLe
1cfd0 66 74 20 29 3b 20 20 20 74 65 73 74 63 61 73 65  ft );   testcase
1cfe0 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20  ( op==TK_LSHIFT 
1cff0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1d000 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53   TK_RSHIFT==OP_S
1d010 68 69 66 74 52 69 67 68 74 20 29 3b 20 20 74 65  hiftRight );  te
1d020 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52  stcase( op==TK_R
1d030 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61  SHIFT );.      a
1d040 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54  ssert( TK_CONCAT
1d050 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 20 20  ==OP_Concat );  
1d060 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1d070 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20  ==TK_CONCAT );. 
1d080 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1d090 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1d0a0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1d0b0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1d0c0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
1d0d0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1d0e0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1d0f0 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
1d100 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1d110 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c  dbeAddOp3(v, op,
1d120 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29   r2, r1, target)
1d130 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1d140 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1d150 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d160 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
1d170 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d180 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
1d190 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45  MINUS: {.      E
1d1a0 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
1d1b0 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
1d1c0 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29   assert( pLeft )
1d1d0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66  ;.      if( pLef
1d1e0 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45  t->op==TK_INTEGE
1d1f0 52 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  R ){.        cod
1d200 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c  eInteger(pParse,
1d210 20 70 4c 65 66 74 2c 20 31 2c 20 74 61 72 67 65   pLeft, 1, targe
1d220 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t);.#ifndef SQLI
1d230 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
1d240 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65 6c  _POINT.      }el
1d250 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70  se if( pLeft->op
1d260 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20  ==TK_FLOAT ){.  
1d270 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1d280 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1d290 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
1d2a0 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  e) );.        co
1d2b0 64 65 52 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d  deReal(v, pLeft-
1d2c0 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61  >u.zToken, 1, ta
1d2d0 72 67 65 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rget);.#endif.  
1d2e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d2f0 20 20 20 74 65 6d 70 58 2e 6f 70 20 3d 20 54 4b     tempX.op = TK
1d300 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20  _INTEGER;.      
1d310 20 20 74 65 6d 70 58 2e 66 6c 61 67 73 20 3d 20    tempX.flags = 
1d320 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 54  EP_IntValue|EP_T
1d330 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 20 20  okenOnly;.      
1d340 20 20 74 65 6d 70 58 2e 75 2e 69 56 61 6c 75 65    tempX.u.iValue
1d350 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 31   = 0;.        r1
1d360 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1d370 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26  deTemp(pParse, &
1d380 74 65 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31  tempX, &regFree1
1d390 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20  );.        r2 = 
1d3a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1d3b0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1d3c0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
1d3d0 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ee2);.        sq
1d3e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1d3f0 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20  v, OP_Subtract, 
1d400 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b  r2, r1, target);
1d410 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1d420 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
1d430 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d440 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a  inReg = target;.
1d450 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d460 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
1d470 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20  ITNOT:.    case 
1d480 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
1d490 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f  assert( TK_BITNO
1d4a0 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 20  T==OP_BitNot ); 
1d4b0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1d4c0 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20  TK_BITNOT );.   
1d4d0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
1d4e0 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20 20 20  T==OP_Not );    
1d4f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1d500 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20  p==TK_NOT );.   
1d510 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1d520 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1d530 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1d540 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1d550 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1d560 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1d570 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65     inReg = targe
1d580 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
1d590 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
1d5a0 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20  , r1, inReg);.  
1d5b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1d5c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
1d5d0 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
1d5e0 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
1d5f0 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
1d600 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e    assert( TK_ISN
1d610 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29  ULL==OP_IsNull )
1d620 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  ;   testcase( op
1d630 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==TK_ISNULL );. 
1d640 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1d650 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e  NOTNULL==OP_NotN
1d660 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28  ull ); testcase(
1d670 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
1d680 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1d690 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d6a0 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72  _Integer, 1, tar
1d6b0 67 65 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  get);.      r1 =
1d6c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1d6d0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1d6e0 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1d6f0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73  ree1);.      tes
1d700 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1d710 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72  =0 );.      addr
1d720 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1d730 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b  dOp1(v, op, r1);
1d740 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
1d750 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
1d760 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56  ISNULL);.      V
1d770 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1d780 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29   op==TK_NOTNULL)
1d790 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1d7a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1d7b0 49 6e 74 65 67 65 72 2c 20 30 2c 20 74 61 72 67  Integer, 0, targ
1d7c0 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
1d7d0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
1d7e0 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 62  , addr);.      b
1d7f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1d800 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
1d810 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67  TION: {.      Ag
1d820 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70  gInfo *pInfo = p
1d830 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a  Expr->pAggInfo;.
1d840 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d        if( pInfo=
1d850 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
1d860 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1d870 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1d880 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1d890 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1d8a0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d  orMsg(pParse, "m
1d8b0 69 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61  isuse of aggrega
1d8c0 74 65 3a 20 25 73 28 29 22 2c 20 70 45 78 70 72  te: %s()", pExpr
1d8d0 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
1d8e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d8f0 20 20 69 6e 52 65 67 20 3d 20 70 49 6e 66 6f 2d    inReg = pInfo-
1d900 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41  >aFunc[pExpr->iA
1d910 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20  gg].iMem;.      
1d920 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
1d930 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1d940 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
1d950 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 61     ExprList *pFa
1d960 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  rg;       /* Lis
1d970 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  t of function ar
1d980 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
1d990 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20 20 20   int nFarg;     
1d9a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1d9b0 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  r of function ar
1d9c0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
1d9d0 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20   FuncDef *pDef; 
1d9e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
1d9f0 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69  unction definiti
1da00 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  on object */.   
1da10 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1da20 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Id;       /* The
1da30 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
1da40 2f 0a 20 20 20 20 20 20 75 33 32 20 63 6f 6e 73  /.      u32 cons
1da50 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 2f  tMask = 0;     /
1da60 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74 69  * Mask of functi
1da70 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61  on arguments tha
1da80 74 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 20 2a  t are constant *
1da90 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  /.      int i;  
1daa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1dab0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
1dac0 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d  /.      u8 enc =
1dad0 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20 20 2f   ENC(db);      /
1dae0 2a 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f 64  * The text encod
1daf0 69 6e 67 20 75 73 65 64 20 62 79 20 74 68 69 73  ing used by this
1db00 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
1db10 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
1db20 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20 63  l = 0;    /* A c
1db30 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1db40 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65  e */..      asse
1db50 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1db60 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
1db70 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
1db80 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
1db90 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1dba0 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
1dbb0 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 30         pFarg = 0
1dbc0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1dbd0 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 70         pFarg = p
1dbe0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
1dbf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 61       }.      nFa
1dc00 72 67 20 3d 20 70 46 61 72 67 20 3f 20 70 46 61  rg = pFarg ? pFa
1dc10 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20  rg->nExpr : 0;. 
1dc20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1dc30 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1dc40 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1dc50 29 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d  ) );.      zId =
1dc60 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1dc70 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73  ;.      pDef = s
1dc80 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
1dc90 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 46 61 72  on(db, zId, nFar
1dca0 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 23 69 66 64  g, enc, 0);.#ifd
1dcb0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1dcc0 5f 55 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e  _UNKNOWN_SQL_FUN
1dcd0 43 54 49 4f 4e 0a 20 20 20 20 20 20 69 66 28 20  CTION.      if( 
1dce0 70 44 65 66 3d 3d 30 20 26 26 20 70 50 61 72 73  pDef==0 && pPars
1dcf0 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
1dd00 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
1dd10 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
1dd20 28 64 62 2c 20 22 75 6e 6b 6e 6f 77 6e 22 2c 20  (db, "unknown", 
1dd30 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a  nFarg, enc, 0);.
1dd40 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1dd50 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30       if( pDef==0
1dd60 20 7c 7c 20 70 44 65 66 2d 3e 78 46 69 6e 61 6c   || pDef->xFinal
1dd70 69 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize!=0 ){.      
1dd80 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1dd90 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f  g(pParse, "unkno
1dda0 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73 28  wn function: %s(
1ddb0 29 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20  )", zId);.      
1ddc0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1ddd0 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d  ..      /* Attem
1dde0 70 74 20 61 20 64 69 72 65 63 74 20 69 6d 70 6c  pt a direct impl
1ddf0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
1de00 65 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c 45  e built-in COALE
1de10 53 43 45 28 29 20 61 6e 64 0a 20 20 20 20 20 20  SCE() and.      
1de20 2a 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63  ** IFNULL() func
1de30 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 61 76 6f  tions.  This avo
1de40 69 64 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20  ids unnecessary 
1de50 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 0a 20 20  evaluation of.  
1de60 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73      ** arguments
1de70 20 70 61 73 74 20 74 68 65 20 66 69 72 73 74 20   past the first 
1de80 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e  non-NULL argumen
1de90 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
1dea0 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63    if( pDef->func
1deb0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
1dec0 55 4e 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a  UNC_COALESCE ){.
1ded0 20 20 20 20 20 20 20 20 69 6e 74 20 65 6e 64 43          int endC
1dee0 6f 61 6c 65 73 63 65 20 3d 20 73 71 6c 69 74 65  oalesce = sqlite
1def0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1df00 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1df10 74 28 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20  t( nFarg>=2 );. 
1df20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1df30 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1df40 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
1df50 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1df60 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46     for(i=1; i<nF
1df70 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  arg; i++){.     
1df80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1df90 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp2(v, OP_Not
1dfa0 4e 75 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e  Null, target, en
1dfb0 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20  dCoalesce);.    
1dfc0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1dfd0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
1dfe0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1dff0 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20  eRemove(pParse, 
1e000 74 61 72 67 65 74 2c 20 31 29 3b 0a 20 20 20 20  target, 1);.    
1e010 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1e020 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
1e030 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
1e040 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1e050 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69  arse, pFarg->a[i
1e060 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
1e070 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1e080 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
1e090 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
1e0a0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
1e0b0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1e0c0 65 6c 28 76 2c 20 65 6e 64 43 6f 61 6c 65 73 63  el(v, endCoalesc
1e0d0 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  e);.        brea
1e0e0 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
1e0f0 20 20 2f 2a 20 54 68 65 20 55 4e 4c 49 4b 45 4c    /* The UNLIKEL
1e100 59 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  Y() function is 
1e110 61 20 6e 6f 2d 6f 70 2e 20 20 54 68 65 20 72 65  a no-op.  The re
1e120 73 75 6c 74 20 69 73 20 74 68 65 20 76 61 6c 75  sult is the valu
1e130 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  e.      ** of th
1e140 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1e150 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1e160 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46   if( pDef->funcF
1e170 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
1e180 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20  NC_UNLIKELY ){. 
1e190 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
1e1a0 46 61 72 67 3e 3d 31 20 29 3b 0a 20 20 20 20 20  Farg>=1 );.     
1e1b0 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
1e1c0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
1e1d0 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
1e1e0 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  a[0].pExpr, targ
1e1f0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  et);.        bre
1e200 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
1e210 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46     for(i=0; i<nF
1e220 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  arg; i++){.     
1e230 20 20 20 69 66 28 20 69 3c 33 32 20 26 26 20 73     if( i<32 && s
1e240 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
1e250 74 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d  tant(pFarg->a[i]
1e260 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
1e270 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
1e280 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20  ==31 );.        
1e290 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d    constMask |= M
1e2a0 41 53 4b 42 49 54 33 32 28 69 29 3b 0a 20 20 20  ASKBIT32(i);.   
1e2b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1e2c0 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c  f( (pDef->funcFl
1e2d0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
1e2e0 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26  C_NEEDCOLL)!=0 &
1e2f0 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  & !pColl ){.    
1e300 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
1e310 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1e320 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
1e330 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
1e340 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1e350 20 20 20 20 20 69 66 28 20 70 46 61 72 67 20 29       if( pFarg )
1e360 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  {.        if( co
1e370 6e 73 74 4d 61 73 6b 20 29 7b 0a 20 20 20 20 20  nstMask ){.     
1e380 20 20 20 20 20 72 31 20 3d 20 70 50 61 72 73 65       r1 = pParse
1e390 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20  ->nMem+1;.      
1e3a0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
1e3b0 20 2b 3d 20 6e 46 61 72 67 3b 0a 20 20 20 20 20   += nFarg;.     
1e3c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e3d0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1e3e0 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
1e3f0 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20  rse, nFarg);.   
1e400 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1e410 2f 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28 29 20  /* For length() 
1e420 61 6e 64 20 74 79 70 65 6f 66 28 29 20 66 75 6e  and typeof() fun
1e430 63 74 69 6f 6e 73 20 77 69 74 68 20 61 20 63 6f  ctions with a co
1e440 6c 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a 20  lumn argument,. 
1e450 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68         ** set th
1e460 65 20 50 35 20 70 61 72 61 6d 65 74 65 72 20 74  e P5 parameter t
1e470 6f 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20  o the OP_Column 
1e480 6f 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41 47  opcode to OPFLAG
1e490 5f 4c 45 4e 47 54 48 41 52 47 0a 20 20 20 20 20  _LENGTHARG.     
1e4a0 20 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47 5f     ** or OPFLAG_
1e4b0 54 59 50 45 4f 46 41 52 47 20 72 65 73 70 65 63  TYPEOFARG respec
1e4c0 74 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69 64  tively, to avoid
1e4d0 20 75 6e 6e 65 63 65 73 73 61 72 79 20 64 61 74   unnecessary dat
1e4e0 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 61  a.        ** loa
1e4f0 64 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ding..        */
1e500 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44  .        if( (pD
1e510 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
1e520 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e  (SQLITE_FUNC_LEN
1e530 47 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f  GTH|SQLITE_FUNC_
1e540 54 59 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a 20  TYPEOF))!=0 ){. 
1e550 20 20 20 20 20 20 20 20 20 75 38 20 65 78 70 72           u8 expr
1e560 4f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  Op;.          as
1e570 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29  sert( nFarg==1 )
1e580 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
1e590 72 74 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  rt( pFarg->a[0].
1e5a0 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  pExpr!=0 );.    
1e5b0 20 20 20 20 20 20 65 78 70 72 4f 70 20 3d 20 70        exprOp = p
1e5c0 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
1e5d0 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20  ->op;.          
1e5e0 69 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 43  if( exprOp==TK_C
1e5f0 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70 3d  OLUMN || exprOp=
1e600 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
1e610 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
1e620 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e  sert( SQLITE_FUN
1e630 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41 47  C_LENGTH==OPFLAG
1e640 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20  _LENGTHARG );.  
1e650 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1e660 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59  ( SQLITE_FUNC_TY
1e670 50 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59 50  PEOF==OPFLAG_TYP
1e680 45 4f 46 41 52 47 20 29 3b 0a 20 20 20 20 20 20  EOFARG );.      
1e690 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e6a0 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
1e6b0 26 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41  & OPFLAG_LENGTHA
1e6c0 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  RG );.          
1e6d0 20 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45    pFarg->a[0].pE
1e6e0 78 70 72 2d 3e 6f 70 32 20 3d 20 0a 20 20 20 20  xpr->op2 = .    
1e6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44                pD
1e700 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
1e710 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52  (OPFLAG_LENGTHAR
1e720 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41  G|OPFLAG_TYPEOFA
1e730 52 47 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  RG);.          }
1e740 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1e750 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1e760 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
1e770 3b 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20  ;     /* Ticket 
1e780 32 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a  2ea2425d34be */.
1e790 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1e7a0 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
1e7b0 70 50 61 72 73 65 2c 20 70 46 61 72 67 2c 20 72  pParse, pFarg, r
1e7c0 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  1, 0,.          
1e7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7e0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45        SQLITE_ECE
1e7f0 4c 5f 44 55 50 7c 53 51 4c 49 54 45 5f 45 43 45  L_DUP|SQLITE_ECE
1e800 4c 5f 46 41 43 54 4f 52 29 3b 0a 20 20 20 20 20  L_FACTOR);.     
1e810 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1e820 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 20  chePop(pParse); 
1e830 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32       /* Ticket 2
1e840 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20  ea2425d34be */. 
1e850 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e860 20 20 20 20 72 31 20 3d 20 30 3b 0a 20 20 20 20      r1 = 0;.    
1e870 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1e880 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1e890 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f  ABLE.      /* Po
1e8a0 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20  ssibly overload 
1e8b0 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20  the function if 
1e8c0 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
1e8d0 6e 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  nt is.      ** a
1e8e0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63   virtual table c
1e8f0 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a  olumn..      **.
1e900 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66        ** For inf
1e910 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49  ix functions (LI
1e920 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50  KE, GLOB, REGEXP
1e930 2c 20 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65  , and MATCH) use
1e940 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65   the.      ** se
1e950 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e  cond argument, n
1e960 6f 74 20 74 68 65 20 66 69 72 73 74 2c 20 61 73  ot the first, as
1e970 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   the argument to
1e980 20 74 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a   test to.      *
1e990 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 61  * see if it is a
1e9a0 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72   column in a vir
1e9b0 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69  tual table.  Thi
1e9c0 73 20 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73  s is done becaus
1e9d0 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c  e.      ** the l
1e9e0 65 66 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69  eft operand of i
1e9f0 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28  nfix functions (
1ea00 74 68 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77  the operand we w
1ea10 61 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ant to.      ** 
1ea20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64  control overload
1ea30 69 6e 67 29 20 65 6e 64 73 20 75 70 20 61 73 20  ing) ends up as 
1ea40 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1ea50 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20  ent to the.     
1ea60 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54   ** function.  T
1ea70 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41  he expression "A
1ea80 20 67 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69   glob B" is equi
1ea90 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20  valent to .     
1eaa0 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20   ** "glob(B,A). 
1eab0 20 57 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20   We want to use 
1eac0 74 68 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62  the A in "A glob
1ead0 20 42 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20   B" to test.    
1eae0 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f    ** for functio
1eaf0 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20  n overloading.  
1eb00 42 75 74 20 77 65 20 75 73 65 20 74 68 65 20 42  But we use the B
1eb10 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42   term in "glob(B
1eb20 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ,A)"..      */. 
1eb30 20 20 20 20 20 69 66 28 20 6e 46 61 72 67 3e 3d       if( nFarg>=
1eb40 32 20 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61  2 && (pExpr->fla
1eb50 67 73 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e  gs & EP_InfixFun
1eb60 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  c) ){.        pD
1eb70 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  ef = sqlite3Vtab
1eb80 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e  OverloadFunction
1eb90 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67  (db, pDef, nFarg
1eba0 2c 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45  , pFarg->a[1].pE
1ebb0 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  xpr);.      }els
1ebc0 65 20 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b  e if( nFarg>0 ){
1ebd0 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
1ebe0 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c  sqlite3VtabOverl
1ebf0 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  oadFunction(db, 
1ec00 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61  pDef, nFarg, pFa
1ec10 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  rg->a[0].pExpr);
1ec20 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1ec30 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
1ec40 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
1ec50 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
1ec60 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1ec70 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
1ec80 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20   db->pDfltColl; 
1ec90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1eca0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1ecb0 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20  _CollSeq, 0, 0, 
1ecc0 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c  0, (char *)pColl
1ecd0 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
1ece0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1ecf0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1ed00 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 2c 20  , OP_Function0, 
1ed10 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74  constMask, r1, t
1ed20 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20  arget,.         
1ed30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1ed40 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46  char*)pDef, P4_F
1ed50 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73  UNCDEF);.      s
1ed60 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1ed70 50 35 28 76 2c 20 28 75 38 29 6e 46 61 72 67 29  P5(v, (u8)nFarg)
1ed80 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72  ;.      if( nFar
1ed90 67 20 26 26 20 63 6f 6e 73 74 4d 61 73 6b 3d 3d  g && constMask==
1eda0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
1edb0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1edc0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c  ange(pParse, r1,
1edd0 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d   nFarg);.      }
1ede0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1edf0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1ee00 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1ee10 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
1ee20 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  STS:.    case TK
1ee30 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
1ee40 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   int nCol;.     
1ee50 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1ee60 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20  K_EXISTS );.    
1ee70 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1ee80 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20  TK_SELECT );.   
1ee90 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45     if( op==TK_SE
1eea0 4c 45 43 54 20 26 26 20 28 6e 43 6f 6c 20 3d 20  LECT && (nCol = 
1eeb0 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
1eec0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
1eed0 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
1eee0 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45  qlite3SubselectE
1eef0 72 72 6f 72 28 70 50 61 72 73 65 2c 20 6e 43 6f  rror(pParse, nCo
1ef00 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  l, 1);.      }el
1ef10 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65  se{.        inRe
1ef20 67 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53  g = sqlite3CodeS
1ef30 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
1ef40 20 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20   pExpr, 0, 0);. 
1ef50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
1ef60 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1ef70 73 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  se TK_SELECT_COL
1ef80 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  UMN: {.      if(
1ef90 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69   pExpr->pLeft->i
1efa0 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Table==0 ){.    
1efb0 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
1efc0 2d 3e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74  ->iTable = sqlit
1efd0 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
1efe0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1eff0 4c 65 66 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Left, 0, 0);.   
1f000 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67     }.      inReg
1f010 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d   = pExpr->pLeft-
1f020 3e 69 54 61 62 6c 65 20 2b 20 70 45 78 70 72 2d  >iTable + pExpr-
1f030 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
1f040 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1f050 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
1f060 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46       int destIfF
1f070 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  alse = sqlite3Vd
1f080 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1f090 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
1f0a0 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  Null = sqlite3Vd
1f0b0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1f0c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f0d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
1f0e0 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
1f0f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1f100 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
1f110 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c  pExpr, destIfFal
1f120 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  se, destIfNull);
1f130 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1f140 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1f150 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65  nteger, 1, targe
1f160 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1f170 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1f180 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65  l(v, destIfFalse
1f190 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f1a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1f1b0 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c  _AddImm, target,
1f1c0 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
1f1d0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1f1e0 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c  el(v, destIfNull
1f1f0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1f200 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
1f210 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1f220 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a  UERY */...    /*
1f230 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54  .    **    x BET
1f240 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20  WEEN y AND z.   
1f250 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
1f260 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
1f270 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1f280 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a    x>=y AND x<=z.
1f290 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20      **.    ** X 
1f2a0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
1f2b0 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a  pr->pLeft..    *
1f2c0 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Y is stored in
1f2d0 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
1f2e0 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [0].pExpr..    *
1f2f0 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Z is stored in
1f300 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
1f310 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [1].pExpr..    *
1f320 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  /.    case TK_BE
1f330 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 65  TWEEN: {.      e
1f340 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70  xprCodeBetween(p
1f350 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
1f360 72 67 65 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  rget, 0, 0);.   
1f370 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f380 20 20 20 20 63 61 73 65 20 54 4b 5f 53 50 41 4e      case TK_SPAN
1f390 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
1f3a0 4c 4c 41 54 45 3a 20 0a 20 20 20 20 63 61 73 65  LLATE: .    case
1f3b0 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20   TK_UPLUS: {.   
1f3c0 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
1f3d0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
1f3e0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1f3f0 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a  pLeft, target);.
1f400 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f410 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
1f420 54 52 49 47 47 45 52 3a 20 7b 0a 20 20 20 20 20  TRIGGER: {.     
1f430 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 63 6f 64   /* If the opcod
1f440 65 20 69 73 20 54 4b 5f 54 52 49 47 47 45 52 2c  e is TK_TRIGGER,
1f450 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
1f460 73 69 6f 6e 20 69 73 20 61 20 72 65 66 65 72 65  sion is a refere
1f470 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  nce.      ** to 
1f480 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  a column in the 
1f490 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70  new.* or old.* p
1f4a0 73 65 75 64 6f 2d 74 61 62 6c 65 73 20 61 76 61  seudo-tables ava
1f4b0 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20  ilable to.      
1f4c0 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  ** trigger progr
1f4d0 61 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ams. In this cas
1f4e0 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20 69 73  e Expr.iTable is
1f4f0 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20 74 68   set to 1 for th
1f500 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a  e.      ** new.*
1f510 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f   pseudo-table, o
1f520 72 20 30 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e  r 0 for the old.
1f530 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20  * pseudo-table. 
1f540 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20  Expr.iColumn.   
1f550 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20     ** is set to 
1f560 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  the column of th
1f570 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 74  e pseudo-table t
1f580 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31  o read, or to -1
1f590 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61   to.      ** rea
1f5a0 64 20 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c  d the rowid fiel
1f5b0 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
1f5c0 20 20 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73    ** The express
1f5d0 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
1f5e0 65 64 20 75 73 69 6e 67 20 61 6e 20 4f 50 5f 50  ed using an OP_P
1f5f0 61 72 61 6d 20 6f 70 63 6f 64 65 2e 20 54 68 65  aram opcode. The
1f600 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 70 61 72   p1.      ** par
1f610 61 6d 65 74 65 72 20 69 73 20 73 65 74 20 74 6f  ameter is set to
1f620 20 30 20 66 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f   0 for an old.ro
1f630 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 6f  wid reference, o
1f640 72 20 74 6f 20 28 69 2b 31 29 0a 20 20 20 20 20  r to (i+1).     
1f650 20 2a 2a 20 74 6f 20 72 65 66 65 72 65 6e 63 65   ** to reference
1f660 20 61 6e 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20   another column 
1f670 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65  of the old.* pse
1f680 75 64 6f 2d 74 61 62 6c 65 2c 20 77 68 65 72 65  udo-table, where
1f690 20 0a 20 20 20 20 20 20 2a 2a 20 69 20 69 73 20   .      ** i is 
1f6a0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
1f6b0 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61 20 6e   column. For a n
1f6c0 65 77 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e  ew.rowid referen
1f6d0 63 65 2c 20 70 31 20 69 73 0a 20 20 20 20 20 20  ce, p1 is.      
1f6e0 2a 2a 20 73 65 74 20 74 6f 20 28 6e 2b 31 29 2c  ** set to (n+1),
1f6f0 20 77 68 65 72 65 20 6e 20 69 73 20 74 68 65 20   where n is the 
1f700 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
1f710 73 20 69 6e 20 65 61 63 68 20 70 73 65 75 64 6f  s in each pseudo
1f720 2d 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a  -table..      **
1f730 20 46 6f 72 20 61 20 72 65 66 65 72 65 6e 63 65   For a reference
1f740 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 63 6f   to any other co
1f750 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e  lumn in the new.
1f760 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20  * pseudo-table, 
1f770 70 31 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  p1.      ** is s
1f780 65 74 20 74 6f 20 28 6e 2b 32 2b 69 29 2c 20 77  et to (n+2+i), w
1f790 68 65 72 65 20 6e 20 61 6e 64 20 69 20 61 72 65  here n and i are
1f7a0 20 61 73 20 64 65 66 69 6e 65 64 20 70 72 65 76   as defined prev
1f7b0 69 6f 75 73 6c 79 2e 20 46 6f 72 0a 20 20 20 20  iously. For.    
1f7c0 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66    ** example, if
1f7d0 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 77 68   the table on wh
1f7e0 69 63 68 20 74 72 69 67 67 65 72 73 20 61 72 65  ich triggers are
1f7f0 20 62 65 69 6e 67 20 66 69 72 65 64 20 69 73 0a   being fired is.
1f800 20 20 20 20 20 20 2a 2a 20 64 65 63 6c 61 72 65        ** declare
1f810 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  d as:.      **. 
1f820 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45       **   CREATE
1f830 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
1f840 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
1f850 2a 2a 20 54 68 65 6e 20 70 31 20 69 73 20 69 6e  ** Then p1 is in
1f860 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c  terpreted as fol
1f870 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  lows:.      **. 
1f880 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 30 20       **   p1==0 
1f890 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f 77 69    ->    old.rowi
1f8a0 64 20 20 20 20 20 70 31 3d 3d 33 20 20 20 2d 3e  d     p1==3   ->
1f8b0 20 20 20 20 6e 65 77 2e 72 6f 77 69 64 0a 20 20      new.rowid.  
1f8c0 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 31 20 20      **   p1==1  
1f8d0 20 2d 3e 20 20 20 20 6f 6c 64 2e 61 20 20 20 20   ->    old.a    
1f8e0 20 20 20 20 20 70 31 3d 3d 34 20 20 20 2d 3e 20       p1==4   -> 
1f8f0 20 20 20 6e 65 77 2e 61 0a 20 20 20 20 20 20 2a     new.a.      *
1f900 2a 20 20 20 70 31 3d 3d 32 20 20 20 2d 3e 20 20  *   p1==2   ->  
1f910 20 20 6f 6c 64 2e 62 20 20 20 20 20 20 20 20 20    old.b         
1f920 70 31 3d 3d 35 20 20 20 2d 3e 20 20 20 20 6e 65  p1==5   ->    ne
1f930 77 2e 62 20 20 20 20 20 20 20 0a 20 20 20 20 20  w.b       .     
1f940 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20   */.      Table 
1f950 2a 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70  *pTab = pExpr->p
1f960 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 70  Tab;.      int p
1f970 31 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  1 = pExpr->iTabl
1f980 65 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b  e * (pTab->nCol+
1f990 31 29 20 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e  1) + 1 + pExpr->
1f9a0 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20  iColumn;..      
1f9b0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69  assert( pExpr->i
1f9c0 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70  Table==0 || pExp
1f9d0 72 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a  r->iTable==1 );.
1f9e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1f9f0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31  xpr->iColumn>=-1
1fa00 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   && pExpr->iColu
1fa10 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  mn<pTab->nCol );
1fa20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1fa30 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20  Tab->iPKey<0 || 
1fa40 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  pExpr->iColumn!=
1fa50 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20  pTab->iPKey );. 
1fa60 20 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e       assert( p1>
1fa70 3d 30 20 26 26 20 70 31 3c 28 70 54 61 62 2d 3e  =0 && p1<(pTab->
1fa80 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20  nCol*2+2) );..  
1fa90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1faa0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72 61  ddOp2(v, OP_Para
1fab0 6d 2c 20 70 31 2c 20 74 61 72 67 65 74 29 3b 0a  m, p1, target);.
1fac0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
1fad0 74 28 28 76 2c 20 22 25 73 2e 25 73 20 2d 3e 20  t((v, "%s.%s -> 
1fae0 24 25 64 22 2c 0a 20 20 20 20 20 20 20 20 28 70  $%d",.        (p
1faf0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22  Expr->iTable ? "
1fb00 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20  new" : "old"),. 
1fb10 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69         (pExpr->i
1fb20 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69  Column<0 ? "rowi
1fb30 64 22 20 3a 20 70 45 78 70 72 2d 3e 70 54 61 62  d" : pExpr->pTab
1fb40 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43  ->aCol[pExpr->iC
1fb50 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a 20  olumn].zName),. 
1fb60 20 20 20 20 20 20 20 74 61 72 67 65 74 0a 20 20         target.  
1fb70 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65 66      ));..#ifndef
1fb80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
1fb90 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
1fba0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
1fbb0 6d 6e 20 68 61 73 20 52 45 41 4c 20 61 66 66 69  mn has REAL affi
1fbc0 6e 69 74 79 2c 20 69 74 20 6d 61 79 20 63 75 72  nity, it may cur
1fbd0 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64  rently be stored
1fbe0 20 61 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20   as an.      ** 
1fbf0 69 6e 74 65 67 65 72 2e 20 55 73 65 20 4f 50 5f  integer. Use OP_
1fc00 52 65 61 6c 41 66 66 69 6e 69 74 79 20 74 6f 20  RealAffinity to 
1fc10 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20  make sure it is 
1fc20 72 65 61 6c 6c 79 20 72 65 61 6c 2e 0a 20 20 20  really real..   
1fc30 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45     **.      ** E
1fc40 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 30  VIDENCE-OF: R-60
1fc50 39 38 35 2d 35 37 36 36 32 20 53 51 4c 69 74 65  985-57662 SQLite
1fc60 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74 68   will convert th
1fc70 65 20 76 61 6c 75 65 20 62 61 63 6b 20 74 6f 0a  e value back to.
1fc80 20 20 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e        ** floatin
1fc90 67 20 70 6f 69 6e 74 20 77 68 65 6e 20 65 78 74  g point when ext
1fca0 72 61 63 74 69 6e 67 20 69 74 20 66 72 6f 6d 20  racting it from 
1fcb0 74 68 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f 0a  the record.  */.
1fcc0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
1fcd0 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20  >iColumn>=0 .   
1fce0 20 20 20 20 26 26 20 70 54 61 62 2d 3e 61 43 6f      && pTab->aCo
1fcf0 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  l[pExpr->iColumn
1fd00 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ].affinity==SQLI
1fd10 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20 20  TE_AFF_REAL.    
1fd20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c    ){.        sql
1fd30 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
1fd40 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74  , OP_RealAffinit
1fd50 79 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  y, target);.    
1fd60 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
1fd70 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1fd80 20 20 20 63 61 73 65 20 54 4b 5f 56 45 43 54 4f     case TK_VECTO
1fd90 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
1fda0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1fdb0 65 2c 20 22 69 6e 76 61 6c 69 64 20 75 73 65 20  e, "invalid use 
1fdc0 6f 66 20 72 6f 77 20 76 61 6c 75 65 22 29 3b 0a  of row value");.
1fdd0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1fde0 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
1fdf0 2a 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a  * Form A:.    **
1fe00 20 20 20 43 41 53 45 20 78 20 57 48 45 4e 20 65     CASE x WHEN e
1fe10 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65  1 THEN r1 WHEN e
1fe20 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48  2 THEN r2 ... WH
1fe30 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c  EN eN THEN rN EL
1fe40 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a  SE y END.    **.
1fe50 20 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20      ** Form B:. 
1fe60 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45     **   CASE WHE
1fe70 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  N e1 THEN r1 WHE
1fe80 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e  N e2 THEN r2 ...
1fe90 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e   WHEN eN THEN rN
1fea0 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20   ELSE y END.    
1feb0 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41  **.    ** Form A
1fec0 20 69 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73   is can be trans
1fed0 66 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20  formed into the 
1fee0 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20  equivalent form 
1fef0 42 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  B as follows:.  
1ff00 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e    **   CASE WHEN
1ff10 20 78 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48   x=e1 THEN r1 WH
1ff20 45 4e 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20  EN x=e2 THEN r2 
1ff30 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ....    **      
1ff40 20 20 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e    WHEN x=eN THEN
1ff50 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
1ff60 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28     **.    ** X (
1ff70 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73  if it exists) is
1ff80 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   in pExpr->pLeft
1ff90 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e  ..    ** Y is in
1ffa0 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e   the last elemen
1ffb0 74 20 6f 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c  t of pExpr->x.pL
1ffc0 69 73 74 20 69 66 20 70 45 78 70 72 2d 3e 78 2e  ist if pExpr->x.
1ffd0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 69 73 0a  pList->nExpr is.
1ffe0 20 20 20 20 2a 2a 20 6f 64 64 2e 20 20 54 68 65      ** odd.  The
1fff0 20 59 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f   Y is also optio
20000 6e 61 6c 2e 20 20 49 66 20 74 68 65 20 6e 75 6d  nal.  If the num
20010 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
20020 69 6e 20 78 2e 70 4c 69 73 74 0a 20 20 20 20 2a  in x.pList.    *
20030 2a 20 69 73 20 65 76 65 6e 2c 20 74 68 65 6e 20  * is even, then 
20040 59 20 69 73 20 6f 6d 69 74 74 65 64 20 61 6e 64  Y is omitted and
20050 20 74 68 65 20 22 6f 74 68 65 72 77 69 73 65 22   the "otherwise"
20060 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e   result is NULL.
20070 0a 20 20 20 20 2a 2a 20 45 69 20 69 73 20 69 6e  .    ** Ei is in
20080 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
20090 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20 69 73 20  [i*2] and Ri is 
200a0 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
200b0 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20  i*2+1]..    **. 
200c0 20 20 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74     ** The result
200d0 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
200e0 6f 6e 20 69 73 20 74 68 65 20 52 69 20 66 6f 72  on is the Ri for
200f0 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
20100 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f  ing Ei,.    ** o
20110 72 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  r if there is no
20120 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 20 74 68   matching Ei, th
20130 65 20 45 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f  e ELSE term Y, o
20140 72 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20  r if there is.  
20150 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72    ** no ELSE ter
20160 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a  m, NULL..    */.
20170 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
20180 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45  ert( op==TK_CASE
20190 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20   ); {.      int 
201a0 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20 20 20  endLabel;       
201b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
201c0 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20   GOTO label for 
201d0 65 6e 64 20 6f 66 20 43 41 53 45 20 73 74 6d 74  end of CASE stmt
201e0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 65   */.      int ne
201f0 78 74 43 61 73 65 3b 20 20 20 20 20 20 20 20 20  xtCase;         
20200 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
20210 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65  OTO label for ne
20220 78 74 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a  xt WHEN clause *
20230 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70  /.      int nExp
20240 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
20250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 78 20            /* 2x 
20260 6e 75 6d 62 65 72 20 6f 66 20 57 48 45 4e 20 74  number of WHEN t
20270 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  erms */.      in
20280 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
20290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202a0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
202b0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
202c0 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
202d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
202e0 73 74 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73  st of WHEN terms
202f0 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
20300 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
20310 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41  aListelem;  /* A
20320 72 72 61 79 20 6f 66 20 57 48 45 4e 20 74 65 72  rray of WHEN ter
20330 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  ms */.      Expr
20340 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20 20 20   opCompare;     
20350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20360 20 54 68 65 20 58 3d 3d 45 69 20 65 78 70 72 65   The X==Ei expre
20370 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ssion */.      E
20380 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20  xpr *pX;        
20390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203a0 20 2f 2a 20 54 68 65 20 58 20 65 78 70 72 65 73   /* The X expres
203b0 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78  sion */.      Ex
203c0 70 72 20 2a 70 54 65 73 74 20 3d 20 30 3b 20 20  pr *pTest = 0;  
203d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203e0 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41  /* X==Ei (form A
203f0 29 20 6f 72 20 6a 75 73 74 20 45 69 20 28 66 6f  ) or just Ei (fo
20400 72 6d 20 42 29 20 2a 2f 0a 20 20 20 20 20 20 56  rm B) */.      V
20410 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 69 43 61  VA_ONLY( int iCa
20420 63 68 65 4c 65 76 65 6c 20 3d 20 70 50 61 72 73  cheLevel = pPars
20430 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 20  e->iCacheLevel; 
20440 29 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  )..      assert(
20450 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
20460 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
20470 65 6c 65 63 74 29 20 26 26 20 70 45 78 70 72 2d  elect) && pExpr-
20480 3e 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20 20  >x.pList );.    
20490 20 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e    assert(pExpr->
204a0 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e  x.pList->nExpr >
204b0 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73   0);.      pELis
204c0 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
204d0 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65  st;.      aListe
204e0 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b  lem = pEList->a;
204f0 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70  .      nExpr = p
20500 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
20510 20 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73      endLabel = s
20520 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
20530 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66  bel(v);.      if
20540 28 20 28 70 58 20 3d 20 70 45 78 70 72 2d 3e 70  ( (pX = pExpr->p
20550 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  Left)!=0 ){.    
20560 20 20 20 20 74 65 6d 70 58 20 3d 20 2a 70 58 3b      tempX = *pX;
20570 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
20580 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  e( pX->op==TK_CO
20590 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
205a0 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 26  exprToRegister(&
205b0 74 65 6d 70 58 2c 20 73 71 6c 69 74 65 33 45 78  tempX, sqlite3Ex
205c0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
205d0 65 2c 20 70 58 2c 20 26 72 65 67 46 72 65 65 31  e, pX, &regFree1
205e0 29 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ));.        test
205f0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
20600 30 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 43  0 );.        opC
20610 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45  ompare.op = TK_E
20620 51 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d  Q;.        opCom
20630 70 61 72 65 2e 70 4c 65 66 74 20 3d 20 26 74 65  pare.pLeft = &te
20640 6d 70 58 3b 0a 20 20 20 20 20 20 20 20 70 54 65  mpX;.        pTe
20650 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b  st = &opCompare;
20660 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 69 63 6b  .        /* Tick
20670 65 74 20 62 33 35 31 64 39 35 66 39 63 64 35 65  et b351d95f9cd5e
20680 66 31 37 65 39 64 39 64 62 61 65 31 38 66 35 63  f17e9d9dbae18f5c
20690 61 38 36 31 31 31 39 30 30 30 31 3a 0a 20 20 20  a8611190001:.   
206a0 20 20 20 20 20 2a 2a 20 54 68 65 20 76 61 6c 75       ** The valu
206b0 65 20 69 6e 20 72 65 67 46 72 65 65 31 20 6d 69  e in regFree1 mi
206c0 67 68 74 20 67 65 74 20 53 43 6f 70 79 2d 65 64  ght get SCopy-ed
206d0 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 72   into the file r
206e0 65 73 75 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a  esult..        *
206f0 2a 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  * So make sure t
20700 68 61 74 20 74 68 65 20 72 65 67 46 72 65 65 31  hat the regFree1
20710 20 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74   register is not
20720 20 72 65 75 73 65 64 20 66 6f 72 20 6f 74 68 65   reused for othe
20730 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 75 72  r.        ** pur
20740 70 6f 73 65 73 20 61 6e 64 20 70 6f 73 73 69 62  poses and possib
20750 6c 79 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20  ly overwritten. 
20760 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 46   */.        regF
20770 72 65 65 31 20 3d 20 30 3b 0a 20 20 20 20 20 20  ree1 = 0;.      
20780 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
20790 20 69 3c 6e 45 78 70 72 2d 31 3b 20 69 3d 69 2b   i<nExpr-1; i=i+
207a0 32 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2){.        sqli
207b0 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
207c0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
207d0 20 20 69 66 28 20 70 58 20 29 7b 0a 20 20 20 20    if( pX ){.    
207e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
207f0 65 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  est!=0 );.      
20800 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 52      opCompare.pR
20810 69 67 68 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d  ight = aListelem
20820 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
20830 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20840 20 20 20 20 70 54 65 73 74 20 3d 20 61 4c 69 73      pTest = aLis
20850 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a  telem[i].pExpr;.
20860 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20870 20 20 6e 65 78 74 43 61 73 65 20 3d 20 73 71 6c    nextCase = sql
20880 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
20890 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65  l(v);.        te
208a0 73 74 63 61 73 65 28 20 70 54 65 73 74 2d 3e 6f  stcase( pTest->o
208b0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
208c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
208d0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
208e0 65 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43 61  e, pTest, nextCa
208f0 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  se, SQLITE_JUMPI
20900 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20  FNULL);.        
20910 74 65 73 74 63 61 73 65 28 20 61 4c 69 73 74 65  testcase( aListe
20920 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e  lem[i+1].pExpr->
20930 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
20940 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20950 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
20960 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e   aListelem[i+1].
20970 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
20980 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
20990 64 62 65 47 6f 74 6f 28 76 2c 20 65 6e 64 4c 61  dbeGoto(v, endLa
209a0 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  bel);.        sq
209b0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
209c0 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
209d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
209e0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65  solveLabel(v, ne
209f0 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20 7d  xtCase);.      }
20a00 0a 20 20 20 20 20 20 69 66 28 20 28 6e 45 78 70  .      if( (nExp
20a10 72 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  r&1)!=0 ){.     
20a20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
20a30 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
20a40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20a50 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
20a60 20 70 45 4c 69 73 74 2d 3e 61 5b 6e 45 78 70 72   pEList->a[nExpr
20a70 2d 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  -1].pExpr, targe
20a80 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
20a90 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
20aa0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d  pParse);.      }
20ab0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
20ac0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
20ad0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
20ae0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  arget);.      }.
20af0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
20b00 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
20b10 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  | pParse->nErr>0
20b20 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
20b30 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
20b40 76 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76 65 6c  vel==iCacheLevel
20b50 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
20b60 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
20b70 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a  l(v, endLabel);.
20b80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20b90 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
20ba0 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20  E_OMIT_TRIGGER. 
20bb0 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45     case TK_RAISE
20bc0 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
20bd0 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  ( pExpr->affinit
20be0 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a  y==OE_Rollback .
20bf0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45             || pE
20c00 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
20c10 45 5f 41 62 6f 72 74 0a 20 20 20 20 20 20 20 20  E_Abort.        
20c20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66     || pExpr->aff
20c30 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20  inity==OE_Fail. 
20c40 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78            || pEx
20c50 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
20c60 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20 20 29 3b  _Ignore.      );
20c70 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72  .      if( !pPar
20c80 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20  se->pTriggerTab 
20c90 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
20ca0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
20cb0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
20cc0 20 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45            "RAISE
20cd0 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75  () may only be u
20ce0 73 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69  sed within a tri
20cf0 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a  gger-program");.
20d00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
20d10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20d20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  if( pExpr->affin
20d30 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b  ity==OE_Abort ){
20d40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20d50 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
20d60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20d70 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
20d80 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
20d90 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
20da0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
20db0 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67  >affinity==OE_Ig
20dc0 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20  nore ){.        
20dd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
20de0 34 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 76  4(.            v
20df0 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54  , OP_Halt, SQLIT
20e00 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c  E_OK, OE_Ignore,
20e10 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f   0, pExpr->u.zTo
20e20 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  ken,0);.        
20e30 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
20e40 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
20e50 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c        sqlite3Hal
20e60 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  tConstraint(pPar
20e70 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  se, SQLITE_CONST
20e80 52 41 49 4e 54 5f 54 52 49 47 47 45 52 2c 0a 20  RAINT_TRIGGER,. 
20e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
20eb0 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20 70 45  pr->affinity, pE
20ec0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30  xpr->u.zToken, 0
20ed0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 0);.      }.. 
20ee0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20ef0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73  }.#endif.  }.  s
20f00 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
20f10 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
20f20 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65  Free1);.  sqlite
20f30 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
20f40 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
20f50 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65  );.  return inRe
20f60 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61 63 74  g;.}../*.** Fact
20f70 6f 72 20 6f 75 74 20 74 68 65 20 63 6f 64 65 20  or out the code 
20f80 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  of the given exp
20f90 72 65 73 73 69 6f 6e 20 74 6f 20 69 6e 69 74 69  ression to initi
20fa0 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a  alization time..
20fb0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
20fc0 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 0a 20  xprCodeAtInit(. 
20fd0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
20fe0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
20ff0 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
21000 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20  *pExpr,      /* 
21010 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
21020 6f 20 63 6f 64 65 20 77 68 65 6e 20 74 68 65 20  o code when the 
21030 56 44 42 45 20 69 6e 69 74 69 61 6c 69 7a 65 73  VDBE initializes
21040 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 65 73   */.  int regDes
21050 74 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65  t,      /* Store
21060 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68   the value in th
21070 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  is register */. 
21080 20 75 38 20 72 65 75 73 61 62 6c 65 20 20 20 20   u8 reusable    
21090 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
210a0 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  is expression is
210b0 20 72 65 75 73 61 62 6c 65 20 2a 2f 0a 29 7b 0a   reusable */.){.
210c0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 3b 0a 20    ExprList *p;. 
210d0 20 61 73 73 65 72 74 28 20 43 6f 6e 73 74 46 61   assert( ConstFa
210e0 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29  ctorOk(pParse) )
210f0 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
21100 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 70 45  pConstExpr;.  pE
21110 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
21120 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
21130 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 70 20   pExpr, 0);.  p 
21140 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
21150 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
21160 70 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28  p, pExpr);.  if(
21170 20 70 20 29 7b 0a 20 20 20 20 20 73 74 72 75 63   p ){.     struc
21180 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
21190 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70  *pItem = &p->a[p
211a0 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20  ->nExpr-1];.    
211b0 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74   pItem->u.iConst
211c0 45 78 70 72 52 65 67 20 3d 20 72 65 67 44 65 73  ExprReg = regDes
211d0 74 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  t;.     pItem->r
211e0 65 75 73 61 62 6c 65 20 3d 20 72 65 75 73 61 62  eusable = reusab
211f0 6c 65 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65  le;.  }.  pParse
21200 2d 3e 70 43 6f 6e 73 74 45 78 70 72 20 3d 20 70  ->pConstExpr = p
21210 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
21220 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c  ate code to eval
21230 75 61 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  uate an expressi
21240 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  on and store the
21250 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f   results.** into
21260 20 61 20 72 65 67 69 73 74 65 72 2e 20 20 52 65   a register.  Re
21270 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65  turn the registe
21280 72 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74  r number where t
21290 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72  he results.** ar
212a0 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  e stored..**.** 
212b0 49 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20  If the register 
212c0 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72  is a temporary r
212d0 65 67 69 73 74 65 72 20 74 68 61 74 20 63 61 6e  egister that can
212e0 20 62 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c   be deallocated,
212f0 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 69  .** then write i
21300 74 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a  ts number into *
21310 70 52 65 67 2e 20 20 49 66 20 74 68 65 20 72 65  pReg.  If the re
21320 73 75 6c 74 20 72 65 67 69 73 74 65 72 20 69 73  sult register is
21330 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72   not.** a tempor
21340 61 72 79 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  ary, then set *p
21350 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a  Reg to zero..**.
21360 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61  ** If pExpr is a
21370 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20   constant, then 
21380 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
21390 68 74 20 67 65 6e 65 72 61 74 65 20 74 68 69 73  ht generate this
213a0 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 66 69 6c 6c  .** code to fill
213b0 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69 6e   the register in
213c0 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
213d0 69 6f 6e 20 73 65 63 74 69 6f 6e 20 6f 66 20 74  ion section of t
213e0 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67 72  he.** VDBE progr
213f0 61 6d 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  am, in order to 
21400 66 61 63 74 6f 72 20 69 74 20 6f 75 74 20 6f 66  factor it out of
21410 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   the evaluation 
21420 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  loop..*/.int sql
21430 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
21440 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
21450 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
21460 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74 20 72   *pReg){.  int r
21470 32 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c  2;.  pExpr = sql
21480 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
21490 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20 69 66  ate(pExpr);.  if
214a0 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28  ( ConstFactorOk(
214b0 70 50 61 72 73 65 29 0a 20 20 20 26 26 20 70 45  pParse).   && pE
214c0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49  xpr->op!=TK_REGI
214d0 53 54 45 52 0a 20 20 20 26 26 20 73 71 6c 69 74  STER.   && sqlit
214e0 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
214f0 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 0a 20  NotJoin(pExpr). 
21500 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   ){.    ExprList
21510 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 43   *p = pParse->pC
21520 6f 6e 73 74 45 78 70 72 3b 0a 20 20 20 20 69 6e  onstExpr;.    in
21530 74 20 69 3b 0a 20 20 20 20 2a 70 52 65 67 20 20  t i;.    *pReg  
21540 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 20 29  = 0;.    if( p )
21550 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  {.      struct E
21560 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
21570 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  tem;.      for(p
21580 49 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d 70 2d 3e  Item=p->a, i=p->
21590 6e 45 78 70 72 3b 20 69 3e 30 3b 20 70 49 74 65  nExpr; i>0; pIte
215a0 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20 20 20 20  m++, i--){.     
215b0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 72 65     if( pItem->re
215c0 75 73 61 62 6c 65 20 26 26 20 73 71 6c 69 74 65  usable && sqlite
215d0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 49 74  3ExprCompare(pIt
215e0 65 6d 2d 3e 70 45 78 70 72 2c 70 45 78 70 72 2c  em->pExpr,pExpr,
215f0 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -1)==0 ){.      
21600 20 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 6d      return pItem
21610 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65  ->u.iConstExprRe
21620 67 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  g;.        }.   
21630 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
21640 32 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  2 = ++pParse->nM
21650 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  em;.    sqlite3E
21660 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50  xprCodeAtInit(pP
21670 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 32 2c  arse, pExpr, r2,
21680 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   1);.  }else{.  
21690 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
216a0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
216b0 72 73 65 29 3b 0a 20 20 20 20 72 32 20 3d 20 73  rse);.    r2 = s
216c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
216d0 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
216e0 70 72 2c 20 72 31 29 3b 0a 20 20 20 20 69 66 28  pr, r1);.    if(
216f0 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20 20   r2==r1 ){.     
21700 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20 20 20   *pReg = r1;.   
21710 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
21720 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
21730 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
21740 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d 20 30  .      *pReg = 0
21750 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
21760 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn r2;.}../*.*
21770 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
21780 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61  that will evalua
21790 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  te expression pE
217a0 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68  xpr and store th
217b0 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20  e.** results in 
217c0 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
217d0 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72    The results ar
217e0 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  e guaranteed to 
217f0 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67  appear.** in reg
21800 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f  ister target..*/
21810 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
21820 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61  rCode(Parse *pPa
21830 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
21840 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
21850 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61   int inReg;..  a
21860 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
21870 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73  && target<=pPars
21880 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28  e->nMem );.  if(
21890 20 70 45 78 70 72 20 26 26 20 70 45 78 70 72 2d   pExpr && pExpr-
218a0 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op==TK_REGISTER
218b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
218c0 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65  dbeAddOp2(pParse
218d0 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79  ->pVdbe, OP_Copy
218e0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
218f0 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73   target);.  }els
21900 65 7b 0a 20 20 20 20 69 6e 52 65 67 20 3d 20 73  e{.    inReg = s
21910 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
21920 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
21930 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
21940 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
21950 3e 70 56 64 62 65 21 3d 30 20 7c 7c 20 70 50 61  >pVdbe!=0 || pPa
21960 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
21970 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28  ailed );.    if(
21980 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 26   inReg!=target &
21990 26 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20  & pParse->pVdbe 
219a0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
219b0 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73  VdbeAddOp2(pPars
219c0 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f  e->pVdbe, OP_SCo
219d0 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65  py, inReg, targe
219e0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
219f0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 72  ./*.** Make a tr
21a00 61 6e 73 69 65 6e 74 20 63 6f 70 79 20 6f 66 20  ansient copy of 
21a10 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
21a20 20 61 6e 64 20 74 68 65 6e 20 63 6f 64 65 20 69   and then code i
21a30 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  t using.** sqlit
21a40 65 33 45 78 70 72 43 6f 64 65 28 29 2e 20 20 54  e3ExprCode().  T
21a50 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
21a60 73 20 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c 69  s just like sqli
21a70 74 65 33 45 78 70 72 43 6f 64 65 28 29 0a 2a 2a  te3ExprCode().**
21a80 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65   except that the
21a90 20 69 6e 70 75 74 20 65 78 70 72 65 73 73 69 6f   input expressio
21aa0 6e 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  n is guaranteed 
21ab0 74 6f 20 62 65 20 75 6e 63 68 61 6e 67 65 64 2e  to be unchanged.
21ac0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
21ad0 45 78 70 72 43 6f 64 65 43 6f 70 79 28 50 61 72  ExprCodeCopy(Par
21ae0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
21af0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
21b00 67 65 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  get){.  sqlite3 
21b10 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
21b20 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69  ;.  pExpr = sqli
21b30 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
21b40 45 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20  Expr, 0);.  if( 
21b50 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
21b60 64 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 43  d ) sqlite3ExprC
21b70 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
21b80 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 73 71  r, target);.  sq
21b90 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
21ba0 64 62 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f  db, pExpr);.}../
21bb0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
21bc0 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61  de that will eva
21bd0 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  luate expression
21be0 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65   pExpr and store
21bf0 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20   the.** results 
21c00 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
21c10 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73  et.  The results
21c20 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
21c30 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20  to appear.** in 
21c40 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
21c50 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73    If the express
21c60 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c  ion is constant,
21c70 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
21c80 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 63 68 6f 6f  ne.** might choo
21c90 73 65 20 74 6f 20 63 6f 64 65 20 74 68 65 20 65  se to code the e
21ca0 78 70 72 65 73 73 69 6f 6e 20 61 74 20 69 6e 69  xpression at ini
21cb0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65  tialization time
21cc0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
21cd0 33 45 78 70 72 43 6f 64 65 46 61 63 74 6f 72 61  3ExprCodeFactora
21ce0 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
21cf0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
21d00 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69  int target){.  i
21d10 66 28 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e  f( pParse->okCon
21d20 73 74 46 61 63 74 6f 72 20 26 26 20 73 71 6c 69  stFactor && sqli
21d30 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
21d40 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  t(pExpr) ){.    
21d50 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
21d60 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45  tInit(pParse, pE
21d70 78 70 72 2c 20 74 61 72 67 65 74 2c 20 30 29 3b  xpr, target, 0);
21d80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
21d90 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
21da0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
21db0 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  get);.  }.}../*.
21dc0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
21dd0 20 74 68 61 74 20 65 76 61 6c 75 61 74 65 73 20   that evaluates 
21de0 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
21df0 73 69 6f 6e 20 61 6e 64 20 70 75 74 73 20 74 68  sion and puts th
21e00 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72  e result.** in r
21e10 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a  egister target..
21e20 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20  **.** Also make 
21e30 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78  a copy of the ex
21e40 70 72 65 73 73 69 6f 6e 20 72 65 73 75 6c 74 73  pression results
21e50 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22 63   into another "c
21e60 61 63 68 65 22 20 72 65 67 69 73 74 65 72 0a 2a  ache" register.*
21e70 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65  * and modify the
21e80 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f 20 74   expression so t
21e90 68 61 74 20 74 68 65 20 6e 65 78 74 20 74 69 6d  hat the next tim
21ea0 65 20 69 74 20 69 73 20 65 76 61 6c 75 61 74 65  e it is evaluate
21eb0 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  d,.** the result
21ec0 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68   is a copy of th
21ed0 65 20 63 61 63 68 65 20 72 65 67 69 73 74 65 72  e cache register
21ee0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
21ef0 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
21f00 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
21f10 74 20 61 72 65 20 75 73 65 64 20 6d 75 6c 74 69  t are used multi
21f20 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20  ple .** times.  
21f30 54 68 65 79 20 61 72 65 20 65 76 61 6c 75 61 74  They are evaluat
21f40 65 64 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20  ed once and the 
21f50 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 65  results of the e
21f60 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65  xpression.** are
21f70 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64   reused..*/.void
21f80 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
21f90 41 6e 64 43 61 63 68 65 28 50 61 72 73 65 20 2a  AndCache(Parse *
21fa0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
21fb0 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
21fc0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
21fd0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
21fe0 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20 61 73 73 65  nt iMem;..  asse
21ff0 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a  rt( target>0 );.
22000 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
22010 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op!=TK_REGISTER
22020 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
22030 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
22040 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
22050 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
22060 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  >nMem;.  sqlite3
22070 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
22080 5f 43 6f 70 79 2c 20 74 61 72 67 65 74 2c 20 69  _Copy, target, i
22090 4d 65 6d 29 3b 0a 20 20 65 78 70 72 54 6f 52 65  Mem);.  exprToRe
220a0 67 69 73 74 65 72 28 70 45 78 70 72 2c 20 69 4d  gister(pExpr, iM
220b0 65 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  em);.}../*.** Ge
220c0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
220d0 20 70 75 73 68 65 73 20 74 68 65 20 76 61 6c 75   pushes the valu
220e0 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65  e of every eleme
220f0 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a  nt of the given.
22100 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
22110 73 74 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e  st into a sequen
22120 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ce of registers 
22130 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72  beginning at tar
22140 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  get..**.** Retur
22150 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
22160 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74  elements evaluat
22170 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51  ed..**.** The SQ
22180 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 20 66 6c  LITE_ECEL_DUP fl
22190 61 67 20 70 72 65 76 65 6e 74 73 20 74 68 65 20  ag prevents the 
221a0 61 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20 62  arguments from b
221b0 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64 20 75  eing.** filled u
221c0 73 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2e 20 20  sing OP_SCopy.  
221d0 4f 50 5f 43 6f 70 79 20 6d 75 73 74 20 62 65 20  OP_Copy must be 
221e0 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  used instead..**
221f0 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45  .** The SQLITE_E
22200 43 45 4c 5f 46 41 43 54 4f 52 20 61 72 67 75 6d  CEL_FACTOR argum
22210 65 6e 74 20 61 6c 6c 6f 77 73 20 63 6f 6e 73 74  ent allows const
22220 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  ant arguments to
22230 20 62 65 0a 2a 2a 20 66 61 63 74 6f 72 65 64 20   be.** factored 
22240 6f 75 74 20 69 6e 74 6f 20 69 6e 69 74 69 61 6c  out into initial
22250 69 7a 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 2a 2a  ization code..**
22260 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45  .** The SQLITE_E
22270 43 45 4c 5f 52 45 46 20 66 6c 61 67 20 6d 65 61  CEL_REF flag mea
22280 6e 73 20 74 68 61 74 20 65 78 70 72 65 73 73 69  ns that expressi
22290 6f 6e 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  ons in the list 
222a0 77 69 74 68 0a 2a 2a 20 45 78 70 72 4c 69 73 74  with.** ExprList
222b0 2e 61 5b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  .a[].u.x.iOrderB
222c0 79 43 6f 6c 3e 30 20 68 61 76 65 20 61 6c 72 65  yCol>0 have alre
222d0 61 64 79 20 62 65 65 6e 20 65 76 61 6c 75 61 74  ady been evaluat
222e0 65 64 20 61 6e 64 20 73 74 6f 72 65 64 0a 2a 2a  ed and stored.**
222f0 20 69 6e 20 72 65 67 69 73 74 65 72 73 20 61 74   in registers at
22300 20 73 72 63 52 65 67 2c 20 61 6e 64 20 73 6f 20   srcReg, and so 
22310 74 68 65 20 76 61 6c 75 65 20 63 61 6e 20 62 65  the value can be
22320 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65   copied from the
22330 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  re..*/.int sqlit
22340 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
22350 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
22360 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73  rse,     /* Pars
22370 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
22380 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
22390 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65  ,   /* The expre
223a0 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65  ssion list to be
223b0 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
223c0 74 61 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f  target,        /
223d0 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65  * Where to write
223e0 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
223f0 74 20 73 72 63 52 65 67 2c 20 20 20 20 20 20 20  t srcReg,       
22400 20 2f 2a 20 53 6f 75 72 63 65 20 72 65 67 69 73   /* Source regis
22410 74 65 72 73 20 69 66 20 53 51 4c 49 54 45 5f 45  ters if SQLITE_E
22420 43 45 4c 5f 52 45 46 20 2a 2f 0a 20 20 75 38 20  CEL_REF */.  u8 
22430 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
22440 2f 2a 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 2a  /* SQLITE_ECEL_*
22450 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 73   flags */.){.  s
22460 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
22470 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
22480 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 75 38 20  t i, j, n;.  u8 
22490 63 6f 70 79 4f 70 20 3d 20 28 66 6c 61 67 73 20  copyOp = (flags 
224a0 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55  & SQLITE_ECEL_DU
224b0 50 29 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20 4f  P) ? OP_Copy : O
224c0 50 5f 53 43 6f 70 79 3b 0a 20 20 56 64 62 65 20  P_SCopy;.  Vdbe 
224d0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
224e0 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  be;.  assert( pL
224f0 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ist!=0 );.  asse
22500 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a  rt( target>0 );.
22510 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
22520 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b 20 20 2f  ->pVdbe!=0 );  /
22530 2a 20 4e 65 76 65 72 20 67 65 74 73 20 74 68 69  * Never gets thi
22540 73 20 66 61 72 20 6f 74 68 65 72 77 69 73 65 20  s far otherwise 
22550 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e  */.  n = pList->
22560 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 21 43 6f  nExpr;.  if( !Co
22570 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72  nstFactorOk(pPar
22580 73 65 29 20 29 20 66 6c 61 67 73 20 26 3d 20 7e  se) ) flags &= ~
22590 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54  SQLITE_ECEL_FACT
225a0 4f 52 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d  OR;.  for(pItem=
225b0 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
225c0 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  <n; i++, pItem++
225d0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
225e0 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70  pr = pItem->pExp
225f0 72 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67  r;.    if( (flag
22600 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  s & SQLITE_ECEL_
22610 52 45 46 29 21 3d 30 20 26 26 20 28 6a 20 3d 20  REF)!=0 && (j = 
22620 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 75 2e 78 2e  pList->a[i].u.x.
22630 69 4f 72 64 65 72 42 79 43 6f 6c 29 3e 30 20 29  iOrderByCol)>0 )
22640 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
22650 64 62 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70  dbeAddOp2(v, cop
22660 79 4f 70 2c 20 6a 2b 73 72 63 52 65 67 2d 31 2c  yOp, j+srcReg-1,
22670 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20   target+i);.    
22680 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73  }else if( (flags
22690 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46   & SQLITE_ECEL_F
226a0 41 43 54 4f 52 29 21 3d 30 20 26 26 20 73 71 6c  ACTOR)!=0 && sql
226b0 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
226c0 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  nt(pExpr) ){.   
226d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
226e0 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c  deAtInit(pParse,
226f0 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69   pExpr, target+i
22700 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
22710 0a 20 20 20 20 20 20 69 6e 74 20 69 6e 52 65 67  .      int inReg
22720 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
22730 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
22740 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69   pExpr, target+i
22750 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52  );.      if( inR
22760 65 67 21 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a  eg!=target+i ){.
22770 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a          VdbeOp *
22780 70 4f 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pOp;.        if(
22790 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70 79   copyOp==OP_Copy
227a0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 4f  .         && (pO
227b0 70 3d 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  p=sqlite3VdbeGet
227c0 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f 70 63 6f  Op(v, -1))->opco
227d0 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20  de==OP_Copy.    
227e0 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 31 2b       && pOp->p1+
227f0 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65 67  pOp->p3+1==inReg
22800 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4f 70  .         && pOp
22810 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d  ->p2+pOp->p3+1==
22820 74 61 72 67 65 74 2b 69 0a 20 20 20 20 20 20 20  target+i.       
22830 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
22840 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20 20 20 20  p->p3++;.       
22850 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22860 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22870 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20 69  Op2(v, copyOp, i
22880 6e 52 65 67 2c 20 74 61 72 67 65 74 2b 69 29 3b  nReg, target+i);
22890 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
228a0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
228b0 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
228c0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
228d0 66 6f 72 20 61 20 42 45 54 57 45 45 4e 20 6f 70  for a BETWEEN op
228e0 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20  erator..**.**   
228f0 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44   x BETWEEN y AND
22900 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f   z.**.** The abo
22910 76 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  ve is equivalent
22920 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e   to .**.**    x>
22930 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a  =y AND x<=z.**.*
22940 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73 75 63  * Code it as suc
22950 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74  h, taking care t
22960 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  o do the common 
22970 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  subexpression.**
22980 20 65 6c 69 6d 69 6e 61 74 69 6f 6e 20 6f 66 20   elimination of 
22990 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 78 4a 75  x..**.** The xJu
229a0 6d 70 49 66 20 70 61 72 61 6d 65 74 65 72 20 64  mpIf parameter d
229b0 65 74 65 72 6d 69 6e 65 73 20 64 65 74 61 69 6c  etermines detail
229c0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 55 4c 4c  s:.**.**    NULL
229d0 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
229e0 20 20 20 20 53 74 6f 72 65 20 74 68 65 20 62 6f      Store the bo
229f0 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 69 6e 20  olean result in 
22a00 72 65 67 5b 64 65 73 74 5d 0a 2a 2a 20 20 20 20  reg[dest].**    
22a10 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
22a20 65 3a 20 20 20 20 20 20 4a 75 6d 70 20 74 6f 20  e:      Jump to 
22a30 64 65 73 74 20 69 66 20 74 72 75 65 0a 2a 2a 20  dest if true.** 
22a40 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
22a50 46 61 6c 73 65 3a 20 20 20 20 20 4a 75 6d 70 20  False:     Jump 
22a60 74 6f 20 64 65 73 74 20 69 66 20 66 61 6c 73 65  to dest if false
22a70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 75 6d 70 49  .**.** The jumpI
22a80 66 4e 75 6c 6c 20 70 61 72 61 6d 65 74 65 72 20  fNull parameter 
22a90 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20 78 4a  is ignored if xJ
22aa0 75 6d 70 49 66 20 69 73 20 4e 55 4c 4c 2e 0a 2a  umpIf is NULL..*
22ab0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
22ac0 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 0a 20  prCodeBetween(. 
22ad0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
22ae0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
22af0 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
22b00 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
22b10 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
22b20 20 2f 2a 20 54 68 65 20 42 45 54 57 45 45 4e 20   /* The BETWEEN 
22b30 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
22b40 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20 20  int dest,       
22b50 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e    /* Jump destin
22b60 61 74 69 6f 6e 20 6f 72 20 73 74 6f 72 61 67 65  ation or storage
22b70 20 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 76   location */.  v
22b80 6f 69 64 20 28 2a 78 4a 75 6d 70 29 28 50 61 72  oid (*xJump)(Par
22b90 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 69 6e  se*,Expr*,int,in
22ba0 74 29 2c 20 2f 2a 20 41 63 74 69 6f 6e 20 74 6f  t), /* Action to
22bb0 20 74 61 6b 65 20 2a 2f 0a 20 20 69 6e 74 20 6a   take */.  int j
22bc0 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20  umpIfNull    /* 
22bd0 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  Take the jump if
22be0 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 73 20   the BETWEEN is 
22bf0 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 45 78 70 72  NULL */.){. Expr
22c00 20 65 78 70 72 41 6e 64 3b 20 20 20 20 20 2f 2a   exprAnd;     /*
22c10 20 54 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f   The AND operato
22c20 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20 78  r in  x>=y AND x
22c30 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20 63  <=z  */.  Expr c
22c40 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20 54  ompLeft;    /* T
22c50 68 65 20 20 78 3e 3d 79 20 20 74 65 72 6d 20 2a  he  x>=y  term *
22c60 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67  /.  Expr compRig
22c70 68 74 3b 20 20 20 2f 2a 20 54 68 65 20 20 78 3c  ht;   /* The  x<
22c80 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78  =z  term */.  Ex
22c90 70 72 20 65 78 70 72 58 3b 20 20 20 20 20 20 20  pr exprX;       
22ca0 2f 2a 20 54 68 65 20 20 78 20 20 73 75 62 65 78  /* The  x  subex
22cb0 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
22cc0 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20  t regFree1 = 0; 
22cd0 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65  /* Temporary use
22ce0 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 0a 20   register */... 
22cf0 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 4c 65 66   memset(&compLef
22d00 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70  t, 0, sizeof(Exp
22d10 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 63  r));.  memset(&c
22d20 6f 6d 70 52 69 67 68 74 2c 20 30 2c 20 73 69 7a  ompRight, 0, siz
22d30 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 6d 65  eof(Expr));.  me
22d40 6d 73 65 74 28 26 65 78 70 72 41 6e 64 2c 20 30  mset(&exprAnd, 0
22d50 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b  , sizeof(Expr));
22d60 0a 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  ..  assert( !Exp
22d70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
22d80 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
22d90 29 20 29 3b 0a 20 20 65 78 70 72 58 20 3d 20 2a  ) );.  exprX = *
22da0 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
22db0 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f  exprAnd.op = TK_
22dc0 41 4e 44 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70  AND;.  exprAnd.p
22dd0 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74  Left = &compLeft
22de0 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 52 69 67  ;.  exprAnd.pRig
22df0 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b  ht = &compRight;
22e00 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d  .  compLeft.op =
22e10 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c 65   TK_GE;.  compLe
22e20 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72  ft.pLeft = &expr
22e30 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52  X;.  compLeft.pR
22e40 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  ight = pExpr->x.
22e50 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
22e60 72 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f  r;.  compRight.o
22e70 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d  p = TK_LE;.  com
22e80 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20 26  pRight.pLeft = &
22e90 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 52 69 67  exprX;.  compRig
22ea0 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70  ht.pRight = pExp
22eb0 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d  r->x.pList->a[1]
22ec0 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 73 71  .pExpr;.  if( sq
22ed0 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f  lite3ExprIsVecto
22ee0 72 28 26 65 78 70 72 58 29 3d 3d 30 20 29 7b 0a  r(&exprX)==0 ){.
22ef0 20 20 20 20 65 78 70 72 54 6f 52 65 67 69 73 74      exprToRegist
22f00 65 72 28 26 65 78 70 72 58 2c 20 73 71 6c 69 74  er(&exprX, sqlit
22f10 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
22f20 50 61 72 73 65 2c 20 26 65 78 70 72 58 2c 20 26  Parse, &exprX, &
22f30 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20 7d 0a  regFree1));.  }.
22f40 20 20 69 66 28 20 78 4a 75 6d 70 20 29 7b 0a 20    if( xJump ){. 
22f50 20 20 20 78 4a 75 6d 70 28 70 50 61 72 73 65 2c     xJump(pParse,
22f60 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c   &exprAnd, dest,
22f70 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
22f80 7d 65 6c 73 65 7b 0a 20 20 20 20 65 78 70 72 58  }else{.    exprX
22f90 2e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 46 72 6f  .flags |= EP_Fro
22fa0 6d 4a 6f 69 6e 3b 0a 20 20 20 20 73 71 6c 69 74  mJoin;.    sqlit
22fb0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
22fc0 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e  (pParse, &exprAn
22fd0 64 2c 20 64 65 73 74 29 3b 0a 20 20 7d 0a 20 20  d, dest);.  }.  
22fe0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
22ff0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
23000 67 46 72 65 65 31 29 3b 0a 0a 20 20 2f 2a 20 45  gFree1);..  /* E
23010 6e 73 75 72 65 20 61 64 65 71 75 61 74 65 20 74  nsure adequate t
23020 65 73 74 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a  est coverage */.
23030 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
23040 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
23050 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e  True  && jumpIfN
23060 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
23070 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
23080 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
23090 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20 26  te3ExprIfTrue  &
230a0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  & jumpIfNull==0 
230b0 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29  && regFree1!=0 )
230c0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
230d0 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ump==sqlite3Expr
230e0 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49  IfTrue  && jumpI
230f0 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
23100 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73  ree1==0 );.  tes
23110 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
23120 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 20  lite3ExprIfTrue 
23130 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
23140 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30  0 && regFree1!=0
23150 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
23160 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78  xJump==sqlite3Ex
23170 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d  prIfFalse && jum
23180 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
23190 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74  gFree1==0 );.  t
231a0 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
231b0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
231c0 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  se && jumpIfNull
231d0 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21  ==0 && regFree1!
231e0 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
231f0 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
23200 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a  ExprIfFalse && j
23210 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
23220 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
23230 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
23240 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  ==sqlite3ExprIfF
23250 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  alse && jumpIfNu
23260 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll!=0 && regFree
23270 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1!=0 );.  testca
23280 73 65 28 20 78 4a 75 6d 70 3d 3d 30 20 29 3b 0a  se( xJump==0 );.
23290 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
232a0 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f  e code for a boo
232b0 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lean expression 
232c0 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70  such that a jump
232d0 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74   is made.** to t
232e0 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20  he label "dest" 
232f0 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
23300 6e 20 69 73 20 74 72 75 65 20 62 75 74 20 65 78  n is true but ex
23310 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69  ecution.** conti
23320 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68  nues straight th
23330 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ru if the expres
23340 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a  sion is false..*
23350 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
23360 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  ession evaluates
23370 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65   to NULL (neithe
23380 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65  r true nor false
23390 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20  ), then.** take 
233a0 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20  the jump if the 
233b0 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20  jumpIfNull flag 
233c0 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  is SQLITE_JUMPIF
233d0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  NULL..**.** This
233e0 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e   code depends on
233f0 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 63   the fact that c
23400 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c  ertain token val
23410 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a  ues (ex: TK_EQ).
23420 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  ** are the same 
23430 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73  as opcode values
23440 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61   (ex: OP_Eq) tha
23450 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  t implement the 
23460 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
23470 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65   operation.  Spe
23480 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e  cial comments in
23490 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20   vdbe.c and the 
234a0 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63  mkopcodeh.awk sc
234b0 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d  ript in.** the m
234c0 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75 73  ake process caus
234d0 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74  e these values t
234e0 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74  o align.  Assert
234f0 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a  ()s in the code.
23500 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20  ** below verify 
23510 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73  that the numbers
23520 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72   are aligned cor
23530 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  rectly..*/.void 
23540 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
23550 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
23560 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
23570 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70  t dest, int jump
23580 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20  IfNull){.  Vdbe 
23590 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
235a0 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30  be;.  int op = 0
235b0 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31  ;.  int regFree1
235c0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
235d0 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree2 = 0;.  int 
235e0 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72  r1, r2;..  asser
235f0 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  t( jumpIfNull==S
23600 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
23610 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   || jumpIfNull==
23620 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  0 );.  if( NEVER
23630 28 76 3d 3d 30 29 20 29 20 20 20 20 20 72 65 74  (v==0) )     ret
23640 75 72 6e 3b 20 20 2f 2a 20 45 78 69 73 74 65 6e  urn;  /* Existen
23650 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b  ce of VDBE check
23660 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a  ed by caller */.
23670 20 20 69 66 28 20 4e 45 56 45 52 28 70 45 78 70    if( NEVER(pExp
23680 72 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20  r==0) ) return; 
23690 20 2f 2a 20 4e 6f 20 77 61 79 20 74 68 69 73 20   /* No way this 
236a0 63 61 6e 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20  can happen */.  
236b0 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
236c0 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
236d0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
236e0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20   {.      int d2 
236f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
23700 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
23710 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
23720 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
23730 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
23740 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
23750 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75  pr->pLeft, d2,ju
23760 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f  mpIfNull^SQLITE_
23770 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
23780 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
23790 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
237a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
237b0 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
237c0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
237d0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
237e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
237f0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
23800 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73  (v, d2);.      s
23810 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
23820 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
23830 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
23840 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b     case TK_OR: {
23850 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
23860 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
23870 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
23880 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
23890 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
238a0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
238b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
238c0 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
238d0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
238e0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
238f0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
23900 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
23910 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
23920 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
23930 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
23940 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
23950 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
23960 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
23970 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
23980 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
23990 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
239a0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
239b0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
239c0 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
239d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
239e0 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65   TK_IS:.    case
239f0 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20   TK_ISNOT:.     
23a00 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
23a10 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65  K_IS );.      te
23a20 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
23a30 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 6f 70  SNOT );.      op
23a40 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f   = (op==TK_IS) ?
23a50 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a   TK_EQ : TK_NE;.
23a60 20 20 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c        jumpIfNull
23a70 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51   = SQLITE_NULLEQ
23a80 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  ;.      /* Fall 
23a90 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65  thru */.    case
23aa0 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
23ab0 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
23ac0 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
23ad0 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
23ae0 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
23af0 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
23b00 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
23b10 73 56 65 63 74 6f 72 28 70 45 78 70 72 2d 3e 70  sVector(pExpr->p
23b20 4c 65 66 74 29 20 29 20 67 6f 74 6f 20 64 65 66  Left) ) goto def
23b30 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20 20 20 20  ault_expr;.     
23b40 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
23b50 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
23b60 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
23b70 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
23b80 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
23b90 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
23ba0 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
23bb0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
23bc0 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
23bd0 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
23be0 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
23bf0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
23c00 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
23c10 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
23c20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
23c30 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r2, dest, jumpIf
23c40 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73  Null);.      ass
23c50 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74  ert(TK_LT==OP_Lt
23c60 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
23c70 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Lt); VdbeCove
23c80 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
23c90 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Lt);.      asser
23ca0 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b  t(TK_LE==OP_Le);
23cb0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
23cc0 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Le); VdbeCovera
23cd0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65  geIf(v,op==OP_Le
23ce0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
23cf0 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74  TK_GT==OP_Gt); t
23d00 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
23d10 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
23d20 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b  If(v,op==OP_Gt);
23d30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
23d40 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73  _GE==OP_Ge); tes
23d50 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29  tcase(op==OP_Ge)
23d60 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
23d70 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20  (v,op==OP_Ge);. 
23d80 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45       assert(TK_E
23d90 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63  Q==OP_Eq); testc
23da0 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a  ase(op==OP_Eq);.
23db0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
23dc0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45  geIf(v, op==OP_E
23dd0 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  q && jumpIfNull=
23de0 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
23df0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
23e00 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
23e10 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Eq && jumpIfNull
23e20 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  !=SQLITE_NULLEQ)
23e30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
23e40 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65  K_NE==OP_Ne); te
23e50 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65  stcase(op==OP_Ne
23e60 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
23e70 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
23e80 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Ne && jumpIfNu
23e90 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll==SQLITE_NULLE
23ea0 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
23eb0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
23ec0 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Ne && jumpIfN
23ed0 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull!=SQLITE_NULL
23ee0 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  EQ);.      testc
23ef0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
23f00 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
23f10 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
23f20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
23f30 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
23f40 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
23f50 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
23f60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
23f70 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e  K_ISNULL==OP_IsN
23f80 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63 61 73  ull );   testcas
23f90 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  e( op==TK_ISNULL
23fa0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
23fb0 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50  ( TK_NOTNULL==OP
23fc0 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74  _NotNull ); test
23fd0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
23fe0 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31  NULL );.      r1
23ff0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
24000 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
24010 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
24020 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73  gFree1);.      s
24030 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
24040 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74  (v, op, r1, dest
24050 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
24060 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
24070 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  K_ISNULL);.     
24080 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
24090 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  v, op==TK_NOTNUL
240a0 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  L);.      testca
240b0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
240c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
240d0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
240e0 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
240f0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
24100 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
24110 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74 77      exprCodeBetw
24120 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70  een(pParse, pExp
24130 72 2c 20 64 65 73 74 2c 20 73 71 6c 69 74 65 33  r, dest, sqlite3
24140 45 78 70 72 49 66 54 72 75 65 2c 20 6a 75 6d 70  ExprIfTrue, jump
24150 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
24160 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
24170 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
24180 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
24190 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
241a0 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65   int destIfFalse
241b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
241c0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
241d0 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c    int destIfNull
241e0 20 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20   = jumpIfNull ? 
241f0 64 65 73 74 20 3a 20 64 65 73 74 49 66 46 61 6c  dest : destIfFal
24200 73 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se;.      sqlite
24210 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72  3ExprCodeIN(pPar
24220 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49  se, pExpr, destI
24230 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75  fFalse, destIfNu
24240 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
24250 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65  e3VdbeGoto(v, de
24260 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
24270 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
24280 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73  el(v, destIfFals
24290 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
242a0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
242b0 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
242c0 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3a 0a 20   default_expr:. 
242d0 20 20 20 20 20 69 66 28 20 65 78 70 72 41 6c 77       if( exprAlw
242e0 61 79 73 54 72 75 65 28 70 45 78 70 72 29 20 29  aysTrue(pExpr) )
242f0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
24300 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73  3VdbeGoto(v, des
24310 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  t);.      }else 
24320 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 46 61  if( exprAlwaysFa
24330 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  lse(pExpr) ){.  
24340 20 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 2a        /* No-op *
24350 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  /.      }else{. 
24360 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
24370 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
24380 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26  pParse, pExpr, &
24390 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
243a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
243b0 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp3(v, OP_If, r
243c0 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  1, dest, jumpIfN
243d0 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  ull!=0);.       
243e0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
243f0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
24400 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
24410 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
24420 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
24430 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
24440 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
24450 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
24460 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
24470 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
24480 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
24490 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
244a0 72 65 67 46 72 65 65 32 29 3b 20 20 0a 7d 0a 0a  regFree2);  .}..
244b0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
244c0 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61  ode for a boolea
244d0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63  n expression suc
244e0 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73  h that a jump is
244f0 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20   made.** to the 
24500 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20  label "dest" if 
24510 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
24520 73 20 66 61 6c 73 65 20 62 75 74 20 65 78 65 63  s false but exec
24530 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75  ution.** continu
24540 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75  es straight thru
24550 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
24560 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a  on is true..**.*
24570 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
24580 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ion evaluates to
24590 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74   NULL (neither t
245a0 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74  rue nor false) t
245b0 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a  hen.** jump if j
245c0 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c  umpIfNull is SQL
245d0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f  ITE_JUMPIFNULL o
245e0 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69  r fall through i
245f0 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20  f jumpIfNull.** 
24600 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  is 0..*/.void sq
24610 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
24620 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
24630 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
24640 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49   dest, int jumpI
24650 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a  fNull){.  Vdbe *
24660 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
24670 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b  e;.  int op = 0;
24680 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
24690 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72  = 0;.  int regFr
246a0 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ee2 = 0;.  int r
246b0 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74  1, r2;..  assert
246c0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  ( jumpIfNull==SQ
246d0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
246e0 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  || jumpIfNull==0
246f0 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   );.  if( NEVER(
24700 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20  v==0) ) return; 
24710 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20  /* Existence of 
24720 56 44 42 45 20 63 68 65 63 6b 65 64 20 62 79 20  VDBE checked by 
24730 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20  caller */.  if( 
24740 70 45 78 70 72 3d 3d 30 20 29 20 20 20 20 72 65  pExpr==0 )    re
24750 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  turn;..  /* The 
24760 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72 2d 3e  value of pExpr->
24770 6f 70 20 61 6e 64 20 6f 70 20 61 72 65 20 72 65  op and op are re
24780 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  lated as follows
24790 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
247a0 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20    pExpr->op     
247b0 20 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20         op.  **  
247c0 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20       ---------  
247d0 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d          --------
247e0 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  --.  **       TK
247f0 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20 20 20 20  _ISNULL         
24800 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a   OP_NotNull.  **
24810 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c         TK_NOTNUL
24820 4c 20 20 20 20 20 20 20 20 20 4f 50 5f 49 73 4e  L         OP_IsN
24830 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ull.  **       T
24840 4b 5f 4e 45 20 20 20 20 20 20 20 20 20 20 20 20  K_NE            
24850 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20    OP_Eq.  **    
24860 20 20 20 54 4b 5f 45 51 20 20 20 20 20 20 20 20     TK_EQ        
24870 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a        OP_Ne.  **
24880 20 20 20 20 20 20 20 54 4b 5f 47 54 20 20 20 20         TK_GT    
24890 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a            OP_Le.
248a0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45    **       TK_LE
248b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
248c0 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Gt.  **       T
248d0 4b 5f 47 45 20 20 20 20 20 20 20 20 20 20 20 20  K_GE            
248e0 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20    OP_Lt.  **    
248f0 20 20 20 54 4b 5f 4c 54 20 20 20 20 20 20 20 20     TK_LT        
24900 20 20 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a        OP_Ge.  **
24910 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20  .  ** For other 
24920 76 61 6c 75 65 73 20 6f 66 20 70 45 78 70 72 2d  values of pExpr-
24930 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64 65 66  >op, op is undef
24940 69 6e 65 64 20 61 6e 64 20 75 6e 75 73 65 64 2e  ined and unused.
24950 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  .  ** The value 
24960 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63  of TK_ and OP_ c
24970 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 61 72 72  onstants are arr
24980 61 6e 67 65 64 20 73 75 63 68 20 74 68 61 74 20  anged such that 
24990 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70  we.  ** can comp
249a0 75 74 65 20 74 68 65 20 6d 61 70 70 69 6e 67 20  ute the mapping 
249b0 61 62 6f 76 65 20 75 73 69 6e 67 20 74 68 65 20  above using the 
249c0 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73  following expres
249d0 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72  sion..  ** Asser
249e0 74 28 29 73 20 76 65 72 69 66 79 20 74 68 61 74  t()s verify that
249f0 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e   the computation
24a00 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a   is correct..  *
24a10 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45 78 70 72  /.  op = ((pExpr
24a20 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26  ->op+(TK_ISNULL&
24a30 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c  1))^1)-(TK_ISNUL
24a40 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69  L&1);..  /* Veri
24a50 66 79 20 63 6f 72 72 65 63 74 20 61 6c 69 67 6e  fy correct align
24a60 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20  ment of TK_ and 
24a70 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20  OP_ constants.  
24a80 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  */.  assert( pEx
24a90 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c  pr->op!=TK_ISNUL
24aa0 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e  L || op==OP_NotN
24ab0 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ull );.  assert(
24ac0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e   pExpr->op!=TK_N
24ad0 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50  OTNULL || op==OP
24ae0 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73  _IsNull );.  ass
24af0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
24b00 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_NE || op==OP_
24b10 45 71 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Eq );.  assert( 
24b20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51  pExpr->op!=TK_EQ
24b30 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b   || op==OP_Ne );
24b40 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
24b50 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f  ->op!=TK_LT || o
24b60 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73  p==OP_Ge );.  as
24b70 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
24b80 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_LE || op==OP
24b90 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Gt );.  assert(
24ba0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47   pExpr->op!=TK_G
24bb0 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29  T || op==OP_Le )
24bc0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
24bd0 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20  r->op!=TK_GE || 
24be0 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20  op==OP_Lt );..  
24bf0 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
24c00 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
24c10 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 74 65  _AND: {.      te
24c20 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
24c30 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
24c40 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
24c50 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
24c60 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
24c70 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
24c80 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
24c90 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
24ca0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
24cb0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
24cc0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
24cd0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
24ce0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
24cf0 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
24d00 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  se);.      break
24d10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
24d20 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
24d30 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
24d40 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
24d50 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
24d60 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
24d70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
24d80 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
24d90 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
24da0 20 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e   d2, jumpIfNull^
24db0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
24dc0 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
24dd0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
24de0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
24df0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
24e00 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
24e10 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
24e20 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
24e30 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
24e40 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b  lveLabel(v, d2);
24e50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
24e60 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
24e70 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
24e80 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
24e90 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
24ea0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
24eb0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
24ec0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
24ed0 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
24ee0 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
24ef0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
24f00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
24f10 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20     case TK_IS:. 
24f20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54     case TK_ISNOT
24f30 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
24f40 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
24f50 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  IS );.      test
24f60 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
24f70 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20  =TK_ISNOT );.   
24f80 20 20 20 6f 70 20 3d 20 28 70 45 78 70 72 2d 3e     op = (pExpr->
24f90 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f  op==TK_IS) ? TK_
24fa0 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a 20 20 20 20  NE : TK_EQ;.    
24fb0 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53    jumpIfNull = S
24fc0 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20  QLITE_NULLEQ;.  
24fd0 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75      /* Fall thru
24fe0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
24ff0 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
25000 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
25010 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
25020 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
25030 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
25040 45 51 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  EQ: {.      if( 
25050 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63  sqlite3ExprIsVec
25060 74 6f 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  tor(pExpr->pLeft
25070 29 20 29 20 67 6f 74 6f 20 64 65 66 61 75 6c 74  ) ) goto default
25080 5f 65 78 70 72 3b 0a 20 20 20 20 20 20 74 65 73  _expr;.      tes
25090 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
250a0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31  l==0 );.      r1
250b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
250c0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
250d0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
250e0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
250f0 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
25100 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
25110 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
25120 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
25130 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
25140 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
25150 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
25160 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
25170 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
25180 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
25190 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
251a0 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74  TK_LT==OP_Lt); t
251b0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
251c0 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
251d0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  If(v,op==OP_Lt);
251e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
251f0 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73  _LE==OP_Le); tes
25200 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29  tcase(op==OP_Le)
25210 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
25220 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20  (v,op==OP_Le);. 
25230 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
25240 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63  T==OP_Gt); testc
25250 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20  ase(op==OP_Gt); 
25260 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
25270 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20  ,op==OP_Gt);.   
25280 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d     assert(TK_GE=
25290 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ge); testcas
252a0 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64  e(op==OP_Ge); Vd
252b0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
252c0 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20  p==OP_Ge);.     
252d0 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f   assert(TK_EQ==O
252e0 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65 28  P_Eq); testcase(
252f0 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20  op==OP_Eq);.    
25300 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
25310 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26  (v, op==OP_Eq &&
25320 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c   jumpIfNull!=SQL
25330 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
25340 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
25350 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26  f(v, op==OP_Eq &
25360 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  & jumpIfNull==SQ
25370 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
25380 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45      assert(TK_NE
25390 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61  ==OP_Ne); testca
253a0 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20  se(op==OP_Ne);. 
253b0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
253c0 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65  eIf(v, op==OP_Ne
253d0 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
253e0 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
253f0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
25400 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e  geIf(v, op==OP_N
25410 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  e && jumpIfNull=
25420 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
25430 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
25440 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
25450 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
25460 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
25470 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
25480 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
25490 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
254a0 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
254b0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
254c0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
254d0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
254e0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
254f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
25500 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c  ddOp2(v, op, r1,
25510 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65   dest);.      te
25520 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
25530 53 4e 55 4c 4c 20 29 3b 20 20 20 56 64 62 65 43  SNULL );   VdbeC
25540 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
25550 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20  =TK_ISNULL);.   
25560 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
25570 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 20 20  =TK_NOTNULL );  
25580 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
25590 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  , op==TK_NOTNULL
255a0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
255b0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
255c0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
255d0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
255e0 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
255f0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
25600 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
25610 20 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65     exprCodeBetwe
25620 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  en(pParse, pExpr
25630 2c 20 64 65 73 74 2c 20 73 71 6c 69 74 65 33 45  , dest, sqlite3E
25640 78 70 72 49 66 46 61 6c 73 65 2c 20 6a 75 6d 70  xprIfFalse, jump
25650 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
25660 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
25670 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
25680 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
25690 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
256a0 20 69 66 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   if( jumpIfNull 
256b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
256c0 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61  e3ExprCodeIN(pPa
256d0 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
256e0 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d  , dest);.      }
256f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
25700 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73  t destIfNull = s
25710 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
25720 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
25730 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
25740 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  N(pParse, pExpr,
25750 20 64 65 73 74 2c 20 64 65 73 74 49 66 4e 75 6c   dest, destIfNul
25760 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
25770 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
25780 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c  bel(v, destIfNul
25790 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
257a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
257b0 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
257c0 74 3a 20 7b 0a 20 20 20 20 64 65 66 61 75 6c 74  t: {.    default
257d0 5f 65 78 70 72 3a 20 0a 20 20 20 20 20 20 69 66  _expr: .      if
257e0 28 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73  ( exprAlwaysFals
257f0 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  e(pExpr) ){.    
25800 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
25810 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20  oto(v, dest);.  
25820 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78      }else if( ex
25830 70 72 41 6c 77 61 79 73 54 72 75 65 28 70 45 78  prAlwaysTrue(pEx
25840 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  pr) ){.        /
25850 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20  * no-op */.     
25860 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
25870 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
25880 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
25890 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65   pExpr, &regFree
258a0 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
258b0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
258c0 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64   OP_IfNot, r1, d
258d0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  est, jumpIfNull!
258e0 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  =0);.        Vdb
258f0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
25900 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
25910 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
25920 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
25930 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
25940 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25950 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
25960 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
25970 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
25980 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
25990 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
259a0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
259b0 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ree2);.}../*.** 
259c0 4c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72  Like sqlite3Expr
259d0 49 66 46 61 6c 73 65 28 29 20 65 78 63 65 70 74  IfFalse() except
259e0 20 74 68 61 74 20 61 20 63 6f 70 79 20 69 73 20   that a copy is 
259f0 6d 61 64 65 20 6f 66 20 70 45 78 70 72 20 62 65  made of pExpr be
25a00 66 6f 72 65 0a 2a 2a 20 63 6f 64 65 20 67 65 6e  fore.** code gen
25a10 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 74 68 61  eration, and tha
25a20 74 20 63 6f 70 79 20 69 73 20 64 65 6c 65 74 65  t copy is delete
25a30 64 20 61 66 74 65 72 20 63 6f 64 65 20 67 65 6e  d after code gen
25a40 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 0a 2a 2a  eration. This.**
25a50 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
25a60 65 20 6f 72 69 67 69 6e 61 6c 20 70 45 78 70 72  e original pExpr
25a70 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a   is unchanged..*
25a80 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
25a90 70 72 49 66 46 61 6c 73 65 44 75 70 28 50 61 72  prIfFalseDup(Par
25aa0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
25ab0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
25ac0 74 2c 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  t,int jumpIfNull
25ad0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
25ae0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
25af0 20 45 78 70 72 20 2a 70 43 6f 70 79 20 3d 20 73   Expr *pCopy = s
25b00 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
25b10 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 69  , pExpr, 0);.  i
25b20 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
25b30 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  led==0 ){.    sq
25b40 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
25b50 28 70 50 61 72 73 65 2c 20 70 43 6f 70 79 2c 20  (pParse, pCopy, 
25b60 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
25b70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
25b80 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
25b90 43 6f 70 79 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  Copy);.}.../*.**
25ba0 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61   Do a deep compa
25bb0 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70  rison of two exp
25bc0 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20  ression trees.  
25bd0 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20  Return 0 if the 
25be0 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  two.** expressio
25bf0 6e 73 20 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c  ns are completel
25c00 79 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 52 65  y identical.  Re
25c10 74 75 72 6e 20 31 20 69 66 20 74 68 65 79 20 64  turn 1 if they d
25c20 69 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79  iffer only.** by
25c30 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61   a COLLATE opera
25c40 74 6f 72 20 61 74 20 74 68 65 20 74 6f 70 20 6c  tor at the top l
25c50 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 32 20  evel.  Return 2 
25c60 69 66 20 74 68 65 72 65 20 61 72 65 20 64 69 66  if there are dif
25c70 66 65 72 65 6e 63 65 73 0a 2a 2a 20 6f 74 68 65  ferences.** othe
25c80 72 20 74 68 61 6e 20 74 68 65 20 74 6f 70 2d 6c  r than the top-l
25c90 65 76 65 6c 20 43 4f 4c 4c 41 54 45 20 6f 70 65  evel COLLATE ope
25ca0 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rator..**.** If 
25cb0 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f  any subelement o
25cc0 66 20 70 42 20 68 61 73 20 45 78 70 72 2e 69 54  f pB has Expr.iT
25cd0 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20  able==(-1) then 
25ce0 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a  it is allowed.**
25cf0 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75 61   to compare equa
25d00 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c 65  l to an equivale
25d10 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41  nt element in pA
25d20 20 77 69 74 68 20 45 78 70 72 2e 69 54 61 62 6c   with Expr.iTabl
25d30 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54  e==iTab..**.** T
25d40 68 65 20 70 41 20 73 69 64 65 20 6d 69 67 68 74  he pA side might
25d50 20 62 65 20 75 73 69 6e 67 20 54 4b 5f 52 45 47   be using TK_REG
25d60 49 53 54 45 52 2e 20 20 49 66 20 74 68 61 74 20  ISTER.  If that 
25d70 69 73 20 74 68 65 20 63 61 73 65 20 61 6e 64 20  is the case and 
25d80 70 42 20 69 73 0a 2a 2a 20 6e 6f 74 20 75 73 69  pB is.** not usi
25d90 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52 20 62  ng TK_REGISTER b
25da0 75 74 20 69 73 20 6f 74 68 65 72 77 69 73 65 20  ut is otherwise 
25db0 65 71 75 69 76 61 6c 65 6e 74 2c 20 74 68 65 6e  equivalent, then
25dc0 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 20 30 2e   still return 0.
25dd0 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
25de0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
25df0 6c 6c 20 72 65 74 75 72 6e 20 32 20 65 76 65 6e  ll return 2 even
25e00 20 69 66 20 74 68 65 20 74 77 6f 20 65 78 70 72   if the two expr
25e10 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c  essions.** reall
25e20 79 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74  y are equivalent
25e30 2e 20 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20  .  If we cannot 
25e40 70 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 65  prove that the e
25e50 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a  xpressions are.*
25e60 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20  * identical, we 
25e70 72 65 74 75 72 6e 20 32 20 6a 75 73 74 20 74 6f  return 2 just to
25e80 20 62 65 20 73 61 66 65 2e 20 20 53 6f 20 69 66   be safe.  So if
25e90 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
25ea0 20 72 65 74 75 72 6e 73 20 32 2c 20 74 68 65 6e   returns 2, then
25eb0 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c   you do not real
25ec0 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74  ly know for cert
25ed0 61 69 6e 20 69 66 20 74 68 65 20 74 77 6f 0a 2a  ain if the two.*
25ee0 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  * expressions ar
25ef0 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74  e the same.  But
25f00 20 69 66 20 79 6f 75 20 67 65 74 20 61 20 30 20   if you get a 0 
25f10 6f 72 20 31 20 72 65 74 75 72 6e 2c 20 74 68 65  or 1 return, the
25f20 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20  n you.** can be 
25f30 73 75 72 65 20 74 68 65 20 65 78 70 72 65 73 73  sure the express
25f40 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d  ions are the sam
25f50 65 2e 20 20 49 6e 20 74 68 65 20 70 6c 61 63 65  e.  In the place
25f60 73 20 77 68 65 72 65 0a 2a 2a 20 74 68 69 73 20  s where.** this 
25f70 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 2c  routine is used,
25f80 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 68 75 72   it does not hur
25f90 74 20 74 6f 20 67 65 74 20 61 6e 20 65 78 74 72  t to get an extr
25fa0 61 20 32 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75  a 2 - that.** ju
25fb0 73 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20  st might result 
25fc0 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79  in some slightly
25fd0 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20 42   slower code.  B
25fe0 75 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20  ut returning.** 
25ff0 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 30 20 6f  an incorrect 0 o
26000 72 20 31 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  r 1 could lead t
26010 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e  o a malfunction.
26020 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
26030 78 70 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20  xprCompare(Expr 
26040 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 2c 20 69  *pA, Expr *pB, i
26050 6e 74 20 69 54 61 62 29 7b 0a 20 20 75 33 32 20  nt iTab){.  u32 
26060 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 3b 0a 20  combinedFlags;. 
26070 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42   if( pA==0 || pB
26080 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
26090 6e 20 70 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32  n pB==pA ? 0 : 2
260a0 3b 0a 20 20 7d 0a 20 20 63 6f 6d 62 69 6e 65 64  ;.  }.  combined
260b0 46 6c 61 67 73 20 3d 20 70 41 2d 3e 66 6c 61 67  Flags = pA->flag
260c0 73 20 7c 20 70 42 2d 3e 66 6c 61 67 73 3b 0a 20  s | pB->flags;. 
260d0 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61   if( combinedFla
260e0 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
260f0 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 41 2d   ){.    if( (pA-
26100 3e 66 6c 61 67 73 26 70 42 2d 3e 66 6c 61 67 73  >flags&pB->flags
26110 26 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30  &EP_IntValue)!=0
26120 20 26 26 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65   && pA->u.iValue
26130 3d 3d 70 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29  ==pB->u.iValue )
26140 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
26150 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
26160 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 2;.  }.  if( 
26170 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29  pA->op!=pB->op )
26180 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70  {.    if( pA->op
26190 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20  ==TK_COLLATE && 
261a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
261b0 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42  re(pA->pLeft, pB
261c0 2c 20 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20  , iTab)<2 ){.   
261d0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
261e0 20 7d 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 6f   }.    if( pB->o
261f0 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26  p==TK_COLLATE &&
26200 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
26210 61 72 65 28 70 41 2c 20 70 42 2d 3e 70 4c 65 66  are(pA, pB->pLef
26220 74 2c 20 69 54 61 62 29 3c 32 20 29 7b 0a 20 20  t, iTab)<2 ){.  
26230 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
26240 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32    }.    return 2
26250 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e  ;.  }.  if( pA->
26260 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op!=TK_COLUMN &&
26270 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f   pA->op!=TK_AGG_
26280 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 75 2e  COLUMN && pA->u.
26290 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66  zToken ){.    if
262a0 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e  ( pA->op==TK_FUN
262b0 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 69  CTION ){.      i
262c0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
262d0 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70  p(pA->u.zToken,p
262e0 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20  B->u.zToken)!=0 
262f0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
26300 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
26310 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42  (pA->u.zToken,pB
26320 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29  ->u.zToken)!=0 )
26330 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
26340 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  A->op==TK_COLLAT
26350 45 20 3f 20 31 20 3a 20 32 3b 0a 20 20 20 20 7d  E ? 1 : 2;.    }
26360 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e  .  }.  if( (pA->
26370 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
26380 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73  nct)!=(pB->flags
26390 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20   & EP_Distinct) 
263a0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66  ) return 2;.  if
263b0 28 20 41 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e  ( ALWAYS((combin
263c0 65 64 46 6c 61 67 73 20 26 20 45 50 5f 54 6f 6b  edFlags & EP_Tok
263d0 65 6e 4f 6e 6c 79 29 3d 3d 30 29 20 29 7b 0a 20  enOnly)==0) ){. 
263e0 20 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46     if( combinedF
263f0 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c  lags & EP_xIsSel
26400 65 63 74 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ect ) return 2;.
26410 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
26420 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70  xprCompare(pA->p
26430 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 2c  Left, pB->pLeft,
26440 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   iTab) ) return 
26450 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  2;.    if( sqlit
26460 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
26470 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52  ->pRight, pB->pR
26480 69 67 68 74 2c 20 69 54 61 62 29 20 29 20 72 65  ight, iTab) ) re
26490 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
264a0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
264b0 6f 6d 70 61 72 65 28 70 41 2d 3e 78 2e 70 4c 69  ompare(pA->x.pLi
264c0 73 74 2c 20 70 42 2d 3e 78 2e 70 4c 69 73 74 2c  st, pB->x.pList,
264d0 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   iTab) ) return 
264e0 32 3b 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59  2;.    if( ALWAY
264f0 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  S((combinedFlags
26500 20 26 20 45 50 5f 52 65 64 75 63 65 64 29 3d 3d   & EP_Reduced)==
26510 30 29 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b  0) && pA->op!=TK
26520 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 20  _STRING ){.     
26530 20 69 66 28 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e   if( pA->iColumn
26540 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20  !=pB->iColumn ) 
26550 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 20 20  return 2;.      
26560 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d  if( pA->iTable!=
26570 70 42 2d 3e 69 54 61 62 6c 65 20 0a 20 20 20 20  pB->iTable .    
26580 20 20 20 26 26 20 28 70 41 2d 3e 69 54 61 62 6c     && (pA->iTabl
26590 65 21 3d 69 54 61 62 20 7c 7c 20 4e 45 56 45 52  e!=iTab || NEVER
265a0 28 70 42 2d 3e 69 54 61 62 6c 65 3e 3d 30 29 29  (pB->iTable>=0))
265b0 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
265c0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
265d0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  0;.}../*.** Comp
265e0 61 72 65 20 74 77 6f 20 45 78 70 72 4c 69 73 74  are two ExprList
265f0 20 6f 62 6a 65 63 74 73 2e 20 20 52 65 74 75 72   objects.  Retur
26600 6e 20 30 20 69 66 20 74 68 65 79 20 61 72 65 20  n 0 if they are 
26610 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20 0a 2a  identical and .*
26620 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  * non-zero if th
26630 65 79 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79  ey differ in any
26640 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61   way..**.** If a
26650 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66  ny subelement of
26660 20 70 42 20 68 61 73 20 45 78 70 72 2e 69 54 61   pB has Expr.iTa
26670 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69  ble==(-1) then i
26680 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20  t is allowed.** 
26690 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c  to compare equal
266a0 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e   to an equivalen
266b0 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20  t element in pA 
266c0 77 69 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65  with Expr.iTable
266d0 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68  ==iTab..**.** Th
266e0 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
266f0 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
26700 20 66 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20   for equivalent 
26710 45 78 70 72 4c 69 73 74 73 2e 20 20 54 68 65 0a  ExprLists.  The.
26720 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65 71 75 65  ** only conseque
26730 6e 63 65 20 77 69 6c 6c 20 62 65 20 64 69 73 61  nce will be disa
26740 62 6c 65 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f  bled optimizatio
26750 6e 73 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f  ns.  But this ro
26760 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e 65  utine.** must ne
26770 76 65 72 20 72 65 74 75 72 6e 20 30 20 69 66 20  ver return 0 if 
26780 74 68 65 20 74 77 6f 20 45 78 70 72 4c 69 73 74  the two ExprList
26790 20 6f 62 6a 65 63 74 73 20 61 72 65 20 64 69 66   objects are dif
267a0 66 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20  ferent, or.** a 
267b0 6d 61 6c 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  malfunction will
267c0 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54   result..**.** T
267d0 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73  wo NULL pointers
267e0 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
267f0 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65 2e 20  to be the same. 
26800 20 42 75 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e   But a NULL poin
26810 74 65 72 0a 2a 2a 20 61 6c 77 61 79 73 20 64 69  ter.** always di
26820 66 66 65 72 73 20 66 72 6f 6d 20 61 20 6e 6f 6e  ffers from a non
26830 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a  -NULL pointer..*
26840 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
26850 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 45 78 70  rListCompare(Exp
26860 72 4c 69 73 74 20 2a 70 41 2c 20 45 78 70 72 4c  rList *pA, ExprL
26870 69 73 74 20 2a 70 42 2c 20 69 6e 74 20 69 54 61  ist *pB, int iTa
26880 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  b){.  int i;.  i
26890 66 28 20 70 41 3d 3d 30 20 26 26 20 70 42 3d 3d  f( pA==0 && pB==
268a0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
268b0 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d  if( pA==0 || pB=
268c0 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
268d0 20 69 66 28 20 70 41 2d 3e 6e 45 78 70 72 21 3d   if( pA->nExpr!=
268e0 70 42 2d 3e 6e 45 78 70 72 20 29 20 72 65 74 75  pB->nExpr ) retu
268f0 72 6e 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  rn 1;.  for(i=0;
26900 20 69 3c 70 41 2d 3e 6e 45 78 70 72 3b 20 69 2b   i<pA->nExpr; i+
26910 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
26920 78 70 72 41 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e  xprA = pA->a[i].
26930 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20  pExpr;.    Expr 
26940 2a 70 45 78 70 72 42 20 3d 20 70 42 2d 3e 61 5b  *pExprB = pB->a[
26950 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
26960 28 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  ( pA->a[i].sortO
26970 72 64 65 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73  rder!=pB->a[i].s
26980 6f 72 74 4f 72 64 65 72 20 29 20 72 65 74 75 72  ortOrder ) retur
26990 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  n 1;.    if( sql
269a0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
269b0 70 45 78 70 72 41 2c 20 70 45 78 70 72 42 2c 20  pExprA, pExprB, 
269c0 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 31  iTab) ) return 1
269d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
269e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
269f0 6e 20 74 72 75 65 20 69 66 20 77 65 20 63 61 6e  n true if we can
26a00 20 70 72 6f 76 65 20 74 68 65 20 70 45 32 20 77   prove the pE2 w
26a10 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 74 72  ill always be tr
26a20 75 65 20 69 66 20 70 45 31 20 69 73 0a 2a 2a 20  ue if pE1 is.** 
26a30 74 72 75 65 2e 20 20 52 65 74 75 72 6e 20 66 61  true.  Return fa
26a40 6c 73 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74  lse if we cannot
26a50 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 70 72   complete the pr
26a60 6f 6f 66 20 6f 72 20 69 66 20 70 45 32 20 6d 69  oof or if pE2 mi
26a70 67 68 74 0a 2a 2a 20 62 65 20 66 61 6c 73 65 2e  ght.** be false.
26a80 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a    Examples:.**.*
26a90 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 3d 35 20  *     pE1: x==5 
26aa0 20 20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20        pE2: x==5 
26ab0 20 20 20 20 20 20 20 20 20 20 20 20 52 65 73 75              Resu
26ac0 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20  lt: true.**     
26ad0 70 45 31 3a 20 78 3e 30 20 20 20 20 20 20 20 20  pE1: x>0        
26ae0 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20  pE2: x==5       
26af0 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61        Result: fa
26b00 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  lse.**     pE1: 
26b10 78 3d 32 31 20 20 20 20 20 20 20 70 45 32 3a 20  x=21       pE2: 
26b20 78 3d 32 31 20 4f 52 20 79 3d 34 33 20 20 20 20  x=21 OR y=43    
26b30 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a   Result: true.**
26b40 20 20 20 20 20 70 45 31 3a 20 78 21 3d 31 32 33       pE1: x!=123
26b50 20 20 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e       pE2: x IS N
26b60 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c  OT NULL    Resul
26b70 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70  t: true.**     p
26b80 45 31 3a 20 78 21 3d 3f 31 20 20 20 20 20 20 70  E1: x!=?1      p
26b90 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c  E2: x IS NOT NUL
26ba0 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75  L    Result: tru
26bb0 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20  e.**     pE1: x 
26bc0 49 53 20 4e 55 4c 4c 20 20 70 45 32 3a 20 78 20  IS NULL  pE2: x 
26bd0 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52  IS NOT NULL    R
26be0 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20  esult: false.** 
26bf0 20 20 20 20 70 45 31 3a 20 78 20 49 53 20 3f 32      pE1: x IS ?2
26c00 20 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f      pE2: x IS NO
26c10 54 20 4e 55 4c 4c 20 20 20 20 52 65 75 73 6c 74  T NULL    Reuslt
26c20 3a 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68  : false.**.** Wh
26c30 65 6e 20 63 6f 6d 70 61 72 69 6e 67 20 54 4b 5f  en comparing TK_
26c40 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 62 65 74  COLUMN nodes bet
26c50 77 65 65 6e 20 70 45 31 20 61 6e 64 20 70 45 32  ween pE1 and pE2
26c60 2c 20 69 66 20 70 45 32 20 68 61 73 0a 2a 2a 20  , if pE2 has.** 
26c70 45 78 70 72 2e 69 54 61 62 6c 65 3c 30 20 74 68  Expr.iTable<0 th
26c80 65 6e 20 61 73 73 75 6d 65 20 61 20 74 61 62 6c  en assume a tabl
26c90 65 20 6e 75 6d 62 65 72 20 67 69 76 65 6e 20 62  e number given b
26ca0 79 20 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 57 68  y iTab..**.** Wh
26cb0 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74  en in doubt, ret
26cc0 75 72 6e 20 66 61 6c 73 65 2e 20 20 52 65 74 75  urn false.  Retu
26cd0 72 6e 69 6e 67 20 74 72 75 65 20 6d 69 67 68 74  rning true might
26ce0 20 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61   give a performa
26cf0 6e 63 65 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d 65  nce.** improveme
26d00 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 66  nt.  Returning f
26d10 61 6c 73 65 20 6d 69 67 68 74 20 63 61 75 73 65  alse might cause
26d20 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72   a performance r
26d30 65 64 75 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a  eduction, but.**
26d40 20 69 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20   it will always 
26d50 67 69 76 65 20 74 68 65 20 63 6f 72 72 65 63 74  give the correct
26d60 20 61 6e 73 77 65 72 20 61 6e 64 20 69 73 20 68   answer and is h
26d70 65 6e 63 65 20 61 6c 77 61 79 73 20 73 61 66 65  ence always safe
26d80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
26d90 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
26da0 45 78 70 72 20 2a 70 45 31 2c 20 45 78 70 72 20  Expr *pE1, Expr 
26db0 2a 70 45 32 2c 20 69 6e 74 20 69 54 61 62 29 7b  *pE2, int iTab){
26dc0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
26dd0 70 72 43 6f 6d 70 61 72 65 28 70 45 31 2c 20 70  prCompare(pE1, p
26de0 45 32 2c 20 69 54 61 62 29 3d 3d 30 20 29 7b 0a  E2, iTab)==0 ){.
26df0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
26e00 7d 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d  }.  if( pE2->op=
26e10 3d 54 4b 5f 4f 52 0a 20 20 20 26 26 20 28 73 71  =TK_OR.   && (sq
26e20 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
26e30 45 78 70 72 28 70 45 31 2c 20 70 45 32 2d 3e 70  Expr(pE1, pE2->p
26e40 4c 65 66 74 2c 20 69 54 61 62 29 0a 20 20 20 20  Left, iTab).    
26e50 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
26e60 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78  te3ExprImpliesEx
26e70 70 72 28 70 45 31 2c 20 70 45 32 2d 3e 70 52 69  pr(pE1, pE2->pRi
26e80 67 68 74 2c 20 69 54 61 62 29 20 29 0a 20 20 29  ght, iTab) ).  )
26e90 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
26ea0 20 20 7d 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f    }.  if( pE2->o
26eb0 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20  p==TK_NOTNULL.  
26ec0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
26ed0 6f 6d 70 61 72 65 28 70 45 31 2d 3e 70 4c 65 66  ompare(pE1->pLef
26ee0 74 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69  t, pE2->pLeft, i
26ef0 54 61 62 29 3d 3d 30 0a 20 20 20 26 26 20 28 70  Tab)==0.   && (p
26f00 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c  E1->op!=TK_ISNUL
26f10 4c 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b  L && pE1->op!=TK
26f20 5f 49 53 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  _IS).  ){.    re
26f30 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
26f40 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
26f50 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
26f60 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
26f70 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20  ructure is used 
26f80 62 79 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b  by the tree walk
26f90 65 72 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69  er.** to determi
26fa0 6e 65 20 69 66 20 61 6e 20 65 78 70 72 65 73 73  ne if an express
26fb0 69 6f 6e 20 63 61 6e 20 62 65 20 65 76 61 6c 75  ion can be evalu
26fc0 61 74 65 64 20 62 79 20 72 65 66 65 72 65 6e 63  ated by referenc
26fd0 65 20 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 65  e to the.** inde
26fe0 78 20 6f 6e 6c 79 2c 20 77 69 74 68 6f 75 74 20  x only, without 
26ff0 68 61 76 69 6e 67 20 74 6f 20 64 6f 20 61 20 73  having to do a s
27000 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 63 6f  earch for the co
27010 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74  rresponding.** t
27020 61 62 6c 65 20 65 6e 74 72 79 2e 20 20 54 68 65  able entry.  The
27030 20 49 64 78 43 6f 76 65 72 2e 70 49 64 78 20 66   IdxCover.pIdx f
27040 69 65 6c 64 20 69 73 20 74 68 65 20 69 6e 64 65  ield is the inde
27050 78 2e 20 20 49 64 78 43 6f 76 65 72 2e 69 43 75  x.  IdxCover.iCu
27060 72 0a 2a 2a 20 69 73 20 74 68 65 20 63 75 72 73  r.** is the curs
27070 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  or for the table
27080 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 49 64 78 43  ..*/.struct IdxC
27090 6f 76 65 72 20 7b 0a 20 20 49 6e 64 65 78 20 2a  over {.  Index *
270a0 70 49 64 78 3b 20 20 20 20 20 2f 2a 20 54 68 65  pIdx;     /* The
270b0 20 69 6e 64 65 78 20 74 6f 20 62 65 20 74 65 73   index to be tes
270c0 74 65 64 20 66 6f 72 20 63 6f 76 65 72 61 67 65  ted for coverage
270d0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20   */.  int iCur; 
270e0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
270f0 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
27100 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64  table correspond
27110 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ing to the index
27120 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68   */.};../*.** Ch
27130 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
27140 65 72 65 20 61 72 65 20 72 65 66 65 72 65 6e 63  ere are referenc
27150 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e  es to columns in
27160 20 74 61 62 6c 65 20 0a 2a 2a 20 70 57 61 6c 6b   table .** pWalk
27170 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d  er->u.pIdxCover-
27180 3e 69 43 75 72 20 63 61 6e 20 62 65 20 73 61 74  >iCur can be sat
27190 69 73 66 69 65 64 20 75 73 69 6e 67 20 74 68 65  isfied using the
271a0 20 69 6e 64 65 78 0a 2a 2a 20 70 57 61 6c 6b 65   index.** pWalke
271b0 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e  r->u.pIdxCover->
271c0 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pIdx..*/.static 
271d0 69 6e 74 20 65 78 70 72 49 64 78 43 6f 76 65 72  int exprIdxCover
271e0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
271f0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
27200 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
27210 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26  =TK_COLUMN.   &&
27220 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
27230 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43  pWalker->u.pIdxC
27240 6f 76 65 72 2d 3e 69 43 75 72 0a 20 20 20 26 26  over->iCur.   &&
27250 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
27260 49 6e 64 65 78 28 70 57 61 6c 6b 65 72 2d 3e 75  Index(pWalker->u
27270 2e 70 49 64 78 43 6f 76 65 72 2d 3e 70 49 64 78  .pIdxCover->pIdx
27280 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
27290 29 3c 30 0a 20 20 29 7b 0a 20 20 20 20 70 57 61  )<0.  ){.    pWa
272a0 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b  lker->eCode = 1;
272b0 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
272c0 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 65 74  Abort;.  }.  ret
272d0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
272e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  ;.}../*.** Deter
272f0 6d 69 6e 65 20 69 66 20 61 6e 20 69 6e 64 65 78  mine if an index
27300 20 70 49 64 78 20 6f 6e 20 74 61 62 6c 65 20 77   pIdx on table w
27310 69 74 68 20 63 75 72 73 6f 72 20 69 43 75 72 20  ith cursor iCur 
27320 63 6f 6e 74 61 69 6e 73 20 77 69 6c 6c 0a 2a 2a  contains will.**
27330 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
27340 70 45 78 70 72 2e 20 20 52 65 74 75 72 6e 20 74  pExpr.  Return t
27350 72 75 65 20 69 66 20 74 68 65 20 69 6e 64 65 78  rue if the index
27360 20 64 6f 65 73 20 63 6f 76 65 72 20 74 68 65 0a   does cover the.
27370 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ** expression an
27380 64 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 70  d false if the p
27390 45 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e 20  Expr expression 
273a0 72 65 66 65 72 65 6e 63 65 73 20 74 61 62 6c 65  references table
273b0 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 74 68 61 74   columns.** that
273c0 20 61 72 65 20 6e 6f 74 20 66 6f 75 6e 64 20 69   are not found i
273d0 6e 20 74 68 65 20 69 6e 64 65 78 20 70 49 64 78  n the index pIdx
273e0 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 64 65 78  ..**.** An index
273f0 20 63 6f 76 65 72 69 6e 67 20 61 6e 20 65 78 70   covering an exp
27400 72 65 73 73 69 6f 6e 20 6d 65 61 6e 73 20 74 68  ression means th
27410 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  at the expressio
27420 6e 20 63 61 6e 20 62 65 0a 2a 2a 20 65 76 61 6c  n can be.** eval
27430 75 61 74 65 64 20 75 73 69 6e 67 20 6f 6e 6c 79  uated using only
27440 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 77   the index and w
27450 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
27460 20 6c 6f 6f 6b 75 70 20 74 68 65 0a 2a 2a 20 63   lookup the.** c
27470 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62  orresponding tab
27480 6c 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 69 6e 74  le entry..*/.int
27490 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 76 65   sqlite3ExprCove
274a0 72 65 64 42 79 49 6e 64 65 78 28 0a 20 20 45 78  redByIndex(.  Ex
274b0 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
274c0 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74    /* The index t
274d0 6f 20 62 65 20 74 65 73 74 65 64 20 2a 2f 0a 20  o be tested */. 
274e0 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20   int iCur,      
274f0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
27500 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
27510 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
27520 74 61 62 6c 65 20 2a 2f 0a 20 20 49 6e 64 65 78  table */.  Index
27530 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 2f   *pIdx         /
27540 2a 20 54 68 65 20 69 6e 64 65 78 20 74 68 61 74  * The index that
27550 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 20 66   might be used f
27560 6f 72 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 29  or coverage */.)
27570 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
27580 73 74 72 75 63 74 20 49 64 78 43 6f 76 65 72 20  struct IdxCover 
27590 78 63 6f 76 3b 0a 20 20 6d 65 6d 73 65 74 28 26  xcov;.  memset(&
275a0 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29  w, 0, sizeof(w))
275b0 3b 0a 20 20 78 63 6f 76 2e 69 43 75 72 20 3d 20  ;.  xcov.iCur = 
275c0 69 43 75 72 3b 0a 20 20 78 63 6f 76 2e 70 49 64  iCur;.  xcov.pId
275d0 78 20 3d 20 70 49 64 78 3b 0a 20 20 77 2e 78 45  x = pIdx;.  w.xE
275e0 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78  xprCallback = ex
275f0 70 72 49 64 78 43 6f 76 65 72 3b 0a 20 20 77 2e  prIdxCover;.  w.
27600 75 2e 70 49 64 78 43 6f 76 65 72 20 3d 20 26 78  u.pIdxCover = &x
27610 63 6f 76 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  cov;.  sqlite3Wa
27620 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72  lkExpr(&w, pExpr
27630 29 3b 0a 20 20 72 65 74 75 72 6e 20 21 77 2e 65  );.  return !w.e
27640 43 6f 64 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Code;.}.../*.** 
27650 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
27660 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
27670 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20 62  ucture is used b
27680 79 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 65  y the tree walke
27690 72 0a 2a 2a 20 74 6f 20 63 6f 75 6e 74 20 72 65  r.** to count re
276a0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62 6c  ferences to tabl
276b0 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  e columns in the
276c0 20 61 72 67 75 6d 65 6e 74 73 20 6f 66 20 61 6e   arguments of an
276d0 20 0a 2a 2a 20 61 67 67 72 65 67 61 74 65 20 66   .** aggregate f
276e0 75 6e 63 74 69 6f 6e 2c 20 69 6e 20 6f 72 64 65  unction, in orde
276f0 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  r to implement t
27700 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e  he.** sqlite3Fun
27710 63 74 69 6f 6e 54 68 69 73 53 72 63 28 29 20 72  ctionThisSrc() r
27720 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63  outine..*/.struc
27730 74 20 53 72 63 43 6f 75 6e 74 20 7b 0a 20 20 53  t SrcCount {.  S
27740 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
27750 2f 2a 20 4f 6e 65 20 70 61 72 74 69 63 75 6c 61  /* One particula
27760 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e  r FROM clause in
27770 20 61 20 6e 65 73 74 65 64 20 71 75 65 72 79 20   a nested query 
27780 2a 2f 0a 20 20 69 6e 74 20 6e 54 68 69 73 3b 20  */.  int nThis; 
27790 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
277a0 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
277b0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 53 72 63   columns in pSrc
277c0 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  List */.  int nO
277d0 74 68 65 72 3b 20 20 20 20 20 20 2f 2a 20 4e 75  ther;      /* Nu
277e0 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
277f0 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e  es to columns in
27800 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75   other FROM clau
27810 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ses */.};../*.**
27820 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
27830 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
27840 74 6f 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73  to columns..*/.s
27850 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53 72  tatic int exprSr
27860 63 43 6f 75 6e 74 28 57 61 6c 6b 65 72 20 2a 70  cCount(Walker *p
27870 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
27880 78 70 72 29 7b 0a 20 20 2f 2a 20 54 68 65 20 4e  xpr){.  /* The N
27890 45 56 45 52 28 29 20 6f 6e 20 74 68 65 20 73 65  EVER() on the se
278a0 63 6f 6e 64 20 74 65 72 6d 20 69 73 20 62 65 63  cond term is bec
278b0 61 75 73 65 20 73 71 6c 69 74 65 33 46 75 6e 63  ause sqlite3Func
278c0 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28  tionUsesThisSrc(
278d0 29 0a 20 20 2a 2a 20 69 73 20 61 6c 77 61 79 73  ).  ** is always
278e0 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 73   called before s
278f0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
27900 65 41 67 67 72 65 67 61 74 65 73 28 29 20 61 6e  eAggregates() an
27910 64 20 73 6f 20 74 68 65 0a 20 20 2a 2a 20 54 4b  d so the.  ** TK
27920 5f 43 4f 4c 55 4d 4e 73 20 68 61 76 65 20 6e 6f  _COLUMNs have no
27930 74 20 79 65 74 20 62 65 65 6e 20 63 6f 6e 76 65  t yet been conve
27940 72 74 65 64 20 69 6e 74 6f 20 54 4b 5f 41 47 47  rted into TK_AGG
27950 5f 43 4f 4c 55 4d 4e 2e 20 20 49 66 0a 20 20 2a  _COLUMN.  If.  *
27960 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f  * sqlite3Functio
27970 6e 55 73 65 73 54 68 69 73 53 72 63 28 29 20 69  nUsesThisSrc() i
27980 73 20 75 73 65 64 20 64 69 66 66 65 72 65 6e 74  s used different
27990 6c 79 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  ly in the future
279a0 2c 20 74 68 65 0a 20 20 2a 2a 20 4e 45 56 45 52  , the.  ** NEVER
279b0 28 29 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  () will need to 
279c0 62 65 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20  be removed. */. 
279d0 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
279e0 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56  TK_COLUMN || NEV
279f0 45 52 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  ER(pExpr->op==TK
27a00 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a  _AGG_COLUMN) ){.
27a10 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73      int i;.    s
27a20 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 2a  truct SrcCount *
27a30 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  p = pWalker->u.p
27a40 53 72 63 43 6f 75 6e 74 3b 0a 20 20 20 20 53 72  SrcCount;.    Sr
27a50 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d  cList *pSrc = p-
27a60 3e 70 53 72 63 3b 0a 20 20 20 20 69 6e 74 20 6e  >pSrc;.    int n
27a70 53 72 63 20 3d 20 70 53 72 63 20 3f 20 70 53 72  Src = pSrc ? pSr
27a80 63 2d 3e 6e 53 72 63 20 3a 20 30 3b 0a 20 20 20  c->nSrc : 0;.   
27a90 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 72 63   for(i=0; i<nSrc
27aa0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
27ab0 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
27ac0 3d 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72  =pSrc->a[i].iCur
27ad0 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  sor ) break;.   
27ae0 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 53 72   }.    if( i<nSr
27af0 63 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 54  c ){.      p->nT
27b00 68 69 73 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  his++;.    }else
27b10 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 74 68 65  {.      p->nOthe
27b20 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  r++;.    }.  }. 
27b30 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
27b40 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  inue;.}../*.** D
27b50 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 79 20  etermine if any 
27b60 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  of the arguments
27b70 20 74 6f 20 74 68 65 20 70 45 78 70 72 20 46 75   to the pExpr Fu
27b80 6e 63 74 69 6f 6e 20 72 65 66 65 72 65 6e 63 65  nction reference
27b90 0a 2a 2a 20 70 53 72 63 4c 69 73 74 2e 20 20 52  .** pSrcList.  R
27ba0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
27bb0 65 79 20 64 6f 2e 20 20 41 6c 73 6f 20 72 65 74  ey do.  Also ret
27bc0 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
27bd0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20  function.** has 
27be0 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 6f 72 20  no arguments or 
27bf0 68 61 73 20 6f 6e 6c 79 20 63 6f 6e 73 74 61 6e  has only constan
27c00 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65  t arguments.  Re
27c10 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 70 45  turn false if pE
27c20 78 70 72 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  xpr.** reference
27c30 73 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 6e 6f  s columns but no
27c40 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 61 62  t columns of tab
27c50 6c 65 73 20 66 6f 75 6e 64 20 69 6e 20 70 53 72  les found in pSr
27c60 63 4c 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cList..*/.int sq
27c70 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65  lite3FunctionUse
27c80 73 54 68 69 73 53 72 63 28 45 78 70 72 20 2a 70  sThisSrc(Expr *p
27c90 45 78 70 72 2c 20 53 72 63 4c 69 73 74 20 2a 70  Expr, SrcList *p
27ca0 53 72 63 4c 69 73 74 29 7b 0a 20 20 57 61 6c 6b  SrcList){.  Walk
27cb0 65 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20 53  er w;.  struct S
27cc0 72 63 43 6f 75 6e 74 20 63 6e 74 3b 0a 20 20 61  rcCount cnt;.  a
27cd0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
27ce0 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  ==TK_AGG_FUNCTIO
27cf0 4e 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77  N );.  memset(&w
27d00 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b  , 0, sizeof(w));
27d10 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
27d20 63 6b 20 3d 20 65 78 70 72 53 72 63 43 6f 75 6e  ck = exprSrcCoun
27d30 74 3b 0a 20 20 77 2e 75 2e 70 53 72 63 43 6f 75  t;.  w.u.pSrcCou
27d40 6e 74 20 3d 20 26 63 6e 74 3b 0a 20 20 63 6e 74  nt = &cnt;.  cnt
27d50 2e 70 53 72 63 20 3d 20 70 53 72 63 4c 69 73 74  .pSrc = pSrcList
27d60 3b 0a 20 20 63 6e 74 2e 6e 54 68 69 73 20 3d 20  ;.  cnt.nThis = 
27d70 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68 65 72 20  0;.  cnt.nOther 
27d80 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  = 0;.  sqlite3Wa
27d90 6c 6b 45 78 70 72 4c 69 73 74 28 26 77 2c 20 70  lkExprList(&w, p
27da0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  Expr->x.pList);.
27db0 20 20 72 65 74 75 72 6e 20 63 6e 74 2e 6e 54 68    return cnt.nTh
27dc0 69 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68  is>0 || cnt.nOth
27dd0 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  er==0;.}../*.** 
27de0 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
27df0 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66  t to the pAggInf
27e00 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e  o->aCol[] array.
27e10 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
27e20 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ex of.** the new
27e30 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72   element.  Retur
27e40 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  n a negative num
27e50 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ber if malloc fa
27e60 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
27e70 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c  nt addAggInfoCol
27e80 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  umn(sqlite3 *db,
27e90 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29   AggInfo *pInfo)
27ea0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e  {.  int i;.  pIn
27eb0 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74  fo->aCol = sqlit
27ec0 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
27ed0 0a 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20  .       db,.    
27ee0 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a     pInfo->aCol,.
27ef0 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49         sizeof(pI
27f00 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20  nfo->aCol[0]),. 
27f10 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43        &pInfo->nC
27f20 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 69  olumn,.       &i
27f30 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  .  );.  return i
27f40 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41  ;.}    ../*.** A
27f50 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
27f60 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f   to the pAggInfo
27f70 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e  ->aFunc[] array.
27f80 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
27f90 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ex of.** the new
27fa0 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72   element.  Retur
27fb0 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  n a negative num
27fc0 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ber if malloc fa
27fd0 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
27fe0 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e  nt addAggInfoFun
27ff0 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41  c(sqlite3 *db, A
28000 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  ggInfo *pInfo){.
28010 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f    int i;.  pInfo
28020 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65  ->aFunc = sqlite
28030 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
28040 20 20 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20         db, .    
28050 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c     pInfo->aFunc,
28060 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70  .       sizeof(p
28070 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c  Info->aFunc[0]),
28080 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e  .       &pInfo->
28090 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 69  nFunc,.       &i
280a0 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  .  );.  return i
280b0 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54  ;.}    ../*.** T
280c0 68 69 73 20 69 73 20 74 68 65 20 78 45 78 70 72  his is the xExpr
280d0 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20 74  Callback for a t
280e0 72 65 65 20 77 61 6c 6b 65 72 2e 20 20 49 74 20  ree walker.  It 
280f0 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d  is used to.** im
28100 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 45  plement sqlite3E
28110 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
28120 61 74 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c  ates().  See sql
28130 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
28140 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72  ggregates.** for
28150 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
28160 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  rmation..*/.stat
28170 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67  ic int analyzeAg
28180 67 72 65 67 61 74 65 28 57 61 6c 6b 65 72 20 2a  gregate(Walker *
28190 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
281a0 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Expr){.  int i;.
281b0 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
281c0 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  NC = pWalker->u.
281d0 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  pNC;.  Parse *pP
281e0 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
281f0 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  se;.  SrcList *p
28200 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  SrcList = pNC->p
28210 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e  SrcList;.  AggIn
28220 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70  fo *pAggInfo = p
28230 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20  NC->pAggInfo;.. 
28240 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
28250 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
28260 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
28270 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
28280 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
28290 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
282a0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
282b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
282c0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
282d0 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a  LUMN );.      /*
282e0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
282f0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69   the column is i
28300 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62  n one of the tab
28310 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a  les in the FROM.
28320 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20        ** clause 
28330 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  of the aggregate
28340 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20   query */.      
28350 69 66 28 20 41 4c 57 41 59 53 28 70 53 72 63 4c  if( ALWAYS(pSrcL
28360 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  ist!=0) ){.     
28370 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
28380 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
28390 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  pSrcList->a;.   
283a0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
283b0 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pSrcList->nSrc; 
283c0 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
283d0 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
283e0 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
283f0 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  l;.          ass
28400 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
28410 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
28420 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
28430 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20  uced) );.       
28440 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
28450 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75  able==pItem->iCu
28460 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rsor ){.        
28470 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61      /* If we rea
28480 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69  ch this point, i
28490 74 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78  t means that pEx
284a0 70 72 20 72 65 66 65 72 73 20 74 6f 20 61 20 74  pr refers to a t
284b0 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  able.           
284c0 20 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74   ** that is in t
284d0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
284e0 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
284f0 71 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20  query.  .       
28500 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
28510 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65      ** Make an e
28520 6e 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c  ntry for the col
28530 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  umn in pAggInfo-
28540 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65  >aCol[] if there
28550 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
28560 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20  is not an entry 
28570 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20  there already.. 
28580 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
28590 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b            int k;
285a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
285b0 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  l = pAggInfo->aC
285c0 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol;.            
285d0 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49  for(k=0; k<pAggI
285e0 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b  nfo->nColumn; k+
285f0 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
28600 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
28610 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70  ol->iTable==pExp
28620 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20  r->iTable &&.   
28630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
28640 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45  Col->iColumn==pE
28650 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a  xpr->iColumn ){.
28660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28670 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
28680 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
28690 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
286a0 20 69 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66   if( (k>=pAggInf
286b0 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20  o->nColumn).    
286c0 20 20 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d           && (k =
286d0 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d   addAggInfoColum
286e0 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41  n(pParse->db, pA
286f0 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20  ggInfo))>=0 .   
28700 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
28710 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d            pCol =
28720 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c   &pAggInfo->aCol
28730 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [k];.           
28740 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20     pCol->pTab = 
28750 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20  pExpr->pTab;.   
28760 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
28770 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d  >iTable = pExpr-
28780 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  >iTable;.       
28790 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f         pCol->iCo
287a0 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43  lumn = pExpr->iC
287b0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20  olumn;.         
287c0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20       pCol->iMem 
287d0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
287e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
287f0 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
28800 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
28810 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45          pCol->pE
28820 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  xpr = pExpr;.   
28830 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
28840 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42  AggInfo->pGroupB
28850 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y ){.           
28860 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20       int j, n;. 
28870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
28880 78 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70  xprList *pGB = p
28890 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42  AggInfo->pGroupB
288a0 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y;.             
288b0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
288c0 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d  st_item *pTerm =
288d0 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20   pGB->a;.       
288e0 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42           n = pGB
288f0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
28900 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
28910 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72  ; j<n; j++, pTer
28920 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
28930 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
28940 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
28950 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28960 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
28970 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e  K_COLUMN && pE->
28980 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
28990 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20  Table &&.       
289a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
289b0 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70  E->iColumn==pExp
289c0 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  r->iColumn ){.  
289d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289e0 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
289f0 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20  olumn = j;.     
28a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
28a10 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
28a20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28a30 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
28a40 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
28a50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
28a60 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
28a70 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  n<0 ){.         
28a80 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
28a90 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67  rterColumn = pAg
28aa0 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43  gInfo->nSortingC
28ab0 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20  olumn++;.       
28ac0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28ad0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
28ae0 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
28af0 6f 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  ow an entry for 
28b00 70 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66  pExpr in pAggInf
28b10 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65  o->aCol[] (eithe
28b20 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  r.            **
28b30 20 62 65 63 61 75 73 65 20 69 74 20 77 61 73 20   because it was 
28b40 74 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20  there before or 
28b50 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 20  because we just 
28b60 63 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20  created it)..   
28b70 20 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76           ** Conv
28b80 65 72 74 20 74 68 65 20 70 45 78 70 72 20 74 6f  ert the pExpr to
28b90 20 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c   be a TK_AGG_COL
28ba0 55 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f  UMN referring to
28bb0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
28bc0 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61    ** pAggInfo->a
28bd0 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20  Col[] entry..   
28be0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
28bf0 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74 56          ExprSetV
28c00 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  VAProperty(pExpr
28c10 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
28c20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
28c30 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41  r->pAggInfo = pA
28c40 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  ggInfo;.        
28c50 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
28c60 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20  TK_AGG_COLUMN;. 
28c70 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
28c80 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 6b 3b  ->iAgg = (i16)k;
28c90 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
28ca0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20  ak;.          } 
28cb0 2f 2a 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e  /* endif pExpr->
28cc0 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69  iTable==pItem->i
28cd0 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20  Cursor */.      
28ce0 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20    } /* end loop 
28cf0 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f  over pSrcList */
28d00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
28d10 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
28d20 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
28d30 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
28d40 20 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4e   {.      if( (pN
28d50 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f  C->ncFlags & NC_
28d60 49 6e 41 67 67 46 75 6e 63 29 3d 3d 30 0a 20 20  InAggFunc)==0.  
28d70 20 20 20 20 20 26 26 20 70 57 61 6c 6b 65 72 2d       && pWalker-
28d80 3e 77 61 6c 6b 65 72 44 65 70 74 68 3d 3d 70 45  >walkerDepth==pE
28d90 78 70 72 2d 3e 6f 70 32 0a 20 20 20 20 20 20 29  xpr->op2.      )
28da0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  {.        /* Che
28db0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45 78  ck to see if pEx
28dc0 70 72 20 69 73 20 61 20 64 75 70 6c 69 63 61 74  pr is a duplicat
28dd0 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67  e of another agg
28de0 72 65 67 61 74 65 20 0a 20 20 20 20 20 20 20 20  regate .        
28df0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  ** function that
28e00 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
28e10 68 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75  he pAggInfo stru
28e20 63 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f  cture.        */
28e30 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
28e40 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49  AggInfo_func *pI
28e50 74 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  tem = pAggInfo->
28e60 61 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66  aFunc;.        f
28e70 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
28e80 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
28e90 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
28ea0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
28eb0 78 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d  xprCompare(pItem
28ec0 2d 3e 70 45 78 70 72 2c 20 70 45 78 70 72 2c 20  ->pExpr, pExpr, 
28ed0 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -1)==0 ){.      
28ee0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
28ef0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28f00 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
28f10 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  >=pAggInfo->nFun
28f20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  c ){.          /
28f30 2a 20 70 45 78 70 72 20 69 73 20 6f 72 69 67 69  * pExpr is origi
28f40 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77  nal.  Make a new
28f50 20 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49 6e   entry in pAggIn
28f60 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20  fo->aFunc[].    
28f70 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
28f80 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28     u8 enc = ENC(
28f90 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20  pParse->db);.   
28fa0 20 20 20 20 20 20 20 69 20 3d 20 61 64 64 41 67         i = addAg
28fb0 67 49 6e 66 6f 46 75 6e 63 28 70 50 61 72 73 65  gInfoFunc(pParse
28fc0 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b  ->db, pAggInfo);
28fd0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
28fe0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
28ff0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
29000 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
29010 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
29020 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
29030 70 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e 66  pItem = &pAggInf
29040 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20  o->aFunc[i];.   
29050 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
29060 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
29070 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
29080 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  ->iMem = ++pPars
29090 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
290a0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
290b0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
290c0 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
290d0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
290e0 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20   pItem->pFunc = 
290f0 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
29100 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a  ion(pParse->db,.
29110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29120 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b     pExpr->u.zTok
29130 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  en, .           
29140 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78          pExpr->x
29150 2e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e  .pList ? pExpr->
29160 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  x.pList->nExpr :
29170 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20   0, enc, 0);.   
29180 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
29190 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44  pr->flags & EP_D
291a0 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
291b0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
291c0 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72  iDistinct = pPar
291d0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
291e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
291f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
29200 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  em->iDistinct = 
29210 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
29220 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
29230 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29240 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70 6f  /* Make pExpr po
29250 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f  int to the appro
29260 70 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f 2d  priate pAggInfo-
29270 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20  >aFunc[] entry. 
29280 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
29290 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
292a0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
292b0 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
292c0 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
292d0 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41        ExprSetVVA
292e0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
292f0 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
29300 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
29310 67 20 3d 20 28 69 31 36 29 69 3b 0a 20 20 20 20  g = (i16)i;.    
29320 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49      pExpr->pAggI
29330 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a  nfo = pAggInfo;.
29340 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
29350 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20  RC_Prune;.      
29360 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
29370 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
29380 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
29390 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  }.  }.  return W
293a0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73  RC_Continue;.}.s
293b0 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a  tatic int analyz
293c0 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c  eAggregatesInSel
293d0 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ect(Walker *pWal
293e0 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  ker, Select *pSe
293f0 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f  lect){.  UNUSED_
29400 50 41 52 41 4d 45 54 45 52 28 70 57 61 6c 6b 65  PARAMETER(pWalke
29410 72 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  r);.  UNUSED_PAR
29420 41 4d 45 54 45 52 28 70 53 65 6c 65 63 74 29 3b  AMETER(pSelect);
29430 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
29440 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
29450 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 70 45 78   Analyze the pEx
29460 70 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f  pr expression lo
29470 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67  oking for aggreg
29480 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  ate functions an
29490 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62 6c  d.** for variabl
294a0 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  es that need to 
294b0 62 65 20 61 64 64 65 64 20 74 6f 20 41 67 67 49  be added to AggI
294c0 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 20  nfo object that 
294d0 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a  pNC->pAggInfo.**
294e0 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41 64 64   points to.  Add
294f0 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20  itional entries 
29500 61 72 65 20 6d 61 64 65 20 6f 6e 20 74 68 65 20  are made on the 
29510 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 61  AggInfo object a
29520 73 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 2e 0a  s.** necessary..
29530 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
29540 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62  ne should only b
29550 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74  e called after t
29560 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61  he expression ha
29570 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a  s been.** analyz
29580 65 64 20 62 79 20 73 71 6c 69 74 65 33 52 65 73  ed by sqlite3Res
29590 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 2e  olveExprNames().
295a0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
295b0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
295c0 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78  gates(NameContex
295d0 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45  t *pNC, Expr *pE
295e0 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  xpr){.  Walker w
295f0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30  ;.  memset(&w, 0
29600 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
29610 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
29620 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  = analyzeAggrega
29630 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  te;.  w.xSelectC
29640 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a  allback = analyz
29650 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c  eAggregatesInSel
29660 65 63 74 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d  ect;.  w.u.pNC =
29670 20 70 4e 43 3b 0a 20 20 61 73 73 65 72 74 28 20   pNC;.  assert( 
29680 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30  pNC->pSrcList!=0
29690 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c   );.  sqlite3Wal
296a0 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29  kExpr(&w, pExpr)
296b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  ;.}../*.** Call 
296c0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
296d0 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20 66  zeAggregates() f
296e0 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73  or every express
296f0 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70  ion in an.** exp
29700 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52  ression list.  R
29710 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
29720 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a   of errors..**.*
29730 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73  * If an error is
29740 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c   found, the anal
29750 79 73 69 73 20 69 73 20 63 75 74 20 73 68 6f 72  ysis is cut shor
29760 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
29770 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
29780 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74  List(NameContext
29790 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74 20   *pNC, ExprList 
297a0 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75 63  *pList){.  struc
297b0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
297c0 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  *pItem;.  int i;
297d0 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
297e0 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c      for(pItem=pL
297f0 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70  ist->a, i=0; i<p
29800 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
29810 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
29820 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
29830 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70  lyzeAggregates(p
29840 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  NC, pItem->pExpr
29850 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
29860 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
29870 20 73 69 6e 67 6c 65 20 6e 65 77 20 72 65 67 69   single new regi
29880 73 74 65 72 20 66 6f 72 20 75 73 65 20 74 6f 20  ster for use to 
29890 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65 72 6d  hold some interm
298a0 65 64 69 61 74 65 20 72 65 73 75 6c 74 2e 0a 2a  ediate result..*
298b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74  /.int sqlite3Get
298c0 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70  TempReg(Parse *p
298d0 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70 50  Parse){.  if( pP
298e0 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d  arse->nTempReg==
298f0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
29900 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
29910 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61    }.  return pPa
29920 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d  rse->aTempReg[--
29930 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
29940 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c  ];.}../*.** Deal
29950 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73 74 65  locate a registe
29960 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69 6c 61  r, making availa
29970 62 6c 65 20 66 6f 72 20 72 65 75 73 65 20 66 6f  ble for reuse fo
29980 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  r some other.** 
29990 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  purpose..**.** I
299a0 66 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20  f a register is 
299b0 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
299c0 75 73 65 64 20 62 79 20 74 68 65 20 63 6f 6c 75  used by the colu
299d0 6d 6e 20 63 61 63 68 65 2c 20 74 68 65 6e 0a 2a  mn cache, then.*
299e0 2a 20 74 68 65 20 64 65 61 6c 6c 6f 63 61 74 69  * the deallocati
299f0 6f 6e 20 69 73 20 64 65 66 65 72 72 65 64 20 75  on is deferred u
29a00 6e 74 69 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 20  ntil the column 
29a10 63 61 63 68 65 20 6c 69 6e 65 20 74 68 61 74 20  cache line that 
29a20 75 73 65 73 0a 2a 2a 20 74 68 65 20 72 65 67 69  uses.** the regi
29a30 73 74 65 72 20 62 65 63 6f 6d 65 73 20 73 74 61  ster becomes sta
29a40 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
29a50 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
29a60 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  g(Parse *pParse,
29a70 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 66   int iReg){.  if
29a80 28 20 69 52 65 67 20 26 26 20 70 50 61 72 73 65  ( iReg && pParse
29a90 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79  ->nTempReg<Array
29aa0 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65  Size(pParse->aTe
29ab0 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20 69 6e  mpReg) ){.    in
29ac0 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20  t i;.    struct 
29ad0 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20  yColCache *p;.  
29ae0 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
29af0 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
29b00 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
29b10 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
29b20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65        if( p->iRe
29b30 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20 20  g==iReg ){.     
29b40 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20     p->tempReg = 
29b50 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
29b60 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n;.      }.    }
29b70 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65  .    pParse->aTe
29b80 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54  mpReg[pParse->nT
29b90 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67  empReg++] = iReg
29ba0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
29bb0 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c  llocate or deall
29bc0 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66  ocate a block of
29bd0 20 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69 76   nReg consecutiv
29be0 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2f 0a 69  e registers.*/.i
29bf0 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d  nt sqlite3GetTem
29c00 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  pRange(Parse *pP
29c10 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b  arse, int nReg){
29c20 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69  .  int i, n;.  i
29c30 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67   = pParse->iRang
29c40 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72  eReg;.  n = pPar
29c50 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20  se->nRangeReg;. 
29c60 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a   if( nReg<=n ){.
29c70 20 20 20 20 61 73 73 65 72 74 28 20 21 75 73 65      assert( !use
29c80 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70  dAsColumnCache(p
29c90 50 61 72 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29  Parse, i, i+n-1)
29ca0 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   );.    pParse->
29cb0 69 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65  iRangeReg += nRe
29cc0 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  g;.    pParse->n
29cd0 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65 67  RangeReg -= nReg
29ce0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
29cf0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
29d00 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
29d10 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d  Mem += nReg;.  }
29d20 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76  .  return i;.}.v
29d30 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61  oid sqlite3Relea
29d40 73 65 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73  seTempRange(Pars
29d50 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
29d60 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  Reg, int nReg){.
29d70 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
29d80 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c  heRemove(pParse,
29d90 20 69 52 65 67 2c 20 6e 52 65 67 29 3b 0a 20 20   iReg, nReg);.  
29da0 69 66 28 20 6e 52 65 67 3e 70 50 61 72 73 65 2d  if( nReg>pParse-
29db0 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a 20 20  >nRangeReg ){.  
29dc0 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65    pParse->nRange
29dd0 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20  Reg = nReg;.    
29de0 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
29df0 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a  g = iReg;.  }.}.
29e00 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20  ./*.** Mark all 
29e10 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
29e20 65 72 73 20 61 73 20 62 65 69 6e 67 20 75 6e 61  ers as being una
29e30 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75  vailable for reu
29e40 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
29e50 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43  te3ClearTempRegC
29e60 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72  ache(Parse *pPar
29e70 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  se){.  pParse->n
29e80 54 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 70  TempReg = 0;.  p
29e90 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
29ea0 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56   = 0;.}../*.** V
29eb0 61 6c 69 64 61 74 65 20 74 68 61 74 20 6e 6f 20  alidate that no 
29ec0 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
29ed0 65 72 20 66 61 6c 6c 73 20 77 69 74 68 69 6e 20  er falls within 
29ee0 74 68 65 20 72 61 6e 67 65 20 6f 66 0a 2a 2a 20  the range of.** 
29ef0 69 46 69 72 73 74 2e 2e 69 4c 61 73 74 2c 20 69  iFirst..iLast, i
29f00 6e 63 6c 75 73 69 76 65 2e 20 20 54 68 69 73 20  nclusive.  This 
29f10 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
29f20 63 61 6c 6c 20 66 72 6f 6d 20 77 69 74 68 69 6e  call from within
29f30 20 61 73 73 65 72 74 28 29 0a 2a 2a 20 73 74 61   assert().** sta
29f40 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 23 69 66 64  tements..*/.#ifd
29f50 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
29f60 69 6e 74 20 73 71 6c 69 74 65 33 4e 6f 54 65 6d  int sqlite3NoTem
29f70 70 73 49 6e 52 61 6e 67 65 28 50 61 72 73 65 20  psInRange(Parse 
29f80 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 69  *pParse, int iFi
29f90 72 73 74 2c 20 69 6e 74 20 69 4c 61 73 74 29 7b  rst, int iLast){
29fa0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
29fb0 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
29fc0 67 3e 30 0a 20 20 20 26 26 20 70 50 61 72 73 65  g>0.   && pParse
29fd0 2d 3e 69 52 61 6e 67 65 52 65 67 2b 70 50 61 72  ->iRangeReg+pPar
29fe0 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3c 69 4c  se->nRangeReg<iL
29ff0 61 73 74 0a 20 20 20 26 26 20 70 50 61 72 73 65  ast.   && pParse
2a000 2d 3e 69 52 61 6e 67 65 52 65 67 3e 3d 69 46 69  ->iRangeReg>=iFi
2a010 72 73 74 0a 20 20 29 7b 0a 20 20 20 20 20 72 65  rst.  ){.     re
2a020 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f  turn 0;.  }.  fo
2a030 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d  r(i=0; i<pParse-
2a040 3e 6e 54 65 6d 70 52 65 67 3b 20 69 2b 2b 29 7b  >nTempReg; i++){
2a050 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
2a060 3e 61 54 65 6d 70 52 65 67 5b 69 5d 3e 3d 69 46  >aTempReg[i]>=iF
2a070 69 72 73 74 20 26 26 20 70 50 61 72 73 65 2d 3e  irst && pParse->
2a080 61 54 65 6d 70 52 65 67 5b 69 5d 3c 3d 69 4c 61  aTempReg[i]<=iLa
2a090 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  st ){.      retu
2a0a0 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
2a0b0 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
2a0c0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
2a0d0 45 42 55 47 20 2a 2f 0a                          EBUG */.