/ Hex Artifact Content
Login

Artifact 6c5775cf0f0a0349980e26c2fa720dba6fcc9267:


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 2a 0a 2a 2a  in SQLite..**.**
0200: 20 24 49 64 3a 20 65 78 70 72 2e 63 2c 76 20 31   $Id: expr.c,v 1
0210: 2e 34 34 36 20 32 30 30 39 2f 30 36 2f 31 39 20  .446 2009/06/19 
0220: 31 38 3a 33 32 3a 35 35 20 64 72 68 20 45 78 70  18:32:55 drh Exp
0230: 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22   $.*/.#include "
0240: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a  sqliteInt.h"../*
0250: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 27  .** Return the '
0260: 61 66 66 69 6e 69 74 79 27 20 6f 66 20 74 68 65  affinity' of the
0270: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
0280: 72 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20  r if any..**.** 
0290: 49 66 20 70 45 78 70 72 20 69 73 20 61 20 63 6f  If pExpr is a co
02a0: 6c 75 6d 6e 2c 20 61 20 72 65 66 65 72 65 6e 63  lumn, a referenc
02b0: 65 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 76 69  e to a column vi
02c0: 61 20 61 6e 20 27 41 53 27 20 61 6c 69 61 73 2c  a an 'AS' alias,
02d0: 0a 2a 2a 20 6f 72 20 61 20 73 75 62 2d 73 65 6c  .** or a sub-sel
02e0: 65 63 74 20 77 69 74 68 20 61 20 63 6f 6c 75 6d  ect with a colum
02f0: 6e 20 61 73 20 74 68 65 20 72 65 74 75 72 6e 20  n as the return 
0300: 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20  value, then the 
0310: 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20 6f 66 20  .** affinity of 
0320: 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69 73 20 72  that column is r
0330: 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
0340: 73 65 2c 20 30 78 30 30 20 69 73 20 72 65 74 75  se, 0x00 is retu
0350: 72 6e 65 64 2c 0a 2a 2a 20 69 6e 64 69 63 61 74  rned,.** indicat
0360: 69 6e 67 20 6e 6f 20 61 66 66 69 6e 69 74 79 20  ing no affinity 
0370: 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69  for the expressi
0380: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 2e 20 74  on..**.** i.e. t
0390: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
03a0: 65 78 70 72 65 73 73 73 69 6f 6e 73 20 69 6e 20  expresssions in 
03b0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
03c0: 61 74 65 6d 65 6e 74 73 20 61 6c 6c 0a 2a 2a 20  atements all.** 
03d0: 68 61 76 65 20 61 6e 20 61 66 66 69 6e 69 74 79  have an affinity
03e0: 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54  :.**.** CREATE T
03f0: 41 42 4c 45 20 74 31 28 61 29 3b 0a 2a 2a 20 53  ABLE t1(a);.** S
0400: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
0410: 57 48 45 52 45 20 61 3b 0a 2a 2a 20 53 45 4c 45  WHERE a;.** SELE
0420: 43 54 20 61 20 41 53 20 62 20 46 52 4f 4d 20 74  CT a AS b FROM t
0430: 31 20 57 48 45 52 45 20 62 3b 0a 2a 2a 20 53 45  1 WHERE b;.** SE
0440: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
0450: 48 45 52 45 20 28 73 65 6c 65 63 74 20 61 20 66  HERE (select a f
0460: 72 6f 6d 20 74 31 29 3b 0a 2a 2f 0a 63 68 61 72  rom t1);.*/.char
0470: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
0480: 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70 72  nity(Expr *pExpr
0490: 29 7b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 70 45  ){.  int op = pE
04a0: 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  xpr->op;.  if( o
04b0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
04c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
04d0: 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78 49 73 53  r->flags&EP_xIsS
04e0: 65 6c 65 63 74 20 29 3b 0a 20 20 20 20 72 65 74  elect );.    ret
04f0: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41  urn sqlite3ExprA
0500: 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 78  ffinity(pExpr->x
0510: 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
0520: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
0530: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
0540: 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 69 66  E_OMIT_CAST.  if
0550: 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 54 20 29 7b  ( op==TK_CAST ){
0560: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
0570: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
0580: 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
0590: 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) );.    return 
05a0: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
05b0: 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  ype(pExpr->u.zTo
05c0: 6b 65 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ken);.  }.#endif
05d0: 0a 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41  .  if( (op==TK_A
05e0: 47 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d  GG_COLUMN || op=
05f0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70  =TK_COLUMN || op
0600: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 29 20 0a  ==TK_REGISTER) .
0610: 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70 54 61     && pExpr->pTa
0620: 62 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  b!=0.  ){.    /*
0630: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
0640: 20 26 26 20 70 45 78 70 72 2d 3e 70 54 61 62 21   && pExpr->pTab!
0650: 3d 30 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  =0 happens when 
0660: 70 45 78 70 72 20 77 61 73 20 6f 72 69 67 69 6e  pExpr was origin
0670: 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 61 20 54 4b  ally.    ** a TK
0680: 5f 43 4f 4c 55 4d 4e 20 62 75 74 20 77 61 73 20  _COLUMN but was 
0690: 70 72 65 76 69 6f 75 73 6c 79 20 65 76 61 6c 75  previously evalu
06a0: 61 74 65 64 20 61 6e 64 20 63 61 63 68 65 64 20  ated and cached 
06b0: 69 6e 20 61 20 72 65 67 69 73 74 65 72 20 2a 2f  in a register */
06c0: 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 45 78  .    int j = pEx
06d0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
06e0: 20 69 66 28 20 6a 3c 30 20 29 20 72 65 74 75 72   if( j<0 ) retur
06f0: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  n SQLITE_AFF_INT
0700: 45 47 45 52 3b 0a 20 20 20 20 61 73 73 65 72 74  EGER;.    assert
0710: 28 20 70 45 78 70 72 2d 3e 70 54 61 62 20 26 26  ( pExpr->pTab &&
0720: 20 6a 3c 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e   j<pExpr->pTab->
0730: 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 72 65 74 75  nCol );.    retu
0740: 72 6e 20 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e  rn pExpr->pTab->
0750: 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69 74 79  aCol[j].affinity
0760: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
0770: 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3b 0a  Expr->affinity;.
0780: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
0790: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
07a0: 6e 63 65 20 66 6f 72 20 65 78 70 72 65 73 73 69  nce for expressi
07b0: 6f 6e 20 70 45 78 70 72 20 74 6f 20 62 65 20 74  on pExpr to be t
07c0: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20  he collating.** 
07d0: 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 64 20 62  sequence named b
07e0: 79 20 70 54 6f 6b 65 6e 2e 20 20 20 52 65 74 75  y pToken.   Retu
07f0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
0800: 74 68 65 20 72 65 76 69 73 65 64 20 65 78 70 72  the revised expr
0810: 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 63  ession..** The c
0820: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
0830: 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 22  e is marked as "
0840: 65 78 70 6c 69 63 69 74 22 20 75 73 69 6e 67 20  explicit" using 
0850: 74 68 65 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74  the EP_ExpCollat
0860: 65 0a 2a 2a 20 66 6c 61 67 2e 20 20 41 6e 20 65  e.** flag.  An e
0870: 78 70 6c 69 63 69 74 20 63 6f 6c 6c 61 74 69 6e  xplicit collatin
0880: 67 20 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 20  g sequence will 
0890: 6f 76 65 72 72 69 64 65 20 69 6d 70 6c 69 63 69  override implici
08a0: 74 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73  t.** collating s
08b0: 65 71 75 65 6e 63 65 73 2e 0a 2a 2f 0a 45 78 70  equences..*/.Exp
08c0: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 53 65  r *sqlite3ExprSe
08d0: 74 43 6f 6c 6c 28 50 61 72 73 65 20 2a 70 50 61  tColl(Parse *pPa
08e0: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
08f0: 2c 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61  , Token *pCollNa
0900: 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f  me){.  char *zCo
0910: 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ll = 0;         
0920: 20 20 20 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e     /* Dequoted n
0930: 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e  ame of collation
0940: 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 43   sequence */.  C
0950: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
0960: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
0970: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f  Parse->db;.  zCo
0980: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  ll = sqlite3Name
0990: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 43  FromToken(db, pC
09a0: 6f 6c 6c 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ollName);.  if( 
09b0: 70 45 78 70 72 20 26 26 20 7a 43 6f 6c 6c 20 29  pExpr && zColl )
09c0: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
09d0: 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
09e0: 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c  eq(pParse, zColl
09f0: 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  );.    if( pColl
0a00: 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   ){.      pExpr-
0a10: 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a  >pColl = pColl;.
0a20: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61        pExpr->fla
0a30: 67 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c  gs |= EP_ExpColl
0a40: 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ate;.    }.  }. 
0a50: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
0a60: 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 72 65 74  b, zColl);.  ret
0a70: 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a  urn pExpr;.}../*
0a80: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
0a90: 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e  efault collation
0aa0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
0ab0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
0ac0: 70 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20  pr. If.** there 
0ad0: 69 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f  is no default co
0ae0: 6c 6c 61 74 69 6f 6e 20 74 79 70 65 2c 20 72 65  llation type, re
0af0: 74 75 72 6e 20 30 2e 0a 2a 2f 0a 43 6f 6c 6c 53  turn 0..*/.CollS
0b00: 65 71 20 2a 73 71 6c 69 74 65 33 45 78 70 72 43  eq *sqlite3ExprC
0b10: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
0b20: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
0b30: 72 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  r){.  CollSeq *p
0b40: 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 45 78 70 72  Coll = 0;.  Expr
0b50: 20 2a 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 77   *p = pExpr;.  w
0b60: 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 29 20  hile( ALWAYS(p) 
0b70: 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 3b 0a 20  ){.    int op;. 
0b80: 20 20 20 70 43 6f 6c 6c 20 3d 20 70 2d 3e 70 43     pColl = p->pC
0b90: 6f 6c 6c 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  oll;.    if( pCo
0ba0: 6c 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ll ) break;.    
0bb0: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20  op = p->op;.    
0bc0: 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47 47 5f  if( (op==TK_AGG_
0bd0: 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b  COLUMN || op==TK
0be0: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54  _COLUMN || op==T
0bf0: 4b 5f 52 45 47 49 53 54 45 52 29 20 26 26 20 70  K_REGISTER) && p
0c00: 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20 20 20  ->pTab!=0 ){.   
0c10: 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47     /* op==TK_REG
0c20: 49 53 54 45 52 20 26 26 20 70 2d 3e 70 54 61 62  ISTER && p->pTab
0c30: 21 3d 30 20 68 61 70 70 65 6e 73 20 77 68 65 6e  !=0 happens when
0c40: 20 70 45 78 70 72 20 77 61 73 20 6f 72 69 67 69   pExpr was origi
0c50: 6e 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 61  nally.      ** a
0c60: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74 20 77   TK_COLUMN but w
0c70: 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 65 76  as previously ev
0c80: 61 6c 75 61 74 65 64 20 61 6e 64 20 63 61 63 68  aluated and cach
0c90: 65 64 20 69 6e 20 61 20 72 65 67 69 73 74 65 72  ed in a register
0ca0: 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
0cb0: 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20  char *zColl;.   
0cc0: 20 20 20 69 6e 74 20 6a 20 3d 20 70 2d 3e 69 43     int j = p->iC
0cd0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28  olumn;.      if(
0ce0: 20 6a 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   j>=0 ){.       
0cf0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
0d00: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20  Parse->db;.     
0d10: 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 2d 3e 70 54     zColl = p->pT
0d20: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c  ab->aCol[j].zCol
0d30: 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  l;.        pColl
0d40: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
0d50: 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62  llSeq(db, ENC(db
0d60: 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20  ), zColl, 0);.  
0d70: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 43 6f        pExpr->pCo
0d80: 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20  ll = pColl;.    
0d90: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
0da0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
0db0: 70 21 3d 54 4b 5f 43 41 53 54 20 26 26 20 6f 70  p!=TK_CAST && op
0dc0: 21 3d 54 4b 5f 55 50 4c 55 53 20 29 7b 0a 20 20  !=TK_UPLUS ){.  
0dd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
0de0: 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66  .    p = p->pLef
0df0: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  t;.  }.  if( sql
0e00: 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71  ite3CheckCollSeq
0e10: 28 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20  (pParse, pColl) 
0e20: 29 7b 20 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  ){ .    pColl = 
0e30: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
0e40: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pColl;.}../*.** 
0e50: 70 45 78 70 72 20 69 73 20 61 6e 20 6f 70 65 72  pExpr is an oper
0e60: 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61 72 69  and of a compari
0e70: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 61  son operator.  a
0e80: 66 66 32 20 69 73 20 74 68 65 0a 2a 2a 20 74 79  ff2 is the.** ty
0e90: 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  pe affinity of t
0ea0: 68 65 20 6f 74 68 65 72 20 6f 70 65 72 61 6e 64  he other operand
0eb0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
0ec0: 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 74  returns the.** t
0ed0: 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68 61  ype affinity tha
0ee0: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
0ef0: 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69   for the compari
0f00: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f  son operator..*/
0f10: 0a 63 68 61 72 20 73 71 6c 69 74 65 33 43 6f 6d  .char sqlite3Com
0f20: 70 61 72 65 41 66 66 69 6e 69 74 79 28 45 78 70  pareAffinity(Exp
0f30: 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20 61  r *pExpr, char a
0f40: 66 66 32 29 7b 0a 20 20 63 68 61 72 20 61 66 66  ff2){.  char aff
0f50: 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  1 = sqlite3ExprA
0f60: 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a  ffinity(pExpr);.
0f70: 20 20 69 66 28 20 61 66 66 31 20 26 26 20 61 66    if( aff1 && af
0f80: 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42 6f 74  f2 ){.    /* Bot
0f90: 68 20 73 69 64 65 73 20 6f 66 20 74 68 65 20 63  h sides of the c
0fa0: 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20 63 6f  omparison are co
0fb0: 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20 68 61  lumns. If one ha
0fc0: 73 20 6e 75 6d 65 72 69 63 0a 20 20 20 20 2a 2a  s numeric.    **
0fd0: 20 61 66 66 69 6e 69 74 79 2c 20 75 73 65 20 74   affinity, use t
0fe0: 68 61 74 2e 20 4f 74 68 65 72 77 69 73 65 20 75  hat. Otherwise u
0ff0: 73 65 20 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a  se no affinity..
1000: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
1010: 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41  qlite3IsNumericA
1020: 66 66 69 6e 69 74 79 28 61 66 66 31 29 20 7c 7c  ffinity(aff1) ||
1030: 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69   sqlite3IsNumeri
1040: 63 41 66 66 69 6e 69 74 79 28 61 66 66 32 29 20  cAffinity(aff2) 
1050: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1060: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
1070: 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  IC;.    }else{. 
1080: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1090: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
10a0: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21   }.  }else if( !
10b0: 61 66 66 31 20 26 26 20 21 61 66 66 32 20 29 7b  aff1 && !aff2 ){
10c0: 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20  .    /* Neither 
10d0: 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70  side of the comp
10e0: 61 72 69 73 6f 6e 20 69 73 20 61 20 63 6f 6c 75  arison is a colu
10f0: 6d 6e 2e 20 20 43 6f 6d 70 61 72 65 20 74 68 65  mn.  Compare the
1100: 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 20  .    ** results 
1110: 64 69 72 65 63 74 6c 79 2e 0a 20 20 20 20 2a 2f  directly..    */
1120: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1130: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d  TE_AFF_NONE;.  }
1140: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65  else{.    /* One
1150: 20 73 69 64 65 20 69 73 20 61 20 63 6f 6c 75 6d   side is a colum
1160: 6e 2c 20 74 68 65 20 6f 74 68 65 72 20 69 73 20  n, the other is 
1170: 6e 6f 74 2e 20 55 73 65 20 74 68 65 20 63 6f 6c  not. Use the col
1180: 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 2e 20 2a  umns affinity. *
1190: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 66  /.    assert( af
11a0: 66 31 3d 3d 30 20 7c 7c 20 61 66 66 32 3d 3d 30  f1==0 || aff2==0
11b0: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   );.    return (
11c0: 61 66 66 31 20 2b 20 61 66 66 32 29 3b 0a 20 20  aff1 + aff2);.  
11d0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72  }.}../*.** pExpr
11e0: 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   is a comparison
11f0: 20 6f 70 65 72 61 74 6f 72 2e 20 20 52 65 74 75   operator.  Retu
1200: 72 6e 20 74 68 65 20 74 79 70 65 20 61 66 66 69  rn the type affi
1210: 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64  nity that should
1220: 0a 2a 2a 20 62 65 20 61 70 70 6c 69 65 64 20 74  .** be applied t
1230: 6f 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20  o both operands 
1240: 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 74  prior to doing t
1250: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a  he comparison..*
1260: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 63 6f  /.static char co
1270: 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
1280: 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20  (Expr *pExpr){. 
1290: 20 63 68 61 72 20 61 66 66 3b 0a 20 20 61 73 73   char aff;.  ass
12a0: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
12b0: 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_EQ || pExpr->
12c0: 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70 45 78  op==TK_IN || pEx
12d0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c  pr->op==TK_LT ||
12e0: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
12f0: 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70  ->op==TK_GT || p
1300: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20  Expr->op==TK_GE 
1310: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
1320: 5f 4c 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  _LE ||.         
1330: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e   pExpr->op==TK_N
1340: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
1350: 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20  Expr->pLeft );. 
1360: 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 45 78   aff = sqlite3Ex
1370: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
1380: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
1390: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b  pExpr->pRight ){
13a0: 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74  .    aff = sqlit
13b0: 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
13c0: 79 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  y(pExpr->pRight,
13d0: 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69   aff);.  }else i
13e0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
13f0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
1400: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 61  Select) ){.    a
1410: 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ff = sqlite3Comp
1420: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70  areAffinity(pExp
1430: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  r->x.pSelect->pE
1440: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
1450: 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20  , aff);.  }else 
1460: 69 66 28 20 21 61 66 66 20 29 7b 0a 20 20 20 20  if( !aff ){.    
1470: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
1480: 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 20 20 72 65 74  _NONE;.  }.  ret
1490: 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aff;.}../*.*
14a0: 2a 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d  * pExpr is a com
14b0: 70 61 72 69 73 6f 6e 20 65 78 70 72 65 73 73 69  parison expressi
14c0: 6f 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27  on, eg. '=', '<'
14d0: 2c 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a  , IN(...) etc..*
14e0: 2a 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20 69  * idx_affinity i
14f0: 73 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f  s the affinity o
1500: 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c  f an indexed col
1510: 75 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72 75 65  umn. Return true
1520: 0a 2a 2a 20 69 66 20 74 68 65 20 69 6e 64 65 78  .** if the index
1530: 20 77 69 74 68 20 61 66 66 69 6e 69 74 79 20 69   with affinity i
1540: 64 78 5f 61 66 66 69 6e 69 74 79 20 6d 61 79 20  dx_affinity may 
1550: 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  be used to imple
1560: 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70  ment.** the comp
1570: 61 72 69 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e  arison in pExpr.
1580: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
1590: 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 45  ndexAffinityOk(E
15a0: 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72  xpr *pExpr, char
15b0: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a   idx_affinity){.
15c0: 20 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d    char aff = com
15d0: 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28  parisonAffinity(
15e0: 70 45 78 70 72 29 3b 0a 20 20 73 77 69 74 63 68  pExpr);.  switch
15f0: 28 20 61 66 66 20 29 7b 0a 20 20 20 20 63 61 73  ( aff ){.    cas
1600: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  e SQLITE_AFF_NON
1610: 45 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  E:.      return 
1620: 31 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  1;.    case SQLI
1630: 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20  TE_AFF_TEXT:.   
1640: 20 20 20 72 65 74 75 72 6e 20 69 64 78 5f 61 66     return idx_af
1650: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
1660: 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 64 65 66  FF_TEXT;.    def
1670: 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75  ault:.      retu
1680: 72 6e 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65  rn sqlite3IsNume
1690: 72 69 63 41 66 66 69 6e 69 74 79 28 69 64 78 5f  ricAffinity(idx_
16a0: 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d  affinity);.  }.}
16b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
16c0: 68 65 20 50 35 20 76 61 6c 75 65 20 74 68 61 74  he P5 value that
16d0: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
16e0: 66 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d  for a binary com
16f0: 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64  parison.** opcod
1700: 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20  e (OP_Eq, OP_Ge 
1710: 65 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f  etc.) used to co
1720: 6d 70 61 72 65 20 70 45 78 70 72 31 20 61 6e 64  mpare pExpr1 and
1730: 20 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74   pExpr2..*/.stat
1740: 69 63 20 75 38 20 62 69 6e 61 72 79 43 6f 6d 70  ic u8 binaryComp
1750: 61 72 65 50 35 28 45 78 70 72 20 2a 70 45 78 70  areP5(Expr *pExp
1760: 72 31 2c 20 45 78 70 72 20 2a 70 45 78 70 72 32  r1, Expr *pExpr2
1770: 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
1780: 29 7b 0a 20 20 75 38 20 61 66 66 20 3d 20 28 63  ){.  u8 aff = (c
1790: 68 61 72 29 73 71 6c 69 74 65 33 45 78 70 72 41  har)sqlite3ExprA
17a0: 66 66 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b  ffinity(pExpr2);
17b0: 0a 20 20 61 66 66 20 3d 20 28 75 38 29 73 71 6c  .  aff = (u8)sql
17c0: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
17d0: 69 74 79 28 70 45 78 70 72 31 2c 20 61 66 66 29  ity(pExpr1, aff)
17e0: 20 7c 20 28 75 38 29 6a 75 6d 70 49 66 4e 75 6c   | (u8)jumpIfNul
17f0: 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b  l;.  return aff;
1800: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1810: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1820: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
1830: 65 6e 63 65 20 74 68 61 74 20 73 68 6f 75 6c 64  ence that should
1840: 20 62 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 61   be used by.** a
1850: 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73   binary comparis
1860: 6f 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70  on operator comp
1870: 61 72 69 6e 67 20 70 4c 65 66 74 20 61 6e 64 20  aring pLeft and 
1880: 70 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  pRight..**.** If
1890: 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 65   the left hand e
18a0: 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20  xpression has a 
18b0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
18c0: 63 65 20 74 79 70 65 2c 20 74 68 65 6e 20 69 74  ce type, then it
18d0: 20 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68   is.** used. Oth
18e0: 65 72 77 69 73 65 20 74 68 65 20 63 6f 6c 6c 61  erwise the colla
18f0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
1900: 72 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64  r the right hand
1910: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
1920: 73 20 75 73 65 64 2c 20 6f 72 20 74 68 65 20 64  s used, or the d
1930: 65 66 61 75 6c 74 20 28 42 49 4e 41 52 59 29 20  efault (BINARY) 
1940: 69 66 20 6e 65 69 74 68 65 72 20 65 78 70 72 65  if neither expre
1950: 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c  ssion has a coll
1960: 61 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a  ating.** type..*
1970: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 52  *.** Argument pR
1980: 69 67 68 74 20 28 62 75 74 20 6e 6f 74 20 70 4c  ight (but not pL
1990: 65 66 74 29 20 6d 61 79 20 62 65 20 61 20 6e 75  eft) may be a nu
19a0: 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74  ll pointer. In t
19b0: 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20  his case,.** it 
19c0: 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65  is not considere
19d0: 64 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73  d..*/.CollSeq *s
19e0: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
19f0: 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61  areCollSeq(.  Pa
1a00: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20  rse *pParse, .  
1a10: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20  Expr *pLeft, .  
1a20: 45 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a  Expr *pRight.){.
1a30: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
1a40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66  ;.  assert( pLef
1a50: 74 20 29 3b 0a 20 20 69 66 28 20 70 4c 65 66 74  t );.  if( pLeft
1a60: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
1a70: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 61  Collate ){.    a
1a80: 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 70 43  ssert( pLeft->pC
1a90: 6f 6c 6c 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c  oll );.    pColl
1aa0: 20 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b   = pLeft->pColl;
1ab0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69  .  }else if( pRi
1ac0: 67 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e 66  ght && pRight->f
1ad0: 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c  lags & EP_ExpCol
1ae0: 6c 61 74 65 20 29 7b 0a 20 20 20 20 61 73 73 65  late ){.    asse
1af0: 72 74 28 20 70 52 69 67 68 74 2d 3e 70 43 6f 6c  rt( pRight->pCol
1b00: 6c 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  l );.    pColl =
1b10: 20 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 3b 0a   pRight->pColl;.
1b20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f    }else{.    pCo
1b30: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
1b40: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1b50: 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20  pLeft);.    if( 
1b60: 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
1b70: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
1b80: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
1b90: 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  e, pRight);.    
1ba0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
1bb0: 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Coll;.}../*.** G
1bc0: 65 6e 65 72 61 74 65 20 74 68 65 20 6f 70 65 72  enerate the oper
1bd0: 61 6e 64 73 20 66 6f 72 20 61 20 63 6f 6d 70 61  ands for a compa
1be0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 2e  rison operation.
1bf0: 20 20 42 65 66 6f 72 65 0a 2a 2a 20 67 65 6e 65    Before.** gene
1c00: 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20  rating the code 
1c10: 66 6f 72 20 65 61 63 68 20 6f 70 65 72 61 6e 64  for each operand
1c20: 2c 20 73 65 74 20 74 68 65 20 45 50 5f 41 6e 79  , set the EP_Any
1c30: 41 66 66 0a 2a 2a 20 66 6c 61 67 20 6f 6e 20 74  Aff.** flag on t
1c40: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f  he expression so
1c50: 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65   that it will be
1c60: 20 61 62 6c 65 20 74 6f 20 75 73 65 64 20 61 0a   able to used a.
1c70: 2a 2a 20 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e  ** cached column
1c80: 20 76 61 6c 75 65 20 74 68 61 74 20 68 61 73 20   value that has 
1c90: 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 64 65 72  previously under
1ca0: 67 6f 6e 65 20 61 6e 0a 2a 2a 20 61 66 66 69 6e  gone an.** affin
1cb0: 69 74 79 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 73  ity change..*/.s
1cc0: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 43  tatic void codeC
1cd0: 6f 6d 70 61 72 65 4f 70 65 72 61 6e 64 73 28 0a  ompareOperands(.
1ce0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1cf0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
1d00: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
1d10: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1d20: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20  Expr *pLeft,    
1d30: 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70    /* The left op
1d40: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  erand */.  int *
1d50: 70 52 65 67 4c 65 66 74 2c 20 20 20 20 2f 2a 20  pRegLeft,    /* 
1d60: 52 65 67 69 73 74 65 72 20 77 68 65 72 65 20 6c  Register where l
1d70: 65 66 74 20 6f 70 65 72 61 6e 64 20 69 73 20 73  eft operand is s
1d80: 74 6f 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  tored */.  int *
1d90: 70 46 72 65 65 4c 65 66 74 2c 20 20 20 2f 2a 20  pFreeLeft,   /* 
1da0: 46 72 65 65 20 74 68 69 73 20 72 65 67 69 73 74  Free this regist
1db0: 65 72 20 77 68 65 6e 20 64 6f 6e 65 20 2a 2f 0a  er when done */.
1dc0: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
1dd0: 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
1de0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
1df0: 74 20 2a 70 52 65 67 52 69 67 68 74 2c 20 20 20  t *pRegRight,   
1e00: 2f 2a 20 52 65 67 69 73 74 65 72 20 77 68 65 72  /* Register wher
1e10: 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
1e20: 69 73 20 73 74 6f 72 65 64 20 2a 2f 0a 20 20 69  is stored */.  i
1e30: 6e 74 20 2a 70 46 72 65 65 52 69 67 68 74 20 20  nt *pFreeRight  
1e40: 20 2f 2a 20 57 72 69 74 65 20 74 65 6d 70 20 72   /* Write temp r
1e50: 65 67 69 73 74 65 72 20 66 6f 72 20 72 69 67 68  egister for righ
1e60: 74 20 6f 70 65 72 61 6e 64 20 74 68 65 72 65 20  t operand there 
1e70: 2a 2f 0a 29 7b 0a 20 20 77 68 69 6c 65 28 20 70  */.){.  while( p
1e80: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c  Left->op==TK_UPL
1e90: 55 53 20 29 20 70 4c 65 66 74 20 3d 20 70 4c 65  US ) pLeft = pLe
1ea0: 66 74 2d 3e 70 4c 65 66 74 3b 0a 20 20 70 4c 65  ft->pLeft;.  pLe
1eb0: 66 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ft->flags |= EP_
1ec0: 41 6e 79 41 66 66 3b 0a 20 20 2a 70 52 65 67 4c  AnyAff;.  *pRegL
1ed0: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
1ee0: 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1ef0: 2c 20 70 4c 65 66 74 2c 20 70 46 72 65 65 4c 65  , pLeft, pFreeLe
1f00: 66 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 52  ft);.  while( pR
1f10: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c  ight->op==TK_UPL
1f20: 55 53 20 29 20 70 52 69 67 68 74 20 3d 20 70 52  US ) pRight = pR
1f30: 69 67 68 74 2d 3e 70 4c 65 66 74 3b 0a 20 20 70  ight->pLeft;.  p
1f40: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 7c 3d 20  Right->flags |= 
1f50: 45 50 5f 41 6e 79 41 66 66 3b 0a 20 20 2a 70 52  EP_AnyAff;.  *pR
1f60: 65 67 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  egRight = sqlite
1f70: 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1f80: 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 70 46  arse, pRight, pF
1f90: 72 65 65 52 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a  reeRight);.}../*
1fa0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1fb0: 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72 69 73  e for a comparis
1fc0: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a  on operator..*/.
1fd0: 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 43  static int codeC
1fe0: 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65 20  ompare(.  Parse 
1ff0: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 54  *pParse,    /* T
2000: 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e 64 20  he parsing (and 
2010: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 29  code generating)
2020: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
2030: 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20  pr *pLeft,      
2040: 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70 65 72  /* The left oper
2050: 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  and */.  Expr *p
2060: 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54 68  Right,     /* Th
2070: 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
2080: 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64 65 2c  */.  int opcode,
2090: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
20a0: 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65 20  mparison opcode 
20b0: 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20 69 6e  */.  int in1, in
20c0: 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69 73 74  t in2, /* Regist
20d0: 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65 72 61  er holding opera
20e0: 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  nds */.  int des
20f0: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  t,         /* Ju
2100: 6d 70 20 68 65 72 65 20 69 66 20 74 72 75 65 2e  mp here if true.
2110: 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49    */.  int jumpI
2120: 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20 74  fNull    /* If t
2130: 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65 69 74  rue, jump if eit
2140: 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e  her operand is N
2150: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ULL */.){.  int 
2160: 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  p5;.  int addr;.
2170: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a 0a    CollSeq *p4;..
2180: 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33 42 69    p4 = sqlite3Bi
2190: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
21a0: 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  eq(pParse, pLeft
21b0: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70 35 20  , pRight);.  p5 
21c0: 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 50  = binaryCompareP
21d0: 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  5(pLeft, pRight,
21e0: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
21f0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
2200: 62 65 41 64 64 4f 70 34 28 70 50 61 72 73 65 2d  beAddOp4(pParse-
2210: 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c 20  >pVdbe, opcode, 
2220: 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31 2c 0a  in2, dest, in1,.
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2240: 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
2250: 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  *)p4, P4_COLLSEQ
2260: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
2270: 43 68 61 6e 67 65 50 35 28 70 50 61 72 73 65 2d  ChangeP5(pParse-
2280: 3e 70 56 64 62 65 2c 20 28 75 38 29 70 35 29 3b  >pVdbe, (u8)p5);
2290: 0a 20 20 69 66 28 20 28 70 35 20 26 20 53 51 4c  .  if( (p5 & SQL
22a0: 49 54 45 5f 41 46 46 5f 4d 41 53 4b 29 21 3d 53  ITE_AFF_MASK)!=S
22b0: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29  QLITE_AFF_NONE )
22c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
22d0: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
22e0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 6e 31  ange(pParse, in1
22f0: 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
2300: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
2310: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
2320: 20 69 6e 32 2c 20 31 29 3b 0a 20 20 7d 0a 20 20   in2, 1);.  }.  
2330: 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a  return addr;.}..
2340: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45  #if SQLITE_MAX_E
2350: 58 50 52 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a  XPR_DEPTH>0./*.*
2360: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61 72 67  * Check that arg
2370: 75 6d 65 6e 74 20 6e 48 65 69 67 68 74 20 69 73  ument nHeight is
2380: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
2390: 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  ual to the maxim
23a0: 75 6d 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  um.** expression
23b0: 20 64 65 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20   depth allowed. 
23c0: 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65  If it is not, le
23d0: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
23e0: 73 61 67 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73  sage in.** pPars
23f0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
2400: 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74  3ExprCheckHeight
2410: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2420: 69 6e 74 20 6e 48 65 69 67 68 74 29 7b 0a 20 20  int nHeight){.  
2430: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2440: 4f 4b 3b 0a 20 20 69 6e 74 20 6d 78 48 65 69 67  OK;.  int mxHeig
2450: 68 74 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ht = pParse->db-
2460: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
2470: 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d  IMIT_EXPR_DEPTH]
2480: 3b 0a 20 20 69 66 28 20 6e 48 65 69 67 68 74 3e  ;.  if( nHeight>
2490: 6d 78 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20  mxHeight ){.    
24a0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
24b0: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
24c0: 22 45 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65  "Expression tree
24d0: 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d   is too large (m
24e0: 61 78 69 6d 75 6d 20 64 65 70 74 68 20 25 64 29  aximum depth %d)
24f0: 22 2c 20 6d 78 48 65 69 67 68 74 0a 20 20 20 20  ", mxHeight.    
2500: 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
2510: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
2520: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2530: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
2540: 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20  hree functions, 
2550: 68 65 69 67 68 74 4f 66 45 78 70 72 28 29 2c 20  heightOfExpr(), 
2560: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
2570: 28 29 0a 2a 2a 20 61 6e 64 20 68 65 69 67 68 74  ().** and height
2580: 4f 66 53 65 6c 65 63 74 28 29 2c 20 61 72 65 20  OfSelect(), are 
2590: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
25a0: 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65  e the maximum he
25b0: 69 67 68 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65  ight.** of any e
25c0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72  xpression tree r
25d0: 65 66 65 72 65 6e 63 65 64 20 62 79 20 74 68 65  eferenced by the
25e0: 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
25f0: 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73  d as the.** firs
2600: 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  t argument..**.*
2610: 2a 20 49 66 20 74 68 69 73 20 6d 61 78 69 6d 75  * If this maximu
2620: 6d 20 68 65 69 67 68 74 20 69 73 20 67 72 65 61  m height is grea
2630: 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ter than the cur
2640: 72 65 6e 74 20 76 61 6c 75 65 20 70 6f 69 6e 74  rent value point
2650: 65 64 0a 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65  ed.** to by pnHe
2660: 69 67 68 74 2c 20 74 68 65 20 73 65 63 6f 6e 64  ight, the second
2670: 20 70 61 72 61 6d 65 74 65 72 2c 20 74 68 65 6e   parameter, then
2680: 20 73 65 74 20 2a 70 6e 48 65 69 67 68 74 20 74   set *pnHeight t
2690: 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e  o that.** value.
26a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
26b0: 68 65 69 67 68 74 4f 66 45 78 70 72 28 45 78 70  heightOfExpr(Exp
26c0: 72 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69  r *p, int *pnHei
26d0: 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b  ght){.  if( p ){
26e0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 48 65 69  .    if( p->nHei
26f0: 67 68 74 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b  ght>*pnHeight ){
2700: 0a 20 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74  .      *pnHeight
2710: 20 3d 20 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20   = p->nHeight;. 
2720: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
2730: 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45  c void heightOfE
2740: 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
2750: 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67   *p, int *pnHeig
2760: 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ht){.  if( p ){.
2770: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
2780: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78  or(i=0; i<p->nEx
2790: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
27a0: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
27b0: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65  a[i].pExpr, pnHe
27c0: 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ight);.    }.  }
27d0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  .}.static void h
27e0: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 53 65  eightOfSelect(Se
27f0: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e  lect *p, int *pn
2800: 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70  Height){.  if( p
2810: 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66   ){.    heightOf
2820: 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20  Expr(p->pWhere, 
2830: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
2840: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
2850: 48 61 76 69 6e 67 2c 20 70 6e 48 65 69 67 68 74  Having, pnHeight
2860: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  );.    heightOfE
2870: 78 70 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70  xpr(p->pLimit, p
2880: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
2890: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f  ightOfExpr(p->pO
28a0: 66 66 73 65 74 2c 20 70 6e 48 65 69 67 68 74 29  ffset, pnHeight)
28b0: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
28c0: 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74  prList(p->pEList
28d0: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
28e0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
28f0: 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70  t(p->pGroupBy, p
2900: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
2910: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
2920: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65  ->pOrderBy, pnHe
2930: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
2940: 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70 50 72  tOfSelect(p->pPr
2950: 69 6f 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ior, pnHeight);.
2960: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
2970: 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68   the Expr.nHeigh
2980: 74 20 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68  t variable in th
2990: 65 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73  e structure pass
29a0: 65 64 20 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67  ed as an .** arg
29b0: 75 6d 65 6e 74 2e 20 41 6e 20 65 78 70 72 65 73  ument. An expres
29c0: 73 69 6f 6e 20 77 69 74 68 20 6e 6f 20 63 68 69  sion with no chi
29d0: 6c 64 72 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73  ldren, Expr.pLis
29e0: 74 20 6f 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53  t or .** Expr.pS
29f0: 65 6c 65 63 74 20 6d 65 6d 62 65 72 20 68 61 73  elect member has
2a00: 20 61 20 68 65 69 67 68 74 20 6f 66 20 31 2e 20   a height of 1. 
2a10: 41 6e 79 20 6f 74 68 65 72 20 65 78 70 72 65 73  Any other expres
2a20: 73 69 6f 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65  sion.** has a he
2a30: 69 67 68 74 20 65 71 75 61 6c 20 74 6f 20 74 68  ight equal to th
2a40: 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  e maximum height
2a50: 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a   of any other .*
2a60: 2a 20 72 65 66 65 72 65 6e 63 65 64 20 45 78 70  * referenced Exp
2a70: 72 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2f 0a 73  r plus one..*/.s
2a80: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 53  tatic void exprS
2a90: 65 74 48 65 69 67 68 74 28 45 78 70 72 20 2a 70  etHeight(Expr *p
2aa0: 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74  ){.  int nHeight
2ab0: 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66   = 0;.  heightOf
2ac0: 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26  Expr(p->pLeft, &
2ad0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 68 65 69 67  nHeight);.  heig
2ae0: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 52 69 67  htOfExpr(p->pRig
2af0: 68 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  ht, &nHeight);. 
2b00: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
2b10: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
2b20: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 68 65 69  lect) ){.    hei
2b30: 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 78  ghtOfSelect(p->x
2b40: 2e 70 53 65 6c 65 63 74 2c 20 26 6e 48 65 69 67  .pSelect, &nHeig
2b50: 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ht);.  }else{.  
2b60: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69    heightOfExprLi
2b70: 73 74 28 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 26  st(p->x.pList, &
2b80: 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20  nHeight);.  }.  
2b90: 70 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48 65  p->nHeight = nHe
2ba0: 69 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ight + 1;.}../*.
2bb0: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e  ** Set the Expr.
2bc0: 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65  nHeight variable
2bd0: 20 75 73 69 6e 67 20 74 68 65 20 65 78 70 72 53   using the exprS
2be0: 65 74 48 65 69 67 68 74 28 29 20 66 75 6e 63 74  etHeight() funct
2bf0: 69 6f 6e 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68  ion. If.** the h
2c00: 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72  eight is greater
2c10: 20 74 68 61 6e 20 74 68 65 20 6d 61 78 69 6d 75   than the maximu
2c20: 6d 20 61 6c 6c 6f 77 65 64 20 65 78 70 72 65 73  m allowed expres
2c30: 73 69 6f 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c  sion depth,.** l
2c40: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
2c50: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64   pParse..*/.void
2c60: 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48   sqlite3ExprSetH
2c70: 65 69 67 68 74 28 50 61 72 73 65 20 2a 70 50 61  eight(Parse *pPa
2c80: 72 73 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20  rse, Expr *p){. 
2c90: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 70   exprSetHeight(p
2ca0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
2cb0: 43 68 65 63 6b 48 65 69 67 68 74 28 70 50 61 72  CheckHeight(pPar
2cc0: 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b  se, p->nHeight);
2cd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2ce0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69   the maximum hei
2cf0: 67 68 74 20 6f 66 20 61 6e 79 20 65 78 70 72 65  ght of any expre
2d00: 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72  ssion tree refer
2d10: 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  enced.** by the 
2d20: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
2d30: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
2d40: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
2d50: 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
2d60: 48 65 69 67 68 74 28 53 65 6c 65 63 74 20 2a 70  Height(Select *p
2d70: 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74  ){.  int nHeight
2d80: 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66   = 0;.  heightOf
2d90: 53 65 6c 65 63 74 28 70 2c 20 26 6e 48 65 69 67  Select(p, &nHeig
2da0: 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 48  ht);.  return nH
2db0: 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73 65 0a 20  eight;.}.#else. 
2dc0: 20 23 64 65 66 69 6e 65 20 65 78 70 72 53 65 74   #define exprSet
2dd0: 48 65 69 67 68 74 28 79 29 0a 23 65 6e 64 69 66  Height(y).#endif
2de0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45   /* SQLITE_MAX_E
2df0: 58 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a  XPR_DEPTH>0 */..
2e00: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2e10: 6e 65 20 69 73 20 74 68 65 20 63 6f 72 65 20 61  ne is the core a
2e20: 6c 6c 6f 63 61 74 6f 72 20 66 6f 72 20 45 78 70  llocator for Exp
2e30: 72 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43  r nodes..**.** C
2e40: 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65  onstruct a new e
2e50: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61  xpression node a
2e60: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
2e70: 74 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f  ter to it.  Memo
2e80: 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e  ry.** for this n
2e90: 6f 64 65 20 61 6e 64 20 66 6f 72 20 74 68 65 20  ode and for the 
2ea0: 70 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20  pToken argument 
2eb0: 69 73 20 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f  is a single allo
2ec0: 63 61 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e  cation.** obtain
2ed0: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44  ed from sqlite3D
2ee0: 62 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20  bMalloc().  The 
2ef0: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
2f00: 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62  .** is responsib
2f10: 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75  le for making su
2f20: 72 65 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e  re the node even
2f30: 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65  tually gets free
2f40: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75  d..**.** If dequ
2f50: 6f 74 65 20 69 73 20 74 72 75 65 2c 20 74 68 65  ote is true, the
2f60: 6e 20 74 68 65 20 74 6f 6b 65 6e 20 28 69 66 20  n the token (if 
2f70: 69 74 20 65 78 69 73 74 73 29 20 69 73 20 64 65  it exists) is de
2f80: 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65  quoted..** If de
2f90: 71 75 6f 74 65 20 69 73 20 66 61 6c 73 65 2c 20  quote is false, 
2fa0: 6e 6f 20 64 65 71 75 6f 74 69 6e 67 20 69 73 20  no dequoting is 
2fb0: 70 65 72 66 6f 72 6d 61 6e 63 65 2e 20 20 54 68  performance.  Th
2fc0: 65 20 64 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72  e deQuote.** par
2fd0: 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65  ameter is ignore
2fe0: 64 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e  d if pToken is N
2ff0: 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 74 6f  ULL or if the to
3000: 6b 65 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ken does not.** 
3010: 61 70 70 65 61 72 20 74 6f 20 62 65 20 71 75 6f  appear to be quo
3020: 74 65 64 2e 20 20 49 66 20 74 68 65 20 71 75 6f  ted.  If the quo
3030: 74 65 73 20 77 65 72 65 20 6f 66 20 74 68 65 20  tes were of the 
3040: 66 6f 72 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62  form "..." (doub
3050: 6c 65 2d 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68  le-quotes).** th
3060: 65 6e 20 74 68 65 20 45 50 5f 44 62 6c 51 75 6f  en the EP_DblQuo
3070: 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20  ted flag is set 
3080: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
3090: 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70  n node..**.** Sp
30a0: 65 63 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20  ecial case:  If 
30b0: 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61  op==TK_INTEGER a
30c0: 6e 64 20 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73  nd pToken points
30d0: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74 68 61   to a string tha
30e0: 74 0a 2a 2a 20 63 61 6e 20 62 65 20 74 72 61 6e  t.** can be tran
30f0: 73 6c 61 74 65 64 20 69 6e 74 6f 20 61 20 33 32  slated into a 32
3100: 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 74 68  -bit integer, th
3110: 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20 69 73 20  en the token is 
3120: 6e 6f 74 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e  not.** stored in
3130: 20 75 2e 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74   u.zToken.  Inst
3140: 65 61 64 2c 20 74 68 65 20 69 6e 74 65 67 65 72  ead, the integer
3150: 20 76 61 6c 75 65 73 20 69 73 20 77 72 69 74 74   values is writt
3160: 65 6e 0a 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61  en.** into u.iVa
3170: 6c 75 65 20 61 6e 64 20 74 68 65 20 45 50 5f 49  lue and the EP_I
3180: 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 69 73 20  ntValue flag is 
3190: 73 65 74 2e 20 20 4e 6f 20 65 78 74 72 61 20 73  set.  No extra s
31a0: 74 6f 72 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c  torage.** is all
31b0: 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74  ocated to hold t
31c0: 68 65 20 69 6e 74 65 67 65 72 20 74 65 78 74 20  he integer text 
31d0: 61 6e 64 20 74 68 65 20 64 65 71 75 6f 74 65 20  and the dequote 
31e0: 66 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64 2e  flag is ignored.
31f0: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
3200: 33 45 78 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71  3ExprAlloc(.  sq
3210: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
3220: 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
3230: 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  for sqlite3DbMal
3240: 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62  locZero() (may b
3250: 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74  e null) */.  int
3260: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
3270: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
3280: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63  on opcode */.  c
3290: 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  onst Token *pTok
32a0: 65 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20  en,    /* Token 
32b0: 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74  argument.  Might
32c0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   be NULL */.  in
32d0: 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20  t dequote       
32e0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
32f0: 20 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20   dequote */.){. 
3300: 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69   Expr *pNew;.  i
3310: 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20  nt nExtra = 0;. 
3320: 20 69 6e 74 20 69 56 61 6c 75 65 20 3d 20 30 3b   int iValue = 0;
3330: 0a 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29  ..  if( pToken )
3340: 7b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 54 4b  {.    if( op!=TK
3350: 5f 49 4e 54 45 47 45 52 20 7c 7c 20 70 54 6f 6b  _INTEGER || pTok
3360: 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20 20 20 20 20  en->z==0.       
3370: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 65 74     || sqlite3Get
3380: 49 6e 74 33 32 28 70 54 6f 6b 65 6e 2d 3e 7a 2c  Int32(pToken->z,
3390: 20 26 69 56 61 6c 75 65 29 3d 3d 30 20 29 7b 0a   &iValue)==0 ){.
33a0: 20 20 20 20 20 20 6e 45 78 74 72 61 20 3d 20 70        nExtra = p
33b0: 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a 20 20 20 20  Token->n+1;.    
33c0: 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73  }.  }.  pNew = s
33d0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
33e0: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78  ro(db, sizeof(Ex
33f0: 70 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69  pr)+nExtra);.  i
3400: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 70  f( pNew ){.    p
3410: 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29 6f 70  New->op = (u8)op
3420: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41 67 67  ;.    pNew->iAgg
3430: 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 70   = -1;.    if( p
3440: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 69  Token ){.      i
3450: 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29 7b 0a  f( nExtra==0 ){.
3460: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c          pNew->fl
3470: 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c  ags |= EP_IntVal
3480: 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ue;.        pNew
3490: 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 56 61  ->u.iValue = iVa
34a0: 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  lue;.      }else
34b0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b  {.        int c;
34c0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
34d0: 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a  .zToken = (char*
34e0: 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 20  )&pNew[1];.     
34f0: 20 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e     memcpy(pNew->
3500: 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54 6f 6b 65 6e  u.zToken, pToken
3510: 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 29 3b  ->z, pToken->n);
3520: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
3530: 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b 65 6e 2d 3e  .zToken[pToken->
3540: 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  n] = 0;.        
3550: 69 66 28 20 64 65 71 75 6f 74 65 20 26 26 20 6e  if( dequote && n
3560: 45 78 74 72 61 3e 3d 33 20 0a 20 20 20 20 20 20  Extra>=3 .      
3570: 20 20 20 20 20 20 20 26 26 20 28 28 63 20 3d 20         && ((c = 
3580: 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 29 3d 3d 27  pToken->z[0])=='
3590: 5c 27 27 20 7c 7c 20 63 3d 3d 27 22 27 20 7c 7c  \'' || c=='"' ||
35a0: 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d 3d 27 60   c=='[' || c=='`
35b0: 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ') ){.          
35c0: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70  sqlite3Dequote(p
35d0: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  New->u.zToken);.
35e0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d            if( c=
35f0: 3d 27 22 27 20 29 20 70 4e 65 77 2d 3e 66 6c 61  ='"' ) pNew->fla
3600: 67 73 20 7c 3d 20 45 50 5f 44 62 6c 51 75 6f 74  gs |= EP_DblQuot
3610: 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ed;.        }.  
3620: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 20      }.    }.#if 
3630: 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
3640: 44 45 50 54 48 3e 30 0a 20 20 20 20 70 4e 65 77  DEPTH>0.    pNew
3650: 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b 0a 23  ->nHeight = 1;.#
3660: 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20 72 65  endif  .  }.  re
3670: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
3680: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
3690: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ew expression no
36a0: 64 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 74  de from a zero-t
36b0: 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65 6e 20  erminated token 
36c0: 74 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c 72 65  that has.** alre
36d0: 61 64 79 20 62 65 65 6e 20 64 65 71 75 6f 74 65  ady been dequote
36e0: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
36f0: 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c 69 74  te3Expr(.  sqlit
3700: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
3710: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
3720: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
3730: 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e  Zero() (may be n
3740: 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  ull) */.  int op
3750: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3760: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
3770: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  opcode */.  cons
3780: 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 20  t char *zToken  
3790: 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67      /* Token arg
37a0: 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65  ument.  Might be
37b0: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 6f   NULL */.){.  To
37c0: 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d 20 7a  ken x;.  x.z = z
37d0: 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d 20 7a  Token;.  x.n = z
37e0: 54 6f 6b 65 6e 20 3f 20 73 71 6c 69 74 65 33 53  Token ? sqlite3S
37f0: 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e 29 20  trlen30(zToken) 
3800: 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  : 0;.  return sq
3810: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
3820: 62 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b 0a 7d  b, op, &x, 0);.}
3830: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20 73  ../*.** Attach s
3840: 75 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e  ubtrees pLeft an
3850: 64 20 70 52 69 67 68 74 20 74 6f 20 74 68 65 20  d pRight to the 
3860: 45 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f 74 2e  Expr node pRoot.
3870: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f 74 3d  .**.** If pRoot=
3880: 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
3890: 20 74 68 61 74 20 61 20 6d 65 6d 6f 72 79 20 61   that a memory a
38a0: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
38b0: 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a  has occurred..**
38c0: 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64   In that case, d
38d0: 65 6c 65 74 65 20 74 68 65 20 73 75 62 74 72 65  elete the subtre
38e0: 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69  es pLeft and pRi
38f0: 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ght..*/.void sql
3900: 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53 75  ite3ExprAttachSu
3910: 62 74 72 65 65 73 28 0a 20 20 73 71 6c 69 74 65  btrees(.  sqlite
3920: 33 20 2a 64 62 2c 0a 20 20 45 78 70 72 20 2a 70  3 *db,.  Expr *p
3930: 52 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a 70 4c  Root,.  Expr *pL
3940: 65 66 74 2c 0a 20 20 45 78 70 72 20 2a 70 52 69  eft,.  Expr *pRi
3950: 67 68 74 0a 29 7b 0a 20 20 69 66 28 20 70 52 6f  ght.){.  if( pRo
3960: 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ot==0 ){.    ass
3970: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
3980: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c  ailed );.    sql
3990: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
39a0: 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  b, pLeft);.    s
39b0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
39c0: 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  (db, pRight);.  
39d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
39e0: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70  Right ){.      p
39f0: 52 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d 20 70  Root->pRight = p
3a00: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28  Right;.      if(
3a10: 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26   pRight->flags &
3a20: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29   EP_ExpCollate )
3a30: 7b 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74 2d  {.        pRoot-
3a40: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70  >flags |= EP_Exp
3a50: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 20  Collate;.       
3a60: 20 70 52 6f 6f 74 2d 3e 70 43 6f 6c 6c 20 3d 20   pRoot->pColl = 
3a70: 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 3b 0a 20  pRight->pColl;. 
3a80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
3a90: 20 69 66 28 20 70 4c 65 66 74 20 29 7b 0a 20 20   if( pLeft ){.  
3aa0: 20 20 20 20 70 52 6f 6f 74 2d 3e 70 4c 65 66 74      pRoot->pLeft
3ab0: 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20 20 20   = pLeft;.      
3ac0: 69 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73  if( pLeft->flags
3ad0: 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65   & EP_ExpCollate
3ae0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 6f 6f   ){.        pRoo
3af0: 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45  t->flags |= EP_E
3b00: 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20  xpCollate;.     
3b10: 20 20 20 70 52 6f 6f 74 2d 3e 70 43 6f 6c 6c 20     pRoot->pColl 
3b20: 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a  = pLeft->pColl;.
3b30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3b40: 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28    exprSetHeight(
3b50: 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pRoot);.  }.}../
3b60: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
3b70: 45 78 70 72 20 6e 6f 64 65 20 77 68 69 63 68 20  Expr node which 
3b80: 6a 6f 69 6e 73 20 61 73 20 6d 61 6e 79 20 61 73  joins as many as
3b90: 20 74 77 6f 20 73 75 62 74 72 65 65 73 2e 0a 2a   two subtrees..*
3ba0: 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f 74 68  *.** One or both
3bb0: 20 6f 66 20 74 68 65 20 73 75 62 74 72 65 65 73   of the subtrees
3bc0: 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 20 52   can be NULL.  R
3bd0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
3be0: 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 45 78  to the new.** Ex
3bf0: 70 72 20 6e 6f 64 65 2e 20 20 4f 72 2c 20 69 66  pr node.  Or, if
3c00: 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63   an OOM error oc
3c10: 63 75 72 73 2c 20 73 65 74 20 70 50 61 72 73 65  curs, set pParse
3c20: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
3c30: 65 64 2c 0a 2a 2a 20 66 72 65 65 20 74 68 65 20  ed,.** free the 
3c40: 73 75 62 74 72 65 65 73 20 61 6e 64 20 72 65 74  subtrees and ret
3c50: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78 70  urn NULL..*/.Exp
3c60: 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72 28  r *sqlite3PExpr(
3c70: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
3c80: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
3c90: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
3ca0: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
3cb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
3cc0: 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20  pression opcode 
3cd0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  */.  Expr *pLeft
3ce0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
3cf0: 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  Left operand */.
3d00: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
3d10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67            /* Rig
3d20: 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  ht operand */.  
3d30: 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f  const Token *pTo
3d40: 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67 75 6d  ken     /* Argum
3d50: 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a  ent token */.){.
3d60: 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
3d70: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61  te3ExprAlloc(pPa
3d80: 72 73 65 2d 3e 64 62 2c 20 6f 70 2c 20 70 54 6f  rse->db, op, pTo
3d90: 6b 65 6e 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74  ken, 1);.  sqlit
3da0: 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74  e3ExprAttachSubt
3db0: 72 65 65 73 28 70 50 61 72 73 65 2d 3e 64 62 2c  rees(pParse->db,
3dc0: 20 70 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68   p, pLeft, pRigh
3dd0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  t);.  return p;.
3de0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77  }../*.** Join tw
3df0: 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73  o expressions us
3e00: 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61  ing an AND opera
3e10: 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72 20  tor.  If either 
3e20: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a  expression is.**
3e30: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74   NULL, then just
3e40: 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65   return the othe
3e50: 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f  r expression..*/
3e60: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
3e70: 70 72 41 6e 64 28 73 71 6c 69 74 65 33 20 2a 64  prAnd(sqlite3 *d
3e80: 62 2c 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20  b, Expr *pLeft, 
3e90: 45 78 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20  Expr *pRight){. 
3ea0: 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b   if( pLeft==0 ){
3eb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52 69 67  .    return pRig
3ec0: 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ht;.  }else if( 
3ed0: 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20  pRight==0 ){.   
3ee0: 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20   return pLeft;. 
3ef0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70 72   }else{.    Expr
3f00: 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
3f10: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
3f20: 5f 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _AND, 0, 0);.   
3f30: 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61   sqlite3ExprAtta
3f40: 63 68 53 75 62 74 72 65 65 73 28 64 62 2c 20 70  chSubtrees(db, p
3f50: 4e 65 77 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  New, pLeft, pRig
3f60: 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ht);.    return 
3f70: 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  pNew;.  }.}../*.
3f80: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e  ** Construct a n
3f90: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ew expression no
3fa0: 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f  de for a functio
3fb0: 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a  n with multiple.
3fc0: 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f  ** arguments..*/
3fd0: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
3fe0: 70 72 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65  prFunction(Parse
3ff0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69   *pParse, ExprLi
4000: 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
4010: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70   *pToken){.  Exp
4020: 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74  r *pNew;.  sqlit
4030: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
4040: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
4050: 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20  Token );.  pNew 
4060: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  = sqlite3ExprAll
4070: 6f 63 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49  oc(db, TK_FUNCTI
4080: 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a  ON, pToken, 1);.
4090: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
40a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
40b0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
40c0: 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20  List); /* Avoid 
40d0: 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e  memory leak when
40e0: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f   malloc fails */
40f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
4100: 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69   }.  pNew->x.pLi
4110: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73  st = pList;.  as
4120: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
4130: 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
4140: 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
4150: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
4160: 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 4e 65  ight(pParse, pNe
4170: 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  w);.  return pNe
4180: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  w;.}../*.** Assi
4190: 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75  gn a variable nu
41a0: 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65  mber to an expre
41b0: 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64  ssion that encod
41c0: 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a  es a wildcard.**
41d0: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
41e0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
41f0: 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64   .**.** Wildcard
4200: 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  s consisting of 
4210: 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65  a single "?" are
4220: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65   assigned the ne
4230: 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a  xt sequential.**
4240: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
4250: 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64  ..**.** Wildcard
4260: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  s of the form "?
4270: 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65  nnn" are assigne
4280: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e  d the number "nn
4290: 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20  n".  We make.** 
42a0: 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f  sure "nnn" is no
42b0: 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69  t too be to avoi
42c0: 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65  d a denial of se
42d0: 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68 65  rvice attack whe
42e0: 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61  n.** the SQL sta
42f0: 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f  tement comes fro
4300: 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f  m an external so
4310: 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64  urce..**.** Wild
4320: 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72  cards of the for
4330: 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22  m ":aaa", "@aaa"
4340: 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20  , or "$aaa" are 
4350: 61 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d  assigned the sam
4360: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74  e number.** as t
4370: 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74  he previous inst
4380: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
4390: 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69   wildcard.  Or i
43a0: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
43b0: 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20  rst.** instance 
43c0: 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c  of the wildcard,
43d0: 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e   the next sequen
43e0: 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ial variable num
43f0: 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e  ber is.** assign
4400: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
4410: 74 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72  te3ExprAssignVar
4420: 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50  Number(Parse *pP
4430: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
4440: 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  r){.  sqlite3 *d
4450: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
4460: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
4470: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ..  if( pExpr==0
4480: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
4490: 65 72 74 28 20 21 45 78 70 72 48 61 73 41 6e 79  ert( !ExprHasAny
44a0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
44b0: 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52  EP_IntValue|EP_R
44c0: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
44d0: 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45  nly) );.  z = pE
44e0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
44f0: 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b   assert( z!=0 );
4500: 0a 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21  .  assert( z[0]!
4510: 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d  =0 );.  if( z[1]
4520: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69  ==0 ){.    /* Wi
4530: 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f  ldcard of the fo
4540: 72 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20  rm "?".  Assign 
4550: 74 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c  the next variabl
4560: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
4570: 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f  assert( z[0]=='?
4580: 27 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  ' );.    pExpr->
4590: 69 54 61 62 6c 65 20 3d 20 2b 2b 70 50 61 72 73  iTable = ++pPars
45a0: 65 2d 3e 6e 56 61 72 3b 0a 20 20 7d 65 6c 73 65  e->nVar;.  }else
45b0: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29   if( z[0]=='?' )
45c0: 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72  {.    /* Wildcar
45d0: 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  d of the form "?
45e0: 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22  nnn".  Convert "
45f0: 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67  nnn" to an integ
4600: 65 72 20 61 6e 64 0a 20 20 20 20 2a 2a 20 75 73  er and.    ** us
4610: 65 20 69 74 20 61 73 20 74 68 65 20 76 61 72 69  e it as the vari
4620: 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  able number */. 
4630: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 45     int i;.    pE
4640: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 20  xpr->iTable = i 
4650: 3d 20 61 74 6f 69 28 28 63 68 61 72 2a 29 26 7a  = atoi((char*)&z
4660: 5b 31 5d 29 3b 0a 20 20 20 20 74 65 73 74 63 61  [1]);.    testca
4670: 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20  se( i==0 );.    
4680: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31 20 29  testcase( i==1 )
4690: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
46a0: 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  i==db->aLimit[SQ
46b0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
46c0: 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20 29 3b  BLE_NUMBER]-1 );
46d0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69  .    testcase( i
46e0: 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ==db->aLimit[SQL
46f0: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
4700: 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 3b 0a 20 20  LE_NUMBER] );.  
4710: 20 20 69 66 28 20 69 3c 31 20 7c 7c 20 69 3e 64    if( i<1 || i>d
4720: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
4730: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
4740: 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 20  NUMBER] ){.     
4750: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
4760: 28 70 50 61 72 73 65 2c 20 22 76 61 72 69 61 62  (pParse, "variab
4770: 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 62  le number must b
4780: 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e 64  e between ?1 and
4790: 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20   ?%d",.         
47a0: 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49   db->aLimit[SQLI
47b0: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
47c0: 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20 20 20 20  E_NUMBER]);.    
47d0: 7d 0a 20 20 20 20 69 66 28 20 69 3e 70 50 61 72  }.    if( i>pPar
47e0: 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20  se->nVar ){.    
47f0: 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d    pParse->nVar =
4800: 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   i;.    }.  }els
4810: 65 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  e{.    /* Wildca
4820: 72 64 73 20 6c 69 6b 65 20 22 3a 61 61 61 22 2c  rds like ":aaa",
4830: 20 22 24 61 61 61 22 20 6f 72 20 22 40 61 61 61   "$aaa" or "@aaa
4840: 22 2e 20 20 52 65 75 73 65 20 74 68 65 20 73 61  ".  Reuse the sa
4850: 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  me variable.    
4860: 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65  ** number as the
4870: 20 70 72 69 6f 72 20 61 70 70 65 61 72 61 6e 63   prior appearanc
4880: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61  e of the same na
4890: 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20 6e 61  me, or if the na
48a0: 6d 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 65  me.    ** has ne
48b0: 76 65 72 20 61 70 70 65 61 72 65 64 20 62 65 66  ver appeared bef
48c0: 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65 20 73  ore, reuse the s
48d0: 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ame variable num
48e0: 62 65 72 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ber.    */.    i
48f0: 6e 74 20 69 3b 0a 20 20 20 20 75 33 32 20 6e 3b  nt i;.    u32 n;
4900: 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  .    n = sqlite3
4910: 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20  Strlen30(z);.   
4920: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
4930: 73 65 2d 3e 6e 56 61 72 45 78 70 72 3b 20 69 2b  se->nVarExpr; i+
4940: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
4950: 70 45 20 3d 20 70 50 61 72 73 65 2d 3e 61 70 56  pE = pParse->apV
4960: 61 72 45 78 70 72 5b 69 5d 3b 0a 20 20 20 20 20  arExpr[i];.     
4970: 20 61 73 73 65 72 74 28 20 70 45 21 3d 30 20 29   assert( pE!=0 )
4980: 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63  ;.      if( memc
4990: 6d 70 28 70 45 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  mp(pE->u.zToken,
49a0: 20 7a 2c 20 6e 29 3d 3d 30 20 26 26 20 70 45 2d   z, n)==0 && pE-
49b0: 3e 75 2e 7a 54 6f 6b 65 6e 5b 6e 5d 3d 3d 30 20  >u.zToken[n]==0 
49c0: 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  ){.        pExpr
49d0: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 2d 3e 69  ->iTable = pE->i
49e0: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 62  Table;.        b
49f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
4a00: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 70    }.    if( i>=p
4a10: 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 20  Parse->nVarExpr 
4a20: 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
4a30: 69 54 61 62 6c 65 20 3d 20 2b 2b 70 50 61 72 73  iTable = ++pPars
4a40: 65 2d 3e 6e 56 61 72 3b 0a 20 20 20 20 20 20 69  e->nVar;.      i
4a50: 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45  f( pParse->nVarE
4a60: 78 70 72 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61  xpr>=pParse->nVa
4a70: 72 45 78 70 72 41 6c 6c 6f 63 2d 31 20 29 7b 0a  rExprAlloc-1 ){.
4a80: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
4a90: 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 20 2b 3d  nVarExprAlloc +=
4aa0: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70   pParse->nVarExp
4ab0: 72 41 6c 6c 6f 63 20 2b 20 31 30 3b 0a 20 20 20  rAlloc + 10;.   
4ac0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 70 56       pParse->apV
4ad0: 61 72 45 78 70 72 20 3d 0a 20 20 20 20 20 20 20  arExpr =.       
4ae0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52 65       sqlite3DbRe
4af0: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 0a 20 20 20  allocOrFree(.   
4b00: 20 20 20 20 20 20 20 20 20 20 20 64 62 2c 0a 20             db,. 
4b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
4b20: 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 2c 0a  rse->apVarExpr,.
4b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
4b40: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c  arse->nVarExprAl
4b50: 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 50 61 72 73  loc*sizeof(pPars
4b60: 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 30 5d 29  e->apVarExpr[0])
4b70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a  .            );.
4b80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
4b90: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
4ba0: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 61  led ){.        a
4bb0: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 61  ssert( pParse->a
4bc0: 70 56 61 72 45 78 70 72 21 3d 30 20 29 3b 0a 20  pVarExpr!=0 );. 
4bd0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
4be0: 70 56 61 72 45 78 70 72 5b 70 50 61 72 73 65 2d  pVarExpr[pParse-
4bf0: 3e 6e 56 61 72 45 78 70 72 2b 2b 5d 20 3d 20 70  >nVarExpr++] = p
4c00: 45 78 70 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Expr;.      }.  
4c10: 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66 28 20 21    }.  } .  if( !
4c20: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 26 26 20  pParse->nErr && 
4c30: 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 64 62 2d  pParse->nVar>db-
4c40: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
4c50: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
4c60: 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c  MBER] ){.    sql
4c70: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
4c80: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53  rse, "too many S
4c90: 51 4c 20 76 61 72 69 61 62 6c 65 73 22 29 3b 0a  QL variables");.
4ca0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65    }.}../*.** Cle
4cb0: 61 72 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ar an expression
4cc0: 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68 6f   structure witho
4cd0: 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  ut deleting the 
4ce0: 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66  structure itself
4cf0: 2e 0a 2a 2a 20 53 75 62 73 74 72 75 63 74 75 72  ..** Substructur
4d00: 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2f  e is deleted..*/
4d10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
4d20: 72 43 6c 65 61 72 28 73 71 6c 69 74 65 33 20 2a  rClear(sqlite3 *
4d30: 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  db, Expr *p){.  
4d40: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
4d50: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 41 6e    if( !ExprHasAn
4d60: 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  yProperty(p, EP_
4d70: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
4d80: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
4d90: 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74  ete(db, p->pLeft
4da0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
4db0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
4dc0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28  pRight);.    if(
4dd0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
4de0: 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29  y(p, EP_Reduced)
4df0: 20 26 26 20 28 70 2d 3e 66 6c 61 67 73 32 20 26   && (p->flags2 &
4e00: 20 45 50 32 5f 4d 61 6c 6c 6f 63 65 64 54 6f 6b   EP2_MallocedTok
4e10: 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  en)!=0 ){.      
4e20: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4e30: 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  , p->u.zToken);.
4e40: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 45 78      }.    if( Ex
4e50: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
4e60: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
4e70: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
4e80: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
4e90: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  p->x.pSelect);. 
4ea0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4eb0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
4ec0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70  elete(db, p->x.p
4ed0: 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  List);.    }.  }
4ee0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73  .}../*.** Recurs
4ef0: 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20  ively delete an 
4f00: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
4f10: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4f20: 45 78 70 72 44 65 6c 65 74 65 28 73 71 6c 69 74  ExprDelete(sqlit
4f30: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29  e3 *db, Expr *p)
4f40: 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  {.  if( p==0 ) r
4f50: 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
4f60: 45 78 70 72 43 6c 65 61 72 28 64 62 2c 20 70 29  ExprClear(db, p)
4f70: 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  ;.  if( !ExprHas
4f80: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53  Property(p, EP_S
4f90: 74 61 74 69 63 29 20 29 7b 0a 20 20 20 20 73 71  tatic) ){.    sq
4fa0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4fb0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
4fc0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
4fd0: 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f  er of bytes allo
4fe0: 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 65 78  cated for the ex
4ff0: 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63 74 75  pression structu
5000: 72 65 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73  re .** passed as
5010: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
5020: 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61 6c 77  ent. This is alw
5030: 61 79 73 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f  ays one of EXPR_
5040: 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50  FULLSIZE,.** EXP
5050: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72  R_REDUCEDSIZE or
5060: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
5070: 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  IZE..*/.static i
5080: 6e 74 20 65 78 70 72 53 74 72 75 63 74 53 69 7a  nt exprStructSiz
5090: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  e(Expr *p){.  if
50a0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
50b0: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
50c0: 79 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52  y) ) return EXPR
50d0: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a  _TOKENONLYSIZE;.
50e0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
50f0: 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75  perty(p, EP_Redu
5100: 63 65 64 29 20 29 20 72 65 74 75 72 6e 20 45 58  ced) ) return EX
5110: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 3b 0a  PR_REDUCEDSIZE;.
5120: 20 20 72 65 74 75 72 6e 20 45 58 50 52 5f 46 55    return EXPR_FU
5130: 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  LLSIZE;.}../*.**
5140: 20 54 68 65 20 64 75 70 65 64 45 78 70 72 2a 53   The dupedExpr*S
5150: 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 73 20 65  ize() routines e
5160: 61 63 68 20 72 65 74 75 72 6e 20 74 68 65 20 6e  ach return the n
5170: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
5180: 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 73 74  equired.** to st
5190: 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20 61 6e  ore a copy of an
51a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 20 65   expression or e
51b0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
51c0: 20 54 68 65 79 20 64 69 66 66 65 72 20 69 6e 0a   They differ in.
51d0: 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66 20 74  ** how much of t
51e0: 68 65 20 74 72 65 65 20 69 73 20 6d 65 61 73 75  he tree is measu
51f0: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64  red..**.**     d
5200: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
5210: 7a 65 28 29 20 20 20 20 20 53 69 7a 65 20 6f 66  ze()     Size of
5220: 20 6f 6e 6c 79 20 74 68 65 20 45 78 70 72 20 73   only the Expr s
5230: 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 20 20 20  tructure .**    
5240: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
5250: 7a 65 28 29 20 20 20 20 20 20 20 53 69 7a 65 20  ze()       Size 
5260: 6f 66 20 45 78 70 72 20 2b 20 73 70 61 63 65 20  of Expr + space 
5270: 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20  for token.**    
5280: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 29   dupedExprSize()
5290: 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
52a0: 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74 72 65  + token + subtre
52b0: 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a  e components.**.
52c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
52d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
52e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
52f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
5310: 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72 53  * The dupedExprS
5320: 74 72 75 63 74 53 69 7a 65 28 29 20 66 75 6e 63  tructSize() func
5330: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 77 6f  tion returns two
5340: 20 76 61 6c 75 65 73 20 4f 52 2d 65 64 20 74 6f   values OR-ed to
5350: 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28 31 29  gether:  .** (1)
5360: 20 74 68 65 20 73 70 61 63 65 20 72 65 71 75 69   the space requi
5370: 72 65 64 20 66 6f 72 20 61 20 63 6f 70 79 20 6f  red for a copy o
5380: 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63  f the Expr struc
5390: 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a  ture only and .*
53a0: 2a 20 28 32 29 20 74 68 65 20 45 50 5f 78 78 78  * (2) the EP_xxx
53b0: 20 66 6c 61 67 73 20 74 68 61 74 20 69 6e 64 69   flags that indi
53c0: 63 61 74 65 20 77 68 61 74 20 74 68 65 20 73 74  cate what the st
53d0: 72 75 63 74 75 72 65 20 73 69 7a 65 20 73 68 6f  ructure size sho
53e0: 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65 20 72  uld be..** The r
53f0: 65 74 75 72 6e 20 76 61 6c 75 65 73 20 69 73 20  eturn values is 
5400: 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a  always one of:.*
5410: 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 46  *.**      EXPR_F
5420: 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20 20 20  ULLSIZE.**      
5430: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
5440: 20 20 20 7c 20 45 50 5f 52 65 64 75 63 65 64 0a     | EP_Reduced.
5450: 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 54 4f 4b  **      EXPR_TOK
5460: 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f  ENONLYSIZE | EP_
5470: 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20  TokenOnly.**.** 
5480: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
5490: 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65  structure can be
54a0: 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e   found by maskin
54b0: 67 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  g the return val
54c0: 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f  ue.** of this ro
54d0: 75 74 69 6e 65 20 77 69 74 68 20 30 78 66 66 66  utine with 0xfff
54e0: 2e 20 20 54 68 65 20 66 6c 61 67 73 20 63 61 6e  .  The flags can
54f0: 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73   be found by mas
5500: 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65 74 75  king the.** retu
5510: 72 6e 20 76 61 6c 75 65 20 77 69 74 68 20 45 50  rn value with EP
5520: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
5530: 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  nOnly..**.** Not
5540: 65 20 74 68 61 74 20 77 69 74 68 20 66 6c 61 67  e that with flag
5550: 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43  s==EXPRDUP_REDUC
5560: 45 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 73  E, this routines
5570: 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73   works on full-s
5580: 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75 63 65  ize.** (unreduce
5590: 64 29 20 45 78 70 72 20 6f 62 6a 65 63 74 73 20  d) Expr objects 
55a0: 61 73 20 74 68 65 79 20 6f 72 20 6f 72 69 67 69  as they or origi
55b0: 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63 74 65  nally constructe
55c0: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e  d by the parser.
55d0: 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78 70 72 65  .** During expre
55e0: 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 2c 20  ssion analysis, 
55f0: 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f  extra informatio
5600: 6e 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e  n is computed an
5610: 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a 20  d moved into.** 
5620: 6c 61 74 65 72 20 70 61 72 74 73 20 6f 66 20 74  later parts of t
5630: 65 68 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61  eh Expr object a
5640: 6e 64 20 74 68 61 74 20 65 78 74 72 61 20 69 6e  nd that extra in
5650: 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68 74 20  formation might 
5660: 67 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a 20 6f  get chopped.** o
5670: 66 66 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ff if the expres
5680: 73 69 6f 6e 20 69 73 20 72 65 64 75 63 65 64 2e  sion is reduced.
5690: 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74    Note also that
56a0: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72   it does not wor
56b0: 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61 20 45  k to.** make a E
56c0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 63 6f  XPRDUP_REDUCE co
56d0: 70 79 20 6f 66 20 61 20 72 65 64 75 63 65 64 20  py of a reduced 
56e0: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 74 20  expression.  It 
56f0: 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a  is only legal.**
5700: 20 74 6f 20 72 65 64 75 63 65 20 61 20 70 72 69   to reduce a pri
5710: 73 74 69 6e 65 20 65 78 70 72 65 73 73 69 6f 6e  stine expression
5720: 20 74 72 65 65 20 66 72 6f 6d 20 74 68 65 20 70   tree from the p
5730: 61 72 73 65 72 2e 20 20 54 68 65 20 69 6d 70 6c  arser.  The impl
5740: 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66  ementation.** of
5750: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
5760: 53 69 7a 65 28 29 20 63 6f 6e 74 61 69 6e 20 6d  Size() contain m
5770: 75 6c 74 69 70 6c 65 20 61 73 73 65 72 74 28 29  ultiple assert()
5780: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74   statements that
5790: 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65   attempt.** to e
57a0: 6e 66 6f 72 63 65 20 74 68 69 73 20 63 6f 6e 73  nforce this cons
57b0: 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  traint..*/.stati
57c0: 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53  c int dupedExprS
57d0: 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a  tructSize(Expr *
57e0: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
57f0: 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20 20 61 73   int nSize;.  as
5800: 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 45 58 50  sert( flags==EXP
5810: 52 44 55 50 5f 52 45 44 55 43 45 20 7c 7c 20 66  RDUP_REDUCE || f
5820: 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e  lags==0 ); /* On
5830: 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76 61 6c 75  ly one flag valu
5840: 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 69  e allowed */.  i
5850: 66 28 20 30 3d 3d 28 66 6c 61 67 73 26 45 58 50  f( 0==(flags&EXP
5860: 52 44 55 50 5f 52 45 44 55 43 45 29 20 29 7b 0a  RDUP_REDUCE) ){.
5870: 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52      nSize = EXPR
5880: 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c  _FULLSIZE;.  }el
5890: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
58a0: 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65  !ExprHasAnyPrope
58b0: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
58c0: 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
58d0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
58e0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
58f0: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  p, EP_FromJoin) 
5900: 29 3b 20 0a 20 20 20 20 61 73 73 65 72 74 28 20  ); .    assert( 
5910: 28 70 2d 3e 66 6c 61 67 73 32 20 26 20 45 50 32  (p->flags2 & EP2
5920: 5f 4d 61 6c 6c 6f 63 65 64 54 6f 6b 65 6e 29 3d  _MallocedToken)=
5930: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
5940: 28 20 28 70 2d 3e 66 6c 61 67 73 32 20 26 20 45  ( (p->flags2 & E
5950: 50 32 5f 49 72 72 65 64 75 63 69 62 6c 65 29 3d  P2_Irreducible)=
5960: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  =0 );.    if( p-
5970: 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e 70 52 69  >pLeft || p->pRi
5980: 67 68 74 20 7c 7c 20 70 2d 3e 70 43 6f 6c 6c 20  ght || p->pColl 
5990: 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b  || p->x.pList ){
59a0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45  .      nSize = E
59b0: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
59c0: 7c 20 45 50 5f 52 65 64 75 63 65 64 3b 0a 20 20  | EP_Reduced;.  
59d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
59e0: 53 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45  Size = EXPR_TOKE
59f0: 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54  NONLYSIZE | EP_T
5a00: 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a  okenOnly;.    }.
5a10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53 69    }.  return nSi
5a20: 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ze;.}../*.** Thi
5a30: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
5a40: 6e 73 20 74 68 65 20 73 70 61 63 65 20 69 6e 20  ns the space in 
5a50: 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74  bytes required t
5a60: 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79  o store the copy
5a70: 20 0a 2a 2a 20 6f 66 20 74 68 65 20 45 78 70 72   .** of the Expr
5a80: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
5a90: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70   copy of the Exp
5aa0: 72 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e  r.u.zToken strin
5ab0: 67 20 28 69 66 20 74 68 61 74 0a 2a 2a 20 73 74  g (if that.** st
5ac0: 72 69 6e 67 20 69 73 20 64 65 66 69 6e 65 64 2e  ring is defined.
5ad0: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ).*/.static int 
5ae0: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
5af0: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
5b00: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79  lags){.  int nBy
5b10: 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74  te = dupedExprSt
5b20: 72 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67  ructSize(p, flag
5b30: 73 29 20 26 20 30 78 66 66 66 3b 0a 20 20 69 66  s) & 0xfff;.  if
5b40: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
5b50: 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75  ty(p, EP_IntValu
5b60: 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65  e) && p->u.zToke
5b70: 6e 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b  n ){.    nByte +
5b80: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
5b90: 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31  0(p->u.zToken)+1
5ba0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 52  ;.  }.  return R
5bb0: 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a  OUND8(nByte);.}.
5bc0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
5bd0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
5be0: 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 72  s required to cr
5bf0: 65 61 74 65 20 61 20 64 75 70 6c 69 63 61 74 65  eate a duplicate
5c00: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 65 78 70 72   of the .** expr
5c10: 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73  ession passed as
5c20: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
5c30: 65 6e 74 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  ent. The second 
5c40: 61 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a  argument is a.**
5c50: 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67   mask containing
5c60: 20 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61   EXPRDUP_XXX fla
5c70: 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  gs..**.** The va
5c80: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 6e 63  lue returned inc
5c90: 6c 75 64 65 73 20 73 70 61 63 65 20 74 6f 20 63  ludes space to c
5ca0: 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20  reate a copy of 
5cb0: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 0a  the Expr struct.
5cc0: 2a 2a 20 69 74 73 65 6c 66 20 61 6e 64 20 74 68  ** itself and th
5cd0: 65 20 62 75 66 66 65 72 20 72 65 66 65 72 72 65  e buffer referre
5ce0: 64 20 74 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a  d to by Expr.u.z
5cf0: 54 6f 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a  Token, if any..*
5d00: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52  *.** If the EXPR
5d10: 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20  DUP_REDUCE flag 
5d20: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
5d30: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
5d40: 63 6c 75 64 65 73 20 0a 2a 2a 20 73 70 61 63 65  cludes .** space
5d50: 20 74 6f 20 64 75 70 6c 69 63 61 74 65 20 61 6c   to duplicate al
5d60: 6c 20 45 78 70 72 20 6e 6f 64 65 73 20 69 6e 20  l Expr nodes in 
5d70: 74 68 65 20 74 72 65 65 20 66 6f 72 6d 65 64 20  the tree formed 
5d80: 62 79 20 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a  by Expr.pLeft .*
5d90: 2a 20 61 6e 64 20 45 78 70 72 2e 70 52 69 67 68  * and Expr.pRigh
5da0: 74 20 76 61 72 69 61 62 6c 65 73 20 28 62 75 74  t variables (but
5db0: 20 6e 6f 74 20 66 6f 72 20 61 6e 79 20 73 74 72   not for any str
5dc0: 75 63 74 75 72 65 73 20 70 6f 69 6e 74 65 64 20  uctures pointed 
5dd0: 74 6f 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e  to or .** descen
5de0: 64 65 64 20 66 72 6f 6d 20 74 68 65 20 45 78 70  ded from the Exp
5df0: 72 2e 78 2e 70 4c 69 73 74 20 6f 72 20 45 78 70  r.x.pList or Exp
5e00: 72 2e 78 2e 70 53 65 6c 65 63 74 20 76 61 72 69  r.x.pSelect vari
5e10: 61 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69  ables)..*/.stati
5e20: 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53  c int dupedExprS
5e30: 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ize(Expr *p, int
5e40: 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e   flags){.  int n
5e50: 42 79 74 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Byte = 0;.  if( 
5e60: 70 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d  p ){.    nByte =
5e70: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
5e80: 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ze(p, flags);.  
5e90: 20 20 69 66 28 20 66 6c 61 67 73 26 45 58 50 52    if( flags&EXPR
5ea0: 44 55 50 5f 52 45 44 55 43 45 20 29 7b 0a 20 20  DUP_REDUCE ){.  
5eb0: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 64 75 70      nByte += dup
5ec0: 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c  edExprSize(p->pL
5ed0: 65 66 74 2c 20 66 6c 61 67 73 29 20 2b 20 64 75  eft, flags) + du
5ee0: 70 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70  pedExprSize(p->p
5ef0: 52 69 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20  Right, flags);. 
5f00: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5f10: 6e 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n nByte;.}../*.*
5f20: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
5f30: 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71  is similar to sq
5f40: 6c 69 74 65 33 45 78 70 72 44 75 70 28 29 2c 20  lite3ExprDup(), 
5f50: 65 78 63 65 70 74 20 74 68 61 74 20 69 66 20 70  except that if p
5f60: 7a 42 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e  zBuffer .** is n
5f70: 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a  ot NULL then *pz
5f80: 42 75 66 66 65 72 20 69 73 20 61 73 73 75 6d 65  Buffer is assume
5f90: 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  d to point to a 
5fa0: 62 75 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f  buffer large eno
5fb0: 75 67 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65  ugh .** to store
5fc0: 20 74 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70   the copy of exp
5fd0: 72 65 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63  ression p, the c
5fe0: 6f 70 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54  opies of p->u.zT
5ff0: 6f 6b 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c  oken.** (if appl
6000: 69 63 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65  icable), and the
6010: 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70   copies of the p
6020: 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70  ->pLeft and p->p
6030: 52 69 67 68 74 20 65 78 70 72 65 73 73 69 6f 6e  Right expression
6040: 73 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65  s,.** if any. Be
6050: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
6060: 2a 70 7a 42 75 66 66 65 72 20 69 73 20 73 65 74  *pzBuffer is set
6070: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
6080: 74 65 20 70 61 73 73 65 64 20 74 68 65 0a 2a 2a  te passed the.**
6090: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
60a0: 62 75 66 66 65 72 20 63 6f 70 69 65 64 20 69 6e  buffer copied in
60b0: 74 6f 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  to by this funct
60c0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45  ion..*/.static E
60d0: 78 70 72 20 2a 65 78 70 72 44 75 70 28 73 71 6c  xpr *exprDup(sql
60e0: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
60f0: 70 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 75 38  p, int flags, u8
6100: 20 2a 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20 20   **pzBuffer){.  
6110: 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 30 3b 20  Expr *pNew = 0; 
6120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6130: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
6140: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 66 28   return */.  if(
6150: 20 70 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20   p ){.    const 
6160: 69 6e 74 20 69 73 52 65 64 75 63 65 64 20 3d 20  int isReduced = 
6170: 28 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52  (flags&EXPRDUP_R
6180: 45 44 55 43 45 29 3b 0a 20 20 20 20 75 38 20 2a  EDUCE);.    u8 *
6190: 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 75 33 32 20  zAlloc;.    u32 
61a0: 73 74 61 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a  staticFlag = 0;.
61b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 7a 42  .    assert( pzB
61c0: 75 66 66 65 72 3d 3d 30 20 7c 7c 20 69 73 52 65  uffer==0 || isRe
61d0: 64 75 63 65 64 20 29 3b 0a 0a 20 20 20 20 2f 2a  duced );..    /*
61e0: 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 72   Figure out wher
61f0: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6e  e to write the n
6200: 65 77 20 45 78 70 72 20 73 74 72 75 63 74 75 72  ew Expr structur
6210: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 7a  e. */.    if( pz
6220: 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20  Buffer ){.      
6230: 7a 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66  zAlloc = *pzBuff
6240: 65 72 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63  er;.      static
6250: 46 6c 61 67 20 3d 20 45 50 5f 53 74 61 74 69 63  Flag = EP_Static
6260: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6270: 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69     zAlloc = sqli
6280: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
6290: 62 2c 20 64 75 70 65 64 45 78 70 72 53 69 7a 65  b, dupedExprSize
62a0: 28 70 2c 20 66 6c 61 67 73 29 29 3b 0a 20 20 20  (p, flags));.   
62b0: 20 7d 0a 20 20 20 20 70 4e 65 77 20 3d 20 28 45   }.    pNew = (E
62c0: 78 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20  xpr *)zAlloc;.. 
62d0: 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
62e0: 20 20 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65 77       /* Set nNew
62f0: 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65  Size to the size
6300: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
6310: 68 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69  he structure poi
6320: 6e 74 65 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a  nted to.      **
6330: 20 62 79 20 70 4e 65 77 2e 20 54 68 69 73 20 69   by pNew. This i
6340: 73 20 65 69 74 68 65 72 20 45 58 50 52 5f 46 55  s either EXPR_FU
6350: 4c 4c 53 49 5a 45 2c 20 45 58 50 52 5f 52 45 44  LLSIZE, EXPR_RED
6360: 55 43 45 44 53 49 5a 45 20 6f 72 0a 20 20 20 20  UCEDSIZE or.    
6370: 20 20 2a 2a 20 45 58 50 52 5f 54 4f 4b 45 4e 4f    ** EXPR_TOKENO
6380: 4e 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20  NLYSIZE. nToken 
6390: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
63a0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 63 6f  mber of bytes co
63b0: 6e 73 75 6d 65 64 0a 20 20 20 20 20 20 2a 2a 20  nsumed.      ** 
63c0: 62 79 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74  by the copy of t
63d0: 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73  he p->u.zToken s
63e0: 74 72 69 6e 67 20 28 69 66 20 61 6e 79 29 2e 0a  tring (if any)..
63f0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
6400: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 6e 53  onst unsigned nS
6410: 74 72 75 63 74 53 69 7a 65 20 3d 20 64 75 70 65  tructSize = dupe
6420: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
6430: 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 20  p, flags);.     
6440: 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53   const int nNewS
6450: 69 7a 65 20 3d 20 6e 53 74 72 75 63 74 53 69 7a  ize = nStructSiz
6460: 65 20 26 20 30 78 66 66 66 3b 0a 20 20 20 20 20  e & 0xfff;.     
6470: 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20   int nToken;.   
6480: 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50     if( !ExprHasP
6490: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e  roperty(p, EP_In
64a0: 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e  tValue) && p->u.
64b0: 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20  zToken ){.      
64c0: 20 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74    nToken = sqlit
64d0: 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e  e3Strlen30(p->u.
64e0: 7a 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20 20 20  zToken) + 1;.   
64f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6500: 20 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20    nToken = 0;.  
6510: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
6520: 69 73 52 65 64 75 63 65 64 20 29 7b 0a 20 20 20  isReduced ){.   
6530: 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70       assert( Exp
6540: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
6550: 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 20 29  EP_Reduced)==0 )
6560: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
6570: 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77  (zAlloc, p, nNew
6580: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Size);.      }el
6590: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
65a0: 6e 53 69 7a 65 20 3d 20 65 78 70 72 53 74 72 75  nSize = exprStru
65b0: 63 74 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 20  ctSize(p);.     
65c0: 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63     memcpy(zAlloc
65d0: 2c 20 70 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20  , p, nSize);.   
65e0: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c       memset(&zAl
65f0: 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45  loc[nSize], 0, E
6600: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69  XPR_FULLSIZE-nSi
6610: 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ze);.      }..  
6620: 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 45      /* Set the E
6630: 50 5f 52 65 64 75 63 65 64 2c 20 45 50 5f 54 6f  P_Reduced, EP_To
6640: 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45 50 5f  kenOnly, and EP_
6650: 53 74 61 74 69 63 20 66 6c 61 67 73 20 61 70 70  Static flags app
6660: 72 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f 0a 20  ropriately. */. 
6670: 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73       pNew->flags
6680: 20 26 3d 20 7e 28 45 50 5f 52 65 64 75 63 65 64   &= ~(EP_Reduced
6690: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50  |EP_TokenOnly|EP
66a0: 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20 20 20  _Static);.      
66b0: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 6e  pNew->flags |= n
66c0: 53 74 72 75 63 74 53 69 7a 65 20 26 20 28 45 50  StructSize & (EP
66d0: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
66e0: 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 70 4e  nOnly);.      pN
66f0: 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 73 74 61  ew->flags |= sta
6700: 74 69 63 46 6c 61 67 3b 0a 0a 20 20 20 20 20 20  ticFlag;..      
6710: 2f 2a 20 43 6f 70 79 20 74 68 65 20 70 2d 3e 75  /* Copy the p->u
6720: 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 2c 20  .zToken string, 
6730: 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 20  if any. */.     
6740: 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a 20   if( nToken ){. 
6750: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f         char *zTo
6760: 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a 54  ken = pNew->u.zT
6770: 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 7a  oken = (char*)&z
6780: 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d 3b  Alloc[nNewSize];
6790: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
67a0: 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f  zToken, p->u.zTo
67b0: 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20  ken, nToken);.  
67c0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
67d0: 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73 7c 70   0==((p->flags|p
67e0: 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26 20 45 50  New->flags) & EP
67f0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
6800: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
6810: 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e 70 53  n the pNew->x.pS
6820: 65 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d 3e 78  elect or pNew->x
6830: 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e 20 2a  .pList member. *
6840: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 45 78  /.        if( Ex
6850: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
6860: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
6870: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
6880: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71  ->x.pSelect = sq
6890: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
68a0: 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  b, p->x.pSelect,
68b0: 20 69 73 52 65 64 75 63 65 64 29 3b 0a 20 20 20   isReduced);.   
68c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
68d0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c        pNew->x.pL
68e0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
68f0: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
6900: 78 2e 70 4c 69 73 74 2c 20 69 73 52 65 64 75 63  x.pList, isReduc
6910: 65 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ed);.        }. 
6920: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
6930: 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d 3e 70   Fill in pNew->p
6940: 4c 65 66 74 20 61 6e 64 20 70 4e 65 77 2d 3e 70  Left and pNew->p
6950: 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20  Right. */.      
6960: 69 66 28 20 45 78 70 72 48 61 73 41 6e 79 50 72  if( ExprHasAnyPr
6970: 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
6980: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
6990: 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20  Only) ){.       
69a0: 20 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64   zAlloc += duped
69b0: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20  ExprNodeSize(p, 
69c0: 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20  flags);.        
69d0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
69e0: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64  rty(pNew, EP_Red
69f0: 75 63 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20  uced) ){.       
6a00: 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d     pNew->pLeft =
6a10: 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e   exprDup(db, p->
6a20: 70 4c 65 66 74 2c 20 45 58 50 52 44 55 50 5f 52  pLeft, EXPRDUP_R
6a30: 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b  EDUCE, &zAlloc);
6a40: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
6a50: 3e 70 52 69 67 68 74 20 3d 20 65 78 70 72 44 75  >pRight = exprDu
6a60: 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c  p(db, p->pRight,
6a70: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c   EXPRDUP_REDUCE,
6a80: 20 26 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20   &zAlloc);.     
6a90: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
6aa0: 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20   pzBuffer ){.   
6ab0: 20 20 20 20 20 20 20 2a 70 7a 42 75 66 66 65 72         *pzBuffer
6ac0: 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20   = zAlloc;.     
6ad0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
6ae0: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
6af0: 66 6c 61 67 73 32 20 3d 20 30 3b 0a 20 20 20 20  flags2 = 0;.    
6b00: 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
6b10: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45  AnyProperty(p, E
6b20: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
6b30: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
6b40: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
6b50: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
6b60: 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  eft, 0);.       
6b70: 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20     pNew->pRight 
6b80: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
6b90: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20  (db, p->pRight, 
6ba0: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
6bb0: 20 20 20 20 7d 0a 0a 20 20 20 20 7d 0a 20 20 7d      }..    }.  }
6bc0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
6bd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
6be0: 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20  lowing group of 
6bf0: 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65  routines make de
6c00: 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70  ep copies of exp
6c10: 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70  ressions,.** exp
6c20: 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49  ression lists, I
6c30: 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c  D lists, and sel
6c40: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  ect statements. 
6c50: 20 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a   The copies can.
6c60: 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28 62  ** be deleted (b
6c70: 79 20 62 65 69 6e 67 20 70 61 73 73 65 64 20 74  y being passed t
6c80: 6f 20 74 68 65 69 72 20 72 65 73 70 65 63 74 69  o their respecti
6c90: 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72  ve ...Delete() r
6ca0: 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68  outines).** with
6cb0: 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74 68  out effecting th
6cc0: 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a  e originals..**.
6cd0: 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  ** The expressio
6ce0: 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20  n list, ID, and 
6cf0: 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65 74  source lists ret
6d00: 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78  urn by sqlite3Ex
6d10: 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20  prListDup(),.** 
6d20: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
6d30: 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53  (), and sqlite3S
6d40: 72 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20  rcListDup() can 
6d50: 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72 20 65  not be further e
6d60: 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73  xpanded .** by s
6d70: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
6d80: 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70  to sqlite*ListAp
6d90: 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e  pend() routines.
6da0: 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65  .**.** Any table
6db0: 73 20 74 68 61 74 20 74 68 65 20 53 72 63 4c 69  s that the SrcLi
6dc0: 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  st might point t
6dd0: 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63  o are not duplic
6de0: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ated..**.** The 
6df0: 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  flags parameter 
6e00: 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62 69  contains a combi
6e10: 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45 58  nation of the EX
6e20: 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e  PRDUP_XXX flags.
6e30: 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44  .** If the EXPRD
6e40: 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69  UP_REDUCE flag i
6e50: 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
6e60: 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e  structure return
6e70: 65 64 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63  ed is a.** trunc
6e80: 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ated version of 
6e90: 74 68 65 20 75 73 75 61 6c 20 45 78 70 72 20 73  the usual Expr s
6ea0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69  tructure that wi
6eb0: 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73 0a  ll be stored as.
6ec0: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 69  ** part of the i
6ed0: 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
6ee0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  ntation of the d
6ef0: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a  atabase schema..
6f00: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
6f10: 45 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20  ExprDup(sqlite3 
6f20: 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e  *db, Expr *p, in
6f30: 74 20 66 6c 61 67 73 29 7b 0a 20 20 72 65 74 75  t flags){.  retu
6f40: 72 6e 20 65 78 70 72 44 75 70 28 64 62 2c 20 70  rn exprDup(db, p
6f50: 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 7d 0a 45  , flags, 0);.}.E
6f60: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
6f70: 45 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c 69  ExprListDup(sqli
6f80: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73  te3 *db, ExprLis
6f90: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
6fa0: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e  {.  ExprList *pN
6fb0: 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  ew;.  struct Exp
6fc0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
6fd0: 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20  m, *pOldItem;.  
6fe0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d  int i;.  if( p==
6ff0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
7000: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
7010: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
7020: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
7030: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
7040: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
7050: 3e 69 45 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  >iECursor = 0;. 
7060: 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70   pNew->nExpr = p
7070: 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d  New->nAlloc = p-
7080: 3e 6e 45 78 70 72 3b 0a 20 20 70 4e 65 77 2d 3e  >nExpr;.  pNew->
7090: 61 20 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c 69  a = pItem = sqli
70a0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
70b0: 62 2c 20 20 70 2d 3e 6e 45 78 70 72 2a 73 69 7a  b,  p->nExpr*siz
70c0: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a  eof(p->a[0]) );.
70d0: 20 20 69 66 28 20 70 49 74 65 6d 3d 3d 30 20 29    if( pItem==0 )
70e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
70f0: 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20  ree(db, pNew);. 
7100: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
7110: 20 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70   .  pOldItem = p
7120: 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ->a;.  for(i=0; 
7130: 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  i<p->nExpr; i++,
7140: 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74   pItem++, pOldIt
7150: 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  em++){.    Expr 
7160: 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 45  *pNewExpr;.    E
7170: 78 70 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d 20  xpr *pOldExpr = 
7180: 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 3b  pOldItem->pExpr;
7190: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70  .    pItem->pExp
71a0: 72 20 3d 20 70 4e 65 77 45 78 70 72 20 3d 20 73  r = pNewExpr = s
71b0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
71c0: 2c 20 70 4f 6c 64 45 78 70 72 2c 20 66 6c 61 67  , pOldExpr, flag
71d0: 73 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a  s);.    pItem->z
71e0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
71f0: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
7200: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
7210: 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20   pItem->zSpan = 
7220: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
7230: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 53  db, pOldItem->zS
7240: 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  pan);.    pItem-
7250: 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c  >sortOrder = pOl
7260: 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  dItem->sortOrder
7270: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e  ;.    pItem->don
7280: 65 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65 6d  e = 0;.    pItem
7290: 2d 3e 69 43 6f 6c 20 3d 20 70 4f 6c 64 49 74 65  ->iCol = pOldIte
72a0: 6d 2d 3e 69 43 6f 6c 3b 0a 20 20 20 20 70 49 74  m->iCol;.    pIt
72b0: 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 70 4f 6c  em->iAlias = pOl
72c0: 64 49 74 65 6d 2d 3e 69 41 6c 69 61 73 3b 0a 20  dItem->iAlias;. 
72d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
72e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75  ;.}../*.** If cu
72f0: 72 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73 2c  rsors, triggers,
7300: 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71 75   views and subqu
7310: 65 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d  eries are all om
7320: 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68  itted from.** th
7330: 65 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f  e build, then no
7340: 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
7350: 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65 78  ing routines, ex
7360: 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c  cept for .** sql
7370: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 2c  ite3SelectDup(),
7380: 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20   can be called. 
7390: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
73a0: 28 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a  () is sometimes.
73b0: 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61  ** called with a
73c0: 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a   NULL argument..
73d0: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
73e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
73f0: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
7400: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
7410: 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65  R) \. || !define
7420: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
7430: 42 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74 20  BQUERY).SrcList 
7440: 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44  *sqlite3SrcListD
7450: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
7460: 53 72 63 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20  SrcList *p, int 
7470: 66 6c 61 67 73 29 7b 0a 20 20 53 72 63 4c 69 73  flags){.  SrcLis
7480: 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69  t *pNew;.  int i
7490: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
74a0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
74b0: 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20  rn 0;.  nByte = 
74c0: 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d  sizeof(*p) + (p-
74d0: 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66  >nSrc>0 ? sizeof
74e0: 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e  (p->a[0]) * (p->
74f0: 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20  nSrc-1) : 0);.  
7500: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
7510: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e 42  MallocRaw(db, nB
7520: 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  yte );.  if( pNe
7530: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
7540: 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20  .  pNew->nSrc = 
7550: 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70  pNew->nAlloc = p
7560: 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d  ->nSrc;.  for(i=
7570: 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b  0; i<p->nSrc; i+
7580: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
7590: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65  rcList_item *pNe
75a0: 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61  wItem = &pNew->a
75b0: 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20  [i];.    struct 
75c0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f  SrcList_item *pO
75d0: 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69  ldItem = &p->a[i
75e0: 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ];.    Table *pT
75f0: 61 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ab;.    pNewItem
7600: 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71  ->zDatabase = sq
7610: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
7620: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74  , pOldItem->zDat
7630: 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77  abase);.    pNew
7640: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
7650: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
7660: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  , pOldItem->zNam
7670: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
7680: 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74  ->zAlias = sqlit
7690: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
76a0: 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  OldItem->zAlias)
76b0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
76c0: 6a 6f 69 6e 74 79 70 65 20 3d 20 70 4f 6c 64 49  jointype = pOldI
76d0: 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20  tem->jointype;. 
76e0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75     pNewItem->iCu
76f0: 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rsor = pOldItem-
7700: 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e  >iCursor;.    pN
7710: 65 77 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61  ewItem->isPopula
7720: 74 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  ted = pOldItem->
7730: 69 73 50 6f 70 75 6c 61 74 65 64 3b 0a 20 20 20  isPopulated;.   
7740: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 49 6e 64 65   pNewItem->zInde
7750: 78 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  x = sqlite3DbStr
7760: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
7770: 2d 3e 7a 49 6e 64 65 78 29 3b 0a 20 20 20 20 70  ->zIndex);.    p
7780: 4e 65 77 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65  NewItem->notInde
7790: 78 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  xed = pOldItem->
77a0: 6e 6f 74 49 6e 64 65 78 65 64 3b 0a 20 20 20 20  notIndexed;.    
77b0: 70 4e 65 77 49 74 65 6d 2d 3e 70 49 6e 64 65 78  pNewItem->pIndex
77c0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 49 6e   = pOldItem->pIn
77d0: 64 65 78 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  dex;.    pTab = 
77e0: 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d  pNewItem->pTab =
77f0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b   pOldItem->pTab;
7800: 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b  .    if( pTab ){
7810: 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65  .      pTab->nRe
7820: 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  f++;.    }.    p
7830: 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  NewItem->pSelect
7840: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
7850: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
7860: 2d 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61 67 73  ->pSelect, flags
7870: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
7880: 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78  >pOn = sqlite3Ex
7890: 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  prDup(db, pOldIt
78a0: 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b  em->pOn, flags);
78b0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
78c0: 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49  Using = sqlite3I
78d0: 64 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c  dListDup(db, pOl
78e0: 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a  dItem->pUsing);.
78f0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f      pNewItem->co
7900: 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d  lUsed = pOldItem
7910: 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20  ->colUsed;.  }. 
7920: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
7930: 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49  IdList *sqlite3I
7940: 64 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33  dListDup(sqlite3
7950: 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 29   *db, IdList *p)
7960: 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77  {.  IdList *pNew
7970: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
7980: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
7990: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
79a0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
79b0: 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  , sizeof(*pNew) 
79c0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
79d0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
79e0: 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 4e 65 77 2d  New->nId = pNew-
79f0: 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 49 64  >nAlloc = p->nId
7a00: 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71  ;.  pNew->a = sq
7a10: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
7a20: 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65  (db, p->nId*size
7a30: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  of(p->a[0]) );. 
7a40: 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20   if( pNew->a==0 
7a50: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
7a60: 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a  Free(db, pNew);.
7a70: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
7a80: 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
7a90: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
7aa0: 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69   struct IdList_i
7ab0: 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20  tem *pNewItem = 
7ac0: 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pNew->a[i];.   
7ad0: 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69   struct IdList_i
7ae0: 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20  tem *pOldItem = 
7af0: 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e  &p->a[i];.    pN
7b00: 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ewItem->zName = 
7b10: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
7b20: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e  db, pOldItem->zN
7b30: 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ame);.    pNewIt
7b40: 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74  em->idx = pOldIt
7b50: 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72  em->idx;.  }.  r
7b60: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65  eturn pNew;.}.Se
7b70: 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c  lect *sqlite3Sel
7b80: 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  ectDup(sqlite3 *
7b90: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  db, Select *p, i
7ba0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 65 6c  nt flags){.  Sel
7bb0: 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28  ect *pNew;.  if(
7bc0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
7bd0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
7be0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
7bf0: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  , sizeof(*p) );.
7c00: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
7c10: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
7c20: 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74  ->pEList = sqlit
7c30: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
7c40: 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61  , p->pEList, fla
7c50: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72  gs);.  pNew->pSr
7c60: 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
7c70: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 72  stDup(db, p->pSr
7c80: 63 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  c, flags);.  pNe
7c90: 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  w->pWhere = sqli
7ca0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
7cb0: 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61 67 73 29  ->pWhere, flags)
7cc0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70  ;.  pNew->pGroup
7cd0: 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
7ce0: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
7cf0: 47 72 6f 75 70 42 79 2c 20 66 6c 61 67 73 29 3b  GroupBy, flags);
7d00: 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67  .  pNew->pHaving
7d10: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
7d20: 70 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67  p(db, p->pHaving
7d30: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
7d40: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  ->pOrderBy = sql
7d50: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
7d60: 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  db, p->pOrderBy,
7d70: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
7d80: 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70  >op = p->op;.  p
7d90: 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 73 71  New->pPrior = sq
7da0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
7db0: 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 66 6c  b, p->pPrior, fl
7dc0: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c  ags);.  pNew->pL
7dd0: 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78  imit = sqlite3Ex
7de0: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69  prDup(db, p->pLi
7df0: 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  mit, flags);.  p
7e00: 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 73  New->pOffset = s
7e10: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
7e20: 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 66 6c  , p->pOffset, fl
7e30: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c  ags);.  pNew->iL
7e40: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77  imit = 0;.  pNew
7e50: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->iOffset = 0;. 
7e60: 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20   pNew->selFlags 
7e70: 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  = p->selFlags & 
7e80: 7e 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61  ~SF_UsesEphemera
7e90: 6c 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68  l;.  pNew->pRigh
7ea0: 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 70 4e 65  tmost = 0;.  pNe
7eb0: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
7ec0: 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  0] = -1;.  pNew-
7ed0: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
7ee0: 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61   = -1;.  pNew->a
7ef0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d  ddrOpenEphm[2] =
7f00: 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e   -1;.  return pN
7f10: 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65  ew;.}.#else.Sele
7f20: 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63  ct *sqlite3Selec
7f30: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
7f40: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
7f50: 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72   flags){.  asser
7f60: 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74  t( p==0 );.  ret
7f70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
7f80: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
7f90: 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
7fa0: 20 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65   end of an expre
7fb0: 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20  ssion list.  If 
7fc0: 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74  pList is.** init
7fd0: 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e  ially NULL, then
7fe0: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 65 78   create a new ex
7ff0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
8000: 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
8010: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
8020: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6e  r occurs, the en
8030: 74 69 72 65 20 6c 69 73 74 20 69 73 20 66 72 65  tire list is fre
8040: 65 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69  ed and.** NULL i
8050: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20  s returned.  If 
8060: 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75  non-NULL is retu
8070: 72 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  rned, then it is
8080: 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74   guaranteed.** t
8090: 68 61 74 20 74 68 65 20 6e 65 77 20 65 6e 74 72  hat the new entr
80a0: 79 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  y was successful
80b0: 6c 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a  ly appended..*/.
80c0: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
80d0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
80e0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
80f0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
8100: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
8110: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
8120: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
8130: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
8140: 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20  ppend. Might be 
8150: 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a  NULL */.  Expr *
8160: 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  pExpr           
8170: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
8180: 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20  to be appended. 
8190: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
81a0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
81b0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
81c0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
81d0: 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
81e0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
81f0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70  o(db, sizeof(Exp
8200: 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  rList) );.    if
8210: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
8220: 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
8230: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
8240: 74 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  t( pList->nAlloc
8250: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ==0 );.  }.  if(
8260: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3c 3d   pList->nAlloc<=
8270: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  pList->nExpr ){.
8280: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
8290: 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20  ist_item *a;.   
82a0: 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 2d 3e   int n = pList->
82b0: 6e 41 6c 6c 6f 63 2a 32 20 2b 20 34 3b 0a 20 20  nAlloc*2 + 4;.  
82c0: 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62 52    a = sqlite3DbR
82d0: 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74  ealloc(db, pList
82e0: 2d 3e 61 2c 20 6e 2a 73 69 7a 65 6f 66 28 70 4c  ->a, n*sizeof(pL
82f0: 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20  ist->a[0]));.   
8300: 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20   if( a==0 ){.   
8310: 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
8320: 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d      }.    pList-
8330: 3e 61 20 3d 20 61 3b 0a 20 20 20 20 70 4c 69 73  >a = a;.    pLis
8340: 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 73 71 6c 69  t->nAlloc = sqli
8350: 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
8360: 64 62 2c 20 61 29 2f 73 69 7a 65 6f 66 28 61 5b  db, a)/sizeof(a[
8370: 30 5d 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  0]);.  }.  asser
8380: 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29  t( pList->a!=0 )
8390: 3b 0a 20 20 69 66 28 20 31 20 29 7b 0a 20 20 20  ;.  if( 1 ){.   
83a0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
83b0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
83c0: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
83d0: 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65  nExpr++];.    me
83e0: 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20 73  mset(pItem, 0, s
83f0: 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b 0a  izeof(*pItem));.
8400: 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72      pItem->pExpr
8410: 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d 0a 20 20   = pExpr;.  }.  
8420: 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e  return pList;..n
8430: 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a  o_mem:     .  /*
8440: 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d   Avoid leaking m
8450: 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20  emory if malloc 
8460: 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20  has failed. */. 
8470: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
8480: 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20  te(db, pExpr);. 
8490: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
84a0: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
84b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
84c0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
84d0: 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61  ExprList.a[].zNa
84e0: 6d 65 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  me element of th
84f0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
8500: 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e  added item.** on
8510: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
8520: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73  list..**.** pLis
8530: 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  t might be NULL 
8540: 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d  following an OOM
8550: 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70 4e 61   error.  But pNa
8560: 6d 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  me should never 
8570: 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20  be.** NULL.  If 
8580: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
8590: 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70  ion fails, the p
85a0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
85b0: 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20  cFailed flag.** 
85c0: 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20  is set..*/.void 
85d0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
85e0: 65 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20  etName(.  Parse 
85f0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
8600: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
8610: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
8620: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
8630: 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69    /* List to whi
8640: 63 68 20 74 6f 20 61 64 64 20 74 68 65 20 73 70  ch to add the sp
8650: 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  an. */.  Token *
8660: 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  pName,          
8670: 20 2f 2a 20 4e 61 6d 65 20 74 6f 20 62 65 20 61   /* Name to be a
8680: 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65  dded */.  int de
8690: 71 75 6f 74 65 20 20 20 20 20 20 20 20 20 20 20  quote           
86a0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 63 61 75    /* True to cau
86b0: 73 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 20 62  se the name to b
86c0: 65 20 64 65 71 75 6f 74 65 64 20 2a 2f 0a 29 7b  e dequoted */.){
86d0: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
86e0: 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  !=0 || pParse->d
86f0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21  b->mallocFailed!
8700: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73  =0 );.  if( pLis
8710: 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  t ){.    struct 
8720: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
8730: 49 74 65 6d 3b 0a 20 20 20 20 61 73 73 65 72 74  Item;.    assert
8740: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30  ( pList->nExpr>0
8750: 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d 20   );.    pItem = 
8760: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
8770: 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61  >nExpr-1];.    a
8780: 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 7a 4e  ssert( pItem->zN
8790: 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49  ame==0 );.    pI
87a0: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
87b0: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70 50  ite3DbStrNDup(pP
87c0: 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d  arse->db, pName-
87d0: 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20  >z, pName->n);. 
87e0: 20 20 20 69 66 28 20 64 65 71 75 6f 74 65 20 26     if( dequote &
87f0: 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29  & pItem->zName )
8800: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
8810: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
8820: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
8830: 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d  the ExprList.a[]
8840: 2e 7a 53 70 61 6e 20 65 6c 65 6d 65 6e 74 20 6f  .zSpan element o
8850: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
8860: 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a  tly added item.*
8870: 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  * on the express
8880: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
8890: 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e  pList might be N
88a0: 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e  ULL following an
88b0: 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74   OOM error.  But
88c0: 20 70 53 70 61 6e 20 73 68 6f 75 6c 64 20 6e 65   pSpan should ne
88d0: 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20  ver be.** NULL. 
88e0: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
88f0: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74  ocation fails, t
8900: 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  he pParse->db->m
8910: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
8920: 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76  .** is set..*/.v
8930: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
8940: 69 73 74 53 65 74 53 70 61 6e 28 0a 20 20 50 61  istSetSpan(.  Pa
8950: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
8960: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
8970: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
8980: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
8990: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f        /* List to
89a0: 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74 68   which to add th
89b0: 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 45 78 70  e span. */.  Exp
89c0: 72 53 70 61 6e 20 2a 70 53 70 61 6e 20 20 20 20  rSpan *pSpan    
89d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 61 6e       /* The span
89e0: 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a   to be added */.
89f0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
8a00: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
8a10: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
8a20: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
8a30: 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  ailed!=0 );.  if
8a40: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73  ( pList ){.    s
8a50: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
8a60: 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c  tem *pItem = &pL
8a70: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45  ist->a[pList->nE
8a80: 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65  xpr-1];.    asse
8a90: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
8aa0: 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
8ab0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
8ac0: 65 64 20 7c 7c 20 70 49 74 65 6d 2d 3e 70 45 78  ed || pItem->pEx
8ad0: 70 72 3d 3d 70 53 70 61 6e 2d 3e 70 45 78 70 72  pr==pSpan->pExpr
8ae0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   );.    sqlite3D
8af0: 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
8b00: 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74  >zSpan);.    pIt
8b10: 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69  em->zSpan = sqli
8b20: 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
8b30: 20 28 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a   (char*)pSpan->z
8b40: 53 74 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20  Start,.         
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b60: 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
8b70: 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70  (pSpan->zEnd - p
8b80: 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a  Span->zStart));.
8b90: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
8ba0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
8bb0: 69 73 74 20 70 45 4c 69 73 74 20 63 6f 6e 74 61  ist pEList conta
8bc0: 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c  ins more than iL
8bd0: 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a  imit elements,.*
8be0: 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  * leave an error
8bf0: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
8c00: 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
8c10: 74 65 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b  te3ExprListCheck
8c20: 4c 65 6e 67 74 68 28 0a 20 20 50 61 72 73 65 20  Length(.  Parse 
8c30: 2a 70 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c  *pParse,.  ExprL
8c40: 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20 63  ist *pEList,.  c
8c50: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65  onst char *zObje
8c60: 63 74 0a 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d  ct.){.  int mx =
8c70: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69   pParse->db->aLi
8c80: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
8c90: 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73 74  _COLUMN];.  test
8ca0: 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20  case( pEList && 
8cb0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d  pEList->nExpr==m
8cc0: 78 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  x );.  testcase(
8cd0: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
8ce0: 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31 20 29  t->nExpr==mx+1 )
8cf0: 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20 26  ;.  if( pEList &
8d00: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  & pEList->nExpr>
8d10: 6d 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  mx ){.    sqlite
8d20: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8d30: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75  , "too many colu
8d40: 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62 6a  mns in %s", zObj
8d50: 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ect);.  }.}../*.
8d60: 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
8d70: 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  ire expression l
8d80: 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
8d90: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
8da0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
8db0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
8dc0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
8dd0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
8de0: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20  m *pItem;.  if( 
8df0: 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
8e00: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  n;.  assert( pLi
8e10: 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 28 70 4c 69  st->a!=0 || (pLi
8e20: 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 26 26 20  st->nExpr==0 && 
8e30: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30  pList->nAlloc==0
8e40: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
8e50: 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 70 4c 69  List->nExpr<=pLi
8e60: 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20  st->nAlloc );.  
8e70: 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
8e80: 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74  >a, i=0; i<pList
8e90: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  ->nExpr; i++, pI
8ea0: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  tem++){.    sqli
8eb0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
8ec0: 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
8ed0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
8ee0: 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e  ee(db, pItem->zN
8ef0: 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
8f00: 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
8f10: 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 7d 0a 20  m->zSpan);.  }. 
8f20: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8f30: 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20  b, pList->a);.  
8f40: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
8f50: 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  , pList);.}../*.
8f60: 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
8f70: 73 20 61 72 65 20 57 61 6c 6b 65 72 20 63 61 6c  s are Walker cal
8f80: 6c 62 61 63 6b 73 2e 20 20 57 61 6c 6b 65 72 2e  lbacks.  Walker.
8f90: 75 2e 70 69 20 69 73 20 61 20 70 6f 69 6e 74 65  u.pi is a pointe
8fa0: 72 0a 2a 2a 20 74 6f 20 61 6e 20 69 6e 74 65 67  r.** to an integ
8fb0: 65 72 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69  er.  These routi
8fc0: 6e 65 73 20 61 72 65 20 63 68 65 63 6b 69 6e 67  nes are checking
8fd0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
8fe0: 6f 20 73 65 65 0a 2a 2a 20 69 66 20 69 74 20 69  o see.** if it i
8ff0: 73 20 61 20 63 6f 6e 73 74 61 6e 74 2e 20 20 53  s a constant.  S
9000: 65 74 20 2a 57 61 6c 6b 65 72 2e 75 2e 70 69 20  et *Walker.u.pi 
9010: 74 6f 20 30 20 69 66 20 74 68 65 20 65 78 70 72  to 0 if the expr
9020: 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 6e 6f 74  ession is.** not
9030: 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a   constant..**.**
9040: 20 54 68 65 73 65 20 63 61 6c 6c 62 61 63 6b 20   These callback 
9050: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
9060: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
9070: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
9080: 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45  .**     sqlite3E
9090: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 0a  xprIsConstant().
90a0: 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  **     sqlite3Ex
90b0: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a  prIsConstantNotJ
90c0: 6f 69 6e 28 29 0a 2a 2a 20 20 20 20 20 73 71 6c  oin().**     sql
90d0: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
90e0: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 0a 2a  ntOrFunction().*
90f0: 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  *.*/.static int 
9100: 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
9110: 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  nt(Walker *pWalk
9120: 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
9130: 7b 0a 0a 20 20 2f 2a 20 49 66 20 70 57 61 6c 6b  {..  /* If pWalk
9140: 65 72 2d 3e 75 2e 69 20 69 73 20 33 20 74 68 65  er->u.i is 3 the
9150: 6e 20 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68  n any term of th
9160: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
9170: 74 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a  t comes from.  *
9180: 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  * the ON or USIN
9190: 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a  G clauses of a j
91a0: 6f 69 6e 20 64 69 73 71 75 61 6c 69 66 69 65 73  oin disqualifies
91b0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
91c0: 20 20 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20    ** from being 
91d0: 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 6e 73 74  considered const
91e0: 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57  ant. */.  if( pW
91f0: 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 33 20 26 26  alker->u.i==3 &&
9200: 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65   ExprHasAnyPrope
9210: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
9220: 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70  omJoin) ){.    p
9230: 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b  Walker->u.i = 0;
9240: 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
9250: 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77  Abort;.  }..  sw
9260: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
9270: 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64  ){.    /* Consid
9280: 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  er functions to 
9290: 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61  be constant if a
92a0: 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e  ll their argumen
92b0: 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a  ts are constant.
92c0: 20 20 20 20 2a 2a 20 61 6e 64 20 70 57 61 6c 6b      ** and pWalk
92d0: 65 72 2d 3e 75 2e 69 3d 3d 32 20 2a 2f 0a 20 20  er->u.i==2 */.  
92e0: 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
92f0: 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57  ON:.      if( pW
9300: 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 32 20 29 20  alker->u.i==2 ) 
9310: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
9320: 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20  /* Fall through 
9330: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  */.    case TK_I
9340: 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  D:.    case TK_C
9350: 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20  OLUMN:.    case 
9360: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
9370: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
9380: 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 74  _COLUMN:.      t
9390: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
93a0: 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20  op==TK_ID );.   
93b0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
93c0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
93d0: 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
93e0: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
93f0: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
9400: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
9410: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
9420: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _AGG_COLUMN );. 
9430: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e       pWalker->u.
9440: 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  i = 0;.      ret
9450: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
9460: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
9470: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
9480: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
9490: 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64   ); /* selectNod
94a0: 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c  eIsConstant will
94b0: 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20   disallow */.   
94c0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
94d0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54  pr->op==TK_EXIST
94e0: 53 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f  S ); /* selectNo
94f0: 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c  deIsConstant wil
9500: 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20  l disallow */.  
9510: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
9520: 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73  ontinue;.  }.}.s
9530: 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74  tatic int select
9540: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57  NodeIsConstant(W
9550: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
9560: 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 29  Select *NotUsed)
9570: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
9580: 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
9590: 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20   pWalker->u.i = 
95a0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  0;.  return WRC_
95b0: 41 62 6f 72 74 3b 0a 7d 0a 73 74 61 74 69 63 20  Abort;.}.static 
95c0: 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74 28  int exprIsConst(
95d0: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e 69  Expr *p, int ini
95e0: 74 46 6c 61 67 29 7b 0a 20 20 57 61 6c 6b 65 72  tFlag){.  Walker
95f0: 20 77 3b 0a 20 20 77 2e 75 2e 69 20 3d 20 69 6e   w;.  w.u.i = in
9600: 69 74 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70  itFlag;.  w.xExp
9610: 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
9620: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a  NodeIsConstant;.
9630: 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
9640: 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65  ack = selectNode
9650: 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 73 71  IsConstant;.  sq
9660: 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
9670: 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77  , p);.  return w
9680: 2e 75 2e 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  .u.i;.}../*.** W
9690: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
96a0: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
96b0: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
96c0: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
96d0: 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20 69  ** and 0 if it i
96e0: 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65  nvolves variable
96f0: 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61  s or function ca
9700: 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  lls..**.** For t
9710: 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
9720: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
9730: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  double-quoted st
9740: 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29  ring (ex: "abc")
9750: 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
9760: 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74  d a variable but
9770: 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64   a single-quoted
9780: 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62   string (ex: 'ab
9790: 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73  c') is.** a cons
97a0: 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tant..*/.int sql
97b0: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
97c0: 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72  nt(Expr *p){.  r
97d0: 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73  eturn exprIsCons
97e0: 74 28 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  t(p, 1);.}../*.*
97f0: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
9800: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
9810: 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72  rn 1 if the expr
9820: 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
9830: 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73 20  nt.** that does 
9840: 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20 66 72 6f  no originate fro
9850: 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  m the ON or USIN
9860: 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a  G clauses of a j
9870: 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30  oin..** Return 0
9880: 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20   if it involves 
9890: 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e  variables or fun
98a0: 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74  ction calls or t
98b0: 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20  erms from.** an 
98c0: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
98d0: 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
98e0: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
98f0: 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29  NotJoin(Expr *p)
9900: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  {.  return exprI
9910: 73 43 6f 6e 73 74 28 70 2c 20 33 29 3b 0a 7d 0a  sConst(p, 3);.}.
9920: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
9930: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
9940: 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
9950: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
9960: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20  onstant.** or a 
9970: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69  function call wi
9980: 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75  th constant argu
9990: 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61  ments.  Return a
99a0: 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a  nd 0 if there.**
99b0: 20 61 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c   are any variabl
99c0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  es..**.** For th
99d0: 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
99e0: 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64  is function, a d
99f0: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
9a00: 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a  ing (ex: "abc").
9a10: 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
9a20: 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20   a variable but 
9a30: 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20  a single-quoted 
9a40: 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63  string (ex: 'abc
9a50: 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74  ') is.** a const
9a60: 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ant..*/.int sqli
9a70: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
9a80: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72  tOrFunction(Expr
9a90: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65   *p){.  return e
9aa0: 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 32 29  xprIsConst(p, 2)
9ab0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
9ac0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63  e expression p c
9ad0: 6f 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  odes a constant 
9ae0: 69 6e 74 65 67 65 72 20 74 68 61 74 20 69 73 20  integer that is 
9af0: 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20  small enough.** 
9b00: 74 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62  to fit in a 32-b
9b10: 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75  it integer, retu
9b20: 72 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68 65  rn 1 and put the
9b30: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e   value of the in
9b40: 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61  teger.** in *pVa
9b50: 6c 75 65 2e 20 20 49 66 20 74 68 65 20 65 78 70  lue.  If the exp
9b60: 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61  ression is not a
9b70: 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20  n integer or if 
9b80: 69 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a  it is too big.**
9b90: 20 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67   to fit in a sig
9ba0: 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67  ned 32-bit integ
9bb0: 65 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64  er, return 0 and
9bc0: 20 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75   leave *pValue u
9bd0: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74  nchanged..*/.int
9be0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
9bf0: 74 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69  teger(Expr *p, i
9c00: 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69  nt *pValue){.  i
9c10: 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28  nt rc = 0;.  if(
9c20: 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49   p->flags & EP_I
9c30: 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a  ntValue ){.    *
9c40: 70 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56  pValue = p->u.iV
9c50: 61 6c 75 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  alue;.    return
9c60: 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68   1;.  }.  switch
9c70: 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  ( p->op ){.    c
9c80: 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
9c90: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
9ca0: 69 74 65 33 47 65 74 49 6e 74 33 32 28 70 2d 3e  ite3GetInt32(p->
9cb0: 75 2e 7a 54 6f 6b 65 6e 2c 20 70 56 61 6c 75 65  u.zToken, pValue
9cc0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9cd0: 20 72 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20   rc==0 );.      
9ce0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
9cf0: 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20   case TK_UPLUS: 
9d00: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
9d10: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
9d20: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c  r(p->pLeft, pVal
9d30: 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ue);.      break
9d40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
9d50: 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20   TK_UMINUS: {.  
9d60: 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20      int v;.     
9d70: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
9d80: 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65  IsInteger(p->pLe
9d90: 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20  ft, &v) ){.     
9da0: 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b     *pValue = -v;
9db0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
9dc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
9dd0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
9de0: 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a  default: break;.
9df0: 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b 0a    }.  if( rc ){.
9e00: 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72      assert( Expr
9e10: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
9e20: 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  , EP_Reduced|EP_
9e30: 54 6f 6b 65 6e 4f 6e 6c 79 29 0a 20 20 20 20 20  TokenOnly).     
9e40: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 2d            || (p-
9e50: 3e 66 6c 61 67 73 32 20 26 20 45 50 32 5f 4d 61  >flags2 & EP2_Ma
9e60: 6c 6c 6f 63 65 64 54 6f 6b 65 6e 29 3d 3d 30 20  llocedToken)==0 
9e70: 29 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54  );.    p->op = T
9e80: 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70  K_INTEGER;.    p
9e90: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e  ->flags |= EP_In
9ea0: 74 56 61 6c 75 65 3b 0a 20 20 20 20 70 2d 3e 75  tValue;.    p->u
9eb0: 2e 69 56 61 6c 75 65 20 3d 20 2a 70 56 61 6c 75  .iValue = *pValu
9ec0: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
9ed0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
9ee0: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
9ef0: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20  given string is 
9f00: 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20  a row-id column 
9f10: 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  name..*/.int sql
9f20: 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73  ite3IsRowid(cons
9f30: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66  t char *z){.  if
9f40: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
9f50: 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d  (z, "_ROWID_")==
9f60: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
9f70: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
9f80: 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d  mp(z, "ROWID")==
9f90: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
9fa0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
9fb0: 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20  mp(z, "OID")==0 
9fc0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
9fd0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
9fe0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
9ff0: 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20 74  we are able to t
a000: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6f  he IN operator o
a010: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 20 61  ptimization on a
a020: 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20 74 68 65  .** query of the
a030: 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20   form.**.**     
a040: 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e    x IN (SELECT .
a050: 2e 2e 29 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65 20  ..).**.** Where 
a060: 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 63 6c  the SELECT... cl
a070: 61 75 73 65 20 69 73 20 61 73 20 73 70 65 63 69  ause is as speci
a080: 66 69 65 64 20 62 79 20 74 68 65 20 70 61 72 61  fied by the para
a090: 6d 65 74 65 72 20 74 6f 20 74 68 69 73 0a 2a 2a  meter to this.**
a0a0: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
a0b0: 54 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63  The Select objec
a0c0: 74 20 70 61 73 73 65 64 20 69 6e 20 68 61 73 20  t passed in has 
a0d0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72 65  already been pre
a0e0: 70 72 6f 63 65 73 73 65 64 20 61 6e 64 20 6e 6f  processed and no
a0f0: 0a 2a 2a 20 65 72 72 6f 72 73 20 68 61 76 65 20  .** errors have 
a100: 62 65 65 6e 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 23  been found..*/.#
a110: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a120: 49 54 5f 53 55 42 51 55 45 52 59 0a 73 74 61 74  IT_SUBQUERY.stat
a130: 69 63 20 69 6e 74 20 69 73 43 61 6e 64 69 64 61  ic int isCandida
a140: 74 65 46 6f 72 49 6e 4f 70 74 28 53 65 6c 65 63  teForInOpt(Selec
a150: 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74  t *p){.  SrcList
a160: 20 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c 69   *pSrc;.  ExprLi
a170: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61  st *pEList;.  Ta
a180: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 66 28  ble *pTab;.  if(
a190: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
a1a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a1b0: 20 20 20 20 2f 2a 20 72 69 67 68 74 2d 68 61 6e      /* right-han
a1c0: 64 20 73 69 64 65 20 6f 66 20 49 4e 20 69 73 20  d side of IN is 
a1d0: 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20  SELECT */.  if( 
a1e0: 70 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74 75  p->pPrior ) retu
a1f0: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
a200: 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d 70     /* Not a comp
a210: 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20  ound SELECT */. 
a220: 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
a230: 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
a240: 53 46 5f 41 67 67 72 65 67 61 74 65 29 20 29 7b  SF_Aggregate) ){
a250: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28  .    testcase( (
a260: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  p->selFlags & (S
a270: 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
a280: 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69  gregate))==SF_Di
a290: 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 74 65  stinct );.    te
a2a0: 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46  stcase( (p->selF
a2b0: 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
a2c0: 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
a2d0: 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65  ))==SF_Aggregate
a2e0: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   );.    return 0
a2f0: 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49 4e 43 54  ; /* No DISTINCT
a300: 20 6b 65 79 77 6f 72 64 20 61 6e 64 20 6e 6f 20   keyword and no 
a310: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
a320: 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73  ons */.  }.  ass
a330: 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79  ert( p->pGroupBy
a340: 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  ==0 );          
a350: 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 47 52      /* Has no GR
a360: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  OUP BY clause */
a370: 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74  .  if( p->pLimit
a380: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
a390: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
a3a0: 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73 65   no LIMIT clause
a3b0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
a3c0: 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20  >pOffset==0 );  
a3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a3e0: 4e 6f 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 6e  No LIMIT means n
a3f0: 6f 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69 66  o OFFSET */.  if
a400: 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65  ( p->pWhere ) re
a410: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
a420: 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 57       /* Has no W
a430: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
a440: 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
a450: 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21  .  assert( pSrc!
a460: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 53 72 63  =0 );.  if( pSrc
a470: 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75  ->nSrc!=1 ) retu
a480: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f  rn 0;          /
a490: 2a 20 53 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e  * Single term in
a4a0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
a4b0: 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d    if( pSrc->a[0]
a4c0: 2e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75 72  .pSelect ) retur
a4d0: 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  n 0;     /* FROM
a4e0: 20 69 73 20 6e 6f 74 20 61 20 73 75 62 71 75 65   is not a subque
a4f0: 72 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20  ry or view */.  
a500: 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30  pTab = pSrc->a[0
a510: 5d 2e 70 54 61 62 3b 0a 20 20 69 66 28 20 4e 45  ].pTab;.  if( NE
a520: 56 45 52 28 70 54 61 62 3d 3d 30 29 20 29 20 72  VER(pTab==0) ) r
a530: 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72  eturn 0;.  asser
a540: 74 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  t( pTab->pSelect
a550: 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  ==0 );          
a560: 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
a570: 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 2a   is not a view *
a580: 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  /.  if( IsVirtua
a590: 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
a5a0: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 52   0;        /* FR
a5b0: 4f 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20 61 20  OM clause not a 
a5c0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
a5d0: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
a5e0: 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c  EList;.  if( pEL
a5f0: 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20  ist->nExpr!=1 ) 
a600: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
a610: 2f 2a 20 4f 6e 65 20 63 6f 6c 75 6d 6e 20 69 6e  /* One column in
a620: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
a630: 2a 2f 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d  */.  if( pEList-
a640: 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 21  >a[0].pExpr->op!
a650: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74  =TK_COLUMN ) ret
a660: 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 75 6c 74  urn 0; /* Result
a670: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a   is a column */.
a680: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
a690: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
a6a0: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
a6b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
a6c0: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20  tion is used by 
a6d0: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
a6e0: 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e  on of the IN (..
a6f0: 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20  .) operator..** 
a700: 49 74 27 73 20 6a 6f 62 20 69 73 20 74 6f 20 66  It's job is to f
a710: 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61 20  ind or create a 
a720: 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
a730: 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 65   that may be use
a740: 64 0a 2a 2a 20 65 69 74 68 65 72 20 74 6f 20 74  d.** either to t
a750: 65 73 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68  est for membersh
a760: 69 70 20 6f 66 20 74 68 65 20 28 2e 2e 2e 29 20  ip of the (...) 
a770: 73 65 74 20 6f 72 20 74 6f 20 69 74 65 72 61 74  set or to iterat
a780: 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 69 74 73  e through.** its
a790: 20 6d 65 6d 62 65 72 73 2c 20 73 6b 69 70 70 69   members, skippi
a7a0: 6e 67 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a  ng duplicates..*
a7b0: 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 6f  *.** The index o
a7c0: 66 20 74 68 65 20 63 75 72 73 6f 72 20 6f 70 65  f the cursor ope
a7d0: 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d 74 72 65  ned on the b-tre
a7e0: 65 20 28 64 61 74 61 62 61 73 65 20 74 61 62 6c  e (database tabl
a7f0: 65 2c 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  e, database inde
a800: 78 20 0a 2a 2a 20 6f 72 20 65 70 68 65 72 6d 61  x .** or epherma
a810: 6c 20 74 61 62 6c 65 29 20 69 73 20 73 74 6f 72  l table) is stor
a820: 65 64 20 69 6e 20 70 58 2d 3e 69 54 61 62 6c 65  ed in pX->iTable
a830: 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e   before this fun
a840: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a  ction returns..*
a850: 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
a860: 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e  alue of this fun
a870: 63 74 69 6f 6e 20 69 6e 64 69 63 61 74 65 73 20  ction indicates 
a880: 74 68 65 20 62 2d 74 72 65 65 20 74 79 70 65 2c  the b-tree type,
a890: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
a8a0: 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f  **   IN_INDEX_RO
a8b0: 57 49 44 20 2d 20 54 68 65 20 63 75 72 73 6f 72  WID - The cursor
a8c0: 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
a8d0: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e   database table.
a8e0: 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49  .**   IN_INDEX_I
a8f0: 4e 44 45 58 20 2d 20 54 68 65 20 63 75 72 73 6f  NDEX - The curso
a900: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
a910: 61 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  a database index
a920: 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  ..**   IN_INDEX_
a930: 45 50 48 20 2d 20 20 20 54 68 65 20 63 75 72 73  EPH -   The curs
a940: 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
a950: 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65   a specially cre
a960: 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20  ated and.**     
a970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
a980: 6f 70 75 6c 61 74 65 64 20 65 70 68 65 72 65 6d  opulated epherem
a990: 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
a9a0: 41 6e 20 65 78 69 73 74 69 6e 67 20 62 2d 74 72  An existing b-tr
a9b0: 65 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75  ee may only be u
a9c0: 73 65 64 20 69 66 20 74 68 65 20 53 45 4c 45 43  sed if the SELEC
a9d0: 54 20 69 73 20 6f 66 20 74 68 65 20 73 69 6d 70  T is of the simp
a9e0: 6c 65 0a 2a 2a 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  le.** form:.**.*
a9f0: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f  *     SELECT <co
aa00: 6c 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74 61 62 6c  lumn> FROM <tabl
aa10: 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e>.**.** If the 
aa20: 70 72 4e 6f 74 46 6f 75 6e 64 20 70 61 72 61 6d  prNotFound param
aa30: 65 74 65 72 20 69 73 20 30 2c 20 74 68 65 6e 20  eter is 0, then 
aa40: 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20  the b-tree will 
aa50: 62 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61  be used to itera
aa60: 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74 68  te.** through th
aa70: 65 20 73 65 74 20 6d 65 6d 62 65 72 73 2c 20 73  e set members, s
aa80: 6b 69 70 70 69 6e 67 20 61 6e 79 20 64 75 70 6c  kipping any dupl
aa90: 69 63 61 74 65 73 2e 20 49 6e 20 74 68 69 73 20  icates. In this 
aaa0: 63 61 73 65 20 61 6e 0a 2a 2a 20 65 70 68 65 72  case an.** epher
aab0: 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20  emal table must 
aac0: 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 74  be used unless t
aad0: 68 65 20 73 65 6c 65 63 74 65 64 20 3c 63 6f 6c  he selected <col
aae0: 75 6d 6e 3e 20 69 73 20 67 75 61 72 61 6e 74 65  umn> is guarante
aaf0: 65 64 0a 2a 2a 20 74 6f 20 62 65 20 75 6e 69 71  ed.** to be uniq
ab00: 75 65 20 2d 20 65 69 74 68 65 72 20 62 65 63 61  ue - either beca
ab10: 75 73 65 20 69 74 20 69 73 20 61 6e 20 49 4e 54  use it is an INT
ab20: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
ab30: 20 6f 72 20 69 74 0a 2a 2a 20 68 61 73 20 61 20   or it.** has a 
ab40: 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
ab50: 74 20 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65  t or UNIQUE inde
ab60: 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  x..**.** If the 
ab70: 70 72 4e 6f 74 46 6f 75 6e 64 20 70 61 72 61 6d  prNotFound param
ab80: 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74  eter is not 0, t
ab90: 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 77  hen the b-tree w
aba0: 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a 20  ill be used .** 
abb0: 66 6f 72 20 66 61 73 74 20 73 65 74 20 6d 65 6d  for fast set mem
abc0: 62 65 72 73 68 69 70 20 74 65 73 74 73 2e 20 49  bership tests. I
abd0: 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 20 65  n this case an e
abe0: 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d  pheremal table m
abf0: 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64 20  ust .** be used 
ac00: 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 3e 20  unless <column> 
ac10: 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  is an INTEGER PR
ac20: 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 61 6e 20  IMARY KEY or an 
ac30: 69 6e 64 65 78 20 63 61 6e 20 0a 2a 2a 20 62 65  index can .** be
ac40: 20 66 6f 75 6e 64 20 77 69 74 68 20 3c 63 6f 6c   found with <col
ac50: 75 6d 6e 3e 20 61 73 20 69 74 73 20 6c 65 66 74  umn> as its left
ac60: 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a  -most column..**
ac70: 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 62 2d 74  .** When the b-t
ac80: 72 65 65 20 69 73 20 62 65 69 6e 67 20 75 73 65  ree is being use
ac90: 64 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70  d for membership
aca0: 20 74 65 73 74 73 2c 20 74 68 65 20 63 61 6c 6c   tests, the call
acb0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ing function.** 
acc0: 6e 65 65 64 73 20 74 6f 20 6b 6e 6f 77 20 77 68  needs to know wh
acd0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
ace0: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
acf0: 69 6e 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 20  ins an SQL NULL 
ad00: 0a 2a 2a 20 76 61 6c 75 65 20 69 6e 20 6f 72 64  .** value in ord
ad10: 65 72 20 74 6f 20 63 6f 72 72 65 63 74 6c 79 20  er to correctly 
ad20: 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73  evaluate express
ad30: 69 6f 6e 73 20 6c 69 6b 65 20 22 58 20 49 4e 20  ions like "X IN 
ad40: 28 59 2c 20 5a 29 22 2e 0a 2a 2a 20 49 66 20 74  (Y, Z)"..** If t
ad50: 68 65 72 65 20 69 73 20 61 20 63 68 61 6e 63 65  here is a chance
ad60: 20 74 68 61 74 20 74 68 65 20 62 2d 74 72 65 65   that the b-tree
ad70: 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61   might contain a
ad80: 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a   NULL value at.*
ad90: 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20  * runtime, then 
ada0: 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c  a register is al
adb0: 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20  located and the 
adc0: 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20  register number 
add0: 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70  written.** to *p
ade0: 72 4e 6f 74 46 6f 75 6e 64 2e 20 49 66 20 74 68  rNotFound. If th
adf0: 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
ae00: 20 74 68 61 74 20 74 68 65 20 62 2d 74 72 65 65   that the b-tree
ae10: 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e   contains a.** N
ae20: 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  ULL value, then 
ae30: 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 69 73 20 6c  *prNotFound is l
ae40: 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  eft unchanged..*
ae50: 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74  *.** If a regist
ae60: 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  er is allocated 
ae70: 61 6e 64 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e  and its location
ae80: 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 72 4e 6f   stored in *prNo
ae90: 74 46 6f 75 6e 64 2c 20 74 68 65 6e 0a 2a 2a 20  tFound, then.** 
aea0: 69 74 73 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  its initial valu
aeb0: 65 20 69 73 20 4e 55 4c 4c 2e 20 49 66 20 74 68  e is NULL. If th
aec0: 65 20 62 2d 74 72 65 65 20 64 6f 65 73 20 6e 6f  e b-tree does no
aed0: 74 20 72 65 6d 61 69 6e 20 63 6f 6e 73 74 61 6e  t remain constan
aee0: 74 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 75 72  t.** for the dur
aef0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 71 75 65  ation of the que
af00: 72 79 20 28 69 2e 65 2e 20 74 68 65 20 53 45 4c  ry (i.e. the SEL
af10: 45 43 54 20 74 68 61 74 20 67 65 6e 65 72 61 74  ECT that generat
af20: 65 73 20 74 68 65 20 62 2d 74 72 65 65 0a 2a 2a  es the b-tree.**
af30: 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64   is a correlated
af40: 20 73 75 62 71 75 65 72 79 29 20 74 68 65 6e 20   subquery) then 
af50: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
af60: 20 61 6c 6c 6f 63 61 74 65 64 20 72 65 67 69 73   allocated regis
af70: 74 65 72 20 69 73 0a 2a 2a 20 72 65 73 65 74 20  ter is.** reset 
af80: 74 6f 20 4e 55 4c 4c 20 65 61 63 68 20 74 69 6d  to NULL each tim
af90: 65 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20  e the b-tree is 
afa0: 72 65 70 6f 70 75 6c 61 74 65 64 2e 20 54 68 69  repopulated. Thi
afb0: 73 20 61 6c 6c 6f 77 73 20 74 68 65 0a 2a 2a 20  s allows the.** 
afc0: 63 61 6c 6c 65 72 20 74 6f 20 75 73 65 20 76 64  caller to use vd
afd0: 62 65 20 63 6f 64 65 20 65 71 75 69 76 61 6c 65  be code equivale
afe0: 6e 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  nt to the follow
aff0: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28  ing:.**.**   if(
b000: 20 72 65 67 69 73 74 65 72 3d 3d 4e 55 4c 4c 20   register==NULL 
b010: 29 7b 0a 2a 2a 20 20 20 20 20 68 61 73 5f 6e 75  ){.**     has_nu
b020: 6c 6c 20 3d 20 3c 74 65 73 74 20 69 66 20 64 61  ll = <test if da
b030: 74 61 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ta structure con
b040: 74 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a 20 20  tains null>.**  
b050: 20 20 20 72 65 67 69 73 74 65 72 20 3d 20 31 0a     register = 1.
b060: 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 69 6e 20  **   }.**.** in 
b070: 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 72  order to avoid r
b080: 75 6e 6e 69 6e 67 20 74 68 65 20 3c 74 65 73 74  unning the <test
b090: 20 69 66 20 64 61 74 61 20 73 74 72 75 63 74 75   if data structu
b0a0: 72 65 20 63 6f 6e 74 61 69 6e 73 20 6e 75 6c 6c  re contains null
b0b0: 3e 0a 2a 2a 20 74 65 73 74 20 6d 6f 72 65 20 6f  >.** test more o
b0c0: 66 74 65 6e 20 74 68 61 6e 20 69 73 20 6e 65 63  ften than is nec
b0d0: 65 73 73 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64  essary..*/.#ifnd
b0e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
b0f0: 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69  UBQUERY.int sqli
b100: 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 50  te3FindInIndex(P
b110: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
b120: 70 72 20 2a 70 58 2c 20 69 6e 74 20 2a 70 72 4e  pr *pX, int *prN
b130: 6f 74 46 6f 75 6e 64 29 7b 0a 20 20 53 65 6c 65  otFound){.  Sele
b140: 63 74 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  ct *p;          
b150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b160: 20 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f 20 74    /* SELECT to t
b170: 68 65 20 72 69 67 68 74 20 6f 66 20 49 4e 20 6f  he right of IN o
b180: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  perator */.  int
b190: 20 65 54 79 70 65 20 3d 20 30 3b 20 20 20 20 20   eType = 0;     
b1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1b0: 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 52 48     /* Type of RH
b1c0: 53 20 74 61 62 6c 65 2e 20 49 4e 5f 49 4e 44 45  S table. IN_INDE
b1d0: 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  X_* */.  int iTa
b1e0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
b1f0: 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ++;            /
b200: 2a 20 43 75 72 73 6f 72 20 6f 66 20 74 68 65 20  * Cursor of the 
b210: 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  RHS table */.  i
b220: 6e 74 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20  nt mustBeUnique 
b230: 3d 20 28 70 72 4e 6f 74 46 6f 75 6e 64 3d 3d 30  = (prNotFound==0
b240: 29 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  );   /* True if 
b250: 52 48 53 20 6d 75 73 74 20 62 65 20 75 6e 69 71  RHS must be uniq
b260: 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63  ue */..  /* Chec
b270: 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 20 65  k to see if an e
b280: 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72  xisting table or
b290: 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73   index can be us
b2a0: 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69 73  ed to.  ** satis
b2b0: 66 79 20 74 68 65 20 71 75 65 72 79 2e 20 20 54  fy the query.  T
b2c0: 68 69 73 20 69 73 20 70 72 65 66 65 72 61 62 6c  his is preferabl
b2d0: 65 20 74 6f 20 67 65 6e 65 72 61 74 69 6e 67 20  e to generating 
b2e0: 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68 65  a new .  ** ephe
b2f0: 6d 65 72 61 6c 20 74 61 62 6c 65 2e 0a 20 20 2a  meral table..  *
b300: 2f 0a 20 20 70 20 3d 20 28 45 78 70 72 48 61 73  /.  p = (ExprHas
b310: 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f  Property(pX, EP_
b320: 78 49 73 53 65 6c 65 63 74 29 20 3f 20 70 58 2d  xIsSelect) ? pX-
b330: 3e 78 2e 70 53 65 6c 65 63 74 20 3a 20 30 29 3b  >x.pSelect : 0);
b340: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 50  .  if( ALWAYS(pP
b350: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 29 20 26  arse->nErr==0) &
b360: 26 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72  & isCandidateFor
b370: 49 6e 4f 70 74 28 70 29 20 29 7b 0a 20 20 20 20  InOpt(p) ){.    
b380: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
b390: 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
b3a0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
b3b0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
b3c0: 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
b3d0: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b   = p->pEList->a[
b3e0: 30 5d 2e 70 45 78 70 72 3b 20 20 20 2f 2a 20 45  0].pExpr;   /* E
b3f0: 78 70 72 65 73 73 69 6f 6e 20 3c 63 6f 6c 75 6d  xpression <colum
b400: 6e 3e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  n> */.    int iC
b410: 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ol = pExpr->iCol
b420: 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  umn;            
b430: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
b440: 75 6d 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a  umn <column> */.
b450: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71      Vdbe *v = sq
b460: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
b470: 72 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 56 69  rse);      /* Vi
b480: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65  rtual machine be
b490: 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 20  ing coded */.   
b4a0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
b4b0: 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  ->pSrc->a[0].pTa
b4c0: 62 3b 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  b;      /* Table
b4d0: 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20   <table>. */.   
b4e0: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
b4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b500: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
b510: 61 73 65 20 69 64 78 20 66 6f 72 20 70 54 61 62  ase idx for pTab
b520: 20 2a 2f 0a 20 20 20 0a 20 20 20 20 2f 2a 20 43   */.   .    /* C
b530: 6f 64 65 20 61 6e 20 4f 50 5f 56 65 72 69 66 79  ode an OP_Verify
b540: 43 6f 6f 6b 69 65 20 61 6e 64 20 4f 50 5f 54 61  Cookie and OP_Ta
b550: 62 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c 74 61 62  bleLock for <tab
b560: 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 44 62 20  le>. */.    iDb 
b570: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
b580: 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
b590: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 73  >pSchema);.    s
b5a0: 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
b5b0: 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
b5c0: 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
b5d0: 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
b5e0: 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
b5f0: 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
b600: 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73  e);..    /* This
b610: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
b620: 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 74 77  y called from tw
b630: 6f 20 70 6c 61 63 65 73 2e 20 49 6e 20 62 6f 74  o places. In bot
b640: 68 20 63 61 73 65 73 20 74 68 65 20 76 64 62 65  h cases the vdbe
b650: 0a 20 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65  .    ** has alre
b660: 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
b670: 65 64 2e 20 53 6f 20 61 73 73 75 6d 65 20 73 71  ed. So assume sq
b680: 6c 69 74 65 33 47 65 74 56 64 62 65 28 29 20 69  lite3GetVdbe() i
b690: 73 20 61 6c 77 61 79 73 0a 20 20 20 20 2a 2a 20  s always.    ** 
b6a0: 73 75 63 63 65 73 73 66 75 6c 20 68 65 72 65 2e  successful here.
b6b0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
b6c0: 72 74 28 76 29 3b 0a 20 20 20 20 69 66 28 20 69  rt(v);.    if( i
b6d0: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 69  Col<0 ){.      i
b6e0: 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  nt iMem = ++pPar
b6f0: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
b700: 69 6e 74 20 69 41 64 64 72 3b 0a 20 20 20 20 20  int iAddr;.     
b710: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
b720: 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 0a  Btree(v, iDb);..
b730: 20 20 20 20 20 20 69 41 64 64 72 20 3d 20 73 71        iAddr = sq
b740: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
b750: 76 2c 20 4f 50 5f 49 66 2c 20 69 4d 65 6d 29 3b  v, OP_If, iMem);
b760: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b770: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
b780: 6e 74 65 67 65 72 2c 20 31 2c 20 69 4d 65 6d 29  nteger, 1, iMem)
b790: 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
b7a0: 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
b7b0: 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61  , iTab, iDb, pTa
b7c0: 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b  b, OP_OpenRead);
b7d0: 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49  .      eType = I
b7e0: 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 0a  N_INDEX_ROWID;..
b7f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b800: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64  eJumpHere(v, iAd
b810: 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  dr);.    }else{.
b820: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
b830: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
b840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
b850: 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
b860: 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  */..      /* The
b870: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
b880: 6e 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20  nce used by the 
b890: 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 49 66 20 61  comparison. If a
b8a0: 6e 20 69 6e 64 65 78 20 69 73 20 74 6f 0a 20 20  n index is to.  
b8b0: 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64 20 69      ** be used i
b8c0: 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74 65 6d  n place of a tem
b8d0: 70 2d 74 61 62 6c 65 2c 20 69 74 20 6d 75 73 74  p-table, it must
b8e0: 20 62 65 20 6f 72 64 65 72 65 64 20 61 63 63 6f   be ordered acco
b8f0: 72 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74  rding.      ** t
b900: 6f 20 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e  o this collation
b910: 20 73 65 71 75 65 6e 63 65 2e 20 20 2a 2f 0a 20   sequence.  */. 
b920: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52       CollSeq *pR
b930: 65 71 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  eq = sqlite3Bina
b940: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
b950: 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65  (pParse, pX->pLe
b960: 66 74 2c 20 70 45 78 70 72 29 3b 0a 0a 20 20 20  ft, pExpr);..   
b970: 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
b980: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 68   the affinity th
b990: 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  at will be used 
b9a0: 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65 20 0a  to perform the .
b9b0: 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69        ** compari
b9c0: 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65 20  son is the same 
b9d0: 61 73 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  as the affinity 
b9e0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 49  of the column. I
b9f0: 66 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73  f.      ** it is
ba00: 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74 20   not, it is not 
ba10: 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20  possible to use 
ba20: 61 6e 79 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  any index..     
ba30: 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 61   */.      char a
ba40: 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41  ff = comparisonA
ba50: 66 66 69 6e 69 74 79 28 70 58 29 3b 0a 20 20 20  ffinity(pX);.   
ba60: 20 20 20 69 6e 74 20 61 66 66 69 6e 69 74 79 5f     int affinity_
ba70: 6f 6b 20 3d 20 28 70 54 61 62 2d 3e 61 43 6f 6c  ok = (pTab->aCol
ba80: 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 3d  [iCol].affinity=
ba90: 3d 61 66 66 7c 7c 61 66 66 3d 3d 53 51 4c 49 54  =aff||aff==SQLIT
baa0: 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a 0a 20 20  E_AFF_NONE);..  
bab0: 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
bac0: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 20  b->pIndex; pIdx 
bad0: 26 26 20 65 54 79 70 65 3d 3d 30 20 26 26 20 61  && eType==0 && a
bae0: 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 70 49 64 78  ffinity_ok; pIdx
baf0: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
bb00: 20 20 20 20 20 20 20 69 66 28 20 28 70 49 64 78         if( (pIdx
bb10: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69  ->aiColumn[0]==i
bb20: 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 20 26 26  Col).         &&
bb30: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
bb40: 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c  Seq(db, ENC(db),
bb50: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d   pIdx->azColl[0]
bb60: 2c 20 30 29 3d 3d 70 52 65 71 0a 20 20 20 20 20  , 0)==pReq.     
bb70: 20 20 20 20 26 26 20 28 21 6d 75 73 74 42 65 55      && (!mustBeU
bb80: 6e 69 71 75 65 20 7c 7c 20 28 70 49 64 78 2d 3e  nique || (pIdx->
bb90: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20 70 49  nColumn==1 && pI
bba0: 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  dx->onError!=OE_
bbb0: 4e 6f 6e 65 29 29 0a 20 20 20 20 20 20 20 20 29  None)).        )
bbc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
bbd0: 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
bbe0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20  >nMem;.         
bbf0: 20 69 6e 74 20 69 41 64 64 72 3b 0a 20 20 20 20   int iAddr;.    
bc00: 20 20 20 20 20 20 63 68 61 72 20 2a 70 4b 65 79        char *pKey
bc10: 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 70  ;.  .          p
bc20: 4b 65 79 20 3d 20 28 63 68 61 72 20 2a 29 73 71  Key = (char *)sq
bc30: 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66  lite3IndexKeyinf
bc40: 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b  o(pParse, pIdx);
bc50: 0a 20 20 20 20 20 20 20 20 20 20 69 44 62 20 3d  .          iDb =
bc60: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
bc70: 49 6e 64 65 78 28 64 62 2c 20 70 49 64 78 2d 3e  Index(db, pIdx->
bc80: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
bc90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
bca0: 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29  sesBtree(v, iDb)
bcb0: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69 41 64  ;..          iAd
bcc0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
bcd0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c  AddOp1(v, OP_If,
bce0: 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20   iMem);.        
bcf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bd00: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
bd10: 72 2c 20 31 2c 20 69 4d 65 6d 29 3b 0a 20 20 0a  r, 1, iMem);.  .
bd20: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
bd30: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
bd40: 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54 61 62  P_OpenRead, iTab
bd50: 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44  , pIdx->tnum, iD
bd60: 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
bd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd80: 20 20 70 4b 65 79 2c 50 34 5f 4b 45 59 49 4e 46    pKey,P4_KEYINF
bd90: 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20  O_HANDOFF);.    
bda0: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
bdb0: 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78  t((v, "%s", pIdx
bdc0: 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
bdd0: 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f       eType = IN_
bde0: 49 4e 44 45 58 5f 49 4e 44 45 58 3b 0a 0a 20 20  INDEX_INDEX;..  
bdf0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
be00: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69  dbeJumpHere(v, i
be10: 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Addr);.         
be20: 20 69 66 28 20 70 72 4e 6f 74 46 6f 75 6e 64 20   if( prNotFound 
be30: 26 26 20 21 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  && !pTab->aCol[i
be40: 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 7b 0a  Col].notNull ){.
be50: 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 72 4e              *prN
be60: 6f 74 46 6f 75 6e 64 20 3d 20 2b 2b 70 50 61 72  otFound = ++pPar
be70: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
be80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
be90: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
bea0: 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  }..  if( eType==
beb0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c  0 ){.    /* Coul
bec0: 64 20 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 20 65  d not found an e
bed0: 78 69 73 74 69 6e 67 20 61 62 6c 65 20 6f 72 20  xisting able or 
bee0: 69 6e 64 65 78 20 74 6f 20 75 73 65 20 61 73 20  index to use as 
bef0: 74 68 65 20 52 48 53 20 62 2d 74 72 65 65 2e 0a  the RHS b-tree..
bf00: 20 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68      ** We will h
bf10: 61 76 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20  ave to generate 
bf20: 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
bf30: 6c 65 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62  le to do the job
bf40: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
bf50: 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20   rMayHaveNull = 
bf60: 30 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49  0;.    eType = I
bf70: 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20  N_INDEX_EPH;.   
bf80: 20 69 66 28 20 70 72 4e 6f 74 46 6f 75 6e 64 20   if( prNotFound 
bf90: 29 7b 0a 20 20 20 20 20 20 2a 70 72 4e 6f 74 46  ){.      *prNotF
bfa0: 6f 75 6e 64 20 3d 20 72 4d 61 79 48 61 76 65 4e  ound = rMayHaveN
bfb0: 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  ull = ++pParse->
bfc0: 6e 4d 65 6d 3b 0a 20 20 20 20 7d 65 6c 73 65 20  nMem;.    }else 
bfd0: 69 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69  if( pX->pLeft->i
bfe0: 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78 70  Column<0 && !Exp
bff0: 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28  rHasAnyProperty(
c000: 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pX, EP_xIsSelect
c010: 29 20 29 7b 0a 20 20 20 20 20 20 65 54 79 70 65  ) ){.      eType
c020: 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49   = IN_INDEX_ROWI
c030: 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  D;.    }.    sql
c040: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
c050: 74 28 70 50 61 72 73 65 2c 20 70 58 2c 20 72 4d  t(pParse, pX, rM
c060: 61 79 48 61 76 65 4e 75 6c 6c 2c 20 65 54 79 70  ayHaveNull, eTyp
c070: 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49  e==IN_INDEX_ROWI
c080: 44 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  D);.  }else{.   
c090: 20 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54   pX->iTable = iT
c0a0: 61 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ab;.  }.  return
c0b0: 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66   eType;.}.#endif
c0c0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
c0d0: 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72   code for scalar
c0e0: 20 73 75 62 71 75 65 72 69 65 73 20 75 73 65 64   subqueries used
c0f0: 20 61 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f   as an expressio
c100: 6e 0a 2a 2a 20 61 6e 64 20 49 4e 20 6f 70 65 72  n.** and IN oper
c110: 61 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65 73  ators.  Examples
c120: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c  :.**.**     (SEL
c130: 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20  ECT a FROM b)   
c140: 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65         -- subque
c150: 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53  ry.**     EXISTS
c160: 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
c170: 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73  b)   -- EXISTS s
c180: 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 78  ubquery.**     x
c190: 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20   IN (4,5,11)    
c1a0: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20            -- IN 
c1b0: 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69  operator with li
c1c0: 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64  st on right-hand
c1d0: 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49   side.**     x I
c1e0: 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  N (SELECT a FROM
c1f0: 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70   b)     -- IN op
c200: 65 72 61 74 6f 72 20 77 69 74 68 20 73 75 62 71  erator with subq
c210: 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68  uery on the righ
c220: 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70  t.**.** The pExp
c230: 72 20 70 61 72 61 6d 65 74 65 72 20 64 65 73 63  r parameter desc
c240: 72 69 62 65 73 20 74 68 65 20 65 78 70 72 65 73  ribes the expres
c250: 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69  sion that contai
c260: 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65  ns the IN.** ope
c270: 72 61 74 6f 72 20 6f 72 20 73 75 62 71 75 65 72  rator or subquer
c280: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  y..**.** If para
c290: 6d 65 74 65 72 20 69 73 52 6f 77 69 64 20 69 73  meter isRowid is
c2a0: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
c2b0: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
c2c0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a   is guaranteed.*
c2d0: 2a 20 74 6f 20 62 65 20 6f 66 20 74 68 65 20 66  * to be of the f
c2e0: 6f 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e 20  orm "<rowid> IN 
c2f0: 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65 72  (?, ?, ?)", wher
c300: 65 20 3c 72 6f 77 69 64 3e 20 69 73 20 61 20 72  e <rowid> is a r
c310: 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 73  eference.** to s
c320: 6f 6d 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  ome integer key 
c330: 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c  column of a tabl
c340: 65 20 42 2d 54 72 65 65 2e 20 49 6e 20 74 68 69  e B-Tree. In thi
c350: 73 20 63 61 73 65 2c 20 75 73 65 20 61 6e 0a 2a  s case, use an.*
c360: 2a 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 20  * intkey B-Tree 
c370: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74  to store the set
c380: 20 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c 75   of IN(...) valu
c390: 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  es instead of th
c3a0: 65 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77  e usual.** (slow
c3b0: 65 72 29 20 76 61 72 69 61 62 6c 65 20 6c 65 6e  er) variable len
c3c0: 67 74 68 20 6b 65 79 73 20 42 2d 54 72 65 65 2e  gth keys B-Tree.
c3d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61  .**.** If rMayHa
c3e0: 76 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65  veNull is non-ze
c3f0: 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ro, that means t
c400: 68 61 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f  hat the operatio
c410: 6e 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e  n is an IN.** (n
c420: 6f 74 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45  ot a SELECT or E
c430: 58 49 53 54 53 29 20 61 6e 64 20 74 68 61 74 20  XISTS) and that 
c440: 74 68 65 20 52 48 53 20 6d 69 67 68 74 20 63 6f  the RHS might co
c450: 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a  ntains NULLs..**
c460: 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 74 68   Furthermore, th
c470: 65 20 49 4e 20 69 73 20 69 6e 20 61 20 57 48 45  e IN is in a WHE
c480: 52 45 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68  RE clause and th
c490: 61 74 20 77 65 20 72 65 61 6c 6c 79 20 77 61 6e  at we really wan
c4a0: 74 0a 2a 2a 20 74 6f 20 69 74 65 72 61 74 65 20  t.** to iterate 
c4b0: 6f 76 65 72 20 74 68 65 20 52 48 53 20 6f 66 20  over the RHS of 
c4c0: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
c4d0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 71 75 69 63  in order to quic
c4e0: 6b 6c 79 20 6c 6f 63 61 74 65 0a 2a 2a 20 61 6c  kly locate.** al
c4f0: 6c 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  l corresponding 
c500: 4c 48 53 20 65 6c 65 6d 65 6e 74 73 2e 20 20 41  LHS elements.  A
c510: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
c520: 64 6f 65 73 20 69 73 20 69 6e 69 74 69 61 6c 69  does is initiali
c530: 7a 65 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74  ze.** the regist
c540: 65 72 20 67 69 76 65 6e 20 62 79 20 72 4d 61 79  er given by rMay
c550: 48 61 76 65 4e 75 6c 6c 20 74 6f 20 4e 55 4c 4c  HaveNull to NULL
c560: 2e 20 20 43 61 6c 6c 69 6e 67 20 72 6f 75 74 69  .  Calling routi
c570: 6e 65 73 20 77 69 6c 6c 20 74 61 6b 65 0a 2a 2a  nes will take.**
c580: 20 63 61 72 65 20 6f 66 20 63 68 61 6e 67 69 6e   care of changin
c590: 67 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  g this register 
c5a0: 76 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c  value to non-NUL
c5b0: 4c 20 69 66 20 74 68 65 20 52 48 53 20 69 73 20  L if the RHS is 
c5c0: 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a  NULL-free..**.**
c5d0: 20 49 66 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c   If rMayHaveNull
c5e0: 20 69 73 20 7a 65 72 6f 2c 20 74 68 61 74 20 6d   is zero, that m
c5f0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 75  eans that the su
c600: 62 71 75 65 72 79 20 69 73 20 62 65 69 6e 67 20  bquery is being 
c610: 75 73 65 64 0a 2a 2a 20 66 6f 72 20 6d 65 6d 62  used.** for memb
c620: 65 72 73 68 69 70 20 74 65 73 74 69 6e 67 20 6f  ership testing o
c630: 6e 6c 79 2e 20 20 54 68 65 72 65 20 69 73 20 6e  nly.  There is n
c640: 6f 20 6e 65 65 64 20 74 6f 20 69 6e 69 74 69 61  o need to initia
c650: 6c 69 7a 65 20 61 6e 79 0a 2a 2a 20 72 65 67 69  lize any.** regi
c660: 73 74 65 72 73 20 74 6f 20 69 6e 64 69 63 61 74  sters to indicat
c670: 65 20 74 68 65 20 70 72 65 73 65 6e 73 65 20 6f  e the presense o
c680: 72 20 61 62 73 65 6e 63 65 20 6f 66 20 4e 55 4c  r absence of NUL
c690: 4c 73 20 6f 6e 20 74 68 65 20 52 48 53 2e 0a 2a  Ls on the RHS..*
c6a0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
c6b0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 76  _OMIT_SUBQUERY.v
c6c0: 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 53  oid sqlite3CodeS
c6d0: 75 62 73 65 6c 65 63 74 28 0a 20 20 50 61 72 73  ubselect(.  Pars
c6e0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
c6f0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
c700: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
c710: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
c720: 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 2c 20 53      /* The IN, S
c730: 45 4c 45 43 54 2c 20 6f 72 20 45 58 49 53 54 53  ELECT, or EXISTS
c740: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   operator */.  i
c750: 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c  nt rMayHaveNull,
c760: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
c770: 65 72 20 74 68 61 74 20 72 65 63 6f 72 64 73 20  er that records 
c780: 77 68 65 74 68 65 72 20 4e 55 4c 4c 73 20 65 78  whether NULLs ex
c790: 69 73 74 20 69 6e 20 52 48 53 20 2a 2f 0a 20 20  ist in RHS */.  
c7a0: 69 6e 74 20 69 73 52 6f 77 69 64 20 20 20 20 20  int isRowid     
c7b0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
c7c0: 75 65 2c 20 4c 48 53 20 6f 66 20 49 4e 20 6f 70  ue, LHS of IN op
c7d0: 65 72 61 74 6f 72 20 69 73 20 61 20 72 6f 77 69  erator is a rowi
c7e0: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 74 65  d */.){.  int te
c7f0: 73 74 41 64 64 72 20 3d 20 30 3b 20 20 20 20 20  stAddr = 0;     
c800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c810: 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65    /* One-time te
c820: 73 74 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  st address */.  
c830: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
c840: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
c850: 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d  ;.  if( NEVER(v=
c860: 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  =0) ) return;.  
c870: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
c880: 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 0a 20  Push(pParse);.. 
c890: 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 6d 75   /* This code mu
c8a0: 73 74 20 62 65 20 72 75 6e 20 69 6e 20 69 74 73  st be run in its
c8b0: 20 65 6e 74 69 72 65 74 79 20 65 76 65 72 79 20   entirety every 
c8c0: 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75  time it is encou
c8d0: 6e 74 65 72 65 64 0a 20 20 2a 2a 20 69 66 20 61  ntered.  ** if a
c8e0: 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
c8f0: 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a  ing is true:.  *
c900: 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65  *.  **    *  The
c910: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
c920: 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64   is a correlated
c930: 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20   subquery.  **  
c940: 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68    *  The right-h
c950: 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20 65  and side is an e
c960: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63  xpression list c
c970: 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62  ontaining variab
c980: 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57  les.  **    *  W
c990: 65 20 61 72 65 20 69 6e 73 69 64 65 20 61 20 74  e are inside a t
c9a0: 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a  rigger.  **.  **
c9b0: 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61   If all of the a
c9c0: 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20  bove are false, 
c9d0: 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20  then we can run 
c9e0: 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f  this code just o
c9f0: 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68  nce.  ** save th
ca00: 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72  e results, and r
ca10: 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 65  euse the same re
ca20: 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65  sult on subseque
ca30: 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a  nt invocations..
ca40: 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72    */.  if( !Expr
ca50: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
ca60: 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65  Expr, EP_VarSele
ca70: 63 74 29 20 26 26 20 21 70 50 61 72 73 65 2d 3e  ct) && !pParse->
ca80: 74 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20  trigStack ){.   
ca90: 20 69 6e 74 20 6d 65 6d 20 3d 20 2b 2b 70 50 61   int mem = ++pPa
caa0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
cab0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
cac0: 28 76 2c 20 4f 50 5f 49 66 2c 20 6d 65 6d 29 3b  (v, OP_If, mem);
cad0: 0a 20 20 20 20 74 65 73 74 41 64 64 72 20 3d 20  .    testAddr = 
cae0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
caf0: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
cb00: 20 31 2c 20 6d 65 6d 29 3b 0a 20 20 20 20 61 73   1, mem);.    as
cb10: 73 65 72 74 28 20 74 65 73 74 41 64 64 72 3e 30  sert( testAddr>0
cb20: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
cb30: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
cb40: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70    }..  switch( p
cb50: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
cb60: 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
cb70: 20 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74      char affinit
cb80: 79 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  y;.      KeyInfo
cb90: 20 6b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20   keyInfo;.      
cba0: 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20  int addr;       
cbb0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f   /* Address of O
cbc0: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
cbd0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  instruction */. 
cbe0: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
cbf0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
cc00: 0a 0a 20 20 20 20 20 20 69 66 28 20 72 4d 61 79  ..      if( rMay
cc10: 48 61 76 65 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  HaveNull ){.    
cc20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
cc30: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
cc40: 2c 20 30 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c  , 0, rMayHaveNul
cc50: 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  l);.      }..   
cc60: 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73 71     affinity = sq
cc70: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
cc80: 79 28 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20  y(pLeft);..     
cc90: 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69 73   /* Whether this
cca0: 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c   is an 'x IN(SEL
ccb0: 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27  ECT...)' or an '
ccc0: 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29  x IN(<exprlist>)
ccd0: 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65  '.      ** expre
cce0: 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64  ssion it is hand
ccf0: 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77 61 79  led the same way
cd00: 2e 20 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c  . A virtual tabl
cd10: 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66  e is .      ** f
cd20: 69 6c 6c 65 64 20 77 69 74 68 20 73 69 6e 67 6c  illed with singl
cd30: 65 2d 66 69 65 6c 64 20 69 6e 64 65 78 20 6b 65  e-field index ke
cd40: 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  ys representing 
cd50: 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20  the results.    
cd60: 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53 45    ** from the SE
cd70: 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65 78 70  LECT or the <exp
cd80: 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a  rlist>..      **
cd90: 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65  .      ** If the
cda0: 20 27 78 27 20 65 78 70 72 65 73 73 69 6f 6e 20   'x' expression 
cdb0: 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  is a column valu
cdc0: 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45 43 54  e, or the SELECT
cdd0: 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ....      ** sta
cde0: 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61  tement returns a
cdf0: 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74   column value, t
ce00: 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79  hen the affinity
ce10: 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a   of that.      *
ce20: 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64  * column is used
ce30: 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e   to build the in
ce40: 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74  dex keys. If bot
ce50: 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a 20 20  h 'x' and the.  
ce60: 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e      ** SELECT...
ce70: 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63   statement are c
ce80: 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d  olumns, then num
ce90: 65 72 69 63 20 61 66 66 69 6e 69 74 79 20 69 73  eric affinity is
cea0: 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 69   used.      ** i
ceb0: 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20  f either column 
cec0: 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49  has NUMERIC or I
ced0: 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e  NTEGER affinity.
cee0: 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20 20 20   If neither.    
cef0: 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65    ** 'x' nor the
cf00: 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65   SELECT... state
cf10: 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73  ment are columns
cf20: 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61  , then numeric a
cf30: 66 66 69 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a  ffinity.      **
cf40: 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20   is used..      
cf50: 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  */.      pExpr->
cf60: 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d  iTable = pParse-
cf70: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61  >nTab++;.      a
cf80: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
cf90: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
cfa0: 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 45 78  enEphemeral, pEx
cfb0: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 21 69 73 52  pr->iTable, !isR
cfc0: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 6d 65 6d  owid);.      mem
cfd0: 73 65 74 28 26 6b 65 79 49 6e 66 6f 2c 20 30 2c  set(&keyInfo, 0,
cfe0: 20 73 69 7a 65 6f 66 28 6b 65 79 49 6e 66 6f 29   sizeof(keyInfo)
cff0: 29 3b 0a 20 20 20 20 20 20 6b 65 79 49 6e 66 6f  );.      keyInfo
d000: 2e 6e 46 69 65 6c 64 20 3d 20 31 3b 0a 0a 20 20  .nField = 1;..  
d010: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
d020: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
d030: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
d040: 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20          /* Case 
d050: 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28  1:     expr IN (
d060: 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20  SELECT ...).    
d070: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
d080: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
d090: 74 6f 20 77 72 69 74 65 20 74 68 65 20 72 65 73  to write the res
d0a0: 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ults of the sele
d0b0: 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70  ct into the temp
d0c0: 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a  orary.        **
d0d0: 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64   table allocated
d0e0: 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f 76   and opened abov
d0f0: 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
d100: 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
d110: 20 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20 45   dest;.        E
d120: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
d130: 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ..        assert
d140: 28 20 21 69 73 52 6f 77 69 64 20 29 3b 0a 20 20  ( !isRowid );.  
d150: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
d160: 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
d170: 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45 78 70  t, SRT_Set, pExp
d180: 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  r->iTable);.    
d190: 20 20 20 20 64 65 73 74 2e 61 66 66 69 6e 69 74      dest.affinit
d1a0: 79 20 3d 20 28 75 38 29 61 66 66 69 6e 69 74 79  y = (u8)affinity
d1b0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
d1c0: 28 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  ( (pExpr->iTable
d1d0: 26 30 78 30 30 30 30 46 46 46 46 29 3d 3d 70 45  &0x0000FFFF)==pE
d1e0: 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20  xpr->iTable );. 
d1f0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
d200: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
d210: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
d220: 74 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20  t, &dest) ){.   
d230: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
d240: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d250: 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   pEList = pExpr-
d260: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
d270: 73 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  st;.        if( 
d280: 41 4c 57 41 59 53 28 70 45 4c 69 73 74 21 3d 30  ALWAYS(pEList!=0
d290: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
d2a0: 72 3e 30 29 20 29 7b 20 0a 20 20 20 20 20 20 20  r>0) ){ .       
d2b0: 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c     keyInfo.aColl
d2c0: 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  [0] = sqlite3Bin
d2d0: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
d2e0: 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  q(pParse, pExpr-
d2f0: 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20 20 20 20  >pLeft,.        
d300: 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b        pEList->a[
d310: 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  0].pExpr);.     
d320: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
d330: 20 69 66 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c   if( pExpr->x.pL
d340: 69 73 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist!=0 ){.      
d350: 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20    /* Case 2:    
d360: 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69   expr IN (exprli
d370: 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  st).        **. 
d380: 20 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 65 61         ** For ea
d390: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62  ch expression, b
d3a0: 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65  uild an index ke
d3b0: 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75  y from the evalu
d3c0: 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20  ation and.      
d3d0: 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e    ** store it in
d3e0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
d3f0: 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20  able. If <expr> 
d400: 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  is a column, the
d410: 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a  n use.        **
d420: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66   that columns af
d430: 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c  finity when buil
d440: 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e  ding index keys.
d450: 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f   If <expr> is no
d460: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63  t.        ** a c
d470: 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72  olumn, use numer
d480: 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20  ic affinity..   
d490: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
d4a0: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45  int i;.        E
d4b0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
d4c0: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
d4d0: 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
d4e0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
d4f0: 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e  Item;.        in
d500: 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 0a 20  t r1, r2, r3;.. 
d510: 20 20 20 20 20 20 20 69 66 28 20 21 61 66 66 69         if( !affi
d520: 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20  nity ){.        
d530: 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c    affinity = SQL
d540: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
d550: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d560: 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d  keyInfo.aColl[0]
d570: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
d580: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
d590: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 0a 20 20  xpr->pLeft);..  
d5a0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68        /* Loop th
d5b0: 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
d5c0: 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69  ssion in <exprli
d5d0: 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  st>. */.        
d5e0: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
d5f0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
d600: 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c          r2 = sql
d610: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
d620: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
d630: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d640: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
d650: 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 66 6f   r2);.        fo
d660: 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72  r(i=pList->nExpr
d670: 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
d680: 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65  ; i>0; i--, pIte
d690: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
d6a0: 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49 74 65  Expr *pE2 = pIte
d6b0: 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20 20  m->pExpr;..     
d6c0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65       /* If the e
d6d0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74  xpression is not
d6e0: 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20 77   constant then w
d6f0: 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20  e will need to. 
d700: 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 73 61           ** disa
d710: 62 6c 65 20 74 68 65 20 74 65 73 74 20 74 68 61  ble the test tha
d720: 74 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20  t was generated 
d730: 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b 65 73  above that makes
d740: 20 73 75 72 65 0a 20 20 20 20 20 20 20 20 20 20   sure.          
d750: 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c  ** this code onl
d760: 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65 2e  y executes once.
d770: 20 20 42 65 63 61 75 73 65 20 66 6f 72 20 61 20    Because for a 
d780: 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20  non-constant.   
d790: 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73         ** expres
d7a0: 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f 20  sion we need to 
d7b0: 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20  rerun this code 
d7c0: 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20 20  each time..     
d7d0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
d7e0: 20 20 69 66 28 20 74 65 73 74 41 64 64 72 20 26    if( testAddr &
d7f0: 26 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73  & !sqlite3ExprIs
d800: 43 6f 6e 73 74 61 6e 74 28 70 45 32 29 20 29 7b  Constant(pE2) ){
d810: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
d820: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
d830: 4e 6f 6f 70 28 76 2c 20 74 65 73 74 41 64 64 72  Noop(v, testAddr
d840: 2d 31 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20  -1, 2);.        
d850: 20 20 20 20 74 65 73 74 41 64 64 72 20 3d 20 30      testAddr = 0
d860: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
d870: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c           /* Eval
d880: 75 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73  uate the express
d890: 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69  ion and insert i
d8a0: 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20  t into the temp 
d8b0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
d8c0: 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33 45     r3 = sqlite3E
d8d0: 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
d8e0: 61 72 73 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a  arse, pE2, r1);.
d8f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73            if( is
d900: 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
d910: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d920: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73  AddOp2(v, OP_Mus
d930: 74 42 65 49 6e 74 2c 20 72 33 2c 20 73 71 6c 69  tBeInt, r3, sqli
d940: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
d950: 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20 20  dr(v)+2);.      
d960: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d970: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
d980: 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  sert, pExpr->iTa
d990: 62 6c 65 2c 20 72 32 2c 20 72 33 29 3b 0a 20 20  ble, r2, r3);.  
d9a0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
d9b0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d9c0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
d9d0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
d9e0: 33 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e  3, 1, r2, &affin
d9f0: 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ity, 1);.       
da00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
da10: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
da20: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 33 2c 20  nge(pParse, r3, 
da30: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
da40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
da50: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
da60: 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
da70: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 20  , r2);.         
da80: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
da90: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
daa0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
dab0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  e, r1);.        
dac0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
dad0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32  mpReg(pParse, r2
dae0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
daf0: 20 69 66 28 20 21 69 73 52 6f 77 69 64 20 29 7b   if( !isRowid ){
db00: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
db10: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
db20: 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 26 6b  addr, (void *)&k
db30: 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
db40: 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  FO);.      }.   
db50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
db60: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
db70: 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  STS:.    case TK
db80: 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 64 65 66  _SELECT:.    def
db90: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ault: {.      /*
dba0: 20 49 66 20 74 68 69 73 20 68 61 73 20 74 6f 20   If this has to 
dbb0: 62 65 20 61 20 73 63 61 6c 61 72 20 53 45 4c 45  be a scalar SELE
dbc0: 43 54 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  CT.  Generate co
dbd0: 64 65 20 74 6f 20 70 75 74 20 74 68 65 0a 20 20  de to put the.  
dbe0: 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20      ** value of 
dbf0: 74 68 69 73 20 73 65 6c 65 63 74 20 69 6e 20 61  this select in a
dc00: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
dc10: 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62   record the numb
dc20: 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  er.      ** of t
dc30: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69  he memory cell i
dc40: 6e 20 69 43 6f 6c 75 6d 6e 2e 20 20 49 66 20 74  n iColumn.  If t
dc50: 68 69 73 20 69 73 20 61 6e 20 45 58 49 53 54 53  his is an EXISTS
dc60: 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a  , write.      **
dc70: 20 61 6e 20 69 6e 74 65 67 65 72 20 30 20 28 6e   an integer 0 (n
dc80: 6f 74 20 65 78 69 73 74 73 29 20 6f 72 20 31 20  ot exists) or 1 
dc90: 28 65 78 69 73 74 73 29 20 69 6e 74 6f 20 61 20  (exists) into a 
dca0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 0a 20 20 20 20  memory cell.    
dcb0: 20 20 2a 2a 20 61 6e 64 20 72 65 63 6f 72 64 20    ** and record 
dcc0: 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  that memory cell
dcd0: 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20   in iColumn..   
dce0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74     */.      stat
dcf0: 69 63 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 6f  ic const Token o
dd00: 6e 65 20 3d 20 7b 20 22 31 22 2c 20 31 20 7d 3b  ne = { "1", 1 };
dd10: 20 20 2f 2a 20 54 6f 6b 65 6e 20 66 6f 72 20 6c    /* Token for l
dd20: 69 74 65 72 61 6c 20 76 61 6c 75 65 20 31 20 2a  iteral value 1 *
dd30: 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  /.      Select *
dd40: 70 53 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20  pSel;           
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dd60: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
dd70: 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20  t to encode */. 
dd80: 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
dd90: 64 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  dest;           
dda0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
ddb0: 77 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53  w to deal with S
ddc0: 45 4c 45 43 74 20 72 65 73 75 6c 74 20 2a 2f 0a  ELECt result */.
ddd0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
dde0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
ddf0: 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74  XISTS );.      t
de00: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
de10: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
de20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
de30: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49  Expr->op==TK_EXI
de40: 53 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  STS || pExpr->op
de50: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 0a  ==TK_SELECT );..
de60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
de70: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
de80: 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
de90: 74 29 20 29 3b 0a 20 20 20 20 20 20 70 53 65 6c  t) );.      pSel
dea0: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   = pExpr->x.pSel
deb0: 65 63 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ect;.      sqlit
dec0: 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
ded0: 28 26 64 65 73 74 2c 20 30 2c 20 2b 2b 70 50 61  (&dest, 0, ++pPa
dee0: 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20  rse->nMem);.    
def0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
df00: 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20  =TK_SELECT ){.  
df10: 20 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74        dest.eDest
df20: 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20   = SRT_Mem;.    
df30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
df40: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
df50: 2c 20 30 2c 20 64 65 73 74 2e 69 50 61 72 6d 29  , 0, dest.iParm)
df60: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
df70: 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20  mment((v, "Init 
df80: 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 22  subquery result"
df90: 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
dfa0: 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44  .        dest.eD
dfb0: 65 73 74 20 3d 20 53 52 54 5f 45 78 69 73 74 73  est = SRT_Exists
dfc0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
dfd0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
dfe0: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 64 65  P_Integer, 0, de
dff0: 73 74 2e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  st.iParm);.     
e000: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
e010: 76 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53 20  v, "Init EXISTS 
e020: 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20  result"));.     
e030: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
e040: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
e050: 65 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69  e->db, pSel->pLi
e060: 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 53 65 6c  mit);.      pSel
e070: 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74  ->pLimit = sqlit
e080: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
e090: 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20 30  TK_INTEGER, 0, 0
e0a0: 2c 20 26 6f 6e 65 29 3b 0a 20 20 20 20 20 20 69  , &one);.      i
e0b0: 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
e0c0: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 26  (pParse, pSel, &
e0d0: 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  dest) ){.       
e0e0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
e0f0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43  .      pExpr->iC
e100: 6f 6c 75 6d 6e 20 3d 20 64 65 73 74 2e 69 50 61  olumn = dest.iPa
e110: 72 6d 3b 0a 20 20 20 20 20 20 45 78 70 72 53 65  rm;.      ExprSe
e120: 74 49 72 72 65 64 75 63 69 62 6c 65 28 70 45 78  tIrreducible(pEx
e130: 70 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  pr);.      break
e140: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
e150: 66 28 20 74 65 73 74 41 64 64 72 20 29 7b 0a 20  f( testAddr ){. 
e160: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
e170: 6d 70 48 65 72 65 28 76 2c 20 74 65 73 74 41 64  mpHere(v, testAd
e180: 64 72 2d 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  dr-1);.  }.  sql
e190: 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
e1a0: 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 0a 20 20  (pParse, 1);..  
e1b0: 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66  return;.}.#endif
e1c0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
e1d0: 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a  SUBQUERY */../*.
e1e0: 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 61 6e 20  ** Duplicate an 
e1f0: 38 2d 62 79 74 65 20 76 61 6c 75 65 0a 2a 2f 0a  8-byte value.*/.
e200: 73 74 61 74 69 63 20 63 68 61 72 20 2a 64 75 70  static char *dup
e210: 38 62 79 74 65 73 28 56 64 62 65 20 2a 76 2c 20  8bytes(Vdbe *v, 
e220: 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 6e 29 7b  const char *in){
e230: 0a 20 20 63 68 61 72 20 2a 6f 75 74 20 3d 20 73  .  char *out = s
e240: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
e250: 77 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  w(sqlite3VdbeDb(
e260: 76 29 2c 20 38 29 3b 0a 20 20 69 66 28 20 6f 75  v), 8);.  if( ou
e270: 74 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  t ){.    memcpy(
e280: 6f 75 74 2c 20 69 6e 2c 20 38 29 3b 0a 20 20 7d  out, in, 8);.  }
e290: 0a 20 20 72 65 74 75 72 6e 20 6f 75 74 3b 0a 7d  .  return out;.}
e2a0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
e2b0: 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   an instruction 
e2c0: 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68  that will put th
e2d0: 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  e floating point
e2e0: 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69  .** value descri
e2f0: 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d  bed by z[0..n-1]
e300: 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69   into register i
e310: 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  Mem..**.** The z
e320: 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70  [] string will p
e330: 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a  robably not be z
e340: 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20  ero-terminated. 
e350: 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e   But the .** z[n
e360: 5d 20 63 68 61 72 61 63 74 65 72 20 69 73 20 67  ] character is g
e370: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
e380: 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64  something that d
e390: 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20  oes not look.** 
e3a0: 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75  like the continu
e3b0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d  ation of the num
e3c0: 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ber..*/.static v
e3d0: 6f 69 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62  oid codeReal(Vdb
e3e0: 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *v, const char
e3f0: 20 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65 46   *z, int negateF
e400: 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a  lag, int iMem){.
e410: 20 20 69 66 28 20 41 4c 57 41 59 53 28 7a 21 3d    if( ALWAYS(z!=
e420: 30 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65  0) ){.    double
e430: 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 68 61 72   value;.    char
e440: 20 2a 7a 56 3b 0a 20 20 20 20 73 71 6c 69 74 65   *zV;.    sqlite
e450: 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 29  3AtoF(z, &value)
e460: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
e470: 33 49 73 4e 61 4e 28 76 61 6c 75 65 29 20 29 7b  3IsNaN(value) ){
e480: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
e490: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
e4a0: 75 6c 6c 2c 20 30 2c 20 69 4d 65 6d 29 3b 0a 20  ull, 0, iMem);. 
e4b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e4c0: 69 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29  if( negateFlag )
e4d0: 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b   value = -value;
e4e0: 0a 20 20 20 20 20 20 7a 56 20 3d 20 64 75 70 38  .      zV = dup8
e4f0: 62 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29  bytes(v, (char*)
e500: 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 73  &value);.      s
e510: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
e520: 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20  (v, OP_Real, 0, 
e530: 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f  iMem, 0, zV, P4_
e540: 52 45 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  REAL);.    }.  }
e550: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .}.../*.** Gener
e560: 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69  ate an instructi
e570: 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74  on that will put
e580: 20 74 68 65 20 69 6e 74 65 67 65 72 20 64 65 73   the integer des
e590: 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74  cribe by.** text
e5a0: 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20   z[0..n-1] into 
e5b0: 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a  register iMem..*
e5c0: 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72  *.** The z[] str
e5d0: 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c  ing will probabl
e5e0: 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65  y not be zero-te
e5f0: 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74  rminated.  But t
e600: 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72  he .** z[n] char
e610: 61 63 74 65 72 20 69 73 20 67 75 61 72 61 6e 74  acter is guarant
e620: 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68  eed to be someth
e630: 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ing that does no
e640: 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74  t look.** like t
e650: 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20  he continuation 
e660: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a  of the number..*
e670: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
e680: 64 65 49 6e 74 65 67 65 72 28 56 64 62 65 20 2a  deInteger(Vdbe *
e690: 76 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  v, Expr *pExpr, 
e6a0: 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74  int negFlag, int
e6b0: 20 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20 70 45   iMem){.  if( pE
e6c0: 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
e6d0: 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  IntValue ){.    
e6e0: 69 6e 74 20 69 20 3d 20 70 45 78 70 72 2d 3e 75  int i = pExpr->u
e6f0: 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 69 66 28  .iValue;.    if(
e700: 20 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d   negFlag ) i = -
e710: 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  i;.    sqlite3Vd
e720: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
e730: 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29  nteger, i, iMem)
e740: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
e750: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
e760: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
e770: 20 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30      assert( z!=0
e780: 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   );.    if( sqli
e790: 74 65 33 46 69 74 73 49 6e 36 34 42 69 74 73 28  te3FitsIn64Bits(
e7a0: 7a 2c 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20  z, negFlag) ){. 
e7b0: 20 20 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a       i64 value;.
e7c0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a        char *zV;.
e7d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f        sqlite3Ato
e7e0: 69 36 34 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a  i64(z, &value);.
e7f0: 20 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61        if( negFla
e800: 67 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c  g ) value = -val
e810: 75 65 3b 0a 20 20 20 20 20 20 7a 56 20 3d 20 64  ue;.      zV = d
e820: 75 70 38 62 79 74 65 73 28 76 2c 20 28 63 68 61  up8bytes(v, (cha
e830: 72 2a 29 26 76 61 6c 75 65 29 3b 0a 20 20 20 20  r*)&value);.    
e840: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e850: 4f 70 34 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c  Op4(v, OP_Int64,
e860: 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c   0, iMem, 0, zV,
e870: 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20   P4_INT64);.    
e880: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 64  }else{.      cod
e890: 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46  eReal(v, z, negF
e8a0: 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20  lag, iMem);.    
e8b0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  }.  }.}../*.** C
e8c0: 6c 65 61 72 20 61 20 63 61 63 68 65 20 65 6e 74  lear a cache ent
e8d0: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
e8e0: 69 64 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65  id cacheEntryCle
e8f0: 61 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ar(Parse *pParse
e900: 2c 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63  , struct yColCac
e910: 68 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  he *p){.  if( p-
e920: 3e 74 65 6d 70 52 65 67 20 29 7b 0a 20 20 20 20  >tempReg ){.    
e930: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d  if( pParse->nTem
e940: 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70  pReg<ArraySize(p
e950: 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29  Parse->aTempReg)
e960: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
e970: 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73  ->aTempReg[pPars
e980: 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d  e->nTempReg++] =
e990: 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a   p->iReg;.    }.
e9a0: 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d      p->tempReg =
e9b0: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a   0;.  }.}.../*.*
e9c0: 2a 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20  * Record in the 
e9d0: 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 74 68 61  column cache tha
e9e0: 74 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 63  t a particular c
e9f0: 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a 20  olumn from a.** 
ea00: 70 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65  particular table
ea10: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20   is stored in a 
ea20: 70 61 72 74 69 63 75 6c 61 72 20 72 65 67 69 73  particular regis
ea30: 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ter..*/.void sql
ea40: 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
ea50: 72 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  re(Parse *pParse
ea60: 2c 20 69 6e 74 20 69 54 61 62 2c 20 69 6e 74 20  , int iTab, int 
ea70: 69 43 6f 6c 2c 20 69 6e 74 20 69 52 65 67 29 7b  iCol, int iReg){
ea80: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
ea90: 6d 69 6e 4c 72 75 3b 0a 20 20 69 6e 74 20 69 64  minLru;.  int id
eaa0: 78 4c 72 75 3b 0a 20 20 73 74 72 75 63 74 20 79  xLru;.  struct y
eab0: 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20  ColCache *p;..  
eac0: 61 73 73 65 72 74 28 20 69 52 65 67 3e 30 20 29  assert( iReg>0 )
ead0: 3b 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 6e  ;  /* Register n
eae0: 75 6d 62 65 72 73 20 61 72 65 20 61 6c 77 61 79  umbers are alway
eaf0: 73 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20  s positive */.  
eb00: 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 2d 31  assert( iCol>=-1
eb10: 20 26 26 20 69 43 6f 6c 3c 33 32 37 36 38 20 29   && iCol<32768 )
eb20: 3b 20 20 2f 2a 20 46 69 6e 69 74 65 20 63 6f 6c  ;  /* Finite col
eb30: 75 6d 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a  umn numbers */..
eb40: 20 20 2f 2a 20 46 69 72 73 74 20 72 65 70 6c 61    /* First repla
eb50: 63 65 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20  ce any existing 
eb60: 65 6e 74 72 79 20 2a 2f 0a 20 20 66 6f 72 28 69  entry */.  for(i
eb70: 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
eb80: 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
eb90: 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
eba0: 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
ebb0: 20 70 2d 3e 69 52 65 67 20 26 26 20 70 2d 3e 69   p->iReg && p->i
ebc0: 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 70  Table==iTab && p
ebd0: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 20  ->iColumn==iCol 
ebe0: 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e  ){.      cacheEn
ebf0: 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c  tryClear(pParse,
ec00: 20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c   p);.      p->iL
ec10: 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69  evel = pParse->i
ec20: 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20  CacheLevel;.    
ec30: 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67    p->iReg = iReg
ec40: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 66 66 43 68  ;.      p->affCh
ec50: 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  ange = 0;.      
ec60: 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d  p->lru = pParse-
ec70: 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20  >iCacheCnt++;.  
ec80: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
ec90: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64  }.  }..  /* Find
eca0: 20 61 6e 20 65 6d 70 74 79 20 73 6c 6f 74 20 61   an empty slot a
ecb0: 6e 64 20 72 65 70 6c 61 63 65 20 69 74 20 2a 2f  nd replace it */
ecc0: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
ecd0: 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
ece0: 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
ecf0: 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
ed00: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67  .    if( p->iReg
ed10: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
ed20: 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d  iLevel = pParse-
ed30: 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20  >iCacheLevel;.  
ed40: 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20      p->iTable = 
ed50: 69 54 61 62 3b 0a 20 20 20 20 20 20 70 2d 3e 69  iTab;.      p->i
ed60: 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20  Column = iCol;. 
ed70: 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 69       p->iReg = i
ed80: 52 65 67 3b 0a 20 20 20 20 20 20 70 2d 3e 61 66  Reg;.      p->af
ed90: 66 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  fChange = 0;.   
eda0: 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20     p->tempReg = 
edb0: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20  0;.      p->lru 
edc0: 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
edd0: 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74  Cnt++;.      ret
ede0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  urn;.    }.  }..
edf0: 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68 65    /* Replace the
ee00: 20 6c 61 73 74 20 72 65 63 65 6e 74 6c 79 20 75   last recently u
ee10: 73 65 64 20 2a 2f 0a 20 20 6d 69 6e 4c 72 75 20  sed */.  minLru 
ee20: 3d 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20  = 0x7fffffff;.  
ee30: 69 64 78 4c 72 75 20 3d 20 2d 31 3b 0a 20 20 66  idxLru = -1;.  f
ee40: 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
ee50: 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
ee60: 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
ee70: 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
ee80: 20 69 66 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c   if( p->lru<minL
ee90: 72 75 20 29 7b 0a 20 20 20 20 20 20 69 64 78 4c  ru ){.      idxL
eea0: 72 75 20 3d 20 69 3b 0a 20 20 20 20 20 20 6d 69  ru = i;.      mi
eeb0: 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72 75 3b 0a 20  nLru = p->lru;. 
eec0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 41     }.  }.  if( A
eed0: 4c 57 41 59 53 28 69 64 78 4c 72 75 3e 3d 30 29  LWAYS(idxLru>=0)
eee0: 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 50 61   ){.    p = &pPa
eef0: 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69  rse->aColCache[i
ef00: 64 78 4c 72 75 5d 3b 0a 20 20 20 20 70 2d 3e 69  dxLru];.    p->i
ef10: 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e  Level = pParse->
ef20: 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20  iCacheLevel;.   
ef30: 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61   p->iTable = iTa
ef40: 62 3b 0a 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d  b;.    p->iColum
ef50: 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 2d  n = iCol;.    p-
ef60: 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20  >iReg = iReg;.  
ef70: 20 20 70 2d 3e 61 66 66 43 68 61 6e 67 65 20 3d    p->affChange =
ef80: 20 30 3b 0a 20 20 20 20 70 2d 3e 74 65 6d 70 52   0;.    p->tempR
ef90: 65 67 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c  eg = 0;.    p->l
efa0: 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  ru = pParse->iCa
efb0: 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 72 65  cheCnt++;.    re
efc0: 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  turn;.  }.}../*.
efd0: 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74  ** Indicate that
efe0: 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20 62   a register is b
eff0: 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e  eing overwritten
f000: 2e 20 20 50 75 72 67 65 20 74 68 65 20 72 65 67  .  Purge the reg
f010: 69 73 74 65 72 0a 2a 2a 20 66 72 6f 6d 20 74 68  ister.** from th
f020: 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a  e column cache..
f030: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
f040: 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 50  xprCacheRemove(P
f050: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
f060: 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t iReg){.  int i
f070: 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
f080: 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69  ache *p;.  for(i
f090: 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
f0a0: 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
f0b0: 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
f0c0: 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
f0d0: 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29   p->iReg==iReg )
f0e0: 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74  {.      cacheEnt
f0f0: 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20  ryClear(pParse, 
f100: 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65  p);.      p->iRe
f110: 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  g = 0;.    }.  }
f120: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62  .}../*.** Rememb
f130: 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  er the current c
f140: 6f 6c 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74  olumn cache cont
f150: 65 78 74 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e  ext.  Any new en
f160: 74 72 69 65 73 20 61 64 64 65 64 0a 2a 2a 20 61  tries added.** a
f170: 64 64 65 64 20 74 6f 20 74 68 65 20 63 6f 6c 75  dded to the colu
f180: 6d 6e 20 63 61 63 68 65 20 61 66 74 65 72 20 74  mn cache after t
f190: 68 69 73 20 63 61 6c 6c 20 61 72 65 20 72 65 6d  his call are rem
f1a0: 6f 76 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a  oved when the.**
f1b0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70   corresponding p
f1c0: 6f 70 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f  op occurs..*/.vo
f1d0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
f1e0: 63 68 65 50 75 73 68 28 50 61 72 73 65 20 2a 70  chePush(Parse *p
f1f0: 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65  Parse){.  pParse
f200: 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b  ->iCacheLevel++;
f210: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
f220: 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e   from the column
f230: 20 63 61 63 68 65 20 61 6e 79 20 65 6e 74 72 69   cache any entri
f240: 65 73 20 74 68 61 74 20 77 65 72 65 20 61 64 64  es that were add
f250: 65 64 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20  ed since the.** 
f260: 74 68 65 20 70 72 65 76 69 6f 75 73 20 4e 20 50  the previous N P
f270: 75 73 68 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20  ush operations. 
f280: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
f290: 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 61 63   restore the cac
f2a0: 68 65 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61  he.** to the sta
f2b0: 74 65 20 69 74 20 77 61 73 20 69 6e 20 4e 20 50  te it was in N P
f2c0: 75 73 68 65 73 20 61 67 6f 2e 0a 2a 2f 0a 76 6f  ushes ago..*/.vo
f2d0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
f2e0: 63 68 65 50 6f 70 28 50 61 72 73 65 20 2a 70 50  chePop(Parse *pP
f2f0: 61 72 73 65 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  arse, int N){.  
f300: 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
f310: 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20  yColCache *p;.  
f320: 61 73 73 65 72 74 28 20 4e 3e 30 20 29 3b 0a 20  assert( N>0 );. 
f330: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
f340: 3e 69 43 61 63 68 65 4c 65 76 65 6c 3e 3d 4e 20  >iCacheLevel>=N 
f350: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61  );.  pParse->iCa
f360: 63 68 65 4c 65 76 65 6c 20 2d 3d 20 4e 3b 0a 20  cheLevel -= N;. 
f370: 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
f380: 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
f390: 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
f3a0: 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
f3b0: 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20 26     if( p->iReg &
f3c0: 26 20 70 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72  & p->iLevel>pPar
f3d0: 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20  se->iCacheLevel 
f3e0: 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e  ){.      cacheEn
f3f0: 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c  tryClear(pParse,
f400: 20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52   p);.      p->iR
f410: 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  eg = 0;.    }.  
f420: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  }.}../*.** When 
f430: 61 20 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e 20  a cached column 
f440: 69 73 20 72 65 75 73 65 64 2c 20 6d 61 6b 65 20  is reused, make 
f450: 73 75 72 65 20 74 68 61 74 20 69 74 73 20 72 65  sure that its re
f460: 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f 20  gister is.** no 
f470: 6c 6f 6e 67 65 72 20 61 76 61 69 6c 61 62 6c 65  longer available
f480: 20 61 73 20 61 20 74 65 6d 70 20 72 65 67 69 73   as a temp regis
f490: 74 65 72 2e 20 20 74 69 63 6b 65 74 20 23 33 38  ter.  ticket #38
f4a0: 37 39 3a 20 20 74 68 61 74 20 73 61 6d 65 0a 2a  79:  that same.*
f4b0: 2a 20 72 65 67 69 73 74 65 72 20 6d 69 67 68 74  * register might
f4c0: 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65   be in the cache
f4d0: 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61   in multiple pla
f4e0: 63 65 73 2c 20 73 6f 20 62 65 20 73 75 72 65 20  ces, so be sure 
f4f0: 74 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20 61  to.** get them a
f500: 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ll..*/.static vo
f510: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
f520: 63 68 65 50 69 6e 52 65 67 69 73 74 65 72 28 50  chePinRegister(P
f530: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
f540: 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t iReg){.  int i
f550: 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
f560: 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69  ache *p;.  for(i
f570: 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
f580: 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
f590: 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
f5a0: 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
f5b0: 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29   p->iReg==iReg )
f5c0: 7b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52  {.      p->tempR
f5d0: 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  eg = 0;.    }.  
f5e0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
f5f0: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
f600: 6c 6c 20 65 78 74 72 61 63 74 20 74 68 65 20 69  ll extract the i
f610: 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e  Column-th column
f620: 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70   from.** table p
f630: 54 61 62 20 61 6e 64 20 73 74 6f 72 65 20 74 68  Tab and store th
f640: 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  e column value i
f650: 6e 20 61 20 72 65 67 69 73 74 65 72 2e 20 20 41  n a register.  A
f660: 6e 20 65 66 66 6f 72 74 0a 2a 2a 20 69 73 20 6d  n effort.** is m
f670: 61 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65  ade to store the
f680: 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e   column value in
f690: 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2c 20   register iReg, 
f6a0: 62 75 74 20 74 68 69 73 20 69 73 0a 2a 2a 20 6e  but this is.** n
f6b0: 6f 74 20 67 75 61 72 61 6e 74 65 65 64 2e 20 20  ot guaranteed.  
f6c0: 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  The location of 
f6d0: 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  the column value
f6e0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
f6f0: 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62  .** There must b
f700: 65 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72  e an open cursor
f710: 20 74 6f 20 70 54 61 62 20 69 6e 20 69 54 61 62   to pTab in iTab
f720: 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  le when this rou
f730: 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
f740: 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30  d.  If iColumn<0
f750: 20 74 68 65 6e 20 63 6f 64 65 20 69 73 20 67 65   then code is ge
f760: 6e 65 72 61 74 65 64 20 74 68 61 74 20 65 78 74  nerated that ext
f770: 72 61 63 74 73 20 74 68 65 20 72 6f 77 69 64 2e  racts the rowid.
f780: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
f790: 69 6e 65 20 6d 69 67 68 74 20 61 74 74 65 6d 70  ine might attemp
f7a0: 74 20 74 6f 20 72 65 75 73 65 20 74 68 65 20 76  t to reuse the v
f7b0: 61 6c 75 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  alue of the colu
f7c0: 6d 6e 20 74 68 61 74 0a 2a 2a 20 68 61 73 20 61  mn that.** has a
f7d0: 6c 72 65 61 64 79 20 62 65 65 6e 20 6c 6f 61 64  lready been load
f7e0: 65 64 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74  ed into a regist
f7f0: 65 72 2e 20 20 54 68 65 20 76 61 6c 75 65 20 77  er.  The value w
f800: 69 6c 6c 20 61 6c 77 61 79 73 0a 2a 2a 20 62 65  ill always.** be
f810: 20 75 73 65 64 20 69 66 20 69 74 20 68 61 73 20   used if it has 
f820: 6e 6f 74 20 75 6e 64 65 72 67 6f 6e 65 20 61 6e  not undergone an
f830: 79 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67  y affinity chang
f840: 65 73 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 61  es.  But if.** a
f850: 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67  n affinity chang
f860: 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20  e has occurred, 
f870: 74 68 65 6e 20 74 68 65 20 63 61 63 68 65 64 20  then the cached 
f880: 76 61 6c 75 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  value will only 
f890: 62 65 0a 2a 2a 20 75 73 65 64 20 69 66 20 61 6c  be.** used if al
f8a0: 6c 6f 77 41 66 66 43 68 6e 67 20 69 73 20 74 72  lowAffChng is tr
f8b0: 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ue..*/.int sqlit
f8c0: 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
f8d0: 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  umn(.  Parse *pP
f8e0: 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69  arse,   /* Parsi
f8f0: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
f900: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
f910: 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
f920: 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
f930: 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ion of the table
f940: 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
f950: 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43  from */.  int iC
f960: 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e  olumn,     /* In
f970: 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65  dex of the table
f980: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74   column */.  int
f990: 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a   iTable,      /*
f9a0: 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   The cursor poin
f9b0: 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c  ting to the tabl
f9c0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c  e */.  int iReg,
f9d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
f9e0: 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
f9f0: 0a 20 20 69 6e 74 20 61 6c 6c 6f 77 41 66 66 43  .  int allowAffC
fa00: 68 6e 67 20 2f 2a 20 54 72 75 65 20 69 66 20 70  hng /* True if p
fa10: 72 69 6f 72 20 61 66 66 69 6e 69 74 79 20 63 68  rior affinity ch
fa20: 61 6e 67 65 73 20 61 72 65 20 4f 4b 20 2a 2f 0a  anges are OK */.
fa30: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
fa40: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
fa50: 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
fa60: 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20  yColCache *p;.. 
fa70: 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
fa80: 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
fa90: 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
faa0: 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
fab0: 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3e 30     if( p->iReg>0
fac0: 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69   && p->iTable==i
fad0: 54 61 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c  Table && p->iCol
fae0: 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20  umn==iColumn.   
faf0: 20 20 20 20 20 20 20 20 26 26 20 28 21 70 2d 3e          && (!p->
fb00: 61 66 66 43 68 61 6e 67 65 20 7c 7c 20 61 6c 6c  affChange || all
fb10: 6f 77 41 66 66 43 68 6e 67 29 20 29 7b 0a 20 20  owAffChng) ){.  
fb20: 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61      p->lru = pPa
fb30: 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b  rse->iCacheCnt++
fb40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
fb50: 78 70 72 43 61 63 68 65 50 69 6e 52 65 67 69 73  xprCachePinRegis
fb60: 74 65 72 28 70 50 61 72 73 65 2c 20 70 2d 3e 69  ter(pParse, p->i
fb70: 52 65 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Reg);.      retu
fb80: 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20  rn p->iReg;.    
fb90: 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73 65 72 74  }.  }  .  assert
fba0: 28 20 76 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ( v!=0 );.  if( 
fbb0: 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  iColumn<0 ){.   
fbc0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fbd0: 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20  p2(v, OP_Rowid, 
fbe0: 69 54 61 62 6c 65 2c 20 69 52 65 67 29 3b 0a 20  iTable, iReg);. 
fbf0: 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
fc00: 53 28 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20  S(pTab!=0) ){.  
fc10: 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72    int op = IsVir
fc20: 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f  tual(pTab) ? OP_
fc30: 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c  VColumn : OP_Col
fc40: 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  umn;.    sqlite3
fc50: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70  VdbeAddOp3(v, op
fc60: 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d  , iTable, iColum
fc70: 6e 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 73 71  n, iReg);.    sq
fc80: 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75  lite3ColumnDefau
fc90: 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c  lt(v, pTab, iCol
fca0: 75 6d 6e 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  umn);.#ifndef SQ
fcb0: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
fcc0: 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 69 66 28  NG_POINT.    if(
fcd0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
fce0: 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53  umn].affinity==S
fcf0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 29  QLITE_AFF_REAL )
fd00: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
fd10: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
fd20: 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20 69 52  RealAffinity, iR
fd30: 65 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eg);.    }.#endi
fd40: 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  f.  }.  sqlite3E
fd50: 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50  xprCacheStore(pP
fd60: 61 72 73 65 2c 20 69 54 61 62 6c 65 2c 20 69 43  arse, iTable, iC
fd70: 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20  olumn, iReg);.  
fd80: 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a  return iReg;.}..
fd90: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 6c 6c 20  /*.** Clear all 
fda0: 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 65 6e 74  column cache ent
fdb0: 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ries..*/.void sq
fdc0: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
fdd0: 65 61 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ear(Parse *pPars
fde0: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  e){.  int i;.  s
fdf0: 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
fe00: 2a 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20  *p;..  for(i=0, 
fe10: 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
fe20: 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
fe30: 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
fe40: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
fe50: 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20 63 61  iReg ){.      ca
fe60: 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50  cheEntryClear(pP
fe70: 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20  arse, p);.      
fe80: 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20  p->iReg = 0;.   
fe90: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
fea0: 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
feb0: 74 68 61 74 20 61 6e 20 61 66 66 69 6e 69 74 79  that an affinity
fec0: 20 63 68 61 6e 67 65 20 68 61 73 20 6f 63 63 75   change has occu
fed0: 72 72 65 64 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a  rred on iCount.*
fee0: 2a 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  * registers star
fef0: 74 69 6e 67 20 77 69 74 68 20 69 53 74 61 72 74  ting with iStart
ff00: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
ff10: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
ff20: 74 79 43 68 61 6e 67 65 28 50 61 72 73 65 20 2a  tyChange(Parse *
ff30: 70 50 61 72 73 65 2c 20 69 6e 74 20 69 53 74 61  pParse, int iSta
ff40: 72 74 2c 20 69 6e 74 20 69 43 6f 75 6e 74 29 7b  rt, int iCount){
ff50: 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 69 53  .  int iEnd = iS
ff60: 74 61 72 74 20 2b 20 69 43 6f 75 6e 74 20 2d 20  tart + iCount - 
ff70: 31 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  1;.  int i;.  st
ff80: 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
ff90: 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  p;.  for(i=0, p=
ffa0: 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
ffb0: 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
ffc0: 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
ffd0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20 70  ){.    int r = p
ffe0: 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20  ->iReg;.    if( 
fff0: 72 3e 3d 69 53 74 61 72 74 20 26 26 20 72 3c 3d  r>=iStart && r<=
10000 69 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 70 2d  iEnd ){.      p-
10010 3e 61 66 66 43 68 61 6e 67 65 20 3d 20 31 3b 0a  >affChange = 1;.
10020 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
10030 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
10040 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74   to move content
10050 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20   from registers 
10060 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52  iFrom...iFrom+nR
10070 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20  eg-1.** over to 
10080 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e  iTo..iTo+nReg-1.
10090 20 4b 65 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e   Keep the column
100a0 20 63 61 63 68 65 20 75 70 2d 74 6f 2d 64 61 74   cache up-to-dat
100b0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
100c0 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50  e3ExprCodeMove(P
100d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
100e0 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f  t iFrom, int iTo
100f0 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69  , int nReg){.  i
10100 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
10110 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 69  ColCache *p;.  i
10120 66 28 20 4e 45 56 45 52 28 69 46 72 6f 6d 3d 3d  f( NEVER(iFrom==
10130 69 54 6f 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  iTo) ) return;. 
10140 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10150 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p3(pParse->pVdbe
10160 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d  , OP_Move, iFrom
10170 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 20 20  , iTo, nReg);.  
10180 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
10190 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
101a0 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
101b0 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
101c0 20 20 69 6e 74 20 78 20 3d 20 70 2d 3e 69 52 65    int x = p->iRe
101d0 67 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d 69 46  g;.    if( x>=iF
101e0 72 6f 6d 20 26 26 20 78 3c 69 46 72 6f 6d 2b 6e  rom && x<iFrom+n
101f0 52 65 67 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Reg ){.      p->
10200 69 52 65 67 20 2b 3d 20 69 54 6f 2d 69 46 72 6f  iReg += iTo-iFro
10210 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  m;.    }.  }.}..
10220 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
10230 6f 64 65 20 74 6f 20 63 6f 70 79 20 63 6f 6e 74  ode to copy cont
10240 65 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65  ent from registe
10250 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d  rs iFrom...iFrom
10260 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20  +nReg-1.** over 
10270 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67  to iTo..iTo+nReg
10280 2d 31 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  -1..*/.void sqli
10290 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28  te3ExprCodeCopy(
102a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
102b0 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54  nt iFrom, int iT
102c0 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  o, int nReg){.  
102d0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 4e 45 56  int i;.  if( NEV
102e0 45 52 28 69 46 72 6f 6d 3d 3d 69 54 6f 29 20 29  ER(iFrom==iTo) )
102f0 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
10300 3d 30 3b 20 69 3c 6e 52 65 67 3b 20 69 2b 2b 29  =0; i<nReg; i++)
10310 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
10320 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e  eAddOp2(pParse->
10330 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c 20  pVdbe, OP_Copy, 
10340 69 46 72 6f 6d 2b 69 2c 20 69 54 6f 2b 69 29 3b  iFrom+i, iTo+i);
10350 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
10360 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79  turn true if any
10370 20 72 65 67 69 73 74 65 72 20 69 6e 20 74 68 65   register in the
10380 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e 69 54   range iFrom..iT
10390 6f 20 28 69 6e 63 6c 75 73 69 76 65 29 0a 2a 2a  o (inclusive).**
103a0 20 69 73 20 75 73 65 64 20 61 73 20 70 61 72 74   is used as part
103b0 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   of the column c
103c0 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ache..*/.static 
103d0 69 6e 74 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e  int usedAsColumn
103e0 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61  Cache(Parse *pPa
103f0 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20  rse, int iFrom, 
10400 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74 20  int iTo){.  int 
10410 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
10420 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28  Cache *p;.  for(
10430 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
10440 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
10450 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
10460 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e  ++, p++){.    in
10470 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20  t r = p->iReg;. 
10480 20 20 20 69 66 28 20 72 3e 3d 69 46 72 6f 6d 20     if( r>=iFrom 
10490 26 26 20 72 3c 3d 69 54 6f 20 29 20 72 65 74 75  && r<=iTo ) retu
104a0 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
104b0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 0;.}../*.** I
104c0 66 20 74 68 65 20 6c 61 73 74 20 69 6e 73 74 72  f the last instr
104d0 75 63 74 69 6f 6e 20 63 6f 64 65 64 20 69 73 20  uction coded is 
104e0 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 63 6f 70  an ephemeral cop
104f0 79 20 6f 66 20 61 6e 79 20 6f 66 0a 2a 2a 20 74  y of any of.** t
10500 68 65 20 72 65 67 69 73 74 65 72 73 20 69 6e 20  he registers in 
10510 74 68 65 20 6e 52 65 67 20 72 65 67 69 73 74 65  the nReg registe
10520 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  rs beginning wit
10530 68 20 69 52 65 67 2c 20 74 68 65 6e 0a 2a 2a 20  h iReg, then.** 
10540 63 6f 6e 76 65 72 74 20 74 68 65 20 6c 61 73 74  convert the last
10550 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 72 6f   instruction fro
10560 6d 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 4f 50  m OP_SCopy to OP
10570 5f 43 6f 70 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  _Copy..*/.void s
10580 71 6c 69 74 65 33 45 78 70 72 48 61 72 64 43 6f  qlite3ExprHardCo
10590 70 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  py(Parse *pParse
105a0 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20  , int iReg, int 
105b0 6e 52 65 67 29 7b 0a 20 20 56 64 62 65 4f 70 20  nReg){.  VdbeOp 
105c0 2a 70 4f 70 3b 0a 20 20 56 64 62 65 20 2a 76 3b  *pOp;.  Vdbe *v;
105d0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
105e0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
105f0 69 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 76 20 3d  iled==0 );.  v =
10600 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
10610 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
10620 3b 0a 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65  ;.  pOp = sqlite
10630 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 2d 31  3VdbeGetOp(v, -1
10640 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
10650 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f 70  !=0 );.  if( pOp
10660 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 43 6f  ->opcode==OP_SCo
10670 70 79 20 26 26 20 70 4f 70 2d 3e 70 31 3e 3d 69  py && pOp->p1>=i
10680 52 65 67 20 26 26 20 70 4f 70 2d 3e 70 31 3c 69  Reg && pOp->p1<i
10690 52 65 67 2b 6e 52 65 67 20 29 7b 0a 20 20 20 20  Reg+nReg ){.    
106a0 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
106b0 5f 43 6f 70 79 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  _Copy;.  }.}../*
106c0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
106d0 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 76  e to store the v
106e0 61 6c 75 65 20 6f 66 20 74 68 65 20 69 41 6c 69  alue of the iAli
106f0 61 73 2d 74 68 20 61 6c 69 61 73 20 69 6e 20 72  as-th alias in r
10700 65 67 69 73 74 65 72 0a 2a 2a 20 74 61 72 67 65  egister.** targe
10710 74 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69  t.  The first ti
10720 6d 65 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  me this is calle
10730 64 2c 20 70 45 78 70 72 20 69 73 20 65 76 61 6c  d, pExpr is eval
10740 75 61 74 65 64 20 74 6f 20 63 6f 6d 70 75 74 65  uated to compute
10750 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
10760 20 74 68 65 20 61 6c 69 61 73 2e 20 20 54 68 65   the alias.  The
10770 20 76 61 6c 75 65 20 69 73 20 73 74 6f 72 65 64   value is stored
10780 20 69 6e 20 61 6e 20 61 75 78 69 6c 69 61 72 79   in an auxiliary
10790 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64   register.** and
107a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
107b0 68 61 74 20 72 65 67 69 73 74 65 72 20 69 73 20  hat register is 
107c0 72 65 74 75 72 6e 65 64 2e 20 20 4f 6e 20 73 75  returned.  On su
107d0 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 2c 0a  bsequent calls,.
107e0 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 20  ** the register 
107f0 6e 75 6d 62 65 72 20 69 73 20 72 65 74 75 72 6e  number is return
10800 65 64 20 77 69 74 68 6f 75 74 20 67 65 6e 65 72  ed without gener
10810 61 74 69 6e 67 20 61 6e 79 20 63 6f 64 65 2e 0a  ating any code..
10820 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
10830 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69  in order for thi
10840 73 20 74 6f 20 77 6f 72 6b 2c 20 63 6f 64 65 20  s to work, code 
10850 6d 75 73 74 20 62 65 20 67 65 6e 65 72 61 74 65  must be generate
10860 64 20 69 6e 20 74 68 65 0a 2a 2a 20 73 61 6d 65  d in the.** same
10870 20 6f 72 64 65 72 20 74 68 61 74 20 69 74 20 69   order that it i
10880 73 20 65 78 65 63 75 74 65 64 2e 0a 2a 2a 0a 2a  s executed..**.*
10890 2a 20 41 6c 69 61 73 65 73 20 61 72 65 20 6e 75  * Aliases are nu
108a0 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67 20  mbered starting 
108b0 77 69 74 68 20 31 2e 20 20 53 6f 20 69 41 6c 69  with 1.  So iAli
108c0 61 73 20 69 73 20 69 6e 20 74 68 65 20 72 61 6e  as is in the ran
108d0 67 65 0a 2a 2a 20 6f 66 20 31 20 74 6f 20 70 50  ge.** of 1 to pP
108e0 61 72 73 65 2d 3e 6e 41 6c 69 61 73 20 69 6e 63  arse->nAlias inc
108f0 6c 75 73 69 76 65 2e 20 20 0a 2a 2a 0a 2a 2a 20  lusive.  .**.** 
10900 70 50 61 72 73 65 2d 3e 61 41 6c 69 61 73 5b 69  pParse->aAlias[i
10910 41 6c 69 61 73 2d 31 5d 20 72 65 63 6f 72 64 73  Alias-1] records
10920 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75   the register nu
10930 6d 62 65 72 20 77 68 65 72 65 20 74 68 65 20 76  mber where the v
10940 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 69  alue.** of the i
10950 41 6c 69 61 73 2d 74 68 20 61 6c 69 61 73 20 69  Alias-th alias i
10960 73 20 73 74 6f 72 65 64 2e 20 20 49 66 20 7a 65  s stored.  If ze
10970 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ro, that means t
10980 68 61 74 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73  hat the.** alias
10990 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
109a0 6e 20 63 6f 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73  n computed..*/.s
109b0 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 41 6c  tatic int codeAl
109c0 69 61 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ias(Parse *pPars
109d0 65 2c 20 69 6e 74 20 69 41 6c 69 61 73 2c 20 45  e, int iAlias, E
109e0 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
109f0 74 61 72 67 65 74 29 7b 0a 23 69 66 20 30 0a 20  target){.#if 0. 
10a00 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
10a10 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
10a20 20 69 52 65 67 3b 0a 20 20 69 66 28 20 70 50 61   iReg;.  if( pPa
10a30 72 73 65 2d 3e 6e 41 6c 69 61 73 41 6c 6c 6f 63  rse->nAliasAlloc
10a40 3c 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 20  <pParse->nAlias 
10a50 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61  ){.    pParse->a
10a60 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 44  Alias = sqlite3D
10a70 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 64  bReallocOrFree(d
10a80 62 2c 20 70 50 61 72 73 65 2d 3e 61 41 6c 69 61  b, pParse->aAlia
10a90 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
10aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ab0 20 20 20 20 73 69 7a 65 6f 66 28 70 50 61 72 73      sizeof(pPars
10ac0 65 2d 3e 61 41 6c 69 61 73 5b 30 5d 29 2a 70 50  e->aAlias[0])*pP
10ad0 61 72 73 65 2d 3e 6e 41 6c 69 61 73 20 29 3b 0a  arse->nAlias );.
10ae0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64 62      testcase( db
10af0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
10b00 26 20 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73  & pParse->nAlias
10b10 41 6c 6c 6f 63 3e 30 20 29 3b 0a 20 20 20 20 69  Alloc>0 );.    i
10b20 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
10b30 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  led ) return 0;.
10b40 20 20 20 20 6d 65 6d 73 65 74 28 26 70 50 61 72      memset(&pPar
10b50 73 65 2d 3e 61 41 6c 69 61 73 5b 70 50 61 72 73  se->aAlias[pPars
10b60 65 2d 3e 6e 41 6c 69 61 73 41 6c 6c 6f 63 5d 2c  e->nAliasAlloc],
10b70 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28   0,.           (
10b80 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 2d 70  pParse->nAlias-p
10b90 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 41 6c 6c  Parse->nAliasAll
10ba0 6f 63 29 2a 73 69 7a 65 6f 66 28 70 50 61 72 73  oc)*sizeof(pPars
10bb0 65 2d 3e 61 41 6c 69 61 73 5b 30 5d 29 29 3b 0a  e->aAlias[0]));.
10bc0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 41 6c 69      pParse->nAli
10bd0 61 73 41 6c 6c 6f 63 20 3d 20 70 50 61 72 73 65  asAlloc = pParse
10be0 2d 3e 6e 41 6c 69 61 73 3b 0a 20 20 7d 0a 20 20  ->nAlias;.  }.  
10bf0 61 73 73 65 72 74 28 20 69 41 6c 69 61 73 3e 30  assert( iAlias>0
10c00 20 26 26 20 69 41 6c 69 61 73 3c 3d 70 50 61 72   && iAlias<=pPar
10c10 73 65 2d 3e 6e 41 6c 69 61 73 20 29 3b 0a 20 20  se->nAlias );.  
10c20 69 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 61  iReg = pParse->a
10c30 41 6c 69 61 73 5b 69 41 6c 69 61 73 2d 31 5d 3b  Alias[iAlias-1];
10c40 0a 20 20 69 66 28 20 69 52 65 67 3d 3d 30 20 29  .  if( iReg==0 )
10c50 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  {.    if( pParse
10c60 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3e 30 20  ->iCacheLevel>0 
10c70 29 7b 0a 20 20 20 20 20 20 69 52 65 67 20 3d 20  ){.      iReg = 
10c80 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
10c90 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
10ca0 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
10cb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
10cc0 52 65 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Reg = ++pParse->
10cd0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  nMem;.      sqli
10ce0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
10cf0 73 65 2c 20 70 45 78 70 72 2c 20 69 52 65 67 29  se, pExpr, iReg)
10d00 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
10d10 61 41 6c 69 61 73 5b 69 41 6c 69 61 73 2d 31 5d  aAlias[iAlias-1]
10d20 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20   = iReg;.    }. 
10d30 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67   }.  return iReg
10d40 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
10d50 5f 50 41 52 41 4d 45 54 45 52 28 69 41 6c 69 61  _PARAMETER(iAlia
10d60 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  s);.  return sql
10d70 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
10d80 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
10d90 2c 20 74 61 72 67 65 74 29 3b 0a 23 65 6e 64 69  , target);.#endi
10da0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  f.}../*.** Gener
10db0 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
10dc0 65 20 63 75 72 72 65 6e 74 20 56 64 62 65 20 74  e current Vdbe t
10dd0 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 67  o evaluate the g
10de0 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  iven.** expressi
10df0 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20  on.  Attempt to 
10e00 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
10e10 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 22 74  s in register "t
10e20 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72  arget"..** Retur
10e30 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20 77  n the register w
10e40 68 65 72 65 20 72 65 73 75 6c 74 73 20 61 72 65  here results are
10e50 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57   stored..**.** W
10e60 69 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ith this routine
10e70 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75  , there is no gu
10e80 61 72 61 6e 74 65 65 20 74 68 61 74 20 72 65 73  arantee that res
10e90 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  ults will.** be 
10ea0 73 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74  stored in target
10eb0 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69  .  The result mi
10ec0 67 68 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e  ght be stored in
10ed0 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72   some other.** r
10ee0 65 67 69 73 74 65 72 20 69 66 20 69 74 20 69 73  egister if it is
10ef0 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64   convenient to d
10f00 6f 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69  o so.  The calli
10f10 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d  ng function.** m
10f20 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65  ust check the re
10f30 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f  turn code and mo
10f40 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 74  ve the results t
10f50 6f 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a  o the desired.**
10f60 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e   register..*/.in
10f70 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
10f80 65 54 61 72 67 65 74 28 50 61 72 73 65 20 2a 70  eTarget(Parse *p
10f90 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
10fa0 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
10fb0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
10fc0 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20  rse->pVdbe;  /* 
10fd0 54 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e  The VM under con
10fe0 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
10ff0 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
11000 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
11010 6f 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64  opcode being cod
11020 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65  ed */.  int inRe
11030 67 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20 20  g = target;     
11040 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74 6f    /* Results sto
11050 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20  red in register 
11060 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72  inReg */.  int r
11070 65 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20 20  egFree1 = 0;    
11080 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a       /* If non-z
11090 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65  ero free this te
110a0 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
110b0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65   */.  int regFre
110c0 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  e2 = 0;         
110d0 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66  /* If non-zero f
110e0 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61  ree this tempora
110f0 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  ry register */. 
11100 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 2c   int r1, r2, r3,
11110 20 72 34 3b 20 20 20 20 20 20 20 2f 2a 20 56 61   r4;       /* Va
11120 72 69 6f 75 73 20 72 65 67 69 73 74 65 72 20 6e  rious register n
11130 75 6d 62 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69  umbers */.  sqli
11140 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
11150 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64 61 74  ->db; /* The dat
11160 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
11170 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 74   */..  assert( t
11180 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65  arget>0 && targe
11190 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  t<=pParse->nMem 
111a0 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b  );.  if( v==0 ){
111b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
111c0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
111d0 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74  ailed );.    ret
111e0 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66  urn 0;.  }..  if
111f0 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20  ( pExpr==0 ){.  
11200 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a    op = TK_NULL;.
11210 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20    }else{.    op 
11220 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d  = pExpr->op;.  }
11230 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
11240 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
11250 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
11260 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
11270 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67  fo = pExpr->pAgg
11280 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75  Info;.      stru
11290 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
112a0 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f  pCol = &pAggInfo
112b0 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41  ->aCol[pExpr->iA
112c0 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21  gg];.      if( !
112d0 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
112e0 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Mode ){.        
112f0 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d  assert( pCol->iM
11300 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  em>0 );.        
11310 69 6e 52 65 67 20 3d 20 70 43 6f 6c 2d 3e 69 4d  inReg = pCol->iM
11320 65 6d 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  em;.        brea
11330 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  k;.      }else i
11340 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65  f( pAggInfo->use
11350 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20  SortingIdx ){.  
11360 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11370 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
11380 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e  lumn, pAggInfo->
11390 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20 20 20  sortingIdx,.    
113a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113b0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
113c0 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74  iSorterColumn, t
113d0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
113e0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
113f0 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73       /* Otherwis
11400 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74  e, fall thru int
11410 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20  o the TK_COLUMN 
11420 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  case */.    }.  
11430 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
11440 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  : {.      if( pE
11450 78 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b  xpr->iTable<0 ){
11460 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
11470 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68   only happens wh
11480 65 6e 20 63 6f 64 69 6e 67 20 63 68 65 63 6b 20  en coding check 
11490 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
114a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
114b0 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e 30 20  Parse->ckBase>0 
114c0 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  );.        inReg
114d0 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
114e0 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b 42 61  n + pParse->ckBa
114f0 73 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  se;.      }else{
11500 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
11510 65 28 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73  e( (pExpr->flags
11520 20 26 20 45 50 5f 41 6e 79 41 66 66 29 21 3d 30   & EP_AnyAff)!=0
11530 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65   );.        inRe
11540 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
11550 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61  odeGetColumn(pPa
11560 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 54 61 62  rse, pExpr->pTab
11570 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11590 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
115a0 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  n, pExpr->iTable
115b0 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20  , target,.      
115c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115d0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
115e0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 41 6e 79  ->flags & EP_Any
115f0 41 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Aff);.      }.  
11600 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11610 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
11620 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f  EGER: {.      co
11630 64 65 49 6e 74 65 67 65 72 28 76 2c 20 70 45 78  deInteger(v, pEx
11640 70 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  pr, 0, target);.
11650 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11660 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46   }.    case TK_F
11670 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  LOAT: {.      as
11680 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
11690 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
116a0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
116b0 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20      codeReal(v, 
116c0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
116d0 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
116e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
116f0 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
11700 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  NG: {.      asse
11710 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
11720 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
11730 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
11740 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11750 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  Op4(v, OP_String
11760 38 2c 20 30 2c 20 74 61 72 67 65 74 2c 20 30 2c  8, 0, target, 0,
11770 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
11780 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
11790 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
117a0 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  e TK_NULL: {.   
117b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
117c0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
117d0 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
117e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
117f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11800 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c  MIT_BLOB_LITERAL
11810 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
11820 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  B: {.      int n
11830 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
11840 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61  ar *z;.      cha
11850 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20  r *zBlob;.      
11860 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
11870 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
11880 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
11890 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
118a0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d  xpr->u.zToken[0]
118b0 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e  =='x' || pExpr->
118c0 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27  u.zToken[0]=='X'
118d0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
118e0 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
118f0 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20  n[1]=='\'' );.  
11900 20 20 20 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e      z = &pExpr->
11910 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20  u.zToken[2];.   
11920 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74     n = sqlite3St
11930 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20  rlen30(z) - 1;. 
11940 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b 6e       assert( z[n
11950 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20  ]=='\'' );.     
11960 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   zBlob = sqlite3
11970 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65  HexToBlob(sqlite
11980 33 56 64 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e  3VdbeDb(v), z, n
11990 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
119a0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
119b0 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67  _Blob, n/2, targ
119c0 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34  et, 0, zBlob, P4
119d0 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
119e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
119f0 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
11a00 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20  _VARIABLE: {.   
11a10 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a     VdbeOp *pOp;.
11a20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
11a30 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
11a40 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
11a50 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  e) );.      asse
11a60 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
11a70 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ken!=0 );.      
11a80 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
11a90 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b  .zToken[0]!=0 );
11aa0 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
11ab0 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 30  ->u.zToken[1]==0
11ac0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 4f  .         && (pO
11ad0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47  p = sqlite3VdbeG
11ae0 65 74 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f 70  etOp(v, -1))->op
11af0 63 6f 64 65 3d 3d 4f 50 5f 56 61 72 69 61 62 6c  code==OP_Variabl
11b00 65 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4f  e.         && pO
11b10 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70 33 3d 3d 70  p->p1+pOp->p3==p
11b20 45 78 70 72 2d 3e 69 54 61 62 6c 65 0a 20 20 20  Expr->iTable.   
11b30 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 32        && pOp->p2
11b40 2b 70 4f 70 2d 3e 70 33 3d 3d 74 61 72 67 65 74  +pOp->p3==target
11b50 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4f 70  .         && pOp
11b60 2d 3e 70 34 2e 7a 3d 3d 30 0a 20 20 20 20 20 20  ->p4.z==0.      
11b70 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
11b80 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e   the previous in
11b90 73 74 72 75 63 74 69 6f 6e 20 77 61 73 20 61 20  struction was a 
11ba0 63 6f 70 79 20 6f 66 20 74 68 65 20 70 72 65 76  copy of the prev
11bb0 69 6f 75 73 20 75 6e 6e 61 6d 65 64 0a 20 20 20  ious unnamed.   
11bc0 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65       ** paramete
11bd0 72 20 69 6e 74 6f 20 74 68 65 20 70 72 65 76 69  r into the previ
11be0 6f 75 73 20 72 65 67 69 73 74 65 72 2c 20 74 68  ous register, th
11bf0 65 6e 20 73 69 6d 70 6c 79 20 69 6e 63 72 65 6d  en simply increm
11c00 65 6e 74 20 74 68 65 0a 20 20 20 20 20 20 20 20  ent the.        
11c10 2a 2a 20 72 65 70 65 61 74 20 63 6f 75 6e 74 20  ** repeat count 
11c20 6f 6e 20 74 68 65 20 70 72 69 6f 72 20 69 6e 73  on the prior ins
11c30 74 72 75 63 74 69 6f 6e 20 72 61 74 68 65 72 20  truction rather 
11c40 74 68 61 6e 20 6d 61 6b 69 6e 67 20 61 20 6e 65  than making a ne
11c50 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73  w.        ** ins
11c60 74 72 75 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  truction..      
11c70 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4f 70    */.        pOp
11c80 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  ->p3++;.      }e
11c90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
11ca0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
11cb0 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70  , OP_Variable, p
11cc0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61  Expr->iTable, ta
11cd0 72 67 65 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  rget, 1);.      
11ce0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a    if( pExpr->u.z
11cf0 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20  Token[1]!=0 ){. 
11d00 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11d10 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
11d20 2d 31 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  -1, pExpr->u.zTo
11d30 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ken, 0);.       
11d40 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
11d50 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
11d60 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54    case TK_REGIST
11d70 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65  ER: {.      inRe
11d80 67 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  g = pExpr->iTabl
11d90 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e;.      break;.
11da0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
11db0 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_AS: {.      in
11dc0 52 65 67 20 3d 20 63 6f 64 65 41 6c 69 61 73 28  Reg = codeAlias(
11dd0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 69  pParse, pExpr->i
11de0 54 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Table, pExpr->pL
11df0 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  eft, target);.  
11e00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11e10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11e20 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61  OMIT_CAST.    ca
11e30 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20  se TK_CAST: {.  
11e40 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
11e50 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20  ns of the form: 
11e60 20 20 43 41 53 54 28 70 4c 65 66 74 20 41 53 20    CAST(pLeft AS 
11e70 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20  token) */.      
11e80 69 6e 74 20 61 66 66 2c 20 74 6f 5f 6f 70 3b 0a  int aff, to_op;.
11e90 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
11ea0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
11eb0 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
11ec0 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
11ed0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
11ee0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
11ef0 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
11f00 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61  alue) );.      a
11f10 66 66 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69  ff = sqlite3Affi
11f20 6e 69 74 79 54 79 70 65 28 70 45 78 70 72 2d 3e  nityType(pExpr->
11f30 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
11f40 20 74 6f 5f 6f 70 20 3d 20 61 66 66 20 2d 20 53   to_op = aff - S
11f50 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 2b  QLITE_AFF_TEXT +
11f60 20 4f 50 5f 54 6f 54 65 78 74 3b 0a 20 20 20 20   OP_ToText;.    
11f70 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d    assert( to_op=
11f80 3d 4f 50 5f 54 6f 54 65 78 74 20 20 20 20 7c 7c  =OP_ToText    ||
11f90 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46   aff!=SQLITE_AFF
11fa0 5f 54 45 58 54 20 20 20 20 29 3b 0a 20 20 20 20  _TEXT    );.    
11fb0 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d    assert( to_op=
11fc0 3d 4f 50 5f 54 6f 42 6c 6f 62 20 20 20 20 7c 7c  =OP_ToBlob    ||
11fd0 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46   aff!=SQLITE_AFF
11fe0 5f 4e 4f 4e 45 20 20 20 20 29 3b 0a 20 20 20 20  _NONE    );.    
11ff0 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d    assert( to_op=
12000 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 20 7c 7c  =OP_ToNumeric ||
12010 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46   aff!=SQLITE_AFF
12020 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20 20  _NUMERIC );.    
12030 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d    assert( to_op=
12040 3d 4f 50 5f 54 6f 49 6e 74 20 20 20 20 20 7c 7c  =OP_ToInt     ||
12050 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46   aff!=SQLITE_AFF
12060 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20  _INTEGER );.    
12070 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d    assert( to_op=
12080 3d 4f 50 5f 54 6f 52 65 61 6c 20 20 20 20 7c 7c  =OP_ToReal    ||
12090 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46   aff!=SQLITE_AFF
120a0 5f 52 45 41 4c 20 20 20 20 29 3b 0a 20 20 20 20  _REAL    );.    
120b0 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f    testcase( to_o
120c0 70 3d 3d 4f 50 5f 54 6f 54 65 78 74 20 29 3b 0a  p==OP_ToText );.
120d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
120e0 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62  to_op==OP_ToBlob
120f0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
12100 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  se( to_op==OP_To
12110 4e 75 6d 65 72 69 63 20 29 3b 0a 20 20 20 20 20  Numeric );.     
12120 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70   testcase( to_op
12130 3d 3d 4f 50 5f 54 6f 49 6e 74 20 29 3b 0a 20 20  ==OP_ToInt );.  
12140 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f      testcase( to
12150 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 29  _op==OP_ToReal )
12160 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52 65  ;.      if( inRe
12170 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20  g!=target ){.   
12180 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12190 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
121a0 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65  py, inReg, targe
121b0 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65  t);.        inRe
121c0 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20  g = target;.    
121d0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
121e0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 74  3VdbeAddOp1(v, t
121f0 6f 5f 6f 70 2c 20 69 6e 52 65 67 29 3b 0a 20 20  o_op, inReg);.  
12200 20 20 20 20 74 65 73 74 63 61 73 65 28 20 75 73      testcase( us
12210 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28  edAsColumnCache(
12220 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 69  pParse, inReg, i
12230 6e 52 65 67 29 20 29 3b 0a 20 20 20 20 20 20 73  nReg) );.      s
12240 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
12250 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
12260 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 31 29 3b  arse, inReg, 1);
12270 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12280 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
12290 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a  LITE_OMIT_CAST *
122a0 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  /.    case TK_LT
122b0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
122c0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
122d0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
122e0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
122f0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
12300 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
12310 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29  ( TK_LT==OP_Lt )
12320 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
12330 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a  TK_LE==OP_Le );.
12340 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
12350 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20  _GT==OP_Gt );.  
12360 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
12370 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20  E==OP_Ge );.    
12380 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d    assert( TK_EQ=
12390 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20  =OP_Eq );.      
123a0 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f  assert( TK_NE==O
123b0 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 74 65  P_Ne );.      te
123c0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c  stcase( op==TK_L
123d0 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
123e0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29  ase( op==TK_LE )
123f0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
12400 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20  ( op==TK_GT );. 
12410 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
12420 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20  p==TK_GE );.    
12430 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
12440 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 74  TK_EQ );.      t
12450 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
12460 4e 45 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  NE );.      code
12470 43 6f 6d 70 61 72 65 4f 70 65 72 61 6e 64 73 28  CompareOperands(
12480 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
12490 4c 65 66 74 2c 20 26 72 31 2c 20 26 72 65 67 46  Left, &r1, &regF
124a0 72 65 65 31 2c 0a 20 20 20 20 20 20 20 20 20 20  ree1,.          
124b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124c0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
124d0 52 69 67 68 74 2c 20 26 72 32 2c 20 26 72 65 67  Right, &r2, &reg
124e0 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f  Free2);.      co
124f0 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
12500 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
12510 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
12520 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
12530 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52       r1, r2, inR
12540 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  eg, SQLITE_STORE
12550 50 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  P2);.      testc
12560 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
12570 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
12580 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
12590 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
125a0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
125b0 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20  K_AND:.    case 
125c0 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20  TK_OR:.    case 
125d0 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73  TK_PLUS:.    cas
125e0 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63  e TK_STAR:.    c
125f0 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20  ase TK_MINUS:.  
12600 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20    case TK_REM:. 
12610 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e     case TK_BITAN
12620 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  D:.    case TK_B
12630 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54  ITOR:.    case T
12640 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73  K_SLASH:.    cas
12650 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20  e TK_LSHIFT:.   
12660 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a   case TK_RSHIFT:
12670 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f   .    case TK_CO
12680 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  NCAT: {.      as
12690 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50  sert( TK_AND==OP
126a0 5f 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61 73  _And );.      as
126b0 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f  sert( TK_OR==OP_
126c0 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Or );.      asse
126d0 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f  rt( TK_PLUS==OP_
126e0 41 64 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Add );.      ass
126f0 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f  ert( TK_MINUS==O
12700 50 5f 53 75 62 74 72 61 63 74 20 29 3b 0a 20 20  P_Subtract );.  
12710 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52      assert( TK_R
12720 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72  EM==OP_Remainder
12730 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
12740 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f  ( TK_BITAND==OP_
12750 42 69 74 41 6e 64 20 29 3b 0a 20 20 20 20 20 20  BitAnd );.      
12760 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52  assert( TK_BITOR
12770 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 0a 20 20  ==OP_BitOr );.  
12780 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53      assert( TK_S
12790 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20  LASH==OP_Divide 
127a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
127b0 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53   TK_LSHIFT==OP_S
127c0 68 69 66 74 4c 65 66 74 20 29 3b 0a 20 20 20 20  hiftLeft );.    
127d0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48    assert( TK_RSH
127e0 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67  IFT==OP_ShiftRig
127f0 68 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ht );.      asse
12800 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f  rt( TK_CONCAT==O
12810 50 5f 43 6f 6e 63 61 74 20 29 3b 0a 20 20 20 20  P_Concat );.    
12820 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
12830 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 20 20  TK_AND );.      
12840 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
12850 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _OR );.      tes
12860 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c  tcase( op==TK_PL
12870 55 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  US );.      test
12880 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e  case( op==TK_MIN
12890 55 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  US );.      test
128a0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d  case( op==TK_REM
128b0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
128c0 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e  se( op==TK_BITAN
128d0 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  D );.      testc
128e0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f  ase( op==TK_BITO
128f0 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  R );.      testc
12900 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53  ase( op==TK_SLAS
12910 48 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  H );.      testc
12920 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49  ase( op==TK_LSHI
12930 46 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  FT );.      test
12940 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48  case( op==TK_RSH
12950 49 46 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  IFT );.      tes
12960 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f  tcase( op==TK_CO
12970 4e 43 41 54 20 29 3b 0a 20 20 20 20 20 20 72 31  NCAT );.      r1
12980 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
12990 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
129a0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
129b0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
129c0 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
129d0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
129e0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
129f0 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
12a00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12a10 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31  p3(v, op, r2, r1
12a20 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
12a30 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
12a40 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
12a50 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
12a60 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
12a70 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
12a80 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
12a90 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  {.      Expr *pL
12aa0 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
12ab0 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ft;.      assert
12ac0 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  ( pLeft );.     
12ad0 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d   if( pLeft->op==
12ae0 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20  TK_FLOAT ){.    
12af0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
12b00 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
12b10 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
12b20 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   );.        code
12b30 52 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75  Real(v, pLeft->u
12b40 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67  .zToken, 1, targ
12b50 65 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  et);.      }else
12b60 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d   if( pLeft->op==
12b70 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20  TK_INTEGER ){.  
12b80 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65        codeIntege
12b90 72 28 76 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74  r(v, pLeft, 1, t
12ba0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 65  arget);.      }e
12bb0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 67  lse{.        reg
12bc0 46 72 65 65 31 20 3d 20 72 31 20 3d 20 73 71 6c  Free1 = r1 = sql
12bd0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
12be0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
12bf0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12c00 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
12c10 20 30 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20   0, r1);.       
12c20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
12c30 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
12c40 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
12c50 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
12c60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12c70 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74  ddOp3(v, OP_Subt
12c80 72 61 63 74 2c 20 72 32 2c 20 72 31 2c 20 74 61  ract, r2, r1, ta
12c90 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 74  rget);.        t
12ca0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
12cb0 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  2==0 );.      }.
12cc0 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61        inReg = ta
12cd0 72 67 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61  rget;.      brea
12ce0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
12cf0 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20  e TK_BITNOT:.   
12d00 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
12d10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
12d20 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e  _BITNOT==OP_BitN
12d30 6f 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ot );.      asse
12d40 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e  rt( TK_NOT==OP_N
12d50 6f 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ot );.      test
12d60 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54  case( op==TK_BIT
12d70 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  NOT );.      tes
12d80 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
12d90 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  T );.      r1 = 
12da0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
12db0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
12dc0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
12dd0 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ee1);.      test
12de0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
12df0 30 20 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67  0 );.      inReg
12e00 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20   = target;.     
12e10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12e20 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e  p2(v, op, r1, in
12e30 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Reg);.      brea
12e40 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
12e50 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
12e60 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
12e70 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
12e80 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  dr;.      assert
12e90 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f  ( TK_ISNULL==OP_
12ea0 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20  IsNull );.      
12eb0 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55  assert( TK_NOTNU
12ec0 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  LL==OP_NotNull )
12ed0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
12ee0 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op==TK_ISNULL 
12ef0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
12f00 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
12f10 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  L );.      sqlit
12f20 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12f30 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74  OP_Integer, 1, t
12f40 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 31  arget);.      r1
12f50 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
12f60 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
12f70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
12f80 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74  gFree1);.      t
12f90 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
12fa0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64  1==0 );.      ad
12fb0 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
12fc0 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31  AddOp1(v, op, r1
12fd0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12fe0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12ff0 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c  _AddImm, target,
13000 20 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   -1);.      sqli
13010 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
13020 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20  v, addr);.      
13030 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
13040 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
13050 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41  CTION: {.      A
13060 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20  ggInfo *pInfo = 
13070 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b  pExpr->pAggInfo;
13080 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f  .      if( pInfo
13090 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
130a0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
130b0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
130c0 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
130d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
130e0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
130f0 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65 67  misuse of aggreg
13100 61 74 65 3a 20 25 73 28 29 22 2c 20 70 45 78 70  ate: %s()", pExp
13110 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
13120 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13130 20 20 20 69 6e 52 65 67 20 3d 20 70 49 6e 66 6f     inReg = pInfo
13140 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69  ->aFunc[pExpr->i
13150 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20  Agg].iMem;.     
13160 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
13170 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
13180 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20  K_CONST_FUNC:.  
13190 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
131a0 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  ON: {.      Expr
131b0 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20 20  List *pFarg;    
131c0 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75     /* List of fu
131d0 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
131e0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 46   */.      int nF
131f0 61 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  arg;            
13200 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75   /* Number of fu
13210 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
13220 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65   */.      FuncDe
13230 66 20 2a 70 44 65 66 3b 20 20 20 20 20 20 20 20  f *pDef;        
13240 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e   /* The function
13250 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 62 6a 65   definition obje
13260 63 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ct */.      int 
13270 6e 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  nId;            
13280 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
13290 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  the function nam
132a0 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
132b0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
132c0 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  zId;       /* Th
132d0 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  e function name 
132e0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 6e  */.      int con
132f0 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20  stMask = 0;     
13300 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74  /* Mask of funct
13310 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 68  ion arguments th
13320 61 74 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 20  at are constant 
13330 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20  */.      int i; 
13340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13350 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
13360 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20  */.      u8 enc 
13370 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20 20  = ENC(db);      
13380 2f 2a 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f  /* The text enco
13390 64 69 6e 67 20 75 73 65 64 20 62 79 20 74 68 69  ding used by thi
133a0 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  s database */.  
133b0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
133c0 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20  ll = 0;    /* A 
133d0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
133e0 63 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73  ce */..      ass
133f0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
13400 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
13410 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
13420 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
13430 3d 3d 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 20  ==TK_CONST_FUNC 
13440 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
13450 65 28 20 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49  e( op==TK_FUNCTI
13460 4f 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ON );.      if( 
13470 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
13480 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b  ty(pExpr, EP_Tok
13490 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  enOnly) ){.     
134a0 20 20 20 70 46 61 72 67 20 3d 20 30 3b 0a 20 20     pFarg = 0;.  
134b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
134c0 20 20 20 70 46 61 72 67 20 3d 20 70 45 78 70 72     pFarg = pExpr
134d0 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20  ->x.pList;.     
134e0 20 7d 0a 20 20 20 20 20 20 6e 46 61 72 67 20 3d   }.      nFarg =
134f0 20 70 46 61 72 67 20 3f 20 70 46 61 72 67 2d 3e   pFarg ? pFarg->
13500 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20  nExpr : 0;.     
13510 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
13520 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
13530 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
13540 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 70 45 78  .      zId = pEx
13550 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
13560 20 20 20 20 6e 49 64 20 3d 20 73 71 6c 69 74 65      nId = sqlite
13570 33 53 74 72 6c 65 6e 33 30 28 7a 49 64 29 3b 0a  3Strlen30(zId);.
13580 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
13590 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
135a0 28 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e  (db, zId, nId, n
135b0 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 20  Farg, enc, 0);. 
135c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65       assert( pDe
135d0 66 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  f!=0 );.      if
135e0 28 20 70 46 61 72 67 20 29 7b 0a 20 20 20 20 20  ( pFarg ){.     
135f0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
13600 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
13610 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20  se, nFarg);.    
13620 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
13630 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
13640 73 65 2c 20 70 46 61 72 67 2c 20 72 31 2c 20 31  se, pFarg, r1, 1
13650 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
13660 20 20 20 20 20 20 20 20 72 31 20 3d 20 30 3b 0a          r1 = 0;.
13670 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
13680 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
13690 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f  UALTABLE.      /
136a0 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c  * Possibly overl
136b0 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  oad the function
136c0 20 69 66 20 74 68 65 20 66 69 72 73 74 20 61 72   if the first ar
136d0 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20  gument is.      
136e0 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ** a virtual tab
136f0 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20  le column..     
13700 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72   **.      ** For
13710 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73   infix functions
13720 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45   (LIKE, GLOB, RE
13730 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29  GEXP, and MATCH)
13740 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a   use the.      *
13750 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  * second argumen
13760 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74  t, not the first
13770 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e  , as the argumen
13780 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20  t to test to.   
13790 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20     ** see if it 
137a0 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61  is a column in a
137b0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
137c0 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   This is done be
137d0 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74  cause.      ** t
137e0 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20  he left operand 
137f0 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f  of infix functio
13800 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20  ns (the operand 
13810 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20  we want to.     
13820 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72   ** control over
13830 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70  loading) ends up
13840 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
13850 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20  rgument to the. 
13860 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
13870 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  .  The expressio
13880 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20  n "A glob B" is 
13890 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20  equivalent to . 
138a0 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c       ** "glob(B,
138b0 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20  A).  We want to 
138c0 75 73 65 20 74 68 65 20 41 20 69 6e 20 22 41 20  use the A in "A 
138d0 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a  glob B" to test.
138e0 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e        ** for fun
138f0 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e  ction overloadin
13900 67 2e 20 20 42 75 74 20 77 65 20 75 73 65 20 74  g.  But we use t
13910 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c  he B term in "gl
13920 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20  ob(B,A)"..      
13930 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61  */.      if( nFa
13940 72 67 3e 3d 32 20 26 26 20 28 70 45 78 70 72 2d  rg>=2 && (pExpr-
13950 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 66 69  >flags & EP_Infi
13960 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20  xFunc) ){.      
13970 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
13980 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63  VtabOverloadFunc
13990 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e  tion(db, pDef, n
139a0 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 31  Farg, pFarg->a[1
139b0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
139c0 7d 65 6c 73 65 20 69 66 28 20 6e 46 61 72 67 3e  }else if( nFarg>
139d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
139e0 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f  f = sqlite3VtabO
139f0 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28  verloadFunction(
13a00 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c  db, pDef, nFarg,
13a10 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
13a20 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  pr);.      }.#en
13a30 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  dif.      for(i=
13a40 30 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29  0; i<nFarg; i++)
13a50 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c  {.        if( i<
13a60 33 32 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  32 && sqlite3Exp
13a70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 46 61 72  rIsConstant(pFar
13a80 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  g->a[i].pExpr) )
13a90 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  {.          cons
13aa0 74 4d 61 73 6b 20 7c 3d 20 28 31 3c 3c 69 29 3b  tMask |= (1<<i);
13ab0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13ac0 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 6c     if( (pDef->fl
13ad0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
13ae0 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26  C_NEEDCOLL)!=0 &
13af0 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  & !pColl ){.    
13b00 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
13b10 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
13b20 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
13b30 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
13b40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
13b50 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
13b60 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
13b70 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20  NC_NEEDCOLL ){. 
13b80 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
13b90 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
13ba0 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20  pDfltColl; .    
13bb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13bc0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c  ddOp4(v, OP_Coll
13bd0 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63  Seq, 0, 0, 0, (c
13be0 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
13bf0 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
13c00 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
13c10 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
13c20 46 75 6e 63 74 69 6f 6e 2c 20 63 6f 6e 73 74 4d  Function, constM
13c30 61 73 6b 2c 20 72 31 2c 20 74 61 72 67 65 74 2c  ask, r1, target,
13c40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13c50 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
13c60 70 44 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46  pDef, P4_FUNCDEF
13c70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13c80 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
13c90 28 75 38 29 6e 46 61 72 67 29 3b 0a 20 20 20 20  (u8)nFarg);.    
13ca0 20 20 69 66 28 20 6e 46 61 72 67 20 29 7b 0a 20    if( nFarg ){. 
13cb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
13cc0 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
13cd0 50 61 72 73 65 2c 20 72 31 2c 20 6e 46 61 72 67  Parse, r1, nFarg
13ce0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
13cf0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
13d00 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
13d10 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 46 61 72  pParse, r1, nFar
13d20 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
13d30 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
13d40 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
13d50 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
13d60 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65  EXISTS:.    case
13d70 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
13d80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
13d90 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20  ==TK_EXISTS );. 
13da0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
13db0 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
13dc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
13dd0 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
13de0 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 30 29 3b  e, pExpr, 0, 0);
13df0 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70  .      inReg = p
13e00 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
13e10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13e20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
13e30 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 4e  : {.      int rN
13e40 6f 74 46 6f 75 6e 64 20 3d 20 30 3b 0a 20 20 20  otFound = 0;.   
13e50 20 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e     int rMayHaveN
13e60 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ull = 0;.      i
13e70 6e 74 20 6a 32 2c 20 6a 33 2c 20 6a 34 2c 20 6a  nt j2, j3, j4, j
13e80 35 3b 0a 20 20 20 20 20 20 63 68 61 72 20 61 66  5;.      char af
13e90 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 69 6e  finity;.      in
13ea0 74 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 20 20  t eType;..      
13eb0 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
13ec0 28 76 2c 20 22 62 65 67 69 6e 20 49 4e 20 65 78  (v, "begin IN ex
13ed0 70 72 20 72 25 64 22 2c 20 74 61 72 67 65 74 29  pr r%d", target)
13ee0 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d  );.      eType =
13ef0 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
13f00 64 65 78 28 70 50 61 72 73 65 2c 20 70 45 78 70  dex(pParse, pExp
13f10 72 2c 20 26 72 4d 61 79 48 61 76 65 4e 75 6c 6c  r, &rMayHaveNull
13f20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 4d 61  );.      if( rMa
13f30 79 48 61 76 65 4e 75 6c 6c 20 29 7b 0a 20 20 20  yHaveNull ){.   
13f40 20 20 20 20 20 72 4e 6f 74 46 6f 75 6e 64 20 3d       rNotFound =
13f50 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
13f60 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
13f70 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  /* Figure out th
13f80 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73  e affinity to us
13f90 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 6b 65  e to create a ke
13fa0 79 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c  y from the resul
13fb0 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  ts.      ** of t
13fc0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 61  he expression. a
13fd0 66 66 69 6e 69 74 79 53 74 72 20 73 74 6f 72 65  ffinityStr store
13fe0 73 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e  s a static strin
13ff0 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0a 20  g suitable for. 
14000 20 20 20 20 20 2a 2a 20 50 34 20 6f 66 20 4f 50       ** P4 of OP
14010 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20 20 20  _MakeRecord..   
14020 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 69     */.      affi
14030 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72 69 73 6f  nity = compariso
14040 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  nAffinity(pExpr)
14050 3b 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64  ;...      /* Cod
14060 65 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f  e the <expr> fro
14070 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e  m "<expr> IN (..
14080 2e 29 22 2e 20 54 68 65 20 74 65 6d 70 6f 72 61  .)". The tempora
14090 72 79 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a  ry table.      *
140a0 2a 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  * pExpr->iTable 
140b0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c  contains the val
140c0 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70  ues that make up
140d0 20 74 68 65 20 28 2e 2e 2e 29 20 73 65 74 2e 0a   the (...) set..
140e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
140f0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
14100 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
14110 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
14120 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
14130 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29  ->pLeft, target)
14140 3b 0a 20 20 20 20 20 20 6a 32 20 3d 20 73 71 6c  ;.      j2 = sql
14150 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
14160 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 74 61 72  , OP_IsNull, tar
14170 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  get);.      if( 
14180 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
14190 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20  ROWID ){.       
141a0 20 6a 33 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j3 = sqlite3Vdb
141b0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75  eAddOp1(v, OP_Mu
141c0 73 74 42 65 49 6e 74 2c 20 74 61 72 67 65 74 29  stBeInt, target)
141d0 3b 0a 20 20 20 20 20 20 20 20 6a 34 20 3d 20 73  ;.        j4 = s
141e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
141f0 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  (v, OP_NotExists
14200 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
14210 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
14220 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14230 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
14240 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29  eger, 1, target)
14250 3b 0a 20 20 20 20 20 20 20 20 6a 35 20 3d 20 73  ;.        j5 = s
14260 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
14270 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20  (v, OP_Goto);.  
14280 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14290 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 33 29  eJumpHere(v, j3)
142a0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
142b0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
142c0 20 6a 34 29 3b 0a 20 20 20 20 20 20 20 20 73 71   j4);.        sq
142d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
142e0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
142f0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
14300 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14310 72 32 20 3d 20 72 65 67 46 72 65 65 32 20 3d 20  r2 = regFree2 = 
14320 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
14330 67 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20  g(pParse);..    
14340 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
14350 72 65 63 6f 72 64 20 61 6e 64 20 74 65 73 74 20  record and test 
14360 66 6f 72 20 73 65 74 20 6d 65 6d 62 65 72 73 68  for set membersh
14370 69 70 2e 20 49 66 20 74 68 65 20 73 65 74 20 63  ip. If the set c
14380 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 20 20  ontains.        
14390 2a 2a 20 74 68 65 20 76 61 6c 75 65 2c 20 74 68  ** the value, th
143a0 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65  en jump to the e
143b0 6e 64 20 6f 66 20 74 68 65 20 74 65 73 74 20 63  nd of the test c
143c0 6f 64 65 2e 20 54 68 65 20 74 61 72 67 65 74 0a  ode. The target.
143d0 20 20 20 20 20 20 20 20 2a 2a 20 72 65 67 69 73          ** regis
143e0 74 65 72 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69  ter still contai
143f0 6e 73 20 74 68 65 20 74 72 75 65 20 28 31 29 20  ns the true (1) 
14400 76 61 6c 75 65 20 77 72 69 74 74 65 6e 20 74 6f  value written to
14410 20 69 74 20 65 61 72 6c 69 65 72 2e 0a 20 20 20   it earlier..   
14420 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
14430 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14440 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
14450 72 64 2c 20 74 61 72 67 65 74 2c 20 31 2c 20 72  rd, target, 1, r
14460 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29  2, &affinity, 1)
14470 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
14480 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14490 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61  P_Integer, 1, ta
144a0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6a  rget);.        j
144b0 35 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  5 = sqlite3VdbeA
144c0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 46 6f 75 6e  ddOp3(v, OP_Foun
144d0 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
144e0 2c 20 30 2c 20 72 32 29 3b 0a 0a 20 20 20 20 20  , 0, r2);..     
144f0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 74     /* If the set
14500 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74   membership test
14510 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65   fails, then the
14520 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 0a   result of the .
14530 20 20 20 20 20 20 20 20 2a 2a 20 22 78 20 49 4e          ** "x IN
14540 20 28 2e 2e 2e 29 22 20 65 78 70 72 65 73 73 69   (...)" expressi
14550 6f 6e 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  on must be eithe
14560 72 20 30 20 6f 72 20 4e 55 4c 4c 2e 20 49 66 20  r 0 or NULL. If 
14570 74 68 65 20 73 65 74 0a 20 20 20 20 20 20 20 20  the set.        
14580 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e  ** contains no N
14590 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65 6e  ULL values, then
145a0 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 30   the result is 0
145b0 2e 20 49 66 20 74 68 65 20 73 65 74 20 0a 20 20  . If the set .  
145c0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
145d0 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55  s one or more NU
145e0 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65 6e 20  LL values, then 
145f0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
14600 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70  e.        ** exp
14610 72 65 73 73 69 6f 6e 20 69 73 20 61 6c 73 6f 20  ression is also 
14620 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 2a 2f  NULL..        */
14630 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 4e 6f  .        if( rNo
14640 74 46 6f 75 6e 64 3d 3d 30 20 29 7b 0a 20 20 20  tFound==0 ){.   
14650 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
14660 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20 69 74  ranch runs if it
14670 20 69 73 20 6b 6e 6f 77 6e 20 61 74 20 63 6f 6d   is known at com
14680 70 69 6c 65 20 74 69 6d 65 20 28 6e 6f 77 29 20  pile time (now) 
14690 74 68 61 74 20 0a 20 20 20 20 20 20 20 20 20 20  that .          
146a0 2a 2a 20 74 68 65 20 73 65 74 20 63 6f 6e 74 61  ** the set conta
146b0 69 6e 73 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75  ins no NULL valu
146c0 65 73 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73  es. This happens
146d0 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 0a 20   as the result. 
146e0 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61           ** of a
146f0 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73   "NOT NULL" cons
14700 74 72 61 69 6e 74 20 69 6e 20 74 68 65 20 64 61  traint in the da
14710 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 4e  tabase schema. N
14720 6f 20 6e 65 65 64 0a 20 20 20 20 20 20 20 20 20  o need.         
14730 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20   ** to test the 
14740 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 61  data structure a
14750 74 20 72 75 6e 74 69 6d 65 20 69 6e 20 74 68 69  t runtime in thi
14760 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20  s case..        
14770 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73    */.          s
14780 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14790 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
147a0 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
147b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
147c0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f       /* This blo
147d0 63 6b 20 70 6f 70 75 6c 61 74 65 73 20 74 68 65  ck populates the
147e0 20 72 4e 6f 74 46 6f 75 6e 64 20 72 65 67 69 73   rNotFound regis
147f0 74 65 72 20 77 69 74 68 20 65 69 74 68 65 72 20  ter with either 
14800 4e 55 4c 4c 0a 20 20 20 20 20 20 20 20 20 20 2a  NULL.          *
14810 2a 20 6f 72 20 30 20 28 61 6e 20 69 6e 74 65 67  * or 0 (an integ
14820 65 72 20 76 61 6c 75 65 29 2e 20 49 66 20 74 68  er value). If th
14830 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
14840 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 0a 20 20   contains one.  
14850 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 6d 6f          ** or mo
14860 72 65 20 4e 55 4c 4c 73 2c 20 74 68 65 6e 20 73  re NULLs, then s
14870 65 74 20 72 4e 6f 74 46 6f 75 6e 64 20 74 6f 20  et rNotFound to 
14880 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73 65 2c  NULL. Otherwise,
14890 20 73 65 74 20 69 74 0a 20 20 20 20 20 20 20 20   set it.        
148a0 20 20 2a 2a 20 74 6f 20 30 2e 20 49 66 20 72 65    ** to 0. If re
148b0 67 69 73 74 65 72 20 72 4d 61 79 48 61 76 65 4e  gister rMayHaveN
148c0 75 6c 6c 20 69 73 20 61 6c 72 65 61 64 79 20 73  ull is already s
148d0 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65  et to some value
148e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 74  .          ** ot
148f0 68 65 72 20 74 68 61 6e 20 4e 55 4c 4c 2c 20 74  her than NULL, t
14900 68 65 6e 20 74 68 65 20 74 65 73 74 20 68 61 73  hen the test has
14910 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 75   already been ru
14920 6e 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20 20  n and .         
14930 20 2a 2a 20 72 4e 6f 74 46 6f 75 6e 64 20 69 73   ** rNotFound is
14940 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74   already populat
14950 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ed..          */
14960 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69  .          stati
14970 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6e 75 6c  c const char nul
14980 6c 52 65 63 6f 72 64 5b 5d 20 3d 20 7b 20 30 78  lRecord[] = { 0x
14990 30 32 2c 20 30 78 30 30 20 7d 3b 0a 20 20 20 20  02, 0x00 };.    
149a0 20 20 20 20 20 20 6a 33 20 3d 20 73 71 6c 69 74        j3 = sqlit
149b0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
149c0 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 4d 61 79  OP_NotNull, rMay
149d0 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  HaveNull);.     
149e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
149f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
14a00 6c 2c 20 30 2c 20 72 4e 6f 74 46 6f 75 6e 64 29  l, 0, rNotFound)
14a10 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
14a20 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
14a30 20 4f 50 5f 42 6c 6f 62 2c 20 32 2c 20 72 4d 61   OP_Blob, 2, rMa
14a40 79 48 61 76 65 4e 75 6c 6c 2c 20 30 2c 20 0a 20  yHaveNull, 0, . 
14a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a60 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6c 6c              null
14a70 52 65 63 6f 72 64 2c 20 50 34 5f 53 54 41 54 49  Record, P4_STATI
14a80 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 34  C);.          j4
14a90 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
14aa0 64 4f 70 33 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  dOp3(v, OP_Found
14ab0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
14ac0 20 30 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c   0, rMayHaveNull
14ad0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
14ae0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14af0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
14b00 20 72 4e 6f 74 46 6f 75 6e 64 29 3b 0a 20 20 20   rNotFound);.   
14b10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14b20 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 34  beJumpHere(v, j4
14b30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
14b40 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
14b50 28 76 2c 20 6a 33 29 3b 0a 0a 20 20 20 20 20 20  (v, j3);..      
14b60 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20      /* Copy the 
14b70 76 61 6c 75 65 20 6f 66 20 72 65 67 69 73 74 65  value of registe
14b80 72 20 72 4e 6f 74 46 6f 75 6e 64 20 28 77 68 69  r rNotFound (whi
14b90 63 68 20 69 73 20 65 69 74 68 65 72 20 4e 55 4c  ch is either NUL
14ba0 4c 20 6f 72 20 30 29 0a 20 20 20 20 20 20 20 20  L or 0).        
14bb0 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 74 61    ** into the ta
14bc0 72 67 65 74 20 72 65 67 69 73 74 65 72 2e 20 54  rget register. T
14bd0 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20  his will be the 
14be0 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20  result of the.  
14bf0 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65          ** expre
14c00 73 73 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 20  ssion..         
14c10 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
14c20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14c30 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 4e 6f 74  v, OP_Copy, rNot
14c40 46 6f 75 6e 64 2c 20 74 61 72 67 65 74 29 3b 0a  Found, target);.
14c50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14c60 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
14c70 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
14c80 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
14c90 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
14ca0 20 6a 35 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   j5);.      sqli
14cb0 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
14cc0 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20  pParse, 1);.    
14cd0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
14ce0 2c 20 22 65 6e 64 20 49 4e 20 65 78 70 72 20 72  , "end IN expr r
14cf0 25 64 22 2c 20 74 61 72 67 65 74 29 29 3b 0a 20  %d", target));. 
14d00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14d10 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 0a  }.#endif.    /*.
14d20 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57      **    x BETW
14d30 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20  EEN y AND z.    
14d40 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  **.    ** This i
14d50 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a  s equivalent to.
14d60 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
14d70 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20   x>=y AND x<=z. 
14d80 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69     **.    ** X i
14d90 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70  s stored in pExp
14da0 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a  r->pLeft..    **
14db0 20 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   Y is stored in 
14dc0 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
14dd0 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a  0].pExpr..    **
14de0 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   Z is stored in 
14df0 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
14e00 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f  1].pExpr..    */
14e10 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
14e20 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  WEEN: {.      Ex
14e30 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
14e40 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
14e50 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
14e60 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20 70  item *pLItem = p
14e70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
14e80 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  ;.      Expr *pR
14e90 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70  ight = pLItem->p
14ea0 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 63 6f 64  Expr;..      cod
14eb0 65 43 6f 6d 70 61 72 65 4f 70 65 72 61 6e 64 73  eCompareOperands
14ec0 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
14ed0 26 72 31 2c 20 26 72 65 67 46 72 65 65 31 2c 0a  &r1, &regFree1,.
14ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f00 20 20 70 52 69 67 68 74 2c 20 26 72 32 2c 20 26    pRight, &r2, &
14f10 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
14f20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
14f30 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
14f40 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
14f50 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  e2==0 );.      r
14f60 33 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  3 = sqlite3GetTe
14f70 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
14f80 20 20 20 20 20 72 34 20 3d 20 73 71 6c 69 74 65       r4 = sqlite
14f90 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
14fa0 73 65 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  se);.      codeC
14fb0 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
14fc0 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50  Left, pRight, OP
14fd0 5f 47 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  _Ge,.           
14fe0 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 72         r1, r2, r
14ff0 33 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50  3, SQLITE_STOREP
15000 32 29 3b 0a 20 20 20 20 20 20 70 4c 49 74 65 6d  2);.      pLItem
15010 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74  ++;.      pRight
15020 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72   = pLItem->pExpr
15030 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
15040 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
15050 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b  arse, regFree2);
15060 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
15070 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
15080 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
15090 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
150a0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
150b0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
150c0 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
150d0 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
150e0 68 74 2c 20 4f 50 5f 4c 65 2c 20 72 31 2c 20 72  ht, OP_Le, r1, r
150f0 32 2c 20 72 34 2c 20 53 51 4c 49 54 45 5f 53 54  2, r4, SQLITE_ST
15100 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20 73 71  OREP2);.      sq
15110 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
15120 76 2c 20 4f 50 5f 41 6e 64 2c 20 72 33 2c 20 72  v, OP_And, r3, r
15130 34 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  4, target);.    
15140 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
15150 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
15160 72 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r3);.      sqlit
15170 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
15180 28 70 50 61 72 73 65 2c 20 72 34 29 3b 0a 20 20  (pParse, r4);.  
15190 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
151a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
151b0 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65  US: {.      inRe
151c0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
151d0 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
151e0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
151f0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62  target);.      b
15200 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
15210 20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20   /*.    ** Form 
15220 41 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45  A:.    **   CASE
15230 20 78 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20   x WHEN e1 THEN 
15240 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20  r1 WHEN e2 THEN 
15250 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54  r2 ... WHEN eN T
15260 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
15270 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
15280 46 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20  Form B:.    **  
15290 20 43 41 53 45 20 57 48 45 4e 20 65 31 20 54 48   CASE WHEN e1 TH
152a0 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48  EN r1 WHEN e2 TH
152b0 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65  EN r2 ... WHEN e
152c0 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
152d0 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
152e0 2a 2a 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e  ** Form A is can
152f0 20 62 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20   be transformed 
15300 69 6e 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c  into the equival
15310 65 6e 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f  ent form B as fo
15320 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20  llows:.    **   
15330 43 41 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54  CASE WHEN x=e1 T
15340 48 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32  HEN r1 WHEN x=e2
15350 20 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20   THEN r2 ....   
15360 20 2a 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20   **        WHEN 
15370 78 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53  x=eN THEN rN ELS
15380 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20  E y END.    **. 
15390 20 20 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65     ** X (if it e
153a0 78 69 73 74 73 29 20 69 73 20 69 6e 20 70 45 78  xists) is in pEx
153b0 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a  pr->pLeft..    *
153c0 2a 20 59 20 69 73 20 69 6e 20 70 45 78 70 72 2d  * Y is in pExpr-
153d0 3e 70 52 69 67 68 74 2e 20 20 54 68 65 20 59 20  >pRight.  The Y 
153e0 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c  is also optional
153f0 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
15400 6f 0a 20 20 20 20 2a 2a 20 45 4c 53 45 20 63 6c  o.    ** ELSE cl
15410 61 75 73 65 20 61 6e 64 20 6e 6f 20 6f 74 68 65  ause and no othe
15420 72 20 74 65 72 6d 20 6d 61 74 63 68 65 73 2c 20  r term matches, 
15430 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
15440 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 78  of the.    ** ex
15450 70 72 73 73 69 6f 6e 20 69 73 20 4e 55 4c 4c 2e  prssion is NULL.
15460 0a 20 20 20 20 2a 2a 20 45 69 20 69 73 20 69 6e  .    ** Ei is in
15470 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
15480 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20 69 73 20  [i*2] and Ri is 
15490 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
154a0 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20  i*2+1]..    **. 
154b0 20 20 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74     ** The result
154c0 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
154d0 6f 6e 20 69 73 20 74 68 65 20 52 69 20 66 6f 72  on is the Ri for
154e0 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
154f0 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f  ing Ei,.    ** o
15500 72 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  r if there is no
15510 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 20 74 68   matching Ei, th
15520 65 20 45 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f  e ELSE term Y, o
15530 72 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20  r if there is.  
15540 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72    ** no ELSE ter
15550 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a  m, NULL..    */.
15560 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
15570 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45  ert( op==TK_CASE
15580 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20   ); {.      int 
15590 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20 20 20  endLabel;       
155a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
155b0 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20   GOTO label for 
155c0 65 6e 64 20 6f 66 20 43 41 53 45 20 73 74 6d 74  end of CASE stmt
155d0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 65   */.      int ne
155e0 78 74 43 61 73 65 3b 20 20 20 20 20 20 20 20 20  xtCase;         
155f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
15600 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65  OTO label for ne
15610 78 74 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a  xt WHEN clause *
15620 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70  /.      int nExp
15630 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
15640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 78 20            /* 2x 
15650 6e 75 6d 62 65 72 20 6f 66 20 57 48 45 4e 20 74  number of WHEN t
15660 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  erms */.      in
15670 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
15680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15690 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
156a0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
156b0 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
156c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
156d0 73 74 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73  st of WHEN terms
156e0 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
156f0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
15700 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41  aListelem;  /* A
15710 72 72 61 79 20 6f 66 20 57 48 45 4e 20 74 65 72  rray of WHEN ter
15720 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  ms */.      Expr
15730 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20 20 20   opCompare;     
15740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15750 20 54 68 65 20 58 3d 3d 45 69 20 65 78 70 72 65   The X==Ei expre
15760 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ssion */.      E
15770 78 70 72 20 63 61 63 68 65 58 3b 20 20 20 20 20  xpr cacheX;     
15780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15790 20 2f 2a 20 43 61 63 68 65 64 20 65 78 70 72 65   /* Cached expre
157a0 73 73 69 6f 6e 20 58 20 2a 2f 0a 20 20 20 20 20  ssion X */.     
157b0 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20   Expr *pX;      
157c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157d0 20 20 20 2f 2a 20 54 68 65 20 58 20 65 78 70 72     /* The X expr
157e0 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
157f0 45 78 70 72 20 2a 70 54 65 73 74 20 3d 20 30 3b  Expr *pTest = 0;
15800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15810 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d    /* X==Ei (form
15820 20 41 29 20 6f 72 20 6a 75 73 74 20 45 69 20 28   A) or just Ei (
15830 66 6f 72 6d 20 42 29 20 2a 2f 0a 20 20 20 20 20  form B) */.     
15840 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 69   VVA_ONLY( int i
15850 43 61 63 68 65 4c 65 76 65 6c 20 3d 20 70 50 61  CacheLevel = pPa
15860 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
15870 3b 20 29 0a 0a 20 20 20 20 20 20 61 73 73 65 72  ; )..      asser
15880 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
15890 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
158a0 73 53 65 6c 65 63 74 29 20 26 26 20 70 45 78 70  sSelect) && pExp
158b0 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20  r->x.pList );.  
158c0 20 20 20 20 61 73 73 65 72 74 28 28 70 45 78 70      assert((pExp
158d0 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
158e0 72 20 25 20 32 29 20 3d 3d 20 30 29 3b 0a 20 20  r % 2) == 0);.  
158f0 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70 72      assert(pExpr
15900 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
15910 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c   > 0);.      pEL
15920 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
15930 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73  List;.      aLis
15940 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e  telem = pEList->
15950 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d  a;.      nExpr =
15960 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
15970 20 20 20 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d        endLabel =
15980 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
15990 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
159a0 69 66 28 20 28 70 58 20 3d 20 70 45 78 70 72 2d  if( (pX = pExpr-
159b0 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20  >pLeft)!=0 ){.  
159c0 20 20 20 20 20 20 63 61 63 68 65 58 20 3d 20 2a        cacheX = *
159d0 70 58 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  pX;.        test
159e0 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  case( pX->op==TK
159f0 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
15a00 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d     testcase( pX-
15a10 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op==TK_REGISTER
15a20 20 29 3b 0a 20 20 20 20 20 20 20 20 63 61 63 68   );.        cach
15a30 65 58 2e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69  eX.iTable = sqli
15a40 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
15a50 70 50 61 72 73 65 2c 20 70 58 2c 20 26 72 65 67  pParse, pX, &reg
15a60 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Free1);.        
15a70 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
15a80 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  e1==0 );.       
15a90 20 63 61 63 68 65 58 2e 6f 70 20 3d 20 54 4b 5f   cacheX.op = TK_
15aa0 52 45 47 49 53 54 45 52 3b 0a 20 20 20 20 20 20  REGISTER;.      
15ab0 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d    opCompare.op =
15ac0 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20   TK_EQ;.        
15ad0 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20  opCompare.pLeft 
15ae0 3d 20 26 63 61 63 68 65 58 3b 0a 20 20 20 20 20  = &cacheX;.     
15af0 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f     pTest = &opCo
15b00 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 7d 0a 20  mpare;.      }. 
15b10 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
15b20 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20  nExpr; i=i+2){. 
15b30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
15b40 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
15b50 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  se);.        if(
15b60 20 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20   pX ){.         
15b70 20 61 73 73 65 72 74 28 20 70 54 65 73 74 21 3d   assert( pTest!=
15b80 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  0 );.          o
15b90 70 43 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20  pCompare.pRight 
15ba0 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70  = aListelem[i].p
15bb0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65  Expr;.        }e
15bc0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
15bd0 54 65 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d  Test = aListelem
15be0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
15bf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78     }.        nex
15c00 74 43 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56  tCase = sqlite3V
15c10 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
15c20 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
15c30 65 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b  e( pTest->op==TK
15c40 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
15c50 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
15c60 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54  False(pParse, pT
15c70 65 73 74 2c 20 6e 65 78 74 43 61 73 65 2c 20 53  est, nextCase, S
15c80 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
15c90 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
15ca0 61 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69  ase( aListelem[i
15cb0 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  +1].pExpr->op==T
15cc0 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
15cd0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4c      testcase( aL
15ce0 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78  istelem[i+1].pEx
15cf0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  pr->op==TK_REGIS
15d00 54 45 52 20 29 3b 0a 20 20 20 20 20 20 20 20 73  TER );.        s
15d10 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
15d20 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d  Parse, aListelem
15d30 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61 72  [i+1].pExpr, tar
15d40 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  get);.        sq
15d50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15d60 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65  v, OP_Goto, 0, e
15d70 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  ndLabel);.      
15d80 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
15d90 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
15da0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15db0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
15dc0 6c 28 76 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a  l(v, nextCase);.
15dd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
15de0 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20  ( pExpr->pRight 
15df0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
15e00 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
15e10 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
15e20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
15e30 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
15e40 70 52 69 67 68 74 2c 20 74 61 72 67 65 74 29 3b  pRight, target);
15e50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15e60 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
15e70 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  rse, 1);.      }
15e80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
15e90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15ea0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
15eb0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  arget);.      }.
15ec0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
15ed0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
15ee0 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  | pParse->nErr>0
15ef0 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
15f00 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
15f10 76 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76 65 6c  vel==iCacheLevel
15f20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
15f30 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
15f40 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a  l(v, endLabel);.
15f50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15f60 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
15f70 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20  E_OMIT_TRIGGER. 
15f80 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45     case TK_RAISE
15f90 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70  : {.      if( !p
15fa0 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
15fb0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
15fc0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
15fd0 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
15fe0 20 20 20 20 20 20 20 20 20 20 20 22 52 41 49 53             "RAIS
15ff0 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  E() may only be 
16000 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 74 72  used within a tr
16010 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b  igger-program");
16020 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
16030 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
16040 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69   if( pExpr->affi
16050 6e 69 74 79 21 3d 4f 45 5f 49 67 6e 6f 72 65 20  nity!=OE_Ignore 
16060 29 7b 0a 20 20 20 20 20 20 20 20 20 61 73 73 65  ){.         asse
16070 72 74 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  rt( pExpr->affin
16080 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b  ity==OE_Rollback
16090 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
160a0 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69       pExpr->affi
160b0 6e 69 74 79 20 3d 3d 20 4f 45 5f 41 62 6f 72 74  nity == OE_Abort
160c0 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
160d0 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69       pExpr->affi
160e0 6e 69 74 79 20 3d 3d 20 4f 45 5f 46 61 69 6c 20  nity == OE_Fail 
160f0 29 3b 0a 20 20 20 20 20 20 20 20 20 61 73 73 65  );.         asse
16100 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
16110 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
16120 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
16130 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16140 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c  AddOp4(v, OP_Hal
16150 74 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  t, SQLITE_CONSTR
16160 41 49 4e 54 2c 20 70 45 78 70 72 2d 3e 61 66 66  AINT, pExpr->aff
16170 69 6e 69 74 79 2c 20 30 2c 0a 20 20 20 20 20 20  inity, 0,.      
16180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16190 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54       pExpr->u.zT
161a0 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  oken, 0);.      
161b0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
161c0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
161d0 3e 61 66 66 69 6e 69 74 79 20 3d 3d 20 4f 45 5f  >affinity == OE_
161e0 49 67 6e 6f 72 65 20 29 3b 0a 20 20 20 20 20 20  Ignore );.      
161f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16200 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 6e 74 65  dOp2(v, OP_Conte
16210 78 74 50 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20  xtPop, 0, 0);.  
16220 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
16230 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
16240 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e  oto, 0, pParse->
16250 74 72 69 67 53 74 61 63 6b 2d 3e 69 67 6e 6f 72  trigStack->ignor
16260 65 4a 75 6d 70 29 3b 0a 20 20 20 20 20 20 20 20  eJump);.        
16270 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
16280 20 22 72 61 69 73 65 28 49 47 4e 4f 52 45 29 22   "raise(IGNORE)"
16290 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
162a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
162b0 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69  endif.  }.  sqli
162c0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
162d0 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
162e0 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  e1);.  sqlite3Re
162f0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
16300 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a  rse, regFree2);.
16310 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a    return inReg;.
16320 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
16330 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61  e code to evalua
16340 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  te an expression
16350 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
16360 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61  esults.** into a
16370 20 72 65 67 69 73 74 65 72 2e 20 20 52 65 74 75   register.  Retu
16380 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20  rn the register 
16390 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74 68 65  number where the
163a0 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20   results.** are 
163b0 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  stored..**.** If
163c0 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69 73   the register is
163d0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67   a temporary reg
163e0 69 73 74 65 72 20 74 68 61 74 20 63 61 6e 20 62  ister that can b
163f0 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a  e deallocated,.*
16400 2a 20 74 68 65 6e 20 77 72 69 74 65 20 69 74 73  * then write its
16410 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52   number into *pR
16420 65 67 2e 20 20 49 66 20 74 68 65 20 72 65 73 75  eg.  If the resu
16430 6c 74 20 72 65 67 69 73 74 65 72 20 69 73 20 6e  lt register is n
16440 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72  ot.** a temporar
16450 79 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  y, then set *pRe
16460 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e  g to zero..*/.in
16470 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
16480 65 54 65 6d 70 28 50 61 72 73 65 20 2a 70 50 61  eTemp(Parse *pPa
16490 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
164a0 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20  , int *pReg){.  
164b0 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
164c0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
164d0 65 29 3b 0a 20 20 69 6e 74 20 72 32 20 3d 20 73  e);.  int r2 = s
164e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
164f0 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
16500 70 72 2c 20 72 31 29 3b 0a 20 20 69 66 28 20 72  pr, r1);.  if( r
16510 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20 2a 70 52  2==r1 ){.    *pR
16520 65 67 20 3d 20 72 31 3b 0a 20 20 7d 65 6c 73 65  eg = r1;.  }else
16530 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  {.    sqlite3Rel
16540 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
16550 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 2a 70 52  se, r1);.    *pR
16560 65 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  eg = 0;.  }.  re
16570 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn r2;.}../*.*
16580 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
16590 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61  that will evalua
165a0 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  te expression pE
165b0 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68  xpr and store th
165c0 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20  e.** results in 
165d0 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
165e0 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72    The results ar
165f0 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  e guaranteed to 
16600 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67  appear.** in reg
16610 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f  ister target..*/
16620 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
16630 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61 72  Code(Parse *pPar
16640 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
16650 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
16660 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73  int inReg;..  as
16670 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 26  sert( target>0 &
16680 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65  & target<=pParse
16690 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 6e 52 65  ->nMem );.  inRe
166a0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
166b0 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
166c0 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
166d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
166e0 73 65 2d 3e 70 56 64 62 65 20 7c 7c 20 70 50 61  se->pVdbe || pPa
166f0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
16700 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 69  ailed );.  if( i
16710 6e 52 65 67 21 3d 74 61 72 67 65 74 20 26 26 20  nReg!=target && 
16720 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b  pParse->pVdbe ){
16730 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16740 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70  AddOp2(pParse->p
16750 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  Vdbe, OP_SCopy, 
16760 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a  inReg, target);.
16770 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 74 61 72    }.  return tar
16780 67 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  get;.}../*.** Ge
16790 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
167a0 20 65 76 61 6c 75 74 65 73 20 74 68 65 20 67 69   evalutes the gi
167b0 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61  ven expression a
167c0 6e 64 20 70 75 74 73 20 74 68 65 20 72 65 73 75  nd puts the resu
167d0 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  lt.** in registe
167e0 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20  r target..**.** 
167f0 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79  Also make a copy
16800 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
16810 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20  on results into 
16820 61 6e 6f 74 68 65 72 20 22 63 61 63 68 65 22 20  another "cache" 
16830 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20  register.** and 
16840 6d 6f 64 69 66 79 20 74 68 65 20 65 78 70 72 65  modify the expre
16850 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68  ssion so that th
16860 65 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69  e next time it i
16870 73 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20  s evaluated,.** 
16880 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20  the result is a 
16890 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 63 68  copy of the cach
168a0 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a  e register..**.*
168b0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
168c0 73 20 75 73 65 64 20 66 6f 72 20 65 78 70 72 65  s used for expre
168d0 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ssions that are 
168e0 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a  used multiple .*
168f0 2a 20 74 69 6d 65 73 2e 20 20 54 68 65 79 20 61  * times.  They a
16900 72 65 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63  re evaluated onc
16910 65 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74  e and the result
16920 73 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  s of the express
16930 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73 65  ion.** are reuse
16940 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
16950 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68  3ExprCodeAndCach
16960 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
16970 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
16980 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62  t target){.  Vdb
16990 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
169a0 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 6e 52 65  Vdbe;.  int inRe
169b0 67 3b 0a 20 20 69 6e 52 65 67 20 3d 20 73 71 6c  g;.  inReg = sql
169c0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
169d0 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
169e0 65 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  et);.  assert( t
169f0 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 2f 2a 20  arget>0 );.  /* 
16a00 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
16a10 63 61 6c 6c 65 64 20 66 6f 72 20 74 65 72 6d 73  called for terms
16a20 20 74 6f 20 49 4e 53 45 52 54 20 6f 72 20 55 50   to INSERT or UP
16a30 44 41 54 45 2e 20 20 41 6e 64 20 74 68 65 20 6f  DATE.  And the o
16a40 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72 20 70  nly.  ** other p
16a50 6c 61 63 65 20 77 68 65 72 65 20 65 78 70 72 65  lace where expre
16a60 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 63 6f  ssions can be co
16a70 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 54 4b 5f  nverted into TK_
16a80 52 45 47 49 53 54 45 52 20 69 73 0a 20 20 2a 2a  REGISTER is.  **
16a90 20 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65   in WHERE clause
16aa0 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 53 6f   processing.  So
16ab0 20 61 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6d   as currently im
16ac0 70 6c 65 6d 65 6e 74 65 64 2c 20 74 68 65 72 65  plemented, there
16ad0 20 69 73 0a 20 20 2a 2a 20 6e 6f 20 77 61 79 20   is.  ** no way 
16ae0 66 6f 72 20 61 20 54 4b 5f 52 45 47 49 53 54 45  for a TK_REGISTE
16af0 52 20 74 6f 20 65 78 69 73 74 20 68 65 72 65 2e  R to exist here.
16b00 20 20 42 75 74 20 69 74 20 73 65 65 6d 73 20 70    But it seems p
16b10 72 75 64 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 6b  rudent to.  ** k
16b20 65 65 70 20 74 68 65 20 41 4c 57 41 59 53 28 29  eep the ALWAYS()
16b30 20 69 6e 20 63 61 73 65 20 74 68 65 20 63 6f 6e   in case the con
16b40 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 63 68  ditions above ch
16b50 61 6e 67 65 20 77 69 74 68 20 66 75 74 75 72 65  ange with future
16b60 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69  .  ** modificati
16b70 6f 6e 73 20 6f 72 20 65 6e 68 61 6e 63 65 6d 65  ons or enhanceme
16b80 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 28 20 41 4c  nts. */.  if( AL
16b90 57 41 59 53 28 70 45 78 70 72 2d 3e 6f 70 21 3d  WAYS(pExpr->op!=
16ba0 54 4b 5f 52 45 47 49 53 54 45 52 29 20 29 7b 20  TK_REGISTER) ){ 
16bb0 20 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 3b 0a   .    int iMem;.
16bc0 20 20 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61      iMem = ++pPa
16bd0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
16be0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16bf0 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 69 6e 52  (v, OP_Copy, inR
16c00 65 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 70  eg, iMem);.    p
16c10 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69  Expr->iTable = i
16c20 4d 65 6d 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  Mem;.    pExpr->
16c30 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52  op = TK_REGISTER
16c40 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
16c50 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  nReg;.}../*.** R
16c60 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 70 45  eturn TRUE if pE
16c70 78 70 72 20 69 73 20 61 6e 20 63 6f 6e 73 74 61  xpr is an consta
16c80 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  nt expression th
16c90 61 74 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  at is appropriat
16ca0 65 0a 2a 2a 20 66 6f 72 20 66 61 63 74 6f 72 69  e.** for factori
16cb0 6e 67 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70  ng out of a loop
16cc0 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65 20 65  .  Appropriate e
16cd0 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 3a 0a  xpressions are:.
16ce0 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 41 6e 79 20  **.**    *  Any 
16cf0 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
16d00 65 76 61 6c 75 61 74 65 73 20 74 6f 20 74 77 6f  evaluates to two
16d10 20 6f 72 20 6d 6f 72 65 20 6f 70 63 6f 64 65 73   or more opcodes
16d20 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 41 6e  ..**.**    *  An
16d30 79 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 4f 50  y OP_Integer, OP
16d40 5f 52 65 61 6c 2c 20 4f 50 5f 53 74 72 69 6e 67  _Real, OP_String
16d50 2c 20 4f 50 5f 42 6c 6f 62 2c 20 4f 50 5f 4e 75  , OP_Blob, OP_Nu
16d60 6c 6c 2c 20 0a 2a 2a 20 20 20 20 20 20 20 6f 72  ll, .**       or
16d70 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 74 68 61   OP_Variable tha
16d80 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
16d90 74 6f 20 62 65 20 70 6c 61 63 65 64 20 69 6e 20  to be placed in 
16da0 61 20 0a 2a 2a 20 20 20 20 20 20 20 73 70 65 63  a .**       spec
16db0 69 66 69 63 20 72 65 67 69 73 74 65 72 2e 0a 2a  ific register..*
16dc0 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6e 6f  *.** There is no
16dd0 20 70 6f 69 6e 74 20 69 6e 20 66 61 63 74 6f 72   point in factor
16de0 69 6e 67 20 6f 75 74 20 73 69 6e 67 6c 65 2d 69  ing out single-i
16df0 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f 6e 73 74  nstruction const
16e00 61 6e 74 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ant.** expressio
16e10 6e 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  ns that need to 
16e20 62 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 70  be placed in a p
16e30 61 72 74 69 63 75 6c 61 72 20 72 65 67 69 73 74  articular regist
16e40 65 72 2e 20 20 0a 2a 2a 20 57 65 20 63 6f 75 6c  er.  .** We coul
16e50 64 20 66 61 63 74 6f 72 20 74 68 65 6d 20 6f 75  d factor them ou
16e60 74 2c 20 62 75 74 20 74 68 65 6e 20 77 65 20 77  t, but then we w
16e70 6f 75 6c 64 20 65 6e 64 20 75 70 20 61 64 64 69  ould end up addi
16e80 6e 67 20 61 6e 0a 2a 2a 20 4f 50 5f 53 43 6f 70  ng an.** OP_SCop
16e90 79 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  y instruction to
16ea0 20 6d 6f 76 65 20 74 68 65 20 76 61 6c 75 65 20   move the value 
16eb0 69 6e 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  into the correct
16ec0 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 6c 61 74   register.** lat
16ed0 65 72 2e 20 20 57 65 20 6d 69 67 68 74 20 61 73  er.  We might as
16ee0 20 77 65 6c 6c 20 6a 75 73 74 20 75 73 65 20 74   well just use t
16ef0 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e 73 74  he original inst
16f00 72 75 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 61  ruction and.** a
16f10 76 6f 69 64 20 74 68 65 20 4f 50 5f 53 43 6f 70  void the OP_SCop
16f20 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
16f30 20 69 73 41 70 70 72 6f 70 72 69 61 74 65 46 6f   isAppropriateFo
16f40 72 46 61 63 74 6f 72 69 6e 67 28 45 78 70 72 20  rFactoring(Expr 
16f50 2a 70 29 7b 0a 20 20 69 66 28 20 21 73 71 6c 69  *p){.  if( !sqli
16f60 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
16f70 74 4e 6f 74 4a 6f 69 6e 28 70 29 20 29 7b 0a 20  tNotJoin(p) ){. 
16f80 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a     return 0;  /*
16f90 20 4f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 65   Only constant e
16fa0 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 61  xpressions are a
16fb0 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 66  ppropriate for f
16fc0 61 63 74 6f 72 69 6e 67 20 2a 2f 0a 20 20 7d 0a  actoring */.  }.
16fd0 20 20 69 66 28 20 28 70 2d 3e 66 6c 61 67 73 20    if( (p->flags 
16fe0 26 20 45 50 5f 46 69 78 65 64 44 65 73 74 29 3d  & EP_FixedDest)=
16ff0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
17000 20 31 3b 20 20 2f 2a 20 41 6e 79 20 63 6f 6e 73   1;  /* Any cons
17010 74 61 6e 74 20 77 69 74 68 6f 75 74 20 61 20 66  tant without a f
17020 69 78 65 64 20 64 65 73 74 69 6e 61 74 69 6f 6e  ixed destination
17030 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
17040 2a 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  */.  }.  while( 
17050 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20  p->op==TK_UPLUS 
17060 29 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a  ) p = p->pLeft;.
17070 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
17080 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
17090 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45  E_OMIT_BLOB_LITE
170a0 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  RAL.    case TK_
170b0 42 4c 4f 42 3a 0a 23 65 6e 64 69 66 0a 20 20 20  BLOB:.#endif.   
170c0 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
170d0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  E:.    case TK_I
170e0 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65  NTEGER:.    case
170f0 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63   TK_FLOAT:.    c
17100 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20  ase TK_NULL:.   
17110 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
17120 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
17130 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 42 4c 4f  e( p->op==TK_BLO
17140 42 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  B );.      testc
17150 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 56  ase( p->op==TK_V
17160 41 52 49 41 42 4c 45 20 29 3b 0a 20 20 20 20 20  ARIABLE );.     
17170 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70   testcase( p->op
17180 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 3b 0a  ==TK_INTEGER );.
17190 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
171a0 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  p->op==TK_FLOAT 
171b0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
171c0 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c  e( p->op==TK_NUL
171d0 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  L );.      testc
171e0 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53  ase( p->op==TK_S
171f0 54 52 49 4e 47 20 29 3b 0a 20 20 20 20 20 20 2f  TRING );.      /
17200 2a 20 53 69 6e 67 6c 65 2d 69 6e 73 74 72 75 63  * Single-instruc
17210 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73 20 77  tion constants w
17220 69 74 68 20 61 20 66 69 78 65 64 20 64 65 73 74  ith a fixed dest
17230 69 6e 61 74 69 6f 6e 20 61 72 65 0a 20 20 20 20  ination are.    
17240 20 20 2a 2a 20 62 65 74 74 65 72 20 64 6f 6e 65    ** better done
17250 20 69 6e 2d 6c 69 6e 65 2e 20 20 49 66 20 77 65   in-line.  If we
17260 20 66 61 63 74 6f 72 20 74 68 65 6d 2c 20 74 68   factor them, th
17270 65 79 20 77 69 6c 6c 20 6a 75 73 74 20 65 6e 64  ey will just end
17280 0a 20 20 20 20 20 20 2a 2a 20 75 70 20 67 65 6e  .      ** up gen
17290 65 72 61 74 69 6e 67 20 61 6e 20 4f 50 5f 53 43  erating an OP_SC
172a0 6f 70 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  opy to move the 
172b0 76 61 6c 75 65 20 74 6f 20 74 68 65 20 64 65 73  value to the des
172c0 74 69 6e 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  tination.      *
172d0 2a 20 72 65 67 69 73 74 65 72 2e 20 2a 2f 0a 20  * register. */. 
172e0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
172f0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
17300 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
17310 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f   if( p->pLeft->o
17320 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70  p==TK_FLOAT || p
17330 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pLeft->op==TK_
17340 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20  INTEGER ){.     
17350 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
17360 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
17370 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
17380 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 62 72 65  ult: {.      bre
17390 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
173a0 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
173b0 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61  ** If pExpr is a
173c0 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73   constant expres
173d0 73 69 6f 6e 20 74 68 61 74 20 69 73 20 61 70 70  sion that is app
173e0 72 6f 70 72 69 61 74 65 20 66 6f 72 0a 2a 2a 20  ropriate for.** 
173f0 66 61 63 74 6f 72 69 6e 67 20 6f 75 74 20 6f 66  factoring out of
17400 20 61 20 6c 6f 6f 70 2c 20 74 68 65 6e 20 65 76   a loop, then ev
17410 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65  aluate the expre
17420 73 73 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 61 20  ssion.** into a 
17430 72 65 67 69 73 74 65 72 20 61 6e 64 20 63 6f 6e  register and con
17440 76 65 72 74 20 74 68 65 20 65 78 70 72 65 73 73  vert the express
17450 69 6f 6e 20 69 6e 74 6f 20 61 20 54 4b 5f 52 45  ion into a TK_RE
17460 47 49 53 54 45 52 0a 2a 2a 20 65 78 70 72 65 73  GISTER.** expres
17470 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sion..*/.static 
17480 69 6e 74 20 65 76 61 6c 43 6f 6e 73 74 45 78 70  int evalConstExp
17490 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  r(Walker *pWalke
174a0 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
174b0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
174c0 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
174d0 73 65 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45  se;.  switch( pE
174e0 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
174f0 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a  ase TK_REGISTER:
17500 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
17510 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d  WRC_Prune;.    }
17520 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
17530 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20  CTION:.    case 
17540 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
17550 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e  .    case TK_CON
17560 53 54 5f 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20  ST_FUNC: {.     
17570 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74   /* The argument
17580 73 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  s to a function 
17590 68 61 76 65 20 61 20 66 69 78 65 64 20 64 65 73  have a fixed des
175a0 74 69 6e 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20  tination..      
175b0 2a 2a 20 4d 61 72 6b 20 74 68 65 6d 20 74 68 69  ** Mark them thi
175c0 73 20 77 61 79 20 74 6f 20 61 76 6f 69 64 20 67  s way to avoid g
175d0 65 6e 65 72 61 74 65 64 20 75 6e 6e 65 65 64 65  enerated unneede
175e0 64 20 4f 50 5f 53 43 6f 70 79 0a 20 20 20 20 20  d OP_SCopy.     
175f0 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   ** instructions
17600 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
17610 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
17620 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
17630 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  st;.      assert
17640 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
17650 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
17660 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
17670 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
17680 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 70 4c        int i = pL
17690 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
176a0 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
176b0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
176c0 3d 20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20  = pList->a;.    
176d0 20 20 20 20 66 6f 72 28 3b 20 69 3e 30 3b 20 69      for(; i>0; i
176e0 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
176f0 20 20 20 20 20 20 20 20 69 66 28 20 41 4c 57 41          if( ALWA
17700 59 53 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  YS(pItem->pExpr)
17710 20 29 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2d   ) pItem->pExpr-
17720 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 46 69 78  >flags |= EP_Fix
17730 65 64 44 65 73 74 3b 0a 20 20 20 20 20 20 20 20  edDest;.        
17740 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
17750 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
17760 0a 20 20 69 66 28 20 69 73 41 70 70 72 6f 70 72  .  if( isAppropr
17770 69 61 74 65 46 6f 72 46 61 63 74 6f 72 69 6e 67  iateForFactoring
17780 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 69  (pExpr) ){.    i
17790 6e 74 20 72 31 20 3d 20 2b 2b 70 50 61 72 73 65  nt r1 = ++pParse
177a0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 74 20  ->nMem;.    int 
177b0 72 32 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c  r2;.    r2 = sql
177c0 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
177d0 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
177e0 2c 20 72 31 29 3b 0a 20 20 20 20 69 66 28 20 4e  , r1);.    if( N
177f0 45 56 45 52 28 72 31 21 3d 72 32 29 20 29 20 73  EVER(r1!=r2) ) s
17800 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
17810 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
17820 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20  ;.    pExpr->op 
17830 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20  = TK_REGISTER;. 
17840 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
17850 20 3d 20 72 32 3b 0a 20 20 20 20 72 65 74 75 72   = r2;.    retur
17860 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
17870 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
17880 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
17890 20 50 72 65 65 76 61 6c 75 61 74 65 20 63 6f 6e   Preevaluate con
178a0 73 74 61 6e 74 20 73 75 62 65 78 70 72 65 73 73  stant subexpress
178b0 69 6f 6e 73 20 77 69 74 68 69 6e 20 70 45 78 70  ions within pExp
178c0 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a  r and store the.
178d0 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65  ** results in re
178e0 67 69 73 74 65 72 73 2e 20 20 4d 6f 64 69 66 79  gisters.  Modify
178f0 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 74   pExpr so that t
17900 68 65 20 63 6f 6e 73 74 61 6e 74 20 73 75 62 65  he constant sube
17910 78 70 72 65 73 69 6f 6e 73 0a 2a 2a 20 61 72 65  xpresions.** are
17920 20 54 4b 5f 52 45 47 49 53 54 45 52 20 6f 70 63   TK_REGISTER opc
17930 6f 64 65 73 20 74 68 61 74 20 72 65 66 65 72 20  odes that refer 
17940 74 6f 20 74 68 65 20 70 72 65 63 6f 6d 70 75 74  to the precomput
17950 65 64 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 76 6f  ed values..*/.vo
17960 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
17970 64 65 43 6f 6e 73 74 61 6e 74 73 28 50 61 72 73  deConstants(Pars
17980 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
17990 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65  *pExpr){.  Walke
179a0 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  r w;.  w.xExprCa
179b0 6c 6c 62 61 63 6b 20 3d 20 65 76 61 6c 43 6f 6e  llback = evalCon
179c0 73 74 45 78 70 72 3b 0a 20 20 77 2e 78 53 65 6c  stExpr;.  w.xSel
179d0 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b  ectCallback = 0;
179e0 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50  .  w.pParse = pP
179f0 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57  arse;.  sqlite3W
17a00 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70  alkExpr(&w, pExp
17a10 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  r);.}.../*.** Ge
17a20 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
17a30 20 70 75 73 68 65 73 20 74 68 65 20 76 61 6c 75   pushes the valu
17a40 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65  e of every eleme
17a50 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a  nt of the given.
17a60 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
17a70 73 74 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e  st into a sequen
17a80 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ce of registers 
17a90 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72  beginning at tar
17aa0 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  get..**.** Retur
17ab0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
17ac0 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74  elements evaluat
17ad0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
17ae0 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
17af0 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
17b00 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73  rse,     /* Pars
17b10 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
17b20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
17b30 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65  ,   /* The expre
17b40 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65  ssion list to be
17b50 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
17b60 74 61 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f  target,        /
17b70 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65  * Where to write
17b80 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
17b90 74 20 64 6f 48 61 72 64 43 6f 70 79 20 20 20 20  t doHardCopy    
17ba0 20 2f 2a 20 4d 61 6b 65 20 61 20 68 61 72 64 20   /* Make a hard 
17bb0 63 6f 70 79 20 6f 66 20 65 76 65 72 79 20 65 6c  copy of every el
17bc0 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 74  ement */.){.  st
17bd0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
17be0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
17bf0 20 69 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74 28   i, n;.  assert(
17c00 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61   pList!=0 );.  a
17c10 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
17c20 29 3b 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e  );.  n = pList->
17c30 6e 45 78 70 72 3b 0a 20 20 66 6f 72 28 70 49 74  nExpr;.  for(pIt
17c40 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
17c50 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65  ; i<n; i++, pIte
17c60 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 49  m++){.    if( pI
17c70 74 65 6d 2d 3e 69 41 6c 69 61 73 20 29 7b 0a 20  tem->iAlias ){. 
17c80 20 20 20 20 20 69 6e 74 20 69 52 65 67 20 3d 20       int iReg = 
17c90 63 6f 64 65 41 6c 69 61 73 28 70 50 61 72 73 65  codeAlias(pParse
17ca0 2c 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 2c  , pItem->iAlias,
17cb0 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 74   pItem->pExpr, t
17cc0 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20  arget+i);.      
17cd0 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
17ce0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
17cf0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 52 65 67  ;.      if( iReg
17d00 21 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20  !=target+i ){.  
17d10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17d20 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
17d30 6f 70 79 2c 20 69 52 65 67 2c 20 74 61 72 67 65  opy, iReg, targe
17d40 74 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t+i);.      }.  
17d50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
17d60 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
17d70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45  Parse, pItem->pE
17d80 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a  xpr, target+i);.
17d90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 6f      }.    if( do
17da0 48 61 72 64 43 6f 70 79 20 26 26 20 21 70 50 61  HardCopy && !pPa
17db0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
17dc0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 73  ailed ){.      s
17dd0 71 6c 69 74 65 33 45 78 70 72 48 61 72 64 43 6f  qlite3ExprHardCo
17de0 70 79 28 70 50 61 72 73 65 2c 20 74 61 72 67 65  py(pParse, targe
17df0 74 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  t, n);.    }.  }
17e00 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
17e10 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
17e20 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61  ode for a boolea
17e30 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63  n expression suc
17e40 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73  h that a jump is
17e50 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20   made.** to the 
17e60 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20  label "dest" if 
17e70 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
17e80 73 20 74 72 75 65 20 62 75 74 20 65 78 65 63 75  s true but execu
17e90 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65  tion.** continue
17ea0 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20  s straight thru 
17eb0 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
17ec0 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a  n is false..**.*
17ed0 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
17ee0 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ion evaluates to
17ef0 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74   NULL (neither t
17f00 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20  rue nor false), 
17f10 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65  then.** take the
17f20 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d   jump if the jum
17f30 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20  pIfNull flag is 
17f40 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
17f50 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f  L..**.** This co
17f60 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  de depends on th
17f70 65 20 66 61 63 74 20 74 68 61 74 20 63 65 72 74  e fact that cert
17f80 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73  ain token values
17f90 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20   (ex: TK_EQ).** 
17fa0 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20  are the same as 
17fb0 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65  opcode values (e
17fc0 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69  x: OP_Eq) that i
17fd0 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72  mplement the cor
17fe0 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70  responding.** op
17ff0 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61  eration.  Specia
18000 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64  l comments in vd
18010 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f  be.c and the mko
18020 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70  pcodeh.awk scrip
18030 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65  t in.** the make
18040 20 70 72 6f 63 65 73 73 20 63 61 75 73 65 20 74   process cause t
18050 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61  hese values to a
18060 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73  lign.  Assert()s
18070 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20   in the code.** 
18080 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61  below verify tha
18090 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72  t the numbers ar
180a0 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63  e aligned correc
180b0 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tly..*/.void sql
180c0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 50  ite3ExprIfTrue(P
180d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
180e0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64  pr *pExpr, int d
180f0 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  est, int jumpIfN
18100 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ull){.  Vdbe *v 
18110 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
18120 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20  .  int op = 0;. 
18130 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
18140 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
18150 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c  2 = 0;.  int r1,
18160 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   r2;..  assert( 
18170 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
18180 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c  TE_JUMPIFNULL ||
18190 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
181a0 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d  ;.  if( NEVER(v=
181b0 3d 30 29 20 29 20 20 20 20 20 72 65 74 75 72 6e  =0) )     return
181c0 3b 20 20 2f 2a 20 45 78 69 73 74 61 6e 63 65 20  ;  /* Existance 
181d0 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20  of VDBE checked 
181e0 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69  by caller */.  i
181f0 66 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d  f( NEVER(pExpr==
18200 30 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  0) ) return;  /*
18210 20 4e 6f 20 77 61 79 20 74 68 69 73 20 63 61 6e   No way this can
18220 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20   happen */.  op 
18230 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73  = pExpr->op;.  s
18240 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
18250 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a   case TK_AND: {.
18260 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
18270 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
18280 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65  bel(v);.      te
18290 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
182a0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
182b0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
182c0 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
182d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
182e0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
182f0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a  xpr->pLeft, d2,j
18300 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45  umpIfNull^SQLITE
18310 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
18320 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
18330 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
18340 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
18350 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
18360 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18370 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
18380 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   d2);.      sqli
18390 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
183a0 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20  pParse, 1);.    
183b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
183c0 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b     case TK_OR: {
183d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
183e0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
183f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
18400 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
18410 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
18420 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
18430 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18440 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
18450 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
18460 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
18470 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
18480 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
18490 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
184a0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
184b0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
184c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
184d0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
184e0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
184f0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
18500 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
18510 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
18520 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
18530 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
18540 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
18550 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
18560 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
18570 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
18580 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b   TK_LT==OP_Lt );
18590 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
185a0 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20  K_LE==OP_Le );. 
185b0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
185c0 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20  GT==OP_Gt );.   
185d0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45     assert( TK_GE
185e0 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20  ==OP_Ge );.     
185f0 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d   assert( TK_EQ==
18600 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61  OP_Eq );.      a
18610 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50  ssert( TK_NE==OP
18620 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _Ne );.      tes
18630 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54  tcase( op==TK_LT
18640 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
18650 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b  se( op==TK_LE );
18660 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
18670 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20   op==TK_GT );.  
18680 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
18690 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20  ==TK_GE );.     
186a0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
186b0 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65  K_EQ );.      te
186c0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
186d0 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
186e0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
186f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  =0 );.      code
18700 43 6f 6d 70 61 72 65 4f 70 65 72 61 6e 64 73 28  CompareOperands(
18710 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
18720 4c 65 66 74 2c 20 26 72 31 2c 20 26 72 65 67 46  Left, &r1, &regF
18730 72 65 65 31 2c 0a 20 20 20 20 20 20 20 20 20 20  ree1,.          
18740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18750 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
18760 52 69 67 68 74 2c 20 26 72 32 2c 20 26 72 65 67  Right, &r2, &reg
18770 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f  Free2);.      co
18780 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
18790 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
187a0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
187b0 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
187c0 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73       r1, r2, des
187d0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
187e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
187f0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
18800 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
18810 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
18820 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
18830 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
18840 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
18850 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
18860 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e    assert( TK_ISN
18870 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29  ULL==OP_IsNull )
18880 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
18890 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e  TK_NOTNULL==OP_N
188a0 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20  otNull );.      
188b0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
188c0 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
188d0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
188e0 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20  K_NOTNULL );.   
188f0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
18900 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
18910 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
18920 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
18930 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18940 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c  ddOp2(v, op, r1,
18950 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65   dest);.      te
18960 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
18970 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
18980 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
18990 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
189a0 0a 20 20 20 20 20 20 2f 2a 20 20 20 20 78 20 42  .      /*    x B
189b0 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20  ETWEEN y AND z. 
189c0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
189d0 20 49 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   Is equivalent t
189e0 6f 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  o .      **.    
189f0 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44    **    x>=y AND
18a00 20 78 3c 3d 7a 0a 20 20 20 20 20 20 2a 2a 0a 20   x<=z.      **. 
18a10 20 20 20 20 20 2a 2a 20 43 6f 64 65 20 69 74 20       ** Code it 
18a20 61 73 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20  as such, taking 
18a30 63 61 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63  care to do the c
18a40 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73  ommon subexpress
18a50 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65  ion.      ** ele
18a60 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78 2e 0a  mentation of x..
18a70 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45        */.      E
18a80 78 70 72 20 65 78 70 72 41 6e 64 3b 0a 20 20 20  xpr exprAnd;.   
18a90 20 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74     Expr compLeft
18aa0 3b 0a 20 20 20 20 20 20 45 78 70 72 20 63 6f 6d  ;.      Expr com
18ab0 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 45 78  pRight;.      Ex
18ac0 70 72 20 65 78 70 72 58 3b 0a 0a 20 20 20 20 20  pr exprX;..     
18ad0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
18ae0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
18af0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
18b00 3b 0a 20 20 20 20 20 20 65 78 70 72 58 20 3d 20  ;.      exprX = 
18b10 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20  *pExpr->pLeft;. 
18b20 20 20 20 20 20 65 78 70 72 41 6e 64 2e 6f 70 20       exprAnd.op 
18b30 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20  = TK_AND;.      
18b40 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20  exprAnd.pLeft = 
18b50 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 20 20 20  &compLeft;.     
18b60 20 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20   exprAnd.pRight 
18b70 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20  = &compRight;.  
18b80 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20      compLeft.op 
18b90 3d 20 54 4b 5f 47 45 3b 0a 20 20 20 20 20 20 63  = TK_GE;.      c
18ba0 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20  ompLeft.pLeft = 
18bb0 26 65 78 70 72 58 3b 0a 20 20 20 20 20 20 63 6f  &exprX;.      co
18bc0 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20 3d 20  mpLeft.pRight = 
18bd0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
18be0 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
18bf0 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d    compRight.op =
18c00 20 54 4b 5f 4c 45 3b 0a 20 20 20 20 20 20 63 6f   TK_LE;.      co
18c10 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20  mpRight.pLeft = 
18c20 26 65 78 70 72 58 3b 0a 20 20 20 20 20 20 63 6f  &exprX;.      co
18c30 6d 70 52 69 67 68 74 2e 70 52 69 67 68 74 20 3d  mpRight.pRight =
18c40 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
18c50 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[1].pExpr;.   
18c60 20 20 20 65 78 70 72 58 2e 69 54 61 62 6c 65 20     exprX.iTable 
18c70 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
18c80 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26 65  eTemp(pParse, &e
18c90 78 70 72 58 2c 20 26 72 65 67 46 72 65 65 31 29  xprX, &regFree1)
18ca0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
18cb0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
18cc0 0a 20 20 20 20 20 20 65 78 70 72 58 2e 6f 70 20  .      exprX.op 
18cd0 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20  = TK_REGISTER;. 
18ce0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
18cf0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
18d00 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
18d10 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
18d20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20  &exprAnd, dest, 
18d30 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
18d40 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
18d50 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
18d60 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
18d70 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
18d80 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65  arse, pExpr, &re
18d90 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73  gFree1);.      s
18da0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
18db0 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64  (v, OP_If, r1, d
18dc0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  est, jumpIfNull!
18dd0 3d 30 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  =0);.      testc
18de0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
18df0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
18e00 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
18e10 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
18e20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
18e30 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
18e40 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
18e50 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
18e60 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
18e70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
18e80 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ;  .}../*.** Gen
18e90 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
18ea0 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
18eb0 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
18ec0 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
18ed0 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
18ee0 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
18ef0 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62  ssion is false b
18f00 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
18f10 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
18f20 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
18f30 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
18f40 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
18f50 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
18f60 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65  ates to NULL (ne
18f70 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66  ither true nor f
18f80 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75  alse) then.** ju
18f90 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c  mp if jumpIfNull
18fa0 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49   is SQLITE_JUMPI
18fb0 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68  FNULL or fall th
18fc0 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e  rough if jumpIfN
18fd0 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a  ull.** is 0..*/.
18fe0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
18ff0 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70  IfFalse(Parse *p
19000 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
19010 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
19020 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
19030 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
19040 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
19050 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  op = 0;.  int re
19060 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e  gFree1 = 0;.  in
19070 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a  t regFree2 = 0;.
19080 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20    int r1, r2;.. 
19090 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e   assert( jumpIfN
190a0 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50  ull==SQLITE_JUMP
190b0 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66  IFNULL || jumpIf
190c0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Null==0 );.  if(
190d0 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72   NEVER(v==0) ) r
190e0 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74 61  eturn; /* Exista
190f0 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63  nce of VDBE chec
19100 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f  ked by caller */
19110 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
19120 29 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20  )    return;..  
19130 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  /* The value of 
19140 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70  pExpr->op and op
19150 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73 20   are related as 
19160 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
19170 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  **       pExpr->
19180 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f 70  op            op
19190 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d  .  **       ----
191a0 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d  -----          -
191b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20  ---------.  **  
191c0 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20       TK_ISNULL  
191d0 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75          OP_NotNu
191e0 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  ll.  **       TK
191f0 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20  _NOTNULL        
19200 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20   OP_IsNull.  ** 
19210 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20        TK_NE     
19220 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20           OP_Eq. 
19230 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20   **       TK_EQ 
19240 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
19250 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Ne.  **       TK
19260 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _GT             
19270 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Le.  **     
19280 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20    TK_LE         
19290 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20       OP_Gt.  ** 
192a0 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20        TK_GE     
192b0 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20           OP_Lt. 
192c0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20   **       TK_LT 
192d0 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
192e0 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72  Ge.  **.  ** For
192f0 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66   other values of
19300 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69   pExpr->op, op i
19310 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20  s undefined and 
19320 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65  unused..  ** The
19330 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e   value of TK_ an
19340 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20  d OP_ constants 
19350 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75 63  are arranged suc
19360 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63  h that we.  ** c
19370 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d  an compute the m
19380 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69  apping above usi
19390 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
193a0 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a   expression..  *
193b0 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72 69  * Assert()s veri
193c0 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70  fy that the comp
193d0 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65  utation is corre
193e0 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20  ct..  */.  op = 
193f0 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f  ((pExpr->op+(TK_
19400 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54  ISNULL&1))^1)-(T
19410 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20  K_ISNULL&1);..  
19420 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65 63  /* Verify correc
19430 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54  t alignment of T
19440 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
19450 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ants.  */.  asse
19460 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
19470 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d  K_ISNULL || op==
19480 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20  OP_NotNull );.  
19490 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
194a0 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c  p!=TK_NOTNULL ||
194b0 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29   op==OP_IsNull )
194c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
194d0 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20  r->op!=TK_NE || 
194e0 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61  op==OP_Eq );.  a
194f0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
19500 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_EQ || op==O
19510 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ne );.  assert
19520 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
19530 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20  LT || op==OP_Ge 
19540 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
19550 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c  pr->op!=TK_LE ||
19560 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20   op==OP_Gt );.  
19570 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
19580 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d  p!=TK_GT || op==
19590 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Le );.  asser
195a0 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
195b0 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74  _GE || op==OP_Lt
195c0 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70   );..  switch( p
195d0 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
195e0 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
195f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
19600 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
19610 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
19620 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
19630 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
19640 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
19650 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
19660 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
19670 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
19680 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
19690 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
196a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
196b0 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
196c0 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
196d0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
196e0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
196f0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
19700 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19710 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
19720 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
19730 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
19740 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
19750 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66 4e  eft, d2, jumpIfN
19760 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ull^SQLITE_JUMPI
19770 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71  FNULL);.      sq
19780 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
19790 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
197a0 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
197b0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
197c0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
197d0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b  lveLabel(v, d2);
197e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
197f0 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
19800 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65  e, 1);.      bre
19810 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
19820 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
19830 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
19840 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
19850 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
19860 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
19870 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19880 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
19890 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
198a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
198b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
198c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
198d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
198e0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
198f0 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a  e( op==TK_LT );.
19900 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19910 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20  op==TK_LE );.   
19920 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
19930 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20  =TK_GT );.      
19940 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
19950 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GE );.      tes
19960 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51  tcase( op==TK_EQ
19970 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
19980 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b  se( op==TK_NE );
19990 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
199a0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
199b0 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
199c0 61 72 65 4f 70 65 72 61 6e 64 73 28 70 50 61 72  areOperands(pPar
199d0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
199e0 2c 20 26 72 31 2c 20 26 72 65 67 46 72 65 65 31  , &r1, &regFree1
199f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a10 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
19a20 74 2c 20 26 72 32 2c 20 26 72 65 67 46 72 65 65  t, &r2, &regFree
19a30 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  2);.      codeCo
19a40 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
19a50 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
19a60 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
19a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a80 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a   r1, r2, dest, j
19a90 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
19aa0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
19ab0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
19ac0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
19ad0 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
19ae0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
19af0 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
19b00 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
19b10 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 74 65  NULL: {.      te
19b20 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
19b30 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74  SNULL );.      t
19b40 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
19b50 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  NOTNULL );.     
19b60 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
19b70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
19b80 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
19b90 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
19ba0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19bb0 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64  Op2(v, op, r1, d
19bc0 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
19bd0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
19be0 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
19bf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
19c00 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
19c10 20 20 20 20 20 2f 2a 20 20 20 20 78 20 42 45 54       /*    x BET
19c20 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20  WEEN y AND z.   
19c30 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
19c40 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
19c50 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
19c60 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78  **    x>=y AND x
19c70 3c 3d 7a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  <=z.      **.   
19c80 20 20 20 2a 2a 20 43 6f 64 65 20 69 74 20 61 73     ** Code it as
19c90 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61   such, taking ca
19ca0 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d  re to do the com
19cb0 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f  mon subexpressio
19cc0 6e 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65  n.      ** eleme
19cd0 6e 74 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 20 20  ntation of x..  
19ce0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70      */.      Exp
19cf0 72 20 65 78 70 72 41 6e 64 3b 0a 20 20 20 20 20  r exprAnd;.     
19d00 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 0a   Expr compLeft;.
19d10 20 20 20 20 20 20 45 78 70 72 20 63 6f 6d 70 52        Expr compR
19d20 69 67 68 74 3b 0a 20 20 20 20 20 20 45 78 70 72  ight;.      Expr
19d30 20 65 78 70 72 58 3b 0a 0a 20 20 20 20 20 20 61   exprX;..      a
19d40 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
19d50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
19d60 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
19d70 20 20 20 20 20 20 65 78 70 72 58 20 3d 20 2a 70        exprX = *p
19d80 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
19d90 20 20 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20     exprAnd.op = 
19da0 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 65 78  TK_AND;.      ex
19db0 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63  prAnd.pLeft = &c
19dc0 6f 6d 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 65  ompLeft;.      e
19dd0 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20  xprAnd.pRight = 
19de0 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 20 20  &compRight;.    
19df0 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20    compLeft.op = 
19e00 54 4b 5f 47 45 3b 0a 20 20 20 20 20 20 63 6f 6d  TK_GE;.      com
19e10 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65  pLeft.pLeft = &e
19e20 78 70 72 58 3b 0a 20 20 20 20 20 20 63 6f 6d 70  xprX;.      comp
19e30 4c 65 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45  Left.pRight = pE
19e40 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
19e50 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  0].pExpr;.      
19e60 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54  compRight.op = T
19e70 4b 5f 4c 45 3b 0a 20 20 20 20 20 20 63 6f 6d 70  K_LE;.      comp
19e80 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65  Right.pLeft = &e
19e90 78 70 72 58 3b 0a 20 20 20 20 20 20 63 6f 6d 70  xprX;.      comp
19ea0 52 69 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70  Right.pRight = p
19eb0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
19ec0 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [1].pExpr;.     
19ed0 20 65 78 70 72 58 2e 69 54 61 62 6c 65 20 3d 20   exprX.iTable = 
19ee0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
19ef0 65 6d 70 28 70 50 61 72 73 65 2c 20 26 65 78 70  emp(pParse, &exp
19f00 72 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  rX, &regFree1);.
19f10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19f20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
19f30 20 20 20 20 20 65 78 70 72 58 2e 6f 70 20 3d 20       exprX.op = 
19f40 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20  TK_REGISTER;.   
19f50 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
19f60 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
19f70 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
19f80 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 26  fFalse(pParse, &
19f90 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a  exprAnd, dest, j
19fa0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
19fb0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
19fc0 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
19fd0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
19fe0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
19ff0 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67  rse, pExpr, &reg
1a000 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71  Free1);.      sq
1a010 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1a020 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c  v, OP_IfNot, r1,
1a030 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1a040 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 74 65 73  l!=0);.      tes
1a050 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1a060 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1a070 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1a080 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
1a090 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
1a0a0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1a0b0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
1a0c0 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
1a0d0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1a0e0 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
1a0f0 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  2);.}../*.** Do 
1a100 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f  a deep compariso
1a110 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73  n of two express
1a120 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75  ion trees.  Retu
1a130 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72  rn TRUE (non-zer
1a140 6f 29 0a 2a 2a 20 69 66 20 74 68 65 79 20 61 72  o).** if they ar
1a150 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20  e identical and 
1a160 72 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  return FALSE if 
1a170 74 68 65 79 20 64 69 66 66 65 72 20 69 6e 20 61  they differ in a
1a180 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f  ny way..**.** So
1a190 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75  metimes this rou
1a1a0 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
1a1b0 20 46 41 4c 53 45 20 65 76 65 6e 20 69 66 20 74   FALSE even if t
1a1c0 68 65 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  he two expressio
1a1d0 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65  ns.** really are
1a1e0 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66   equivalent.  If
1a1f0 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65   we cannot prove
1a200 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
1a210 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65  sions are.** ide
1a220 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72  ntical, we retur
1a230 6e 20 46 41 4c 53 45 20 6a 75 73 74 20 74 6f 20  n FALSE just to 
1a240 62 65 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20  be safe.  So if 
1a250 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
1a260 72 65 74 75 72 6e 73 20 66 61 6c 73 65 2c 20 74  returns false, t
1a270 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72  hen you do not r
1a280 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63  eally know for c
1a290 65 72 74 61 69 6e 20 69 66 20 74 68 65 20 74 77  ertain if the tw
1a2a0 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73  o.** expressions
1a2b0 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20   are the same.  
1a2c0 42 75 74 20 69 66 20 79 6f 75 20 67 65 74 20 61  But if you get a
1a2d0 20 54 52 55 45 20 72 65 74 75 72 6e 2c 20 74 68   TRUE return, th
1a2e0 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65  en you.** can be
1a2f0 20 73 75 72 65 20 74 68 65 20 65 78 70 72 65 73   sure the expres
1a300 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61  sions are the sa
1a310 6d 65 2e 20 20 49 6e 20 74 68 65 20 70 6c 61 63  me.  In the plac
1a320 65 73 20 77 68 65 72 65 0a 2a 2a 20 74 68 69 73  es where.** this
1a330 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
1a340 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 68 75  , it does not hu
1a350 72 74 20 74 6f 20 67 65 74 20 61 6e 20 65 78 74  rt to get an ext
1a360 72 61 20 46 41 4c 53 45 20 2d 20 74 68 61 74 0a  ra FALSE - that.
1a370 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20 72 65  ** just might re
1a380 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69  sult in some sli
1a390 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64  ghtly slower cod
1a3a0 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e 69 6e  e.  But returnin
1a3b0 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63  g.** an incorrec
1a3c0 74 20 54 52 55 45 20 63 6f 75 6c 64 20 6c 65 61  t TRUE could lea
1a3d0 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69  d to a malfuncti
1a3e0 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
1a3f0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78  e3ExprCompare(Ex
1a400 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42  pr *pA, Expr *pB
1a410 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
1a420 28 20 70 41 3d 3d 30 7c 7c 70 42 3d 3d 30 20 29  ( pA==0||pB==0 )
1a430 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d  {.    return pB=
1a440 3d 70 41 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  =pA;.  }.  asser
1a450 74 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72  t( !ExprHasAnyPr
1a460 6f 70 65 72 74 79 28 70 41 2c 20 45 50 5f 54 6f  operty(pA, EP_To
1a470 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
1a480 65 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ed) );.  assert(
1a490 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70   !ExprHasAnyProp
1a4a0 65 72 74 79 28 70 42 2c 20 45 50 5f 54 6f 6b 65  erty(pB, EP_Toke
1a4b0 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
1a4c0 29 20 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48  ) );.  if( ExprH
1a4d0 61 73 50 72 6f 70 65 72 74 79 28 70 41 2c 20 45  asProperty(pA, E
1a4e0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 7c 7c 20  P_xIsSelect) || 
1a4f0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1a500 70 42 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pB, EP_xIsSelect
1a510 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1a520 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 41  0;.  }.  if( (pA
1a530 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
1a540 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61  tinct)!=(pB->fla
1a550 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
1a560 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
1a570 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e  if( pA->op!=pB->
1a580 6f 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  op ) return 0;. 
1a590 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
1a5a0 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65  rCompare(pA->pLe
1a5b0 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 29 20 29  ft, pB->pLeft) )
1a5c0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
1a5d0 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d   !sqlite3ExprCom
1a5e0 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c  pare(pA->pRight,
1a5f0 20 70 42 2d 3e 70 52 69 67 68 74 29 20 29 20 72   pB->pRight) ) r
1a600 65 74 75 72 6e 20 30 3b 0a 0a 20 20 69 66 28 20  eturn 0;..  if( 
1a610 70 41 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 70  pA->x.pList && p
1a620 42 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20  B->x.pList ){.  
1a630 20 20 69 66 28 20 70 41 2d 3e 78 2e 70 4c 69 73    if( pA->x.pLis
1a640 74 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 78 2e  t->nExpr!=pB->x.
1a650 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 20 72  pList->nExpr ) r
1a660 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72  eturn 0;.    for
1a670 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 78 2e 70 4c  (i=0; i<pA->x.pL
1a680 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
1a690 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
1a6a0 78 70 72 41 20 3d 20 70 41 2d 3e 78 2e 70 4c 69  xprA = pA->x.pLi
1a6b0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
1a6c0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
1a6d0 72 42 20 3d 20 70 42 2d 3e 78 2e 70 4c 69 73 74  rB = pB->x.pList
1a6e0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
1a6f0 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
1a700 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70  ExprCompare(pExp
1a710 72 41 2c 20 70 45 78 70 72 42 29 20 29 20 72 65  rA, pExprB) ) re
1a720 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
1a730 7d 65 6c 73 65 20 69 66 28 20 70 41 2d 3e 78 2e  }else if( pA->x.
1a740 70 4c 69 73 74 20 7c 7c 20 70 42 2d 3e 78 2e 70  pList || pB->x.p
1a750 4c 69 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75  List ){.    retu
1a760 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  rn 0;.  }..  if(
1a770 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d   pA->iTable!=pB-
1a780 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41 2d 3e 69  >iTable || pA->i
1a790 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c  Column!=pB->iCol
1a7a0 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  umn ) return 0;.
1a7b0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
1a7c0 70 65 72 74 79 28 70 41 2c 20 45 50 5f 49 6e 74  perty(pA, EP_Int
1a7d0 56 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 69 66  Value) ){.    if
1a7e0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1a7f0 74 79 28 70 42 2c 20 45 50 5f 49 6e 74 56 61 6c  ty(pB, EP_IntVal
1a800 75 65 29 20 7c 7c 20 70 41 2d 3e 75 2e 69 56 61  ue) || pA->u.iVa
1a810 6c 75 65 21 3d 70 42 2d 3e 75 2e 69 56 61 6c 75  lue!=pB->u.iValu
1a820 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
1a830 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  n 0;.    }.  }el
1a840 73 65 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54  se if( pA->op!=T
1a850 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e  K_COLUMN && pA->
1a860 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  u.zToken ){.    
1a870 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
1a880 72 74 79 28 70 42 2c 20 45 50 5f 49 6e 74 56 61  rty(pB, EP_IntVa
1a890 6c 75 65 29 20 7c 7c 20 4e 45 56 45 52 28 70 42  lue) || NEVER(pB
1a8a0 2d 3e 75 2e 7a 54 6f 6b 65 6e 3d 3d 30 29 20 29  ->u.zToken==0) )
1a8b0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69   return 0;.    i
1a8c0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
1a8d0 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70  p(pA->u.zToken,p
1a8e0 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20  B->u.zToken)!=0 
1a8f0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1a900 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
1a910 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 1;.}.../*.
1a920 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65  ** Add a new ele
1a930 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67  ment to the pAgg
1a940 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72  Info->aCol[] arr
1a950 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ay.  Return the 
1a960 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20  index of.** the 
1a970 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65  new element.  Re
1a980 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
1a990 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63  number if malloc
1a9a0 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
1a9b0 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f  c int addAggInfo
1a9c0 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a  Column(sqlite3 *
1a9d0 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e  db, AggInfo *pIn
1a9e0 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  fo){.  int i;.  
1a9f0 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71  pInfo->aCol = sq
1aa00 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
1aa10 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 0a 20  te(.       db,. 
1aa20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f        pInfo->aCo
1aa30 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66  l,.       sizeof
1aa40 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29  (pInfo->aCol[0])
1aa50 2c 0a 20 20 20 20 20 20 20 33 2c 0a 20 20 20 20  ,.       3,.    
1aa60 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75     &pInfo->nColu
1aa70 6d 6e 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66  mn,.       &pInf
1aa80 6f 2d 3e 6e 43 6f 6c 75 6d 6e 41 6c 6c 6f 63 2c  o->nColumnAlloc,
1aa90 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a  .       &i.  );.
1aaa0 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20    return i;.}   
1aab0 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e   ../*.** Add a n
1aac0 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
1aad0 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  e pAggInfo->aFun
1aae0 63 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75  c[] array.  Retu
1aaf0 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a  rn the index of.
1ab00 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65  ** the new eleme
1ab10 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65  nt.  Return a ne
1ab20 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66  gative number if
1ab30 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a   malloc fails..*
1ab40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64  /.static int add
1ab50 41 67 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69  AggInfoFunc(sqli
1ab60 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f  te3 *db, AggInfo
1ab70 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20   *pInfo){.  int 
1ab80 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e  i;.  pInfo->aFun
1ab90 63 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79  c = sqlite3Array
1aba0 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20  Allocate(.      
1abb0 20 64 62 2c 20 0a 20 20 20 20 20 20 20 70 49 6e   db, .       pIn
1abc0 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20  fo->aFunc,.     
1abd0 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e    sizeof(pInfo->
1abe0 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20  aFunc[0]),.     
1abf0 20 20 33 2c 0a 20 20 20 20 20 20 20 26 70 49 6e    3,.       &pIn
1ac00 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20  fo->nFunc,.     
1ac10 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 41    &pInfo->nFuncA
1ac20 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 20 26 69 0a  lloc,.       &i.
1ac30 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b    );.  return i;
1ac40 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68  .}    ../*.** Th
1ac50 69 73 20 69 73 20 74 68 65 20 78 45 78 70 72 43  is is the xExprC
1ac60 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20 74 72  allback for a tr
1ac70 65 65 20 77 61 6c 6b 65 72 2e 20 20 49 74 20 69  ee walker.  It i
1ac80 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70  s used to.** imp
1ac90 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 45 78  lement sqlite3Ex
1aca0 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
1acb0 74 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69  tes().  See sqli
1acc0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
1acd0 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20  gregates.** for 
1ace0 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
1acf0 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  mation..*/.stati
1ad00 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67  c int analyzeAgg
1ad10 72 65 67 61 74 65 28 57 61 6c 6b 65 72 20 2a 70  regate(Walker *p
1ad20 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
1ad30 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  xpr){.  int i;. 
1ad40 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
1ad50 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  C = pWalker->u.p
1ad60 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  NC;.  Parse *pPa
1ad70 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
1ad80 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  e;.  SrcList *pS
1ad90 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53  rcList = pNC->pS
1ada0 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e 66  rcList;.  AggInf
1adb0 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e  o *pAggInfo = pN
1adc0 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20  C->pAggInfo;..  
1add0 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
1ade0 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
1adf0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  _AGG_COLUMN:.   
1ae00 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
1ae10 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1ae20 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
1ae30 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _AGG_COLUMN );. 
1ae40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1ae50 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
1ae60 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  UMN );.      /* 
1ae70 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1ae80 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e  the column is in
1ae90 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c   one of the tabl
1aea0 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20  es in the FROM. 
1aeb0 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f       ** clause o
1aec0 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
1aed0 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69  query */.      i
1aee0 66 28 20 41 4c 57 41 59 53 28 70 53 72 63 4c 69  f( ALWAYS(pSrcLi
1aef0 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  st!=0) ){.      
1af00 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1af10 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70  _item *pItem = p
1af20 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20  SrcList->a;.    
1af30 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
1af40 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  SrcList->nSrc; i
1af50 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
1af60 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
1af70 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
1af80 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
1af90 72 74 28 20 21 45 78 70 72 48 61 73 41 6e 79 50  rt( !ExprHasAnyP
1afa0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1afb0 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
1afc0 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20  educed) );.     
1afd0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
1afe0 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69  iTable==pItem->i
1aff0 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
1b000 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72        /* If we r
1b010 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
1b020 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 70   it means that p
1b030 45 78 70 72 20 72 65 66 65 72 73 20 74 6f 20 61  Expr refers to a
1b040 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20   table.         
1b050 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 69 6e     ** that is in
1b060 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1b070 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74   of the aggregat
1b080 65 20 71 75 65 72 79 2e 20 20 0a 20 20 20 20 20  e query.  .     
1b090 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
1b0a0 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e        ** Make an
1b0b0 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 63   entry for the c
1b0c0 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66  olumn in pAggInf
1b0d0 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65  o->aCol[] if the
1b0e0 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  re.            *
1b0f0 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72  * is not an entr
1b100 79 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e  y there already.
1b110 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
1b120 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
1b130 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  k;.            p
1b140 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  Col = pAggInfo->
1b150 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  aCol;.          
1b160 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67    for(k=0; k<pAg
1b170 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  gInfo->nColumn; 
1b180 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  k++, pCol++){.  
1b190 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1b1a0 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45  pCol->iTable==pE
1b1b0 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20  xpr->iTable &&. 
1b1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b1d0 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d   pCol->iColumn==
1b1e0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29  pExpr->iColumn )
1b1f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1b200 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1b210 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b220 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1b230 20 20 20 69 66 28 20 28 6b 3e 3d 70 41 67 67 49     if( (k>=pAggI
1b240 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20  nfo->nColumn).  
1b250 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6b             && (k
1b260 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c   = addAggInfoCol
1b270 75 6d 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  umn(pParse->db, 
1b280 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20  pAggInfo))>=0 . 
1b290 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
1b2a0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
1b2b0 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43   = &pAggInfo->aC
1b2c0 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20  ol[k];.         
1b2d0 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20       pCol->pTab 
1b2e0 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20  = pExpr->pTab;. 
1b2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
1b300 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70  l->iTable = pExp
1b310 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  r->iTable;.     
1b320 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
1b330 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e  Column = pExpr->
1b340 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  iColumn;.       
1b350 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65         pCol->iMe
1b360 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
1b370 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  em;.            
1b380 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
1b390 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
1b3a0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
1b3b0 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
1b3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1b3d0 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75   pAggInfo->pGrou
1b3e0 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBy ){.         
1b3f0 20 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b         int j, n;
1b400 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b410 20 45 78 70 72 4c 69 73 74 20 2a 70 47 42 20 3d   ExprList *pGB =
1b420 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75   pAggInfo->pGrou
1b430 70 42 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pBy;.           
1b440 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
1b450 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d  List_item *pTerm
1b460 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20   = pGB->a;.     
1b470 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70             n = p
1b480 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  GB->nExpr;.     
1b490 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a             for(j
1b4a0 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54  =0; j<n; j++, pT
1b4b0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
1b4c0 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
1b4d0 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pE = pTerm->pExp
1b4e0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
1b4f0 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d       if( pE->op=
1b500 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45  =TK_COLUMN && pE
1b510 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d  ->iTable==pExpr-
1b520 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20  >iTable &&.     
1b530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b540 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45   pE->iColumn==pE
1b550 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a  xpr->iColumn ){.
1b560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b570 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
1b580 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20  rColumn = j;.   
1b590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1b5b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1b5c0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1b5d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1b5e0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1b5f0 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
1b600 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  umn<0 ){.       
1b610 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
1b620 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70  SorterColumn = p
1b630 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e  AggInfo->nSortin
1b640 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20  gColumn++;.     
1b650 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1b660 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b670 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73       /* There is
1b680 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20 66 6f   now an entry fo
1b690 72 20 70 45 78 70 72 20 69 6e 20 70 41 67 67 49  r pExpr in pAggI
1b6a0 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74  nfo->aCol[] (eit
1b6b0 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  her.            
1b6c0 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20 77 61  ** because it wa
1b6d0 73 20 74 68 65 72 65 20 62 65 66 6f 72 65 20 6f  s there before o
1b6e0 72 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73  r because we jus
1b6f0 74 20 63 72 65 61 74 65 64 20 69 74 29 2e 0a 20  t created it).. 
1b700 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 43 6f             ** Co
1b710 6e 76 65 72 74 20 74 68 65 20 70 45 78 70 72 20  nvert the pExpr 
1b720 74 6f 20 62 65 20 61 20 54 4b 5f 41 47 47 5f 43  to be a TK_AGG_C
1b730 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e 67 20  OLUMN referring 
1b740 74 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  to that.        
1b750 20 20 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d      ** pAggInfo-
1b760 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20  >aCol[] entry.. 
1b770 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
1b780 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65            ExprSe
1b790 74 49 72 72 65 64 75 63 69 62 6c 65 28 70 45 78  tIrreducible(pEx
1b7a0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pr);.           
1b7b0 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
1b7c0 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20   = pAggInfo;.   
1b7d0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
1b7e0 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  op = TK_AGG_COLU
1b7f0 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  MN;.            
1b800 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69  pExpr->iAgg = (i
1b810 31 36 29 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  16)k;.          
1b820 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1b830 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45     } /* endif pE
1b840 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74  xpr->iTable==pIt
1b850 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20  em->iCursor */. 
1b860 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20         } /* end 
1b870 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69  loop over pSrcLi
1b880 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  st */.      }.  
1b890 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
1b8a0 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rune;.    }.    
1b8b0 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
1b8c0 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  TION: {.      /*
1b8d0 20 54 68 65 20 70 4e 43 2d 3e 6e 44 65 70 74 68   The pNC->nDepth
1b8e0 3d 3d 30 20 74 65 73 74 20 63 61 75 73 65 73 20  ==0 test causes 
1b8f0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
1b900 6f 6e 73 20 69 6e 20 73 75 62 71 75 65 72 69 65  ons in subquerie
1b910 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65  s.      ** to be
1b920 20 69 67 6e 6f 72 65 64 20 2a 2f 0a 20 20 20 20   ignored */.    
1b930 20 20 69 66 28 20 70 4e 43 2d 3e 6e 44 65 70 74    if( pNC->nDept
1b940 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  h==0 ){.        
1b950 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
1b960 69 66 20 70 45 78 70 72 20 69 73 20 61 20 64 75  if pExpr is a du
1b970 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68  plicate of anoth
1b980 65 72 20 61 67 67 72 65 67 61 74 65 20 0a 20 20  er aggregate .  
1b990 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
1b9a0 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65 61 64  n that is alread
1b9b0 79 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e 66  y in the pAggInf
1b9c0 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20  o structure.    
1b9d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
1b9e0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
1b9f0 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67 67  nc *pItem = pAgg
1ba00 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20  Info->aFunc;.   
1ba10 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1ba20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
1ba30 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
1ba40 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
1ba50 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
1ba60 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70  (pItem->pExpr, p
1ba70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
1ba80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ba90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1baa0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e  }.        if( i>
1bab0 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  =pAggInfo->nFunc
1bac0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
1bad0 20 70 45 78 70 72 20 69 73 20 6f 72 69 67 69 6e   pExpr is origin
1bae0 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77 20  al.  Make a new 
1baf0 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66  entry in pAggInf
1bb00 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20  o->aFunc[].     
1bb10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1bb20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70    u8 enc = ENC(p
1bb30 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20  Parse->db);.    
1bb40 20 20 20 20 20 20 69 20 3d 20 61 64 64 41 67 67        i = addAgg
1bb50 49 6e 66 6f 46 75 6e 63 28 70 50 61 72 73 65 2d  InfoFunc(pParse-
1bb60 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a  >db, pAggInfo);.
1bb70 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
1bb80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1bb90 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1bba0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1bbb0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1bbc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
1bbd0 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f  Item = &pAggInfo
1bbe0 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20  ->aFunc[i];.    
1bbf0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
1bc00 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
1bc10 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
1bc20 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65  >iMem = ++pParse
1bc30 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
1bc40 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1bc50 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1bc60 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1bc70 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
1bc80 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73  pItem->pFunc = s
1bc90 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
1bca0 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20  on(pParse->db,. 
1bcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bcc0 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65    pExpr->u.zToke
1bcd0 6e 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  n, sqlite3Strlen
1bce0 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  30(pExpr->u.zTok
1bcf0 65 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  en),.           
1bd00 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78          pExpr->x
1bd10 2e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e  .pList ? pExpr->
1bd20 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  x.pList->nExpr :
1bd30 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20   0, enc, 0);.   
1bd40 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
1bd50 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44  pr->flags & EP_D
1bd60 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
1bd70 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
1bd80 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72  iDistinct = pPar
1bd90 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
1bda0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1bdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
1bdc0 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  em->iDistinct = 
1bdd0 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
1bde0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
1bdf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1be00 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70 6f  /* Make pExpr po
1be10 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f  int to the appro
1be20 70 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f 2d  priate pAggInfo-
1be30 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20  >aFunc[] entry. 
1be40 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1be50 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1be60 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45  asAnyProperty(pE
1be70 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  xpr, EP_TokenOnl
1be80 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
1be90 0a 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74  .        ExprSet
1bea0 49 72 72 65 64 75 63 69 62 6c 65 28 70 45 78 70  Irreducible(pExp
1beb0 72 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  r);.        pExp
1bec0 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 69  r->iAgg = (i16)i
1bed0 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
1bee0 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67  >pAggInfo = pAgg
1bef0 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65  Info;.        re
1bf00 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
1bf10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1bf20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
1bf30 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69  ontinue;.}.stati
1bf40 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67  c int analyzeAgg
1bf50 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 28  regatesInSelect(
1bf60 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
1bf70 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
1bf80 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  ){.  NameContext
1bf90 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d   *pNC = pWalker-
1bfa0 3e 75 2e 70 4e 43 3b 0a 20 20 69 66 28 20 70 4e  >u.pNC;.  if( pN
1bfb0 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 29 7b 0a  C->nDepth==0 ){.
1bfc0 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2b      pNC->nDepth+
1bfd0 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61  +;.    sqlite3Wa
1bfe0 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
1bff0 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  , pSelect);.    
1c000 70 4e 43 2d 3e 6e 44 65 70 74 68 2d 2d 3b 0a 20  pNC->nDepth--;. 
1c010 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
1c020 75 6e 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  une;.  }else{.  
1c030 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
1c040 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  tinue;.  }.}../*
1c050 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20  .** Analyze the 
1c060 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
1c070 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67   looking for agg
1c080 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
1c090 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69   and.** for vari
1c0a0 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20  ables that need 
1c0b0 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  to be added to t
1c0c0 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  he pParse->aAgg[
1c0d0 5d 20 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b 65  ] array..** Make
1c0e0 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72   additional entr
1c0f0 69 65 73 20 74 6f 20 74 68 65 20 70 50 61 72 73  ies to the pPars
1c100 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 20  e->aAgg[] array 
1c110 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  as necessary..**
1c120 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1c130 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
1c140 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65  called after the
1c150 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
1c160 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64  been.** analyzed
1c170 20 62 79 20 73 71 6c 69 74 65 33 52 65 73 6f 6c   by sqlite3Resol
1c180 76 65 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a  veExprNames()..*
1c190 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1c1a0 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
1c1b0 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20  tes(NameContext 
1c1c0 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70  *pNC, Expr *pExp
1c1d0 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  r){.  Walker w;.
1c1e0 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
1c1f0 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  k = analyzeAggre
1c200 67 61 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63  gate;.  w.xSelec
1c210 74 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c  tCallback = anal
1c220 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53  yzeAggregatesInS
1c230 65 6c 65 63 74 3b 0a 20 20 77 2e 75 2e 70 4e 43  elect;.  w.u.pNC
1c240 20 3d 20 70 4e 43 3b 0a 20 20 61 73 73 65 72 74   = pNC;.  assert
1c250 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21  ( pNC->pSrcList!
1c260 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57  =0 );.  sqlite3W
1c270 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70  alkExpr(&w, pExp
1c280 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  r);.}../*.** Cal
1c290 6c 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  l sqlite3ExprAna
1c2a0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
1c2b0 20 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65   for every expre
1c2c0 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65  ssion in an.** e
1c2d0 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
1c2e0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
1c2f0 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a  er of errors..**
1c300 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1c310 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e  is found, the an
1c320 61 6c 79 73 69 73 20 69 73 20 63 75 74 20 73 68  alysis is cut sh
1c330 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ort..*/.void sql
1c340 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
1c350 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65  ggList(NameConte
1c360 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73  xt *pNC, ExprLis
1c370 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72  t *pList){.  str
1c380 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
1c390 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
1c3a0 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  i;.  if( pList )
1c3b0 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d  {.    for(pItem=
1c3c0 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
1c3d0 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
1c3e0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
1c3f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
1c400 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
1c410 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78  (pNC, pItem->pEx
1c420 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  pr);.    }.  }.}
1c430 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
1c440 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 72 65   a single new re
1c450 67 69 73 74 65 72 20 66 6f 72 20 75 73 65 20 74  gister for use t
1c460 6f 20 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65  o hold some inte
1c470 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 2e  rmediate result.
1c480 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47  .*/.int sqlite3G
1c490 65 74 54 65 6d 70 52 65 67 28 50 61 72 73 65 20  etTempReg(Parse 
1c4a0 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20  *pParse){.  if( 
1c4b0 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
1c4c0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1c4d0 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  n ++pParse->nMem
1c4e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1c4f0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
1c500 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  --pParse->nTempR
1c510 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  eg];.}../*.** De
1c520 61 6c 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73  allocate a regis
1c530 74 65 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69  ter, making avai
1c540 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 20  lable for reuse 
1c550 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a  for some other.*
1c560 2a 20 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a  * purpose..**.**
1c570 20 49 66 20 61 20 72 65 67 69 73 74 65 72 20 69   If a register i
1c580 73 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  s currently bein
1c590 67 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f  g used by the co
1c5a0 6c 75 6d 6e 20 63 61 63 68 65 2c 20 74 68 65 6e  lumn cache, then
1c5b0 0a 2a 2a 20 74 68 65 20 64 61 6c 6c 6f 63 61 74  .** the dallocat
1c5c0 69 6f 6e 20 69 73 20 64 65 66 65 72 72 65 64 20  ion is deferred 
1c5d0 75 6e 74 69 6c 20 74 68 65 20 63 6f 6c 75 6d 6e  until the column
1c5e0 20 63 61 63 68 65 20 6c 69 6e 65 20 74 68 61 74   cache line that
1c5f0 20 75 73 65 73 0a 2a 2a 20 74 68 65 20 72 65 67   uses.** the reg
1c600 69 73 74 65 72 20 62 65 63 6f 6d 65 73 20 73 74  ister becomes st
1c610 61 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ale..*/.void sql
1c620 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1c630 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eg(Parse *pParse
1c640 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69  , int iReg){.  i
1c650 66 28 20 69 52 65 67 20 26 26 20 70 50 61 72 73  f( iReg && pPars
1c660 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61  e->nTempReg<Arra
1c670 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54  ySize(pParse->aT
1c680 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20 69  empReg) ){.    i
1c690 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74  nt i;.    struct
1c6a0 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20   yColCache *p;. 
1c6b0 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50     for(i=0, p=pP
1c6c0 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
1c6d0 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
1c6e0 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
1c6f0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 52  .      if( p->iR
1c700 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20  eg==iReg ){.    
1c710 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d      p->tempReg =
1c720 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   1;.        retu
1c730 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
1c740 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54  }.    pParse->aT
1c750 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e  empReg[pParse->n
1c760 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65  TempReg++] = iRe
1c770 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g;.  }.}../*.** 
1c780 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c  Allocate or deal
1c790 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f  locate a block o
1c7a0 66 20 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69  f nReg consecuti
1c7b0 76 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2f 0a  ve registers.*/.
1c7c0 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65  int sqlite3GetTe
1c7d0 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70  mpRange(Parse *p
1c7e0 50 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29  Parse, int nReg)
1c7f0 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  {.  int i, n;.  
1c800 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61 6e  i = pParse->iRan
1c810 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61  geReg;.  n = pPa
1c820 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a  rse->nRangeReg;.
1c830 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 26 26    if( nReg<=n &&
1c840 20 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61   !usedAsColumnCa
1c850 63 68 65 28 70 50 61 72 73 65 2c 20 69 2c 20 69  che(pParse, i, i
1c860 2b 6e 2d 31 29 20 29 7b 0a 20 20 20 20 70 50 61  +n-1) ){.    pPa
1c870 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b  rse->iRangeReg +
1c880 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72  = nReg;.    pPar
1c890 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d  se->nRangeReg -=
1c8a0 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nReg;.  }else{.
1c8b0 20 20 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e      i = pParse->
1c8c0 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72  nMem+1;.    pPar
1c8d0 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67  se->nMem += nReg
1c8e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
1c8f0 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
1c900 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
1c910 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1c920 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52  int iReg, int nR
1c930 65 67 29 7b 0a 20 20 69 66 28 20 6e 52 65 67 3e  eg){.  if( nReg>
1c940 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
1c950 67 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  g ){.    pParse-
1c960 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65  >nRangeReg = nRe
1c970 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69  g;.    pParse->i
1c980 52 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b  RangeReg = iReg;
1c990 0a 20 20 7d 0a 7d 0a                             .  }.}.