/ Hex Artifact Content
Login

Artifact ba5ba6a6332ec07d81cda97585dabf6c88bffbab:


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 30 20 32 30 30 39 2f 30 35 2f 32 39 20  .440 2009/05/29 
0220: 31 34 3a 33 39 3a 30 38 20 64 72 68 20 45 78 70  14:39:08 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 3b 0a 0a 20 20   int iValue;..  
3330: 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( pToken ){.  
3340: 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 54    if( op!=TK_INT
3350: 45 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e  EGER || pToken->
3360: 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c  z==0.          |
3370: 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33  | sqlite3GetInt3
3380: 32 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56  2(pToken->z, &iV
3390: 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  alue)==0 ){.    
33a0: 20 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b 65    nExtra = pToke
33b0: 6e 2d 3e 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  n->n+1;.    }.  
33c0: 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  }.  pNew = sqlit
33d0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
33e0: 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 2b  b, sizeof(Expr)+
33f0: 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20 70  nExtra);.  if( p
3400: 4e 65 77 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d  New ){.    pNew-
3410: 3e 6f 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20  >op = (u8)op;.  
3420: 20 20 70 4e 65 77 2d 3e 69 41 67 67 20 3d 20 2d    pNew->iAgg = -
3430: 31 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 6b 65  1;.    if( pToke
3440: 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  n ){.      if( n
3450: 45 78 74 72 61 3d 3d 30 20 29 7b 0a 20 20 20 20  Extra==0 ){.    
3460: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
3470: 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a  |= EP_IntValue;.
3480: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
3490: 69 56 61 6c 75 65 20 3d 20 69 56 61 6c 75 65 3b  iValue = iValue;
34a0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
34b0: 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20        int c;.   
34c0: 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f       pNew->u.zTo
34d0: 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 70 4e  ken = (char*)&pN
34e0: 65 77 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 6d  ew[1];.        m
34f0: 65 6d 63 70 79 28 70 4e 65 77 2d 3e 75 2e 7a 54  emcpy(pNew->u.zT
3500: 6f 6b 65 6e 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c  oken, pToken->z,
3510: 20 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20   pToken->n);.   
3520: 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f       pNew->u.zTo
3530: 6b 65 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d  ken[pToken->n] =
3540: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
3550: 64 65 71 75 6f 74 65 20 26 26 20 6e 45 78 74 72  dequote && nExtr
3560: 61 3e 3d 33 20 0a 20 20 20 20 20 20 20 20 20 20  a>=3 .          
3570: 20 20 20 26 26 20 28 28 63 20 3d 20 70 54 6f 6b     && ((c = pTok
3580: 65 6e 2d 3e 7a 5b 30 5d 29 3d 3d 27 5c 27 27 20  en->z[0])=='\'' 
3590: 7c 7c 20 63 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d  || c=='"' || c==
35a0: 27 5b 27 20 7c 7c 20 63 3d 3d 27 60 27 29 20 29  '[' || c=='`') )
35b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
35c0: 74 65 33 44 65 71 75 6f 74 65 28 70 4e 65 77 2d  te3Dequote(pNew-
35d0: 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
35e0: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 22 27        if( c=='"'
35f0: 20 29 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c   ) pNew->flags |
3600: 3d 20 45 50 5f 44 62 6c 51 75 6f 74 65 64 3b 0a  = EP_DblQuoted;.
3610: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3620: 7d 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49  }.    }.#if SQLI
3630: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
3640: 48 3e 30 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 48  H>0.    pNew->nH
3650: 65 69 67 68 74 20 3d 20 31 3b 0a 23 65 6e 64 69  eight = 1;.#endi
3660: 66 20 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f  .  }.  return
3670: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
3680: 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65  Allocate a new e
3690: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66  xpression node f
36a0: 72 6f 6d 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69  rom a zero-termi
36b0: 6e 61 74 65 64 20 74 6f 6b 65 6e 20 74 68 61 74  nated token that
36c0: 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20   has.** already 
36d0: 62 65 65 6e 20 64 65 71 75 6f 74 65 64 2e 0a 2a  been dequoted..*
36e0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
36f0: 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  xpr(.  sqlite3 *
3700: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  db,            /
3710: 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c  * Handle for sql
3720: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
3730: 28 29 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29  () (may be null)
3740: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
3750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3760: 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f   Expression opco
3770: 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  de */.  const ch
3780: 61 72 20 2a 7a 54 6f 6b 65 6e 20 20 20 20 20 20  ar *zToken      
3790: 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e  /* Token argumen
37a0: 74 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  t.  Might be NUL
37b0: 4c 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20  L */.){.  Token 
37c0: 78 3b 0a 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65  x;.  x.z = zToke
37d0: 6e 3b 0a 20 20 78 2e 6e 20 3d 20 7a 54 6f 6b 65  n;.  x.n = zToke
37e0: 6e 20 3f 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n ? sqlite3Strle
37f0: 6e 33 30 28 7a 54 6f 6b 65 6e 29 20 3a 20 30 3b  n30(zToken) : 0;
3800: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
3810: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 6f  3ExprAlloc(db, o
3820: 70 2c 20 26 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  p, &x, 0);.}../*
3830: 0a 2a 2a 20 41 74 74 61 63 68 20 73 75 62 74 72  .** Attach subtr
3840: 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52  ees pLeft and pR
3850: 69 67 68 74 20 74 6f 20 74 68 65 20 45 78 70 72  ight to the Expr
3860: 20 6e 6f 64 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a   node pRoot..**.
3870: 2a 2a 20 49 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c  ** If pRoot==NUL
3880: 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  L that means tha
3890: 74 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  t a memory alloc
38a0: 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20  ation error has 
38b0: 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20 49 6e 20  occurred..** In 
38c0: 74 68 61 74 20 63 61 73 65 2c 20 64 65 6c 65 74  that case, delet
38d0: 65 20 74 68 65 20 73 75 62 74 72 65 65 73 20 70  e the subtrees p
38e0: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e  Left and pRight.
38f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3900: 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65  ExprAttachSubtre
3910: 65 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  es(.  sqlite3 *d
3920: 62 2c 0a 20 20 45 78 70 72 20 2a 70 52 6f 6f 74  b,.  Expr *pRoot
3930: 2c 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  ,.  Expr *pLeft,
3940: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 0a  .  Expr *pRight.
3950: 29 7b 0a 20 20 69 66 28 20 70 52 6f 6f 74 3d 3d  ){.  if( pRoot==
3960: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
3970: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
3980: 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  d );.    sqlite3
3990: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
39a0: 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Left);.    sqlit
39b0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
39c0: 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73   pRight);.  }els
39d0: 65 7b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  e{.    if( pRigh
39e0: 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74  t ){.      pRoot
39f0: 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69 67 68  ->pRight = pRigh
3a00: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69  t;.      if( pRi
3a10: 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ght->flags & EP_
3a20: 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  ExpCollate ){.  
3a30: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61        pRoot->fla
3a40: 67 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c  gs |= EP_ExpColl
3a50: 61 74 65 3b 0a 20 20 20 20 20 20 20 20 70 52 6f  ate;.        pRo
3a60: 6f 74 2d 3e 70 43 6f 6c 6c 20 3d 20 70 52 69 67  ot->pColl = pRig
3a70: 68 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  ht->pColl;.     
3a80: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
3a90: 20 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20   pLeft ){.      
3aa0: 70 52 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d 20 70  pRoot->pLeft = p
3ab0: 4c 65 66 74 3b 0a 20 20 20 20 20 20 69 66 28 20  Left;.      if( 
3ac0: 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45  pLeft->flags & E
3ad0: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a  P_ExpCollate ){.
3ae0: 20 20 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66          pRoot->f
3af0: 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f  lags |= EP_ExpCo
3b00: 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 20 20 70  llate;.        p
3b10: 52 6f 6f 74 2d 3e 70 43 6f 6c 6c 20 3d 20 70 4c  Root->pColl = pL
3b20: 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20  eft->pColl;.    
3b30: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65 78    }.    }.    ex
3b40: 70 72 53 65 74 48 65 69 67 68 74 28 70 52 6f 6f  prSetHeight(pRoo
3b50: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
3b60: 20 41 6c 6c 6f 63 61 74 65 20 61 20 45 78 70 72   Allocate a Expr
3b70: 20 6e 6f 64 65 20 77 68 69 63 68 20 6a 6f 69 6e   node which join
3b80: 73 20 75 70 20 74 6f 20 74 77 6f 20 73 75 62 74  s up to two subt
3b90: 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rees..**.** The 
3ba0: 0a 2a 2a 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73  .** Works like s
3bb0: 71 6c 69 74 65 33 45 78 70 72 28 29 20 65 78 63  qlite3Expr() exc
3bc0: 65 70 74 20 74 68 61 74 20 69 74 20 74 61 6b 65  ept that it take
3bd0: 73 20 61 6e 20 65 78 74 72 61 20 50 61 72 73 65  s an extra Parse
3be0: 2a 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 61 6e  *.** argument an
3bf0: 64 20 6e 6f 74 69 66 69 65 73 20 74 68 65 20 61  d notifies the a
3c00: 73 73 6f 63 69 61 74 65 64 20 63 6f 6e 6e 65 63  ssociated connec
3c10: 74 69 6f 6e 20 6f 62 6a 65 63 74 20 69 66 20 6d  tion object if m
3c20: 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a  alloc fails..*/.
3c30: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78  Expr *sqlite3PEx
3c40: 70 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  pr(.  Parse *pPa
3c50: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
3c60: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
3c70: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
3c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3c90: 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f   Expression opco
3ca0: 64 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  de */.  Expr *pL
3cb0: 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  eft,            
3cc0: 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20  /* Left operand 
3cd0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  */.  Expr *pRigh
3ce0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
3cf0: 52 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f  Right operand */
3d00: 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a  .  const Token *
3d10: 70 54 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72  pToken     /* Ar
3d20: 67 75 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a  gument token */.
3d30: 29 7b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 73  ){.  Expr *p = s
3d40: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
3d50: 70 50 61 72 73 65 2d 3e 64 62 2c 20 6f 70 2c 20  pParse->db, op, 
3d60: 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 73 71  pToken, 1);.  sq
3d70: 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53  lite3ExprAttachS
3d80: 75 62 74 72 65 65 73 28 70 50 61 72 73 65 2d 3e  ubtrees(pParse->
3d90: 64 62 2c 20 70 2c 20 70 4c 65 66 74 2c 20 70 52  db, p, pLeft, pR
3da0: 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  ight);.  return 
3db0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e  p;.}../*.** Join
3dc0: 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73   two expressions
3dd0: 20 75 73 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70   using an AND op
3de0: 65 72 61 74 6f 72 2e 20 20 49 66 20 65 69 74 68  erator.  If eith
3df0: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  er expression is
3e00: 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a  .** NULL, then j
3e10: 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 6f  ust return the o
3e20: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 2e  ther expression.
3e30: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
3e40: 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74 65 33  3ExprAnd(sqlite3
3e50: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c 65 66   *db, Expr *pLef
3e60: 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 29  t, Expr *pRight)
3e70: 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30  {.  if( pLeft==0
3e80: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
3e90: 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69  Right;.  }else i
3ea0: 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a  f( pRight==0 ){.
3eb0: 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74      return pLeft
3ec0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45  ;.  }else{.    E
3ed0: 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  xpr *pNew = sqli
3ee0: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
3ef0: 20 54 4b 5f 41 4e 44 2c 20 30 2c 20 30 29 3b 0a   TK_AND, 0, 0);.
3f00: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
3f10: 74 74 61 63 68 53 75 62 74 72 65 65 73 28 64 62  ttachSubtrees(db
3f20: 2c 20 70 4e 65 77 2c 20 70 4c 65 66 74 2c 20 70  , pNew, pLeft, p
3f30: 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75  Right);.    retu
3f40: 72 6e 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a  rn pNew;.  }.}..
3f50: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
3f60: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
3f70: 20 6e 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63   node for a func
3f80: 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70  tion with multip
3f90: 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e  le.** arguments.
3fa0: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
3fb0: 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 50 61  3ExprFunction(Pa
3fc0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
3fd0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  rList *pList, To
3fe0: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
3ff0: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71  Expr *pNew;.  sq
4000: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
4010: 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
4020: 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e  ( pToken );.  pN
4030: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
4040: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 46 55 4e  Alloc(db, TK_FUN
4050: 43 54 49 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31  CTION, pToken, 1
4060: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
4070: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
4080: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
4090: 2c 20 70 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f  , pList); /* Avo
40a0: 69 64 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 77  id memory leak w
40b0: 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73  hen malloc fails
40c0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30   */.    return 0
40d0: 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e  ;.  }.  pNew->x.
40e0: 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20  pList = pList;. 
40f0: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
4100: 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20  sProperty(pNew, 
4110: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
4120: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 65  .  sqlite3ExprSe
4130: 74 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20  tHeight(pParse, 
4140: 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20  pNew);.  return 
4150: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  pNew;.}../*.** A
4160: 73 73 69 67 6e 20 61 20 76 61 72 69 61 62 6c 65  ssign a variable
4170: 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20 65 78   number to an ex
4180: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65 6e  pression that en
4190: 63 6f 64 65 73 20 61 20 77 69 6c 64 63 61 72 64  codes a wildcard
41a0: 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69 67 69  .** in the origi
41b0: 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  nal SQL statemen
41c0: 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63  t.  .**.** Wildc
41d0: 61 72 64 73 20 63 6f 6e 73 69 73 74 69 6e 67 20  ards consisting 
41e0: 6f 66 20 61 20 73 69 6e 67 6c 65 20 22 3f 22 20  of a single "?" 
41f0: 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65  are assigned the
4200: 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c   next sequential
4210: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  .** variable num
4220: 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63  ber..**.** Wildc
4230: 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ards of the form
4240: 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73 69   "?nnn" are assi
4250: 67 6e 65 64 20 74 68 65 20 6e 75 6d 62 65 72 20  gned the number 
4260: 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a  "nnn".  We make.
4270: 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20 69 73  ** sure "nnn" is
4280: 20 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f 20 61   not too be to a
4290: 76 6f 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66  void a denial of
42a0: 20 73 65 72 76 69 63 65 20 61 74 74 61 63 6b 20   service attack 
42b0: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20  when.** the SQL 
42c0: 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20  statement comes 
42d0: 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c  from an external
42e0: 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57   source..**.** W
42f0: 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20  ildcards of the 
4300: 66 6f 72 6d 20 22 3a 61 61 61 22 2c 20 22 40 61  form ":aaa", "@a
4310: 61 61 22 2c 20 6f 72 20 22 24 61 61 61 22 20 61  aa", or "$aaa" a
4320: 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20  re assigned the 
4330: 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61  same number.** a
4340: 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 69  s the previous i
4350: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73  nstance of the s
4360: 61 6d 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f  ame wildcard.  O
4370: 72 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  r if this is the
4380: 20 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e   first.** instan
4390: 63 65 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61  ce of the wildca
43a0: 72 64 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71  rd, the next seq
43b0: 75 65 6e 69 61 6c 20 76 61 72 69 61 62 6c 65 20  uenial variable 
43c0: 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73  number is.** ass
43d0: 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  igned..*/.void s
43e0: 71 6c 69 74 65 33 45 78 70 72 41 73 73 69 67 6e  qlite3ExprAssign
43f0: 56 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20  VarNumber(Parse 
4400: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
4410: 45 78 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  Expr){.  sqlite3
4420: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
4430: 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
4440: 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72  *z;..  if( pExpr
4450: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
4460: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
4470: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70  AnyProperty(pExp
4480: 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45  r, EP_IntValue|E
4490: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
44a0: 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d  enOnly) );.  z =
44b0: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
44c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30  ;.  assert( z!=0
44d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 5b   );.  assert( z[
44e0: 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a  0]!=0 );.  if( z
44f0: 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  [1]==0 ){.    /*
4500: 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65   Wildcard of the
4510: 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73 69   form "?".  Assi
4520: 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72 69  gn the next vari
4530: 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  able number */. 
4540: 20 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d     assert( z[0]=
4550: 3d 27 3f 27 20 29 3b 0a 20 20 20 20 70 45 78 70  ='?' );.    pExp
4560: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2b 2b 70 50  r->iTable = ++pP
4570: 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 7d 65  arse->nVar;.  }e
4580: 6c 73 65 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f  lse if( z[0]=='?
4590: 27 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64  ' ){.    /* Wild
45a0: 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d  card of the form
45b0: 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72   "?nnn".  Conver
45c0: 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e  t "nnn" to an in
45d0: 74 65 67 65 72 20 61 6e 64 0a 20 20 20 20 2a 2a  teger and.    **
45e0: 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76   use it as the v
45f0: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  ariable number *
4600: 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  /.    int i;.   
4610: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
4620: 20 69 20 3d 20 61 74 6f 69 28 28 63 68 61 72 2a   i = atoi((char*
4630: 29 26 7a 5b 31 5d 29 3b 0a 20 20 20 20 74 65 73  )&z[1]);.    tes
4640: 74 63 61 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20  tcase( i==0 );. 
4650: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d     testcase( i==
4660: 31 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  1 );.    testcas
4670: 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74  e( i==db->aLimit
4680: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
4690: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31  RIABLE_NUMBER]-1
46a0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
46b0: 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  ( i==db->aLimit[
46c0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
46d0: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 3b  IABLE_NUMBER] );
46e0: 0a 20 20 20 20 69 66 28 20 69 3c 31 20 7c 7c 20  .    if( i<1 || 
46f0: 69 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  i>db->aLimit[SQL
4700: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
4710: 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20  LE_NUMBER] ){.  
4720: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
4730: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61 72  Msg(pParse, "var
4740: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73  iable number mus
4750: 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20  t be between ?1 
4760: 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20  and ?%d",.      
4770: 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53      db->aLimit[S
4780: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
4790: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20  ABLE_NUMBER]);. 
47a0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 70     }.    if( i>p
47b0: 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20  Parse->nVar ){. 
47c0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61       pParse->nVa
47d0: 72 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d  r = i;.    }.  }
47e0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 69 6c  else{.    /* Wil
47f0: 64 63 61 72 64 73 20 6c 69 6b 65 20 22 3a 61 61  dcards like ":aa
4800: 61 22 2c 20 22 24 61 61 61 22 20 6f 72 20 22 40  a", "$aaa" or "@
4810: 61 61 61 22 2e 20 20 52 65 75 73 65 20 74 68 65  aaa".  Reuse the
4820: 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20   same variable. 
4830: 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20     ** number as 
4840: 74 68 65 20 70 72 69 6f 72 20 61 70 70 65 61 72  the prior appear
4850: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
4860: 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65   name, or if the
4870: 20 6e 61 6d 65 0a 20 20 20 20 2a 2a 20 68 61 73   name.    ** has
4880: 20 6e 65 76 65 72 20 61 70 70 65 61 72 65 64 20   never appeared 
4890: 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68  before, reuse th
48a0: 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20  e same variable 
48b0: 6e 75 6d 62 65 72 0a 20 20 20 20 2a 2f 0a 20 20  number.    */.  
48c0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 75 33 32    int i;.    u32
48d0: 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69   n;.    n = sqli
48e0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a  te3Strlen30(z);.
48f0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
4900: 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3b  Parse->nVarExpr;
4910: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
4920: 72 20 2a 70 45 20 3d 20 70 50 61 72 73 65 2d 3e  r *pE = pParse->
4930: 61 70 56 61 72 45 78 70 72 5b 69 5d 3b 0a 20 20  apVarExpr[i];.  
4940: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 21 3d      assert( pE!=
4950: 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6d  0 );.      if( m
4960: 65 6d 63 6d 70 28 70 45 2d 3e 75 2e 7a 54 6f 6b  emcmp(pE->u.zTok
4970: 65 6e 2c 20 7a 2c 20 6e 29 3d 3d 30 20 26 26 20  en, z, n)==0 && 
4980: 70 45 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 6e 5d 3d  pE->u.zToken[n]=
4990: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45  =0 ){.        pE
49a0: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45  xpr->iTable = pE
49b0: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
49c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
49d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
49e0: 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78  >=pParse->nVarEx
49f0: 70 72 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  pr ){.      pExp
4a00: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2b 2b 70 50  r->iTable = ++pP
4a10: 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 20 20  arse->nVar;.    
4a20: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 56    if( pParse->nV
4a30: 61 72 45 78 70 72 3e 3d 70 50 61 72 73 65 2d 3e  arExpr>=pParse->
4a40: 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 2d 31 20  nVarExprAlloc-1 
4a50: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  ){.        pPars
4a60: 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63  e->nVarExprAlloc
4a70: 20 2b 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61 72   += pParse->nVar
4a80: 45 78 70 72 41 6c 6c 6f 63 20 2b 20 31 30 3b 0a  ExprAlloc + 10;.
4a90: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
4aa0: 61 70 56 61 72 45 78 70 72 20 3d 0a 20 20 20 20  apVarExpr =.    
4ab0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
4ac0: 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 0a  bReallocOrFree(.
4ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 62                db
4ae0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4af0: 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70  pParse->apVarExp
4b00: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
4b10: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70   pParse->nVarExp
4b20: 72 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 50  rAlloc*sizeof(pP
4b30: 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b  arse->apVarExpr[
4b40: 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  0]).            
4b50: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
4b60: 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
4b70: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
4b80: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
4b90: 2d 3e 61 70 56 61 72 45 78 70 72 21 3d 30 20 29  ->apVarExpr!=0 )
4ba0: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
4bb0: 2d 3e 61 70 56 61 72 45 78 70 72 5b 70 50 61 72  ->apVarExpr[pPar
4bc0: 73 65 2d 3e 6e 56 61 72 45 78 70 72 2b 2b 5d 20  se->nVarExpr++] 
4bd0: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 7d  = pExpr;.      }
4be0: 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66  .    }.  } .  if
4bf0: 28 20 21 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  ( !pParse->nErr 
4c00: 26 26 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e  && pParse->nVar>
4c10: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
4c20: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
4c30: 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20  _NUMBER] ){.    
4c40: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
4c50: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
4c60: 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 22  y SQL variables"
4c70: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
4c80: 43 6c 65 61 72 20 61 6e 20 65 78 70 72 65 73 73  Clear an express
4c90: 69 6f 6e 20 73 74 72 75 63 74 75 72 65 20 77 69  ion structure wi
4ca0: 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74  thout deleting t
4cb0: 68 65 20 73 74 72 75 63 74 75 72 65 20 69 74 73  he structure its
4cc0: 65 6c 66 2e 0a 2a 2a 20 53 75 62 73 74 72 75 63  elf..** Substruc
4cd0: 74 75 72 65 20 69 73 20 64 65 6c 65 74 65 64 2e  ture is deleted.
4ce0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4cf0: 45 78 70 72 43 6c 65 61 72 28 73 71 6c 69 74 65  ExprClear(sqlite
4d00: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b  3 *db, Expr *p){
4d10: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
4d20: 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  );.  if( !ExprHa
4d30: 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20  sAnyProperty(p, 
4d40: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
4d50: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
4d60: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
4d70: 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eft);.    sqlite
4d80: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
4d90: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  p->pRight);.    
4da0: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
4db0: 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63  erty(p, EP_Reduc
4dc0: 65 64 29 20 26 26 20 28 70 2d 3e 66 6c 61 67 73  ed) && (p->flags
4dd0: 32 20 26 20 45 50 32 5f 4d 61 6c 6c 6f 63 65 64  2 & EP2_Malloced
4de0: 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20  Token)!=0 ){.   
4df0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
4e00: 28 64 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  (db, p->u.zToken
4e10: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
4e20: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
4e30: 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  (p, EP_xIsSelect
4e40: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
4e50: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
4e60: 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29  b, p->x.pSelect)
4e70: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4e80: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
4e90: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
4ea0: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  x.pList);.    }.
4eb0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63    }.}../*.** Rec
4ec0: 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20  ursively delete 
4ed0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
4ee0: 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ee..*/.void sqli
4ef0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 73 71  te3ExprDelete(sq
4f00: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
4f10: 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20  *p){.  if( p==0 
4f20: 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
4f30: 74 65 33 45 78 70 72 43 6c 65 61 72 28 64 62 2c  te3ExprClear(db,
4f40: 20 70 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72   p);.  if( !Expr
4f50: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
4f60: 50 5f 53 74 61 74 69 63 29 20 29 7b 0a 20 20 20  P_Static) ){.   
4f70: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4f80: 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  b, p);.  }.}../*
4f90: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
4fa0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
4fb0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
4fc0: 20 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72 75   expression stru
4fd0: 63 74 75 72 65 20 0a 2a 2a 20 70 61 73 73 65 64  cture .** passed
4fe0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
4ff0: 67 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20  gument. This is 
5000: 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20 45 58  always one of EX
5010: 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20  PR_FULLSIZE,.** 
5020: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
5030: 20 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e   or EXPR_TOKENON
5040: 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69  LYSIZE..*/.stati
5050: 63 20 69 6e 74 20 65 78 70 72 53 74 72 75 63 74  c int exprStruct
5060: 53 69 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a 20  Size(Expr *p){. 
5070: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
5080: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
5090: 4f 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20 45  Only) ) return E
50a0: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
50b0: 45 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  E;.  if( ExprHas
50c0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52  Property(p, EP_R
50d0: 65 64 75 63 65 64 29 20 29 20 72 65 74 75 72 6e  educed) ) return
50e0: 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a   EXPR_REDUCEDSIZ
50f0: 45 3b 0a 20 20 72 65 74 75 72 6e 20 45 58 50 52  E;.  return EXPR
5100: 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a  _FULLSIZE;.}../*
5110: 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70  .** The dupedExp
5120: 72 2a 53 69 7a 65 28 29 20 72 6f 75 74 69 6e 65  r*Size() routine
5130: 73 20 65 61 63 68 20 72 65 74 75 72 6e 20 74 68  s each return th
5140: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
5150: 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f  s required.** to
5160: 20 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66   store a copy of
5170: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f   an expression o
5180: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  r expression tre
5190: 65 2e 20 20 54 68 65 79 20 64 69 66 66 65 72 20  e.  They differ 
51a0: 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f  in.** how much o
51b0: 66 20 74 68 65 20 74 72 65 65 20 69 73 20 6d 65  f the tree is me
51c0: 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  asured..**.**   
51d0: 20 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63    dupedExprStruc
51e0: 74 53 69 7a 65 28 29 20 20 20 20 20 53 69 7a 65  tSize()     Size
51f0: 20 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45 78 70   of only the Exp
5200: 72 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20  r structure .** 
5210: 20 20 20 20 64 75 70 65 64 45 78 70 72 4e 6f 64      dupedExprNod
5220: 65 53 69 7a 65 28 29 20 20 20 20 20 20 20 53 69  eSize()       Si
5230: 7a 65 20 6f 66 20 45 78 70 72 20 2b 20 73 70 61  ze of Expr + spa
5240: 63 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20  ce for token.** 
5250: 20 20 20 20 64 75 70 65 64 45 78 70 72 53 69 7a      dupedExprSiz
5260: 65 28 29 20 20 20 20 20 20 20 20 20 20 20 45 78  e()           Ex
5270: 70 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62  pr + token + sub
5280: 74 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a  tree components.
5290: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
52a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
52b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 0a 2a  **************.*
52e0: 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78  *.** The dupedEx
52f0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 66  prStructSize() f
5300: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
5310: 74 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65 64  two values OR-ed
5320: 20 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20   together:  .** 
5330: 28 31 29 20 74 68 65 20 73 70 61 63 65 20 72 65  (1) the space re
5340: 71 75 69 72 65 64 20 66 6f 72 20 61 20 63 6f 70  quired for a cop
5350: 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74  y of the Expr st
5360: 72 75 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64  ructure only and
5370: 20 0a 2a 2a 20 28 32 29 20 74 68 65 20 45 50 5f   .** (2) the EP_
5380: 78 78 78 20 66 6c 61 67 73 20 74 68 61 74 20 69  xxx flags that i
5390: 6e 64 69 63 61 74 65 20 77 68 61 74 20 74 68 65  ndicate what the
53a0: 20 73 74 72 75 63 74 75 72 65 20 73 69 7a 65 20   structure size 
53b0: 73 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68  should be..** Th
53c0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20  e return values 
53d0: 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66  is always one of
53e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50  :.**.**      EXP
53f0: 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20  R_FULLSIZE.**   
5400: 20 20 20 45 58 50 52 5f 52 45 44 55 43 45 44 53     EXPR_REDUCEDS
5410: 49 5a 45 20 20 20 7c 20 45 50 5f 52 65 64 75 63  IZE   | EP_Reduc
5420: 65 64 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f  ed.**      EXPR_
5430: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20  TOKENONLYSIZE | 
5440: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a  EP_TokenOnly.**.
5450: 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  ** The size of t
5460: 68 65 20 73 74 72 75 63 74 75 72 65 20 63 61 6e  he structure can
5470: 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73   be found by mas
5480: 6b 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20  king the return 
5490: 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73  value.** of this
54a0: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 30 78   routine with 0x
54b0: 66 66 66 2e 20 20 54 68 65 20 66 6c 61 67 73 20  fff.  The flags 
54c0: 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20  can be found by 
54d0: 6d 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72  masking the.** r
54e0: 65 74 75 72 6e 20 76 61 6c 75 65 20 77 69 74 68  eturn value with
54f0: 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54   EP_Reduced|EP_T
5500: 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20  okenOnly..**.** 
5510: 4e 6f 74 65 20 74 68 61 74 20 77 69 74 68 20 66  Note that with f
5520: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
5530: 44 55 43 45 2c 20 74 68 69 73 20 72 6f 75 74 69  DUCE, this routi
5540: 6e 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c  nes works on ful
5550: 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64  l-size.** (unred
5560: 75 63 65 64 29 20 45 78 70 72 20 6f 62 6a 65 63  uced) Expr objec
5570: 74 73 20 61 73 20 74 68 65 79 20 6f 72 20 6f 72  ts as they or or
5580: 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75  iginally constru
5590: 63 74 65 64 20 62 79 20 74 68 65 20 70 61 72 73  cted by the pars
55a0: 65 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78  er..** During ex
55b0: 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69  pression analysi
55c0: 73 2c 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  s, extra informa
55d0: 74 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65 64  tion is computed
55e0: 20 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a   and moved into.
55f0: 2a 2a 20 6c 61 74 65 72 20 70 61 72 74 73 20 6f  ** later parts o
5600: 66 20 74 65 68 20 45 78 70 72 20 6f 62 6a 65 63  f teh Expr objec
5610: 74 20 61 6e 64 20 74 68 61 74 20 65 78 74 72 61  t and that extra
5620: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67   information mig
5630: 68 74 20 67 65 74 20 63 68 6f 70 70 65 64 0a 2a  ht get chopped.*
5640: 2a 20 6f 66 66 20 69 66 20 74 68 65 20 65 78 70  * off if the exp
5650: 72 65 73 73 69 6f 6e 20 69 73 20 72 65 64 75 63  ression is reduc
5660: 65 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74  ed.  Note also t
5670: 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  hat it does not 
5680: 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20  work to.** make 
5690: 61 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  a EXPRDUP_REDUCE
56a0: 20 63 6f 70 79 20 6f 66 20 61 20 72 65 64 75 63   copy of a reduc
56b0: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ed expression.  
56c0: 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c  It is only legal
56d0: 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65 20 61 20  .** to reduce a 
56e0: 70 72 69 73 74 69 6e 65 20 65 78 70 72 65 73 73  pristine express
56f0: 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20 74 68  ion tree from th
5700: 65 20 70 61 72 73 65 72 2e 20 20 54 68 65 20 69  e parser.  The i
5710: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a  mplementation.**
5720: 20 6f 66 20 64 75 70 65 64 45 78 70 72 53 74 72   of dupedExprStr
5730: 75 63 74 53 69 7a 65 28 29 20 63 6f 6e 74 61 69  uctSize() contai
5740: 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73 73 65 72  n multiple asser
5750: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
5760: 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  hat attempt.** t
5770: 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 63  o enforce this c
5780: 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74  onstraint..*/.st
5790: 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78  atic int dupedEx
57a0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70  prStructSize(Exp
57b0: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
57c0: 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20  {.  int nSize;. 
57d0: 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
57e0: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 7c  EXPRDUP_REDUCE |
57f0: 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a  | flags==0 ); /*
5800: 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76   Only one flag v
5810: 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a  alue allowed */.
5820: 20 20 69 66 28 20 30 3d 3d 28 66 6c 61 67 73 26    if( 0==(flags&
5830: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 20  EXPRDUP_REDUCE) 
5840: 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 45  ){.    nSize = E
5850: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20 20  XPR_FULLSIZE;.  
5860: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
5870: 74 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72  t( !ExprHasAnyPr
5880: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
5890: 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
58a0: 64 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  d) );.    assert
58b0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
58c0: 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  ty(p, EP_FromJoi
58d0: 6e 29 20 29 3b 20 0a 20 20 20 20 61 73 73 65 72  n) ); .    asser
58e0: 74 28 20 28 70 2d 3e 66 6c 61 67 73 32 20 26 20  t( (p->flags2 & 
58f0: 45 50 32 5f 4d 61 6c 6c 6f 63 65 64 54 6f 6b 65  EP2_MallocedToke
5900: 6e 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  n)==0 );.    ass
5910: 65 72 74 28 20 28 70 2d 3e 66 6c 61 67 73 32 20  ert( (p->flags2 
5920: 26 20 45 50 32 5f 49 72 72 65 64 75 63 69 62 6c  & EP2_Irreducibl
5930: 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  e)==0 );.    if(
5940: 20 70 2d 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e   p->pLeft || p->
5950: 70 52 69 67 68 74 20 7c 7c 20 70 2d 3e 70 43 6f  pRight || p->pCo
5960: 6c 6c 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74  ll || p->x.pList
5970: 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20   ){.      nSize 
5980: 3d 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49  = EXPR_REDUCEDSI
5990: 5a 45 20 7c 20 45 50 5f 52 65 64 75 63 65 64 3b  ZE | EP_Reduced;
59a0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
59b0: 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 54    nSize = EXPR_T
59c0: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45  OKENONLYSIZE | E
59d0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20  P_TokenOnly;.   
59e0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
59f0: 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nSize;.}../*.** 
5a00: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
5a10: 74 75 72 6e 73 20 74 68 65 20 73 70 61 63 65 20  turns the space 
5a20: 69 6e 20 62 79 74 65 73 20 72 65 71 75 69 72 65  in bytes require
5a30: 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63  d to store the c
5a40: 6f 70 79 20 0a 2a 2a 20 6f 66 20 74 68 65 20 45  opy .** of the E
5a50: 78 70 72 20 73 74 72 75 63 74 75 72 65 20 61 6e  xpr structure an
5a60: 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  d a copy of the 
5a70: 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74  Expr.u.zToken st
5a80: 72 69 6e 67 20 28 69 66 20 74 68 61 74 0a 2a 2a  ring (if that.**
5a90: 20 73 74 72 69 6e 67 20 69 73 20 64 65 66 69 6e   string is defin
5aa0: 65 64 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ed.).*/.static i
5ab0: 6e 74 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65  nt dupedExprNode
5ac0: 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e  Size(Expr *p, in
5ad0: 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20  t flags){.  int 
5ae0: 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45 78 70  nByte = dupedExp
5af0: 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20 66  rStructSize(p, f
5b00: 6c 61 67 73 29 20 26 20 30 78 66 66 66 3b 0a 20  lags) & 0xfff;. 
5b10: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
5b20: 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56  perty(p, EP_IntV
5b30: 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54  alue) && p->u.zT
5b40: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 6e 42 79 74  oken ){.    nByt
5b50: 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  e += sqlite3Strl
5b60: 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  en30(p->u.zToken
5b70: 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  )+1;.  }.  retur
5b80: 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b  n ROUND8(nByte);
5b90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
5ba0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
5bb0: 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f  ytes required to
5bc0: 20 63 72 65 61 74 65 20 61 20 64 75 70 6c 69 63   create a duplic
5bd0: 61 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 65  ate of the .** e
5be0: 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65 64  xpression passed
5bf0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
5c00: 67 75 6d 65 6e 74 2e 20 54 68 65 20 73 65 63 6f  gument. The seco
5c10: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  nd argument is a
5c20: 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e  .** mask contain
5c30: 69 6e 67 20 45 58 50 52 44 55 50 5f 58 58 58 20  ing EXPRDUP_XXX 
5c40: 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  flags..**.** The
5c50: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
5c60: 69 6e 63 6c 75 64 65 73 20 73 70 61 63 65 20 74  includes space t
5c70: 6f 20 63 72 65 61 74 65 20 61 20 63 6f 70 79 20  o create a copy 
5c80: 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75  of the Expr stru
5c90: 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20 61 6e 64  ct.** itself and
5ca0: 20 74 68 65 20 62 75 66 66 65 72 20 72 65 66 65   the buffer refe
5cb0: 72 72 65 64 20 74 6f 20 62 79 20 45 78 70 72 2e  rred to by Expr.
5cc0: 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20 61 6e 79  u.zToken, if any
5cd0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45  ..**.** If the E
5ce0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c  XPRDUP_REDUCE fl
5cf0: 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
5d00: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
5d10: 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a 20 73 70   includes .** sp
5d20: 61 63 65 20 74 6f 20 64 75 70 6c 69 63 61 74 65  ace to duplicate
5d30: 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64 65 73 20   all Expr nodes 
5d40: 69 6e 20 74 68 65 20 74 72 65 65 20 66 6f 72 6d  in the tree form
5d50: 65 64 20 62 79 20 45 78 70 72 2e 70 4c 65 66 74  ed by Expr.pLeft
5d60: 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72 2e 70 52   .** and Expr.pR
5d70: 69 67 68 74 20 76 61 72 69 61 62 6c 65 73 20 28  ight variables (
5d80: 62 75 74 20 6e 6f 74 20 66 6f 72 20 61 6e 79 20  but not for any 
5d90: 73 74 72 75 63 74 75 72 65 73 20 70 6f 69 6e 74  structures point
5da0: 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20 64 65 73  ed to or .** des
5db0: 63 65 6e 64 65 64 20 66 72 6f 6d 20 74 68 65 20  cended from the 
5dc0: 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 6f 72 20  Expr.x.pList or 
5dd0: 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74 20 76  Expr.x.pSelect v
5de0: 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74  ariables)..*/.st
5df0: 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78  atic int dupedEx
5e00: 70 72 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20  prSize(Expr *p, 
5e10: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
5e20: 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 69  t nByte = 0;.  i
5e30: 66 28 20 70 20 29 7b 0a 20 20 20 20 6e 42 79 74  f( p ){.    nByt
5e40: 65 20 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64  e = dupedExprNod
5e50: 65 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b  eSize(p, flags);
5e60: 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 26 45  .    if( flags&E
5e70: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29 7b  XPRDUP_REDUCE ){
5e80: 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  .      nByte += 
5e90: 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2d  dupedExprSize(p-
5ea0: 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73 29 20 2b  >pLeft, flags) +
5eb0: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70   dupedExprSize(p
5ec0: 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61 67 73 29  ->pRight, flags)
5ed0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
5ee0: 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f  turn nByte;.}../
5ef0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
5f00: 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  on is similar to
5f10: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
5f20: 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69  ), except that i
5f30: 66 20 70 7a 42 75 66 66 65 72 20 0a 2a 2a 20 69  f pzBuffer .** i
5f40: 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
5f50: 2a 70 7a 42 75 66 66 65 72 20 69 73 20 61 73 73  *pzBuffer is ass
5f60: 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f  umed to point to
5f70: 20 61 20 62 75 66 66 65 72 20 6c 61 72 67 65 20   a buffer large 
5f80: 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f 20 73 74  enough .** to st
5f90: 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20  ore the copy of 
5fa0: 65 78 70 72 65 73 73 69 6f 6e 20 70 2c 20 74 68  expression p, th
5fb0: 65 20 63 6f 70 69 65 73 20 6f 66 20 70 2d 3e 75  e copies of p->u
5fc0: 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69 66 20 61  .zToken.** (if a
5fd0: 70 70 6c 69 63 61 62 6c 65 29 2c 20 61 6e 64 20  pplicable), and 
5fe0: 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  the copies of th
5ff0: 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70  e p->pLeft and p
6000: 2d 3e 70 52 69 67 68 74 20 65 78 70 72 65 73 73  ->pRight express
6010: 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e  ions,.** if any.
6020: 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
6030: 67 2c 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20  g, *pzBuffer is 
6040: 73 65 74 20 74 6f 20 74 68 65 20 66 69 72 73 74  set to the first
6050: 20 62 79 74 65 20 70 61 73 73 65 64 20 74 68 65   byte passed the
6060: 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  .** portion of t
6070: 68 65 20 62 75 66 66 65 72 20 63 6f 70 69 65 64  he buffer copied
6080: 20 69 6e 74 6f 20 62 79 20 74 68 69 73 20 66 75   into by this fu
6090: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
60a0: 63 20 45 78 70 72 20 2a 65 78 70 72 44 75 70 28  c Expr *exprDup(
60b0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
60c0: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 2c  r *p, int flags,
60d0: 20 75 38 20 2a 2a 70 7a 42 75 66 66 65 72 29 7b   u8 **pzBuffer){
60e0: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20  .  Expr *pNew = 
60f0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
6100: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
6110: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
6120: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63 6f 6e  if( p ){.    con
6130: 73 74 20 69 6e 74 20 69 73 52 65 64 75 63 65 64  st int isReduced
6140: 20 3d 20 28 66 6c 61 67 73 26 45 58 50 52 44 55   = (flags&EXPRDU
6150: 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20 75  P_REDUCE);.    u
6160: 38 20 2a 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 75  8 *zAlloc;.    u
6170: 33 32 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20  32 staticFlag = 
6180: 30 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  0;..    assert( 
6190: 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c 20 69  pzBuffer==0 || i
61a0: 73 52 65 64 75 63 65 64 20 29 3b 0a 0a 20 20 20  sReduced );..   
61b0: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77   /* Figure out w
61c0: 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 74 68  here to write th
61d0: 65 20 6e 65 77 20 45 78 70 72 20 73 74 72 75 63  e new Expr struc
61e0: 74 75 72 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ture. */.    if(
61f0: 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20   pzBuffer ){.   
6200: 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42     zAlloc = *pzB
6210: 75 66 66 65 72 3b 0a 20 20 20 20 20 20 73 74 61  uffer;.      sta
6220: 74 69 63 46 6c 61 67 20 3d 20 45 50 5f 53 74 61  ticFlag = EP_Sta
6230: 74 69 63 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  tic;.    }else{.
6240: 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 73        zAlloc = s
6250: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
6260: 77 28 64 62 2c 20 64 75 70 65 64 45 78 70 72 53  w(db, dupedExprS
6270: 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 29 3b 0a  ize(p, flags));.
6280: 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 20 3d      }.    pNew =
6290: 20 28 45 78 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b   (Expr *)zAlloc;
62a0: 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20 29  ..    if( pNew )
62b0: 7b 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6e  {.      /* Set n
62c0: 4e 65 77 53 69 7a 65 20 74 6f 20 74 68 65 20 73  NewSize to the s
62d0: 69 7a 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ize allocated fo
62e0: 72 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  r the structure 
62f0: 70 6f 69 6e 74 65 64 20 74 6f 0a 20 20 20 20 20  pointed to.     
6300: 20 2a 2a 20 62 79 20 70 4e 65 77 2e 20 54 68 69   ** by pNew. Thi
6310: 73 20 69 73 20 65 69 74 68 65 72 20 45 58 50 52  s is either EXPR
6320: 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58 50 52 5f  _FULLSIZE, EXPR_
6330: 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72 0a 20  REDUCEDSIZE or. 
6340: 20 20 20 20 20 2a 2a 20 45 58 50 52 5f 54 4f 4b       ** EXPR_TOK
6350: 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b  ENONLYSIZE. nTok
6360: 65 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  en is set to the
6370: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
6380: 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20 20 20 20   consumed.      
6390: 2a 2a 20 62 79 20 74 68 65 20 63 6f 70 79 20 6f  ** by the copy o
63a0: 66 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65  f the p->u.zToke
63b0: 6e 20 73 74 72 69 6e 67 20 28 69 66 20 61 6e 79  n string (if any
63c0: 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  )..      */.    
63d0: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
63e0: 20 6e 53 74 72 75 63 74 53 69 7a 65 20 3d 20 64   nStructSize = d
63f0: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
6400: 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ze(p, flags);.  
6410: 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4e      const int nN
6420: 65 77 53 69 7a 65 20 3d 20 6e 53 74 72 75 63 74  ewSize = nStruct
6430: 53 69 7a 65 20 26 20 30 78 66 66 66 3b 0a 20 20  Size & 0xfff;.  
6440: 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a      int nToken;.
6450: 20 20 20 20 20 20 69 66 28 20 21 45 78 70 72 48        if( !ExprH
6460: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
6470: 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d  _IntValue) && p-
6480: 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  >u.zToken ){.   
6490: 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 73 71       nToken = sq
64a0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d  lite3Strlen30(p-
64b0: 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a  >u.zToken) + 1;.
64c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
64d0: 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b       nToken = 0;
64e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
64f0: 66 28 20 69 73 52 65 64 75 63 65 64 20 29 7b 0a  f( isReduced ){.
6500: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
6510: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
6520: 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29 3d 3d  p, EP_Reduced)==
6530: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  0 );.        mem
6540: 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e  cpy(zAlloc, p, n
6550: 4e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  NewSize);.      
6560: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
6570: 6e 74 20 6e 53 69 7a 65 20 3d 20 65 78 70 72 53  nt nSize = exprS
6580: 74 72 75 63 74 53 69 7a 65 28 70 29 3b 0a 20 20  tructSize(p);.  
6590: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c        memcpy(zAl
65a0: 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a 65 29 3b 0a  loc, p, nSize);.
65b0: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
65c0: 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30  zAlloc[nSize], 0
65d0: 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2d  , EXPR_FULLSIZE-
65e0: 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  nSize);.      }.
65f0: 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68  .      /* Set th
6600: 65 20 45 50 5f 52 65 64 75 63 65 64 2c 20 45 50  e EP_Reduced, EP
6610: 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20  _TokenOnly, and 
6620: 45 50 5f 53 74 61 74 69 63 20 66 6c 61 67 73 20  EP_Static flags 
6630: 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 20 2a  appropriately. *
6640: 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c  /.      pNew->fl
6650: 61 67 73 20 26 3d 20 7e 28 45 50 5f 52 65 64 75  ags &= ~(EP_Redu
6660: 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ced|EP_TokenOnly
6670: 7c 45 50 5f 53 74 61 74 69 63 29 3b 0a 20 20 20  |EP_Static);.   
6680: 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c     pNew->flags |
6690: 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20  = nStructSize & 
66a0: 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54  (EP_Reduced|EP_T
66b0: 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20 20  okenOnly);.     
66c0: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
66d0: 73 74 61 74 69 63 46 6c 61 67 3b 0a 0a 20 20 20  staticFlag;..   
66e0: 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 70     /* Copy the p
66f0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e  ->u.zToken strin
6700: 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20  g, if any. */.  
6710: 20 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29      if( nToken )
6720: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
6730: 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75  zToken = pNew->u
6740: 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a  .zToken = (char*
6750: 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a  )&zAlloc[nNewSiz
6760: 65 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  e];.        memc
6770: 70 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e  py(zToken, p->u.
6780: 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b  zToken, nToken);
6790: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
67a0: 69 66 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67  if( 0==((p->flag
67b0: 73 7c 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26  s|pNew->flags) &
67c0: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
67d0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  {.        /* Fil
67e0: 6c 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78  l in the pNew->x
67f0: 2e 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65 77  .pSelect or pNew
6800: 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72  ->x.pList member
6810: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
6820: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
6830: 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  (p, EP_xIsSelect
6840: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
6850: 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d  New->x.pSelect =
6860: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
6870: 70 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65  p(db, p->x.pSele
6880: 63 74 2c 20 69 73 52 65 64 75 63 65 64 29 3b 0a  ct, isReduced);.
6890: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
68a0: 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78           pNew->x
68b0: 2e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  .pList = sqlite3
68c0: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
68d0: 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 73 52 65  p->x.pList, isRe
68e0: 64 75 63 65 64 29 3b 0a 20 20 20 20 20 20 20 20  duced);.        
68f0: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
6900: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77   /* Fill in pNew
6910: 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65 77  ->pLeft and pNew
6920: 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20  ->pRight. */.   
6930: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 41 6e     if( ExprHasAn
6940: 79 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20  yProperty(pNew, 
6950: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
6960: 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  kenOnly) ){.    
6970: 20 20 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75      zAlloc += du
6980: 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28  pedExprNodeSize(
6990: 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 20  p, flags);.     
69a0: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
69b0: 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
69c0: 52 65 64 75 63 65 64 29 20 29 7b 0a 20 20 20 20  Reduced) ){.    
69d0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66        pNew->pLef
69e0: 74 20 3d 20 65 78 70 72 44 75 70 28 64 62 2c 20  t = exprDup(db, 
69f0: 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50 52 44 55  p->pLeft, EXPRDU
6a00: 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f  P_REDUCE, &zAllo
6a10: 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  c);.          pN
6a20: 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 65 78 70  ew->pRight = exp
6a30: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67  rDup(db, p->pRig
6a40: 68 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55  ht, EXPRDUP_REDU
6a50: 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a 20 20  CE, &zAlloc);.  
6a60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6a70: 69 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a  if( pzBuffer ){.
6a80: 20 20 20 20 20 20 20 20 20 20 2a 70 7a 42 75 66            *pzBuf
6a90: 66 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20  fer = zAlloc;.  
6aa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
6ab0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  lse{.        pNe
6ac0: 77 2d 3e 66 6c 61 67 73 32 20 3d 20 30 3b 0a 20  w->flags2 = 0;. 
6ad0: 20 20 20 20 20 20 20 69 66 28 20 21 45 78 70 72         if( !Expr
6ae0: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
6af0: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  , EP_TokenOnly) 
6b00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
6b10: 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  w->pLeft = sqlit
6b20: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
6b30: 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20  >pLeft, 0);.    
6b40: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67        pNew->pRig
6b50: 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
6b60: 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68  Dup(db, p->pRigh
6b70: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  t, 0);.        }
6b80: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 7d 0a  .      }..    }.
6b90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
6ba0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  w;.}../*.** The 
6bb0: 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20  following group 
6bc0: 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65  of routines make
6bd0: 20 64 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20   deep copies of 
6be0: 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20  expressions,.** 
6bf0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73  expression lists
6c00: 2c 20 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20  , ID lists, and 
6c10: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
6c20: 73 2e 20 20 54 68 65 20 63 6f 70 69 65 73 20 63  s.  The copies c
6c30: 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64  an.** be deleted
6c40: 20 28 62 79 20 62 65 69 6e 67 20 70 61 73 73 65   (by being passe
6c50: 64 20 74 6f 20 74 68 65 69 72 20 72 65 73 70 65  d to their respe
6c60: 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28  ctive ...Delete(
6c70: 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77  ) routines).** w
6c80: 69 74 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67  ithout effecting
6c90: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a   the originals..
6ca0: 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73  **.** The expres
6cb0: 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61  sion list, ID, a
6cc0: 6e 64 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20  nd source lists 
6cd0: 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65  return by sqlite
6ce0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a  3ExprListDup(),.
6cf0: 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  ** sqlite3IdList
6d00: 44 75 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74  Dup(), and sqlit
6d10: 65 33 53 72 63 4c 69 73 74 44 75 70 28 29 20 63  e3SrcListDup() c
6d20: 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65  an not be furthe
6d30: 72 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62  r expanded .** b
6d40: 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  y subsequent cal
6d50: 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73  ls to sqlite*Lis
6d60: 74 41 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e  tAppend() routin
6d70: 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61  es..**.** Any ta
6d80: 62 6c 65 73 20 74 68 61 74 20 74 68 65 20 53 72  bles that the Sr
6d90: 63 4c 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e  cList might poin
6da0: 74 20 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70  t to are not dup
6db0: 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  licated..**.** T
6dc0: 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
6dd0: 65 72 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f  er contains a co
6de0: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  mbination of the
6df0: 20 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61   EXPRDUP_XXX fla
6e00: 67 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 45 58  gs..** If the EX
6e10: 50 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61  PRDUP_REDUCE fla
6e20: 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  g is set, then t
6e30: 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65 74  he structure ret
6e40: 75 72 6e 65 64 20 69 73 20 61 0a 2a 2a 20 74 72  urned is a.** tr
6e50: 75 6e 63 61 74 65 64 20 76 65 72 73 69 6f 6e 20  uncated version 
6e60: 6f 66 20 74 68 65 20 75 73 75 61 6c 20 45 78 70  of the usual Exp
6e70: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
6e80: 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20   will be stored 
6e90: 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68  as.** part of th
6ea0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
6eb0: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
6ec0: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
6ed0: 61 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  a..*/.Expr *sqli
6ee0: 74 65 33 45 78 70 72 44 75 70 28 73 71 6c 69 74  te3ExprDup(sqlit
6ef0: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c  e3 *db, Expr *p,
6f00: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 72   int flags){.  r
6f10: 65 74 75 72 6e 20 65 78 70 72 44 75 70 28 64 62  eturn exprDup(db
6f20: 2c 20 70 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  , p, flags, 0);.
6f30: 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  }.ExprList *sqli
6f40: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 73  te3ExprListDup(s
6f50: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
6f60: 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61  List *p, int fla
6f70: 67 73 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  gs){.  ExprList 
6f80: 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20  *pNew;.  struct 
6f90: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
6fa0: 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b  Item, *pOldItem;
6fb0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
6fc0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
6fd0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
6fe0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
6ff0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
7000: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
7010: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
7020: 65 77 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 30  ew->iECursor = 0
7030: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20  ;.  pNew->nExpr 
7040: 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d  = pNew->nAlloc =
7050: 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 4e 65   p->nExpr;.  pNe
7060: 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d 20 73  w->a = pItem = s
7070: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
7080: 77 28 64 62 2c 20 20 70 2d 3e 6e 45 78 70 72 2a  w(db,  p->nExpr*
7090: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
70a0: 29 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 3d 3d  );.  if( pItem==
70b0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
70c0: 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29  DbFree(db, pNew)
70d0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
70e0: 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65 6d 20    } .  pOldItem 
70f0: 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d  = p->a;.  for(i=
7100: 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69  0; i<p->nExpr; i
7110: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c  ++, pItem++, pOl
7120: 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  dItem++){.    Ex
7130: 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20  pr *pNewExpr;.  
7140: 20 20 45 78 70 72 20 2a 70 4f 6c 64 45 78 70 72    Expr *pOldExpr
7150: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78   = pOldItem->pEx
7160: 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70  pr;.    pItem->p
7170: 45 78 70 72 20 3d 20 70 4e 65 77 45 78 70 72 20  Expr = pNewExpr 
7180: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
7190: 28 64 62 2c 20 70 4f 6c 64 45 78 70 72 2c 20 66  (db, pOldExpr, f
71a0: 6c 61 67 73 29 3b 0a 20 20 20 20 70 49 74 65 6d  lags);.    pItem
71b0: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
71c0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
71d0: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
71e0: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e      pItem->zSpan
71f0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
7200: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
7210: 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74  >zSpan);.    pIt
7220: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20  em->sortOrder = 
7230: 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72  pOldItem->sortOr
7240: 64 65 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  der;.    pItem->
7250: 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 49  done = 0;.    pI
7260: 74 65 6d 2d 3e 69 43 6f 6c 20 3d 20 70 4f 6c 64  tem->iCol = pOld
7270: 49 74 65 6d 2d 3e 69 43 6f 6c 3b 0a 20 20 20 20  Item->iCol;.    
7280: 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20  pItem->iAlias = 
7290: 70 4f 6c 64 49 74 65 6d 2d 3e 69 41 6c 69 61 73  pOldItem->iAlias
72a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
72b0: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  New;.}../*.** If
72c0: 20 63 75 72 73 6f 72 73 2c 20 74 72 69 67 67 65   cursors, trigge
72d0: 72 73 2c 20 76 69 65 77 73 20 61 6e 64 20 73 75  rs, views and su
72e0: 62 71 75 65 72 69 65 73 20 61 72 65 20 61 6c 6c  bqueries are all
72f0: 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a   omitted from.**
7300: 20 74 68 65 20 62 75 69 6c 64 2c 20 74 68 65 6e   the build, then
7310: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c   none of the fol
7320: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c  lowing routines,
7330: 20 65 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20   except for .** 
7340: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
7350: 28 29 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c 65  (), can be calle
7360: 64 2e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  d. sqlite3Select
7370: 44 75 70 28 29 20 69 73 20 73 6f 6d 65 74 69 6d  Dup() is sometim
7380: 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74  es.** called wit
7390: 68 20 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e  h a NULL argumen
73a0: 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  t..*/.#if !defin
73b0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
73c0: 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
73d0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49  (SQLITE_OMIT_TRI
73e0: 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66  GGER) \. || !def
73f0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
7400: 5f 53 55 42 51 55 45 52 59 29 0a 53 72 63 4c 69  _SUBQUERY).SrcLi
7410: 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69  st *sqlite3SrcLi
7420: 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  stDup(sqlite3 *d
7430: 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 69  b, SrcList *p, i
7440: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 72 63  nt flags){.  Src
7450: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  List *pNew;.  in
7460: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  t i;.  int nByte
7470: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
7480: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65  eturn 0;.  nByte
7490: 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20   = sizeof(*p) + 
74a0: 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a  (p->nSrc>0 ? siz
74b0: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28  eof(p->a[0]) * (
74c0: 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b  p->nSrc-1) : 0);
74d0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
74e0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
74f0: 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
7500: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
7510: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63   0;.  pNew->nSrc
7520: 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20   = pNew->nAlloc 
7530: 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72  = p->nSrc;.  for
7540: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b  (i=0; i<p->nSrc;
7550: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
7560: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
7570: 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77  pNewItem = &pNew
7580: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75  ->a[i];.    stru
7590: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
75a0: 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e  *pOldItem = &p->
75b0: 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20  a[i];.    Table 
75c0: 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 49  *pTab;.    pNewI
75d0: 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
75e0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
75f0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
7600: 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70  Database);.    p
7610: 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  NewItem->zName =
7620: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
7630: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
7640: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  Name);.    pNewI
7650: 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71  tem->zAlias = sq
7660: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
7670: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69  , pOldItem->zAli
7680: 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  as);.    pNewIte
7690: 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 4f  m->jointype = pO
76a0: 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ldItem->jointype
76b0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
76c0: 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74  iCursor = pOldIt
76d0: 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
76e0: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73 50 6f 70   pNewItem->isPop
76f0: 75 6c 61 74 65 64 20 3d 20 70 4f 6c 64 49 74 65  ulated = pOldIte
7700: 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 3b 0a  m->isPopulated;.
7710: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 49      pNewItem->zI
7720: 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 44 62  ndex = sqlite3Db
7730: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
7740: 74 65 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a 20 20  tem->zIndex);.  
7750: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6e 6f 74 49    pNewItem->notI
7760: 6e 64 65 78 65 64 20 3d 20 70 4f 6c 64 49 74 65  ndexed = pOldIte
7770: 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3b 0a 20  m->notIndexed;. 
7780: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 6e     pNewItem->pIn
7790: 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  dex = pOldItem->
77a0: 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 54 61 62  pIndex;.    pTab
77b0: 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61   = pNewItem->pTa
77c0: 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54  b = pOldItem->pT
77d0: 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ab;.    if( pTab
77e0: 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   ){.      pTab->
77f0: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nRef++;.    }.  
7800: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c    pNewItem->pSel
7810: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
7820: 65 63 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  ectDup(db, pOldI
7830: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 66 6c  tem->pSelect, fl
7840: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ags);.    pNewIt
7850: 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65  em->pOn = sqlite
7860: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c  3ExprDup(db, pOl
7870: 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67  dItem->pOn, flag
7880: 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  s);.    pNewItem
7890: 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74  ->pUsing = sqlit
78a0: 65 33 49 64 4c 69 73 74 44 75 70 28 64 62 2c 20  e3IdListDup(db, 
78b0: 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67  pOldItem->pUsing
78c0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
78d0: 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49  >colUsed = pOldI
78e0: 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20  tem->colUsed;.  
78f0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
7900: 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74  .}.IdList *sqlit
7910: 65 33 49 64 4c 69 73 74 44 75 70 28 73 71 6c 69  e3IdListDup(sqli
7920: 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20  te3 *db, IdList 
7930: 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70  *p){.  IdList *p
7940: 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  New;.  int i;.  
7950: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
7960: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
7970: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
7980: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
7990: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
79a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
79b0: 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 4e    pNew->nId = pN
79c0: 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e  ew->nAlloc = p->
79d0: 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d  nId;.  pNew->a =
79e0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
79f0: 52 61 77 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73  Raw(db, p->nId*s
7a00: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29  izeof(p->a[0]) )
7a10: 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d  ;.  if( pNew->a=
7a20: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
7a30: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77  3DbFree(db, pNew
7a40: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
7a50: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
7a60: 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  i<p->nId; i++){.
7a70: 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73      struct IdLis
7a80: 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d  t_item *pNewItem
7a90: 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a   = &pNew->a[i];.
7aa0: 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73      struct IdLis
7ab0: 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d  t_item *pOldItem
7ac0: 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20   = &p->a[i];.   
7ad0: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pNewItem->zName
7ae0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
7af0: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
7b00: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65  >zName);.    pNe
7b10: 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c  wItem->idx = pOl
7b20: 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a  dItem->idx;.  }.
7b30: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
7b40: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
7b50: 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65  SelectDup(sqlite
7b60: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
7b70: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
7b80: 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20  Select *pNew;.  
7b90: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
7ba0: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
7bb0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
7bc0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20  (db, sizeof(*p) 
7bd0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
7be0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
7bf0: 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71  New->pEList = sq
7c00: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
7c10: 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  (db, p->pEList, 
7c20: 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e  flags);.  pNew->
7c30: 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  pSrc = sqlite3Sr
7c40: 63 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  cListDup(db, p->
7c50: 70 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a 20 20  pSrc, flags);.  
7c60: 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73  pNew->pWhere = s
7c70: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
7c80: 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61  , p->pWhere, fla
7c90: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72  gs);.  pNew->pGr
7ca0: 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
7cb0: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
7cc0: 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c 61 67  ->pGroupBy, flag
7cd0: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76  s);.  pNew->pHav
7ce0: 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ing = sqlite3Exp
7cf0: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48 61 76  rDup(db, p->pHav
7d00: 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  ing, flags);.  p
7d10: 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  New->pOrderBy = 
7d20: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
7d30: 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  up(db, p->pOrder
7d40: 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  By, flags);.  pN
7d50: 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a  ew->op = p->op;.
7d60: 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d    pNew->pPrior =
7d70: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
7d80: 70 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c  p(db, p->pPrior,
7d90: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
7da0: 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65  >pLimit = sqlite
7db0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
7dc0: 70 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a  pLimit, flags);.
7dd0: 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20    pNew->pOffset 
7de0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
7df0: 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c  (db, p->pOffset,
7e00: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
7e10: 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70  >iLimit = 0;.  p
7e20: 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30  New->iOffset = 0
7e30: 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61  ;.  pNew->selFla
7e40: 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73  gs = p->selFlags
7e50: 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68 65 6d   & ~SF_UsesEphem
7e60: 65 72 61 6c 3b 0a 20 20 70 4e 65 77 2d 3e 70 52  eral;.  pNew->pR
7e70: 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20  ightmost = 0;.  
7e80: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
7e90: 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[0] = -1;.  pN
7ea0: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
7eb0: 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [1] = -1;.  pNew
7ec0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32  ->addrOpenEphm[2
7ed0: 5d 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e  ] = -1;.  return
7ee0: 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53   pNew;.}.#else.S
7ef0: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
7f00: 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20  lectDup(sqlite3 
7f10: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  *db, Select *p, 
7f20: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73  int flags){.  as
7f30: 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20  sert( p==0 );.  
7f40: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
7f50: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  if.../*.** Add a
7f60: 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
7f70: 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65 78  the end of an ex
7f80: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
7f90: 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69  If pList is.** i
7fa0: 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74  nitially NULL, t
7fb0: 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77  hen create a new
7fc0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
7fd0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
7fe0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
7ff0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
8000: 20 65 6e 74 69 72 65 20 6c 69 73 74 20 69 73 20   entire list is 
8010: 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c  freed and.** NUL
8020: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  L is returned.  
8030: 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72  If non-NULL is r
8040: 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 69 74  eturned, then it
8050: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a   is guaranteed.*
8060: 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 65  * that the new e
8070: 6e 74 72 79 20 77 61 73 20 73 75 63 63 65 73 73  ntry was success
8080: 66 75 6c 6c 79 20 61 70 70 65 6e 64 65 64 2e 0a  fully appended..
8090: 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c  */.ExprList *sql
80a0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
80b0: 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nd(.  Parse *pPa
80c0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
80d0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
80e0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
80f0: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  pList,        /*
8100: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
8110: 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20  o append. Might 
8120: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
8130: 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20  r *pExpr        
8140: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
8150: 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65  on to be appende
8160: 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  d. Might be NULL
8170: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
8180: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
8190: 62 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  b;.  if( pList==
81a0: 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
81b0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
81c0: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
81d0: 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20  ExprList) );.   
81e0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
81f0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  .      goto no_m
8200: 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  em;.    }.    as
8210: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 41 6c  sert( pList->nAl
8220: 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  loc==0 );.  }.  
8230: 69 66 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  if( pList->nAllo
8240: 63 3c 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  c<=pList->nExpr 
8250: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
8260: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  prList_item *a;.
8270: 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73      int n = pLis
8280: 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 34 3b  t->nAlloc*2 + 4;
8290: 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33  .    a = sqlite3
82a0: 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c  DbRealloc(db, pL
82b0: 69 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65 6f 66  ist->a, n*sizeof
82c0: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
82d0: 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a      if( a==0 ){.
82e0: 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65        goto no_me
82f0: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  m;.    }.    pLi
8300: 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 20 20 70  st->a = a;.    p
8310: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 73  List->nAlloc = s
8320: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69  qlite3DbMallocSi
8330: 7a 65 28 64 62 2c 20 61 29 2f 73 69 7a 65 6f 66  ze(db, a)/sizeof
8340: 28 61 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 61 73  (a[0]);.  }.  as
8350: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d  sert( pList->a!=
8360: 30 20 29 3b 0a 20 20 69 66 28 20 31 20 29 7b 0a  0 );.  if( 1 ){.
8370: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
8380: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
8390: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
83a0: 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20  t->nExpr++];.   
83b0: 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30   memset(pItem, 0
83c0: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29  , sizeof(*pItem)
83d0: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45  );.    pItem->pE
83e0: 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d  xpr = pExpr;.  }
83f0: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
8400: 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20  ..no_mem:     . 
8410: 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e   /* Avoid leakin
8420: 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c  g memory if mall
8430: 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a  oc has failed. *
8440: 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  /.  sqlite3ExprD
8450: 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
8460: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
8470: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
8480: 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ist);.  return 0
8490: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
84a0: 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e  he ExprList.a[].
84b0: 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20 6f 66  zName element of
84c0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
84d0: 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a  ly added item.**
84e0: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
84f0: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70  on list..**.** p
8500: 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55  List might be NU
8510: 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20  LL following an 
8520: 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20  OOM error.  But 
8530: 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 65 76  pName should nev
8540: 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20  er be.** NULL.  
8550: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
8560: 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68  cation fails, th
8570: 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  e pParse->db->ma
8580: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a  llocFailed flag.
8590: 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f  ** is set..*/.vo
85a0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
85b0: 73 74 53 65 74 4e 61 6d 65 28 0a 20 20 50 61 72  stSetName(.  Par
85c0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
85d0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
85e0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
85f0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
8600: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
8610: 77 68 69 63 68 20 74 6f 20 61 64 64 20 74 68 65  which to add the
8620: 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65   span. */.  Toke
8630: 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20  n *pName,       
8640: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f 20 62      /* Name to b
8650: 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74  e added */.  int
8660: 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20   dequote        
8670: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
8680: 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65 20 74  cause the name t
8690: 6f 20 62 65 20 64 65 71 75 6f 74 65 64 20 2a 2f  o be dequoted */
86a0: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  .){.  assert( pL
86b0: 69 73 74 21 3d 30 20 7c 7c 20 70 50 61 72 73 65  ist!=0 || pParse
86c0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
86d0: 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
86e0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75  List ){.    stru
86f0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
8700: 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 73 73   *pItem;.    ass
8710: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
8720: 72 3e 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d  r>0 );.    pItem
8730: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
8740: 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20  st->nExpr-1];.  
8750: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
8760: 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20  >zName==0 );.   
8770: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
8780: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
8790: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61  (pParse->db, pNa
87a0: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29  me->z, pName->n)
87b0: 3b 0a 20 20 20 20 69 66 28 20 64 65 71 75 6f 74  ;.    if( dequot
87c0: 65 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  e && pItem->zNam
87d0: 65 20 29 20 73 71 6c 69 74 65 33 44 65 71 75 6f  e ) sqlite3Dequo
87e0: 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  te(pItem->zName)
87f0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
8800: 65 74 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e  et the ExprList.
8810: 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d 65 6e  a[].zSpan elemen
8820: 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  t of the most re
8830: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65  cently added ite
8840: 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72  m.** on the expr
8850: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
8860: 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62  ** pList might b
8870: 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67  e NULL following
8880: 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20   an OOM error.  
8890: 42 75 74 20 70 53 70 61 6e 20 73 68 6f 75 6c 64  But pSpan should
88a0: 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c   never be.** NUL
88b0: 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  L.  If a memory 
88c0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
88d0: 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62  , the pParse->db
88e0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
88f0: 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a  lag.** is set..*
8900: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
8910: 70 72 4c 69 73 74 53 65 74 53 70 61 6e 28 0a 20  prListSetSpan(. 
8920: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
8930: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
8940: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
8950: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
8960: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ,        /* List
8970: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64   to which to add
8980: 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20   the span. */.  
8990: 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61 6e 20  ExprSpan *pSpan 
89a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
89b0: 70 61 6e 20 74 6f 20 62 65 20 61 64 64 65 64 20  pan to be added 
89c0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
89d0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
89e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
89f0: 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  t!=0 || db->mall
8a00: 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20  ocFailed!=0 );. 
8a10: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
8a20: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
8a30: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
8a40: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
8a50: 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61  >nExpr-1];.    a
8a60: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
8a70: 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  xpr>0 );.    ass
8a80: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
8a90: 61 69 6c 65 64 20 7c 7c 20 70 49 74 65 6d 2d 3e  ailed || pItem->
8aa0: 70 45 78 70 72 3d 3d 70 53 70 61 6e 2d 3e 70 45  pExpr==pSpan->pE
8ab0: 78 70 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  xpr );.    sqlit
8ac0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
8ad0: 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  em->zSpan);.    
8ae0: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73  pItem->zSpan = s
8af0: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
8b00: 64 62 2c 20 28 63 68 61 72 2a 29 70 53 70 61 6e  db, (char*)pSpan
8b10: 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20 20 20  ->zStart,.      
8b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
8b40: 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53 70 61  pan->zEnd - pSpa
8b50: 6e 2d 3e 7a 53 74 61 72 74 29 3b 0a 20 20 7d 0a  n->zStart);.  }.
8b60: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
8b70: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
8b80: 70 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20  pEList contains 
8b90: 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d 69 74  more than iLimit
8ba0: 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65   elements,.** le
8bb0: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
8bc0: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a  sage in pParse..
8bd0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
8be0: 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67  xprListCheckLeng
8bf0: 74 68 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  th(.  Parse *pPa
8c00: 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  rse,.  ExprList 
8c10: 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74  *pEList,.  const
8c20: 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29   char *zObject.)
8c30: 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70 50 61  {.  int mx = pPa
8c40: 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  rse->db->aLimit[
8c50: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
8c60: 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61 73 65  UMN];.  testcase
8c70: 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69  ( pEList && pELi
8c80: 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b  st->nExpr==mx );
8c90: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45 4c  .  testcase( pEL
8ca0: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
8cb0: 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20  Expr==mx+1 );.  
8cc0: 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  if( pEList && pE
8cd0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29  List->nExpr>mx )
8ce0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
8cf0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
8d00: 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  oo many columns 
8d10: 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29  in %s", zObject)
8d20: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
8d30: 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
8d40: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
8d50: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8d60: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 73  ExprListDelete(s
8d70: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
8d80: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
8d90: 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
8da0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
8db0: 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73  Item;.  if( pLis
8dc0: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
8dd0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
8de0: 61 21 3d 30 20 7c 7c 20 28 70 4c 69 73 74 2d 3e  a!=0 || (pList->
8df0: 6e 45 78 70 72 3d 3d 30 20 26 26 20 70 4c 69 73  nExpr==0 && pLis
8e00: 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 29 20 29 3b  t->nAlloc==0) );
8e10: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
8e20: 2d 3e 6e 45 78 70 72 3c 3d 70 4c 69 73 74 2d 3e  ->nExpr<=pList->
8e30: 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20 66 6f 72 28  nAlloc );.  for(
8e40: 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
8e50: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
8e60: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
8e70: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  +){.    sqlite3E
8e80: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49  xprDelete(db, pI
8e90: 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
8ea0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8eb0: 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  b, pItem->zName)
8ec0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
8ed0: 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
8ee0: 53 70 61 6e 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Span);.  }.  sql
8ef0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
8f00: 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69  List->a);.  sqli
8f10: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c  te3DbFree(db, pL
8f20: 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ist);.}../*.** T
8f30: 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
8f40: 65 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63  e Walker callbac
8f50: 6b 73 2e 20 20 57 61 6c 6b 65 72 2e 75 2e 70 69  ks.  Walker.u.pi
8f60: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a   is a pointer.**
8f70: 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 20   to an integer. 
8f80: 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
8f90: 61 72 65 20 63 68 65 63 6b 69 6e 67 20 61 6e 20  are checking an 
8fa0: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 73 65  expression to se
8fb0: 65 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 61 20  e.** if it is a 
8fc0: 63 6f 6e 73 74 61 6e 74 2e 20 20 53 65 74 20 2a  constant.  Set *
8fd0: 57 61 6c 6b 65 72 2e 75 2e 70 69 20 74 6f 20 30  Walker.u.pi to 0
8fe0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
8ff0: 6f 6e 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e  on is.** not con
9000: 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  stant..**.** The
9010: 73 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  se callback rout
9020: 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
9030: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 66   implement the f
9040: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
9050: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
9060: 73 43 6f 6e 73 74 61 6e 74 28 29 0a 2a 2a 20 20  sConstant().**  
9070: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73     sqlite3ExprIs
9080: 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
9090: 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ).**     sqlite3
90a0: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
90b0: 46 75 6e 63 74 69 6f 6e 28 29 0a 2a 2a 0a 2a 2f  Function().**.*/
90c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
90d0: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57  NodeIsConstant(W
90e0: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
90f0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 0a 20  Expr *pExpr){.. 
9100: 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65 72 2d 3e   /* If pWalker->
9110: 75 2e 69 20 69 73 20 33 20 74 68 65 6e 20 61 6e  u.i is 3 then an
9120: 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 65 78  y term of the ex
9130: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f  pression that co
9140: 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68  mes from.  ** th
9150: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
9160: 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e 20  auses of a join 
9170: 64 69 73 71 75 61 6c 69 66 69 65 73 20 74 68 65  disqualifies the
9180: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
9190: 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73   from being cons
91a0: 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e  idered constant.
91b0: 20 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b 65   */.  if( pWalke
91c0: 72 2d 3e 75 2e 69 3d 3d 33 20 26 26 20 45 78 70  r->u.i==3 && Exp
91d0: 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28  rHasAnyProperty(
91e0: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
91f0: 69 6e 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b  in) ){.    pWalk
9200: 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 20  er->u.i = 0;.   
9210: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
9220: 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68  t;.  }..  switch
9230: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
9240: 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66     /* Consider f
9250: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 63  unctions to be c
9260: 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20 74  onstant if all t
9270: 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20 61  heir arguments a
9280: 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20  re constant.    
9290: 2a 2a 20 61 6e 64 20 70 57 61 6c 6b 65 72 2d 3e  ** and pWalker->
92a0: 75 2e 69 3d 3d 32 20 2a 2f 0a 20 20 20 20 63 61  u.i==2 */.    ca
92b0: 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a  se TK_FUNCTION:.
92c0: 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65        if( pWalke
92d0: 72 2d 3e 75 2e 69 3d 3d 32 20 29 20 72 65 74 75  r->u.i==2 ) retu
92e0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 46  rn 0;.      /* F
92f0: 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  all through */. 
9300: 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20     case TK_ID:. 
9310: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
9320: 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  N:.    case TK_A
9330: 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  GG_FUNCTION:.   
9340: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
9350: 55 4d 4e 3a 0a 20 20 20 20 20 20 74 65 73 74 63  UMN:.      testc
9360: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
9370: 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20 20 74  TK_ID );.      t
9380: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
9390: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
93a0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
93b0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
93c0: 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  GG_FUNCTION );. 
93d0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
93e0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
93f0: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
9400: 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20   pWalker->u.i = 
9410: 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
9420: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 64  WRC_Abort;.    d
9430: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 74 65  efault:.      te
9440: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
9450: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 20  p==TK_SELECT ); 
9460: 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43  /* selectNodeIsC
9470: 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20 64 69 73  onstant will dis
9480: 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 74  allow */.      t
9490: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
94a0: 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b  op==TK_EXISTS );
94b0: 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65 49 73   /* selectNodeIs
94c0: 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20 64 69  Constant will di
94d0: 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20  sallow */.      
94e0: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
94f0: 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  nue;.  }.}.stati
9500: 63 20 69 6e 74 20 73 65 6c 65 63 74 4e 6f 64 65  c int selectNode
9510: 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65  IsConstant(Walke
9520: 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
9530: 63 74 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20  ct *NotUsed){.  
9540: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
9550: 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 70 57 61  (NotUsed);.  pWa
9560: 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20  lker->u.i = 0;. 
9570: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
9580: 74 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  t;.}.static int 
9590: 65 78 70 72 49 73 43 6f 6e 73 74 28 45 78 70 72  exprIsConst(Expr
95a0: 20 2a 70 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61   *p, int initFla
95b0: 67 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  g){.  Walker w;.
95c0: 20 20 77 2e 75 2e 69 20 3d 20 69 6e 69 74 46 6c    w.u.i = initFl
95d0: 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  ag;.  w.xExprCal
95e0: 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65  lback = exprNode
95f0: 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e  IsConstant;.  w.
9600: 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
9610: 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f  = selectNodeIsCo
9620: 6e 73 74 61 6e 74 3b 0a 20 20 73 71 6c 69 74 65  nstant;.  sqlite
9630: 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29  3WalkExpr(&w, p)
9640: 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 75 2e 69  ;.  return w.u.i
9650: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
9660: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
9670: 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  ee.  Return 1 if
9680: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9690: 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61  is constant.** a
96a0: 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c  nd 0 if it invol
96b0: 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72  ves variables or
96c0: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 2e   function calls.
96d0: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
96e0: 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20  urposes of this 
96f0: 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62  function, a doub
9700: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
9710: 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20   (ex: "abc").** 
9720: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
9730: 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73  variable but a s
9740: 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ingle-quoted str
9750: 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20  ing (ex: 'abc') 
9760: 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74  is.** a constant
9770: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
9780: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 45  ExprIsConstant(E
9790: 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  xpr *p){.  retur
97a0: 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
97b0: 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61   1);.}../*.** Wa
97c0: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
97d0: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31   tree.  Return 1
97e0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
97f0: 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a  on is constant.*
9800: 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 20 6f  * that does no o
9810: 72 69 67 69 6e 61 74 65 20 66 72 6f 6d 20 74 68  riginate from th
9820: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
9830: 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e 2e  auses of a join.
9840: 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20  .** Return 0 if 
9850: 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69  it involves vari
9860: 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f  ables or functio
9870: 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65 72 6d 73  n calls or terms
9880: 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f   from.** an ON o
9890: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a  r USING clause..
98a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
98b0: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a  prIsConstantNotJ
98c0: 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  oin(Expr *p){.  
98d0: 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
98e0: 73 74 28 70 2c 20 33 29 3b 0a 7d 0a 0a 2f 2a 0a  st(p, 3);.}../*.
98f0: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
9900: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
9910: 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70  urn 1 if the exp
9920: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
9930: 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63  ant.** or a func
9940: 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63  tion call with c
9950: 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
9960: 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30  s.  Return and 0
9970: 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
9980: 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a   any variables..
9990: 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
99a0: 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66  rposes of this f
99b0: 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c  unction, a doubl
99c0: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
99d0: 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69  (ex: "abc").** i
99e0: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76  s considered a v
99f0: 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69  ariable but a si
9a00: 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  ngle-quoted stri
9a10: 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69  ng (ex: 'abc') i
9a20: 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e  s.** a constant.
9a30: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
9a40: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46  xprIsConstantOrF
9a50: 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 29  unction(Expr *p)
9a60: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  {.  return exprI
9a70: 73 43 6f 6e 73 74 28 70 2c 20 32 29 3b 0a 7d 0a  sConst(p, 2);.}.
9a80: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  ./*.** If the ex
9a90: 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65 73  pression p codes
9aa0: 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65   a constant inte
9ab0: 67 65 72 20 74 68 61 74 20 69 73 20 73 6d 61 6c  ger that is smal
9ac0: 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66  l enough.** to f
9ad0: 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69  it in a 32-bit i
9ae0: 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 31  nteger, return 1
9af0: 20 61 6e 64 20 70 75 74 20 74 68 65 20 76 61 6c   and put the val
9b00: 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ue of the intege
9b10: 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e  r.** in *pValue.
9b20: 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73    If the express
9b30: 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e  ion is not an in
9b40: 74 65 67 65 72 20 6f 72 20 69 66 20 69 74 20 69  teger or if it i
9b50: 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20  s too big.** to 
9b60: 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64 20  fit in a signed 
9b70: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20  32-bit integer, 
9b80: 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65 61  return 0 and lea
9b90: 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68 61  ve *pValue uncha
9ba0: 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nged..*/.int sql
9bb0: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
9bc0: 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a  r(Expr *p, int *
9bd0: 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20 72  pValue){.  int r
9be0: 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  c = 0;.  if( p->
9bf0: 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61  flags & EP_IntVa
9c00: 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70 56 61 6c  lue ){.    *pVal
9c10: 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61 6c 75 65  ue = p->u.iValue
9c20: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
9c30: 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70 2d    }.  switch( p-
9c40: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
9c50: 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TK_INTEGER: {.  
9c60: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
9c70: 47 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e 7a 54  GetInt32(p->u.zT
9c80: 6f 6b 65 6e 2c 20 70 56 61 6c 75 65 29 3b 0a 20  oken, pValue);. 
9c90: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
9ca0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
9cb0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
9cc0: 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20  e TK_UPLUS: {.  
9cd0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
9ce0: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
9cf0: 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b  >pLeft, pValue);
9d00: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9d10: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
9d20: 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
9d30: 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28  int v;.      if(
9d40: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
9d50: 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
9d60: 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  &v) ){.        *
9d70: 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20  pValue = -v;.   
9d80: 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
9d90: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
9da0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
9db0: 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ult: break;.  }.
9dc0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
9dd0: 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73 41  assert( ExprHasA
9de0: 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  nyProperty(p, EP
9df0: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
9e00: 6e 4f 6e 6c 79 29 0a 20 20 20 20 20 20 20 20 20  nOnly).         
9e10: 20 20 20 20 20 20 7c 7c 20 28 70 2d 3e 66 6c 61        || (p->fla
9e20: 67 73 32 20 26 20 45 50 32 5f 4d 61 6c 6c 6f 63  gs2 & EP2_Malloc
9e30: 65 64 54 6f 6b 65 6e 29 3d 3d 30 20 29 3b 0a 20  edToken)==0 );. 
9e40: 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 49 4e     p->op = TK_IN
9e50: 54 45 47 45 52 3b 0a 20 20 20 20 70 2d 3e 66 6c  TEGER;.    p->fl
9e60: 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c  ags |= EP_IntVal
9e70: 75 65 3b 0a 20 20 20 20 70 2d 3e 75 2e 69 56 61  ue;.    p->u.iVa
9e80: 6c 75 65 20 3d 20 2a 70 56 61 6c 75 65 3b 0a 20  lue = *pValue;. 
9e90: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
9ea0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
9eb0: 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65  TRUE if the give
9ec0: 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f  n string is a ro
9ed0: 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  w-id column name
9ee0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
9ef0: 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68  IsRowid(const ch
9f00: 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71  ar *z){.  if( sq
9f10: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
9f20: 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20  "_ROWID_")==0 ) 
9f30: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
9f40: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
9f50: 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20  , "ROWID")==0 ) 
9f60: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
9f70: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
9f80: 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65  , "OID")==0 ) re
9f90: 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
9fa0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
9fb0: 75 72 6e 20 74 72 75 65 20 69 66 20 77 65 20 61  urn true if we a
9fc0: 72 65 20 61 62 6c 65 20 74 6f 20 74 68 65 20 49  re able to the I
9fd0: 4e 20 6f 70 65 72 61 74 6f 72 20 6f 70 74 69 6d  N operator optim
9fe0: 69 7a 61 74 69 6f 6e 20 6f 6e 20 61 0a 2a 2a 20  ization on a.** 
9ff0: 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72  query of the for
a000: 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 78 20  m.**.**       x 
a010: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a  IN (SELECT ...).
a020: 2a 2a 0a 2a 2a 20 57 68 65 72 65 20 74 68 65 20  **.** Where the 
a030: 53 45 4c 45 43 54 2e 2e 2e 20 63 6c 61 75 73 65  SELECT... clause
a040: 20 69 73 20 61 73 20 73 70 65 63 69 66 69 65 64   is as specified
a050: 20 62 79 20 74 68 65 20 70 61 72 61 6d 65 74 65   by the paramete
a060: 72 20 74 6f 20 74 68 69 73 0a 2a 2a 20 72 6f 75  r to this.** rou
a070: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tine..**.** The 
a080: 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 70 61  Select object pa
a090: 73 73 65 64 20 69 6e 20 68 61 73 20 61 6c 72 65  ssed in has alre
a0a0: 61 64 79 20 62 65 65 6e 20 70 72 65 70 72 6f 63  ady been preproc
a0b0: 65 73 73 65 64 20 61 6e 64 20 6e 6f 0a 2a 2a 20  essed and no.** 
a0c0: 65 72 72 6f 72 73 20 68 61 76 65 20 62 65 65 6e  errors have been
a0d0: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 23 69 66 6e 64   found..*/.#ifnd
a0e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
a0f0: 55 42 51 55 45 52 59 0a 73 74 61 74 69 63 20 69  UBQUERY.static i
a100: 6e 74 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  nt isCandidateFo
a110: 72 49 6e 4f 70 74 28 53 65 6c 65 63 74 20 2a 70  rInOpt(Select *p
a120: 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  ){.  SrcList *pS
a130: 72 63 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  rc;.  ExprList *
a140: 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20  pEList;.  Table 
a150: 2a 70 54 61 62 3b 0a 20 20 69 66 28 20 70 3d 3d  *pTab;.  if( p==
a160: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  0 ) return 0;   
a170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a180: 2f 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  /* right-hand si
a190: 64 65 20 6f 66 20 49 4e 20 69 73 20 53 45 4c 45  de of IN is SELE
a1a0: 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  CT */.  if( p->p
a1b0: 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30  Prior ) return 0
a1c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
a1d0: 2a 20 4e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64  * Not a compound
a1e0: 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28   SELECT */.  if(
a1f0: 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28   p->selFlags & (
a200: 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
a210: 67 67 72 65 67 61 74 65 29 20 29 7b 0a 20 20 20  ggregate) ){.   
a220: 20 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73   testcase( (p->s
a230: 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
a240: 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
a250: 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e  ate))==SF_Distin
a260: 63 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ct );.    testca
a270: 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  se( (p->selFlags
a280: 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
a290: 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
a2a0: 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a  SF_Aggregate );.
a2b0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
a2c0: 20 4e 6f 20 44 49 53 54 49 4e 43 54 20 6b 65 79   No DISTINCT key
a2d0: 77 6f 72 64 20 61 6e 64 20 6e 6f 20 61 67 67 72  word and no aggr
a2e0: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
a2f0: 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  */.  }.  assert(
a300: 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20   p->pGroupBy==0 
a310: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
a320: 2f 2a 20 48 61 73 20 6e 6f 20 47 52 4f 55 50 20  /* Has no GROUP 
a330: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
a340: 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72  f( p->pLimit ) r
a350: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
a360: 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
a370: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a  LIMIT clause */.
a380: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66    assert( p->pOf
a390: 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 20  fset==0 );      
a3a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 4c           /* No L
a3b0: 49 4d 49 54 20 6d 65 61 6e 73 20 6e 6f 20 4f 46  IMIT means no OF
a3c0: 46 53 45 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d  FSET */.  if( p-
a3d0: 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e  >pWhere ) return
a3e0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
a3f0: 20 2f 2a 20 48 61 73 20 6e 6f 20 57 48 45 52 45   /* Has no WHERE
a400: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 70 53 72   clause */.  pSr
a410: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61  c = p->pSrc;.  a
a420: 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29  ssert( pSrc!=0 )
a430: 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53  ;.  if( pSrc->nS
a440: 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  rc!=1 ) return 0
a450: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ;          /* Si
a460: 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20 46 52 4f  ngle term in FRO
a470: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66  M clause */.  if
a480: 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65  ( pSrc->a[0].pSe
a490: 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b  lect ) return 0;
a4a0: 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 69 73 20       /* FROM is 
a4b0: 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 20 6f  not a subquery o
a4c0: 72 20 76 69 65 77 20 2a 2f 0a 20 20 70 54 61 62  r view */.  pTab
a4d0: 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54   = pSrc->a[0].pT
a4e0: 61 62 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28  ab;.  if( NEVER(
a4f0: 70 54 61 62 3d 3d 30 29 20 29 20 72 65 74 75 72  pTab==0) ) retur
a500: 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n 0;.  assert( p
a510: 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  Tab->pSelect==0 
a520: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  );            /*
a530: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
a540: 6e 6f 74 20 61 20 76 69 65 77 20 2a 2f 0a 20 20  not a view */.  
a550: 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
a560: 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ab) ) return 0; 
a570: 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63         /* FROM c
a580: 6c 61 75 73 65 20 6e 6f 74 20 61 20 76 69 72 74  lause not a virt
a590: 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70  ual table */.  p
a5a0: 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
a5b0: 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d  t;.  if( pEList-
a5c0: 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75  >nExpr!=1 ) retu
a5d0: 72 6e 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f  rn 0;       /* O
a5e0: 6e 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  ne column in the
a5f0: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
a600: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30   if( pEList->a[0
a610: 5d 2e 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ].pExpr->op!=TK_
a620: 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20  COLUMN ) return 
a630: 30 3b 20 2f 2a 20 52 65 73 75 6c 74 20 69 73 20  0; /* Result is 
a640: 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 72 65  a column */.  re
a650: 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
a660: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
a670: 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a  SUBQUERY */../*.
a680: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
a690: 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
a6a0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
a6b0: 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20 6f  f the IN (...) o
a6c0: 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 49 74 27 73  perator..** It's
a6d0: 20 6a 6f 62 20 69 73 20 74 6f 20 66 69 6e 64 20   job is to find 
a6e0: 6f 72 20 63 72 65 61 74 65 20 61 20 62 2d 74 72  or create a b-tr
a6f0: 65 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ee structure tha
a700: 74 20 6d 61 79 20 62 65 20 75 73 65 64 0a 2a 2a  t may be used.**
a710: 20 65 69 74 68 65 72 20 74 6f 20 74 65 73 74 20   either to test 
a720: 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 6f  for membership o
a730: 66 20 74 68 65 20 28 2e 2e 2e 29 20 73 65 74 20  f the (...) set 
a740: 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  or to iterate th
a750: 72 6f 75 67 68 0a 2a 2a 20 69 74 73 20 6d 65 6d  rough.** its mem
a760: 62 65 72 73 2c 20 73 6b 69 70 70 69 6e 67 20 64  bers, skipping d
a770: 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  uplicates..**.**
a780: 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   The index of th
a790: 65 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20  e cursor opened 
a7a0: 6f 6e 20 74 68 65 20 62 2d 74 72 65 65 20 28 64  on the b-tree (d
a7b0: 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20 64  atabase table, d
a7c0: 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 0a 2a  atabase index .*
a7d0: 2a 20 6f 72 20 65 70 68 65 72 6d 61 6c 20 74 61  * or ephermal ta
a7e0: 62 6c 65 29 20 69 73 20 73 74 6f 72 65 64 20 69  ble) is stored i
a7f0: 6e 20 70 58 2d 3e 69 54 61 62 6c 65 20 62 65 66  n pX->iTable bef
a800: 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ore this functio
a810: 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 20 54 68  n returns..** Th
a820: 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
a830: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
a840: 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20  n indicates the 
a850: 62 2d 74 72 65 65 20 74 79 70 65 2c 20 61 73 20  b-tree type, as 
a860: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
a870: 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20   IN_INDEX_ROWID 
a880: 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
a890: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74   opened on a dat
a8a0: 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  abase table..** 
a8b0: 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58    IN_INDEX_INDEX
a8c0: 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61   - The cursor wa
a8d0: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61  s opened on a da
a8e0: 74 61 62 61 73 65 20 69 6e 64 65 78 2e 0a 2a 2a  tabase index..**
a8f0: 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20     IN_INDEX_EPH 
a900: 2d 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 77  -   The cursor w
a910: 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73  as opened on a s
a920: 70 65 63 69 61 6c 6c 79 20 63 72 65 61 74 65 64  pecially created
a930: 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20   and.**         
a940: 20 20 20 20 20 20 20 20 20 20 20 70 6f 70 75 6c             popul
a950: 61 74 65 64 20 65 70 68 65 72 65 6d 61 6c 20 74  ated epheremal t
a960: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  able..**.** An e
a970: 78 69 73 74 69 6e 67 20 62 2d 74 72 65 65 20 6d  xisting b-tree m
a980: 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  ay only be used 
a990: 69 66 20 74 68 65 20 53 45 4c 45 43 54 20 69 73  if the SELECT is
a9a0: 20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 0a 2a   of the simple.*
a9b0: 2a 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  * form:.**.**   
a9c0: 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e    SELECT <column
a9d0: 3e 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a  > FROM <table>.*
a9e0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 72 4e 6f  *.** If the prNo
a9f0: 74 46 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72  tFound parameter
aa00: 20 69 73 20 30 2c 20 74 68 65 6e 20 74 68 65 20   is 0, then the 
aa10: 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75  b-tree will be u
aa20: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 0a 2a  sed to iterate.*
aa30: 2a 20 74 68 72 6f 75 67 68 20 74 68 65 20 73 65  * through the se
aa40: 74 20 6d 65 6d 62 65 72 73 2c 20 73 6b 69 70 70  t members, skipp
aa50: 69 6e 67 20 61 6e 79 20 64 75 70 6c 69 63 61 74  ing any duplicat
aa60: 65 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  es. In this case
aa70: 20 61 6e 0a 2a 2a 20 65 70 68 65 72 65 6d 61 6c   an.** epheremal
aa80: 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 75   table must be u
aa90: 73 65 64 20 75 6e 6c 65 73 73 20 74 68 65 20 73  sed unless the s
aaa0: 65 6c 65 63 74 65 64 20 3c 63 6f 6c 75 6d 6e 3e  elected <column>
aab0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a   is guaranteed.*
aac0: 2a 20 74 6f 20 62 65 20 75 6e 69 71 75 65 20 2d  * to be unique -
aad0: 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
aae0: 69 74 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52  it is an INTEGER
aaf0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
ab00: 69 74 0a 2a 2a 20 68 61 73 20 61 20 55 4e 49 51  it.** has a UNIQ
ab10: 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72  UE constraint or
ab20: 20 55 4e 49 51 55 45 20 69 6e 64 65 78 2e 0a 2a   UNIQUE index..*
ab30: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 72 4e 6f  *.** If the prNo
ab40: 74 46 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72  tFound parameter
ab50: 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20   is not 0, then 
ab60: 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20  the b-tree will 
ab70: 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20  be used .** for 
ab80: 66 61 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73  fast set members
ab90: 68 69 70 20 74 65 73 74 73 2e 20 49 6e 20 74 68  hip tests. In th
aba0: 69 73 20 63 61 73 65 20 61 6e 20 65 70 68 65 72  is case an epher
abb0: 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20  emal table must 
abc0: 0a 2a 2a 20 62 65 20 75 73 65 64 20 75 6e 6c 65  .** be used unle
abd0: 73 73 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 61  ss <column> is a
abe0: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
abf0: 59 20 4b 45 59 20 6f 72 20 61 6e 20 69 6e 64 65  Y KEY or an inde
ac00: 78 20 63 61 6e 20 0a 2a 2a 20 62 65 20 66 6f 75  x can .** be fou
ac10: 6e 64 20 77 69 74 68 20 3c 63 6f 6c 75 6d 6e 3e  nd with <column>
ac20: 20 61 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73   as its left-mos
ac30: 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20  t column..**.** 
ac40: 57 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20  When the b-tree 
ac50: 69 73 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f  is being used fo
ac60: 72 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73  r membership tes
ac70: 74 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  ts, the calling 
ac80: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6e 65 65 64  function.** need
ac90: 73 20 74 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65  s to know whethe
aca0: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 73 74 72  r or not the str
acb0: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20  ucture contains 
acc0: 61 6e 20 53 51 4c 20 4e 55 4c 4c 20 0a 2a 2a 20  an SQL NULL .** 
acd0: 76 61 6c 75 65 20 69 6e 20 6f 72 64 65 72 20 74  value in order t
ace0: 6f 20 63 6f 72 72 65 63 74 6c 79 20 65 76 61 6c  o correctly eval
acf0: 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73  uate expressions
ad00: 20 6c 69 6b 65 20 22 58 20 49 4e 20 28 59 2c 20   like "X IN (Y, 
ad10: 5a 29 22 2e 0a 2a 2a 20 49 66 20 74 68 65 72 65  Z)"..** If there
ad20: 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 68 61   is a chance tha
ad30: 74 20 74 68 65 20 62 2d 74 72 65 65 20 6d 69 67  t the b-tree mig
ad40: 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c  ht contain a NUL
ad50: 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75  L value at.** ru
ad60: 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61 20 72 65  ntime, then a re
ad70: 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61  gister is alloca
ad80: 74 65 64 20 61 6e 64 20 74 68 65 20 72 65 67 69  ted and the regi
ad90: 73 74 65 72 20 6e 75 6d 62 65 72 20 77 72 69 74  ster number writ
ada0: 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 4e 6f 74  ten.** to *prNot
adb0: 46 6f 75 6e 64 2e 20 49 66 20 74 68 65 72 65 20  Found. If there 
adc0: 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61  is no chance tha
add0: 74 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e  t the b-tree con
ade0: 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20  tains a.** NULL 
adf0: 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72 4e  value, then *prN
ae00: 6f 74 46 6f 75 6e 64 20 69 73 20 6c 65 66 74 20  otFound is left 
ae10: 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  unchanged..**.**
ae20: 20 49 66 20 61 20 72 65 67 69 73 74 65 72 20 69   If a register i
ae30: 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
ae40: 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20 73 74 6f  its location sto
ae50: 72 65 64 20 69 6e 20 2a 70 72 4e 6f 74 46 6f 75  red in *prNotFou
ae60: 6e 64 2c 20 74 68 65 6e 0a 2a 2a 20 69 74 73 20  nd, then.** its 
ae70: 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 69 73  initial value is
ae80: 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20 62 2d   NULL. If the b-
ae90: 74 72 65 65 20 64 6f 65 73 20 6e 6f 74 20 72 65  tree does not re
aea0: 6d 61 69 6e 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  main constant.**
aeb0: 20 66 6f 72 20 74 68 65 20 64 75 72 61 74 69 6f   for the duratio
aec0: 6e 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 28  n of the query (
aed0: 69 2e 65 2e 20 74 68 65 20 53 45 4c 45 43 54 20  i.e. the SELECT 
aee0: 74 68 61 74 20 67 65 6e 65 72 61 74 65 73 20 74  that generates t
aef0: 68 65 20 62 2d 74 72 65 65 0a 2a 2a 20 69 73 20  he b-tree.** is 
af00: 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
af10: 71 75 65 72 79 29 20 74 68 65 6e 20 74 68 65 20  query) then the 
af20: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 61 6c 6c  value of the all
af30: 6f 63 61 74 65 64 20 72 65 67 69 73 74 65 72 20  ocated register 
af40: 69 73 0a 2a 2a 20 72 65 73 65 74 20 74 6f 20 4e  is.** reset to N
af50: 55 4c 4c 20 65 61 63 68 20 74 69 6d 65 20 74 68  ULL each time th
af60: 65 20 62 2d 74 72 65 65 20 69 73 20 72 65 70 6f  e b-tree is repo
af70: 70 75 6c 61 74 65 64 2e 20 54 68 69 73 20 61 6c  pulated. This al
af80: 6c 6f 77 73 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  lows the.** call
af90: 65 72 20 74 6f 20 75 73 65 20 76 64 62 65 20 63  er to use vdbe c
afa0: 6f 64 65 20 65 71 75 69 76 61 6c 65 6e 74 20 74  ode equivalent t
afb0: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  o the following:
afc0: 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 72 65 67  .**.**   if( reg
afd0: 69 73 74 65 72 3d 3d 4e 55 4c 4c 20 29 7b 0a 2a  ister==NULL ){.*
afe0: 2a 20 20 20 20 20 68 61 73 5f 6e 75 6c 6c 20 3d  *     has_null =
aff0: 20 3c 74 65 73 74 20 69 66 20 64 61 74 61 20 73   <test if data s
b000: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
b010: 73 20 6e 75 6c 6c 3e 0a 2a 2a 20 20 20 20 20 72  s null>.**     r
b020: 65 67 69 73 74 65 72 20 3d 20 31 0a 2a 2a 20 20  egister = 1.**  
b030: 20 7d 0a 2a 2a 0a 2a 2a 20 69 6e 20 6f 72 64 65   }.**.** in orde
b040: 72 20 74 6f 20 61 76 6f 69 64 20 72 75 6e 6e 69  r to avoid runni
b050: 6e 67 20 74 68 65 20 3c 74 65 73 74 20 69 66 20  ng the <test if 
b060: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 63  data structure c
b070: 6f 6e 74 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a  ontains null>.**
b080: 20 74 65 73 74 20 6d 6f 72 65 20 6f 66 74 65 6e   test more often
b090: 20 74 68 61 6e 20 69 73 20 6e 65 63 65 73 73 61   than is necessa
b0a0: 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ry..*/.#ifndef S
b0b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
b0c0: 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  ERY.int sqlite3F
b0d0: 69 6e 64 49 6e 49 6e 64 65 78 28 50 61 72 73 65  indInIndex(Parse
b0e0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
b0f0: 70 58 2c 20 69 6e 74 20 2a 70 72 4e 6f 74 46 6f  pX, int *prNotFo
b100: 75 6e 64 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a  und){.  Select *
b110: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
b120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b130: 20 53 45 4c 45 43 54 20 74 6f 20 74 68 65 20 72   SELECT to the r
b140: 69 67 68 74 20 6f 66 20 49 4e 20 6f 70 65 72 61  ight of IN opera
b150: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79  tor */.  int eTy
b160: 70 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  pe = 0;         
b170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b180: 2a 20 54 79 70 65 20 6f 66 20 52 48 53 20 74 61  * Type of RHS ta
b190: 62 6c 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20  ble. IN_INDEX_* 
b1a0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
b1b0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20  pParse->nTab++; 
b1c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
b1d0: 72 73 6f 72 20 6f 66 20 74 68 65 20 52 48 53 20  rsor of the RHS 
b1e0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d  table */.  int m
b1f0: 75 73 74 42 65 55 6e 69 71 75 65 20 3d 20 28 70  ustBeUnique = (p
b200: 72 4e 6f 74 46 6f 75 6e 64 3d 3d 30 29 3b 20 20  rNotFound==0);  
b210: 20 2f 2a 20 54 72 75 65 20 69 66 20 52 48 53 20   /* True if RHS 
b220: 6d 75 73 74 20 62 65 20 75 6e 69 71 75 65 20 2a  must be unique *
b230: 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  /..  /* Check to
b240: 20 73 65 65 20 69 66 20 61 6e 20 65 78 69 73 74   see if an exist
b250: 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  ing table or ind
b260: 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ex can be used t
b270: 6f 0a 20 20 2a 2a 20 73 61 74 69 73 66 79 20 74  o.  ** satisfy t
b280: 68 65 20 71 75 65 72 79 2e 20 20 54 68 69 73 20  he query.  This 
b290: 69 73 20 70 72 65 66 65 72 61 62 6c 65 20 74 6f  is preferable to
b2a0: 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 6e 65   generating a ne
b2b0: 77 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65 72 61  w .  ** ephemera
b2c0: 6c 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  l table..  */.  
b2d0: 70 20 3d 20 28 45 78 70 72 48 61 73 50 72 6f 70  p = (ExprHasProp
b2e0: 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53  erty(pX, EP_xIsS
b2f0: 65 6c 65 63 74 29 20 3f 20 70 58 2d 3e 78 2e 70  elect) ? pX->x.p
b300: 53 65 6c 65 63 74 20 3a 20 30 29 3b 0a 20 20 69  Select : 0);.  i
b310: 66 28 20 41 4c 57 41 59 53 28 70 50 61 72 73 65  f( ALWAYS(pParse
b320: 2d 3e 6e 45 72 72 3d 3d 30 29 20 26 26 20 69 73  ->nErr==0) && is
b330: 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
b340: 74 28 70 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  t(p) ){.    sqli
b350: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
b360: 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20  ->db;           
b370: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
b380: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20  onnection */.   
b390: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
b3a0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
b3b0: 45 78 70 72 3b 20 20 20 2f 2a 20 45 78 70 72 65  Expr;   /* Expre
b3c0: 73 73 69 6f 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a  ssion <column> *
b3d0: 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  /.    int iCol =
b3e0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
b3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b400: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
b410: 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20  <column> */.    
b420: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
b430: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
b440: 3b 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61  ;      /* Virtua
b450: 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20  l machine being 
b460: 63 6f 64 65 64 20 2a 2f 0a 20 20 20 20 54 61 62  coded */.    Tab
b470: 6c 65 20 2a 70 54 61 62 20 3d 20 70 2d 3e 70 53  le *pTab = p->pS
b480: 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 20 20  rc->a[0].pTab;  
b490: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61      /* Table <ta
b4a0: 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  ble>. */.    int
b4b0: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
b4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4d0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
b4e0: 69 64 78 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a  idx for pTab */.
b4f0: 20 20 20 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20     .    /* Code 
b500: 61 6e 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b  an OP_VerifyCook
b510: 69 65 20 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c  ie and OP_TableL
b520: 6f 63 6b 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e  ock for <table>.
b530: 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71   */.    iDb = sq
b540: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
b550: 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
b560: 68 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74  hema);.    sqlit
b570: 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
b580: 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
b590: 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c  .    sqlite3Tabl
b5a0: 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
b5b0: 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30  b, pTab->tnum, 0
b5c0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
b5d0: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  .    /* This fun
b5e0: 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61  ction is only ca
b5f0: 6c 6c 65 64 20 66 72 6f 6d 20 74 77 6f 20 70 6c  lled from two pl
b600: 61 63 65 73 2e 20 49 6e 20 62 6f 74 68 20 63 61  aces. In both ca
b610: 73 65 73 20 74 68 65 20 76 64 62 65 0a 20 20 20  ses the vdbe.   
b620: 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20   ** has already 
b630: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 20  been allocated. 
b640: 53 6f 20 61 73 73 75 6d 65 20 73 71 6c 69 74 65  So assume sqlite
b650: 33 47 65 74 56 64 62 65 28 29 20 69 73 20 61 6c  3GetVdbe() is al
b660: 77 61 79 73 0a 20 20 20 20 2a 2a 20 73 75 63 63  ways.    ** succ
b670: 65 73 73 66 75 6c 20 68 65 72 65 2e 0a 20 20 20  essful here..   
b680: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 76   */.    assert(v
b690: 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  );.    if( iCol<
b6a0: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
b6b0: 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
b6c0: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  nMem;.      int 
b6d0: 69 41 64 64 72 3b 0a 20 20 20 20 20 20 73 71 6c  iAddr;.      sql
b6e0: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
b6f0: 65 28 76 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20  e(v, iDb);..    
b700: 20 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65    iAddr = sqlite
b710: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
b720: 50 5f 49 66 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  P_If, iMem);.   
b730: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b740: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
b750: 65 72 2c 20 31 2c 20 69 4d 65 6d 29 3b 0a 0a 20  er, 1, iMem);.. 
b760: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
b770: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54  Table(pParse, iT
b780: 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f  ab, iDb, pTab, O
b790: 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20  P_OpenRead);.   
b7a0: 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
b7b0: 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20 20 20 20  DEX_ROWID;..    
b7c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
b7d0: 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b  pHere(v, iAddr);
b7e0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b7f0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
b800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b810: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
b820: 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a  or variable */..
b830: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c        /* The col
b840: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
b850: 75 73 65 64 20 62 79 20 74 68 65 20 63 6f 6d 70  used by the comp
b860: 61 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20 69 6e  arison. If an in
b870: 64 65 78 20 69 73 20 74 6f 0a 20 20 20 20 20 20  dex is to.      
b880: 2a 2a 20 62 65 20 75 73 65 64 20 69 6e 20 70 6c  ** be used in pl
b890: 61 63 65 20 6f 66 20 61 20 74 65 6d 70 2d 74 61  ace of a temp-ta
b8a0: 62 6c 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20  ble, it must be 
b8b0: 6f 72 64 65 72 65 64 20 61 63 63 6f 72 64 69 6e  ordered accordin
b8c0: 67 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68  g.      ** to th
b8d0: 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  is collation seq
b8e0: 75 65 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20 20  uence.  */.     
b8f0: 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d   CollSeq *pReq =
b900: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
b910: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
b920: 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20  rse, pX->pLeft, 
b930: 70 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20 2f  pExpr);..      /
b940: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
b950: 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 77   affinity that w
b960: 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 70  ill be used to p
b970: 65 72 66 6f 72 6d 20 74 68 65 20 0a 20 20 20 20  erform the .    
b980: 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20    ** comparison 
b990: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
b9a0: 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  he affinity of t
b9b0: 68 65 20 63 6f 6c 75 6d 6e 2e 20 49 66 0a 20 20  he column. If.  
b9c0: 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6e 6f 74      ** it is not
b9d0: 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  , it is not poss
b9e0: 69 62 6c 65 20 74 6f 20 75 73 65 20 61 6e 79 20  ible to use any 
b9f0: 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 2a 2f 0a  index..      */.
ba00: 20 20 20 20 20 20 63 68 61 72 20 61 66 66 20 3d        char aff =
ba10: 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e   comparisonAffin
ba20: 69 74 79 28 70 58 29 3b 0a 20 20 20 20 20 20 69  ity(pX);.      i
ba30: 6e 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d  nt affinity_ok =
ba40: 20 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   (pTab->aCol[iCo
ba50: 6c 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 61 66 66  l].affinity==aff
ba60: 7c 7c 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  ||aff==SQLITE_AF
ba70: 46 5f 4e 4f 4e 45 29 3b 0a 0a 20 20 20 20 20 20  F_NONE);..      
ba80: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
ba90: 49 6e 64 65 78 3b 20 70 49 64 78 20 26 26 20 65  Index; pIdx && e
baa0: 54 79 70 65 3d 3d 30 20 26 26 20 61 66 66 69 6e  Type==0 && affin
bab0: 69 74 79 5f 6f 6b 3b 20 70 49 64 78 3d 70 49 64  ity_ok; pIdx=pId
bac0: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
bad0: 20 20 20 69 66 28 20 28 70 49 64 78 2d 3e 61 69     if( (pIdx->ai
bae0: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29  Column[0]==iCol)
baf0: 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c  .         && sql
bb00: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
bb10: 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 70 49 64  db, ENC(db), pId
bb20: 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 2c 20 30 29  x->azColl[0], 0)
bb30: 3d 3d 70 52 65 71 0a 20 20 20 20 20 20 20 20 20  ==pReq.         
bb40: 26 26 20 28 21 6d 75 73 74 42 65 55 6e 69 71 75  && (!mustBeUniqu
bb50: 65 20 7c 7c 20 28 70 49 64 78 2d 3e 6e 43 6f 6c  e || (pIdx->nCol
bb60: 75 6d 6e 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e  umn==1 && pIdx->
bb70: 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
bb80: 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  )).        ){.  
bb90: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4d 65 6d          int iMem
bba0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
bbb0: 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  m;.          int
bbc0: 20 69 41 64 64 72 3b 0a 20 20 20 20 20 20 20 20   iAddr;.        
bbd0: 20 20 63 68 61 72 20 2a 70 4b 65 79 3b 0a 20 20    char *pKey;.  
bbe0: 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 20  .          pKey 
bbf0: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
bc00: 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50  3IndexKeyinfo(pP
bc10: 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20  arse, pIdx);.   
bc20: 20 20 20 20 20 20 20 69 44 62 20 3d 20 73 71 6c         iDb = sql
bc30: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
bc40: 78 28 64 62 2c 20 70 49 64 78 2d 3e 70 53 63 68  x(db, pIdx->pSch
bc50: 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ema);.          
bc60: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
bc70: 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 0a 20  tree(v, iDb);.. 
bc80: 20 20 20 20 20 20 20 20 20 69 41 64 64 72 20 3d           iAddr =
bc90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bca0: 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 69 4d 65  p1(v, OP_If, iMe
bcb0: 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  m);.          sq
bcc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
bcd0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
bce0: 2c 20 69 4d 65 6d 29 3b 0a 20 20 0a 20 20 20 20  , iMem);.  .    
bcf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
bd00: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
bd10: 65 6e 52 65 61 64 2c 20 69 54 61 62 2c 20 70 49  enRead, iTab, pI
bd20: 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20  dx->tnum, iDb,. 
bd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4b                pK
bd50: 65 79 2c 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  ey,P4_KEYINFO_HA
bd60: 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 20 20  NDOFF);.        
bd70: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
bd80: 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e  , "%s", pIdx->zN
bd90: 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ame));.         
bda0: 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
bdb0: 58 5f 49 4e 44 45 58 3b 0a 0a 20 20 20 20 20 20  X_INDEX;..      
bdc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
bdd0: 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72  umpHere(v, iAddr
bde0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
bdf0: 20 70 72 4e 6f 74 46 6f 75 6e 64 20 26 26 20 21   prNotFound && !
be00: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
be10: 2e 6e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  .notNull ){.    
be20: 20 20 20 20 20 20 20 20 2a 70 72 4e 6f 74 46 6f          *prNotFo
be30: 75 6e 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  und = ++pParse->
be40: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  nMem;.          
be50: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
be60: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
be70: 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20 29 7b   if( eType==0 ){
be80: 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f  .    /* Could no
be90: 74 20 66 6f 75 6e 64 20 61 6e 20 65 78 69 73 74  t found an exist
bea0: 69 6e 67 20 61 62 6c 65 20 6f 72 20 69 6e 64 65  ing able or inde
beb0: 78 20 74 6f 20 75 73 65 20 61 73 20 74 68 65 20  x to use as the 
bec0: 52 48 53 20 62 2d 74 72 65 65 2e 0a 20 20 20 20  RHS b-tree..    
bed0: 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61 76 65 20  ** We will have 
bee0: 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65  to generate an e
bef0: 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74  phemeral table t
bf00: 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20  o do the job..  
bf10: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 4d 61    */.    int rMa
bf20: 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20  yHaveNull = 0;. 
bf30: 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
bf40: 44 45 58 5f 45 50 48 3b 0a 20 20 20 20 69 66 28  DEX_EPH;.    if(
bf50: 20 70 72 4e 6f 74 46 6f 75 6e 64 20 29 7b 0a 20   prNotFound ){. 
bf60: 20 20 20 20 20 2a 70 72 4e 6f 74 46 6f 75 6e 64       *prNotFound
bf70: 20 3d 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20   = rMayHaveNull 
bf80: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
bf90: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
bfa0: 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  pX->pLeft->iColu
bfb0: 6d 6e 3c 30 20 26 26 20 21 45 78 70 72 48 61 73  mn<0 && !ExprHas
bfc0: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 58 2c 20  AnyProperty(pX, 
bfd0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
bfe0: 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49  .      eType = I
bff0: 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20  N_INDEX_ROWID;. 
c000: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
c010: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
c020: 61 72 73 65 2c 20 70 58 2c 20 72 4d 61 79 48 61  arse, pX, rMayHa
c030: 76 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d 49  veNull, eType==I
c040: 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b 0a  N_INDEX_ROWID);.
c050: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d    }else{.    pX-
c060: 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a  >iTable = iTab;.
c070: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 54 79    }.  return eTy
c080: 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  pe;.}.#endif../*
c090: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
c0a0: 65 20 66 6f 72 20 73 63 61 6c 61 72 20 73 75 62  e for scalar sub
c0b0: 71 75 65 72 69 65 73 20 75 73 65 64 20 61 73 20  queries used as 
c0c0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  an expression.**
c0d0: 20 61 6e 64 20 49 4e 20 6f 70 65 72 61 74 6f 72   and IN operator
c0e0: 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a  s.  Examples:.**
c0f0: 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45 43 54 20  .**     (SELECT 
c100: 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20 20 20  a FROM b)       
c110: 20 20 20 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a     -- subquery.*
c120: 2a 20 20 20 20 20 45 58 49 53 54 53 20 28 53 45  *     EXISTS (SE
c130: 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
c140: 20 2d 2d 20 45 58 49 53 54 53 20 73 75 62 71 75   -- EXISTS subqu
c150: 65 72 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20  ery.**     x IN 
c160: 28 34 2c 35 2c 31 31 29 20 20 20 20 20 20 20 20  (4,5,11)        
c170: 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72        -- IN oper
c180: 61 74 6f 72 20 77 69 74 68 20 6c 69 73 74 20 6f  ator with list o
c190: 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  n right-hand sid
c1a0: 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 53  e.**     x IN (S
c1b0: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20  ELECT a FROM b) 
c1c0: 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74      -- IN operat
c1d0: 6f 72 20 77 69 74 68 20 73 75 62 71 75 65 72 79  or with subquery
c1e0: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 0a 2a 2a   on the right.**
c1f0: 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70 61  .** The pExpr pa
c200: 72 61 6d 65 74 65 72 20 64 65 73 63 72 69 62 65  rameter describe
c210: 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  s the expression
c220: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
c230: 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f  he IN.** operato
c240: 72 20 6f 72 20 73 75 62 71 75 65 72 79 2e 0a 2a  r or subquery..*
c250: 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
c260: 72 20 69 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e  r isRowid is non
c270: 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 65 78 70 72  -zero, then expr
c280: 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20  ession pExpr is 
c290: 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f  guaranteed.** to
c2a0: 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   be of the form 
c2b0: 22 3c 72 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20  "<rowid> IN (?, 
c2c0: 3f 2c 20 3f 29 22 2c 20 77 68 65 72 65 20 3c 72  ?, ?)", where <r
c2d0: 6f 77 69 64 3e 20 69 73 20 61 20 72 65 66 65 72  owid> is a refer
c2e0: 65 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20  ence.** to some 
c2f0: 69 6e 74 65 67 65 72 20 6b 65 79 20 63 6f 6c 75  integer key colu
c300: 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 20 42 2d  mn of a table B-
c310: 54 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61  Tree. In this ca
c320: 73 65 2c 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e  se, use an.** in
c330: 74 6b 65 79 20 42 2d 54 72 65 65 20 74 6f 20 73  tkey B-Tree to s
c340: 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20  tore the set of 
c350: 49 4e 28 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69  IN(...) values i
c360: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73  nstead of the us
c370: 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20  ual.** (slower) 
c380: 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
c390: 6b 65 79 73 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a  keys B-Tree..**.
c3a0: 2a 2a 20 49 66 20 72 4d 61 79 48 61 76 65 4e 75  ** If rMayHaveNu
c3b0: 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ll is non-zero, 
c3c0: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
c3d0: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  the operation is
c3e0: 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61   an IN.** (not a
c3f0: 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54   SELECT or EXIST
c400: 53 29 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  S) and that the 
c410: 52 48 53 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  RHS might contai
c420: 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20 46 75 72  ns NULLs..** Fur
c430: 74 68 65 72 6d 6f 72 65 2c 20 74 68 65 20 49 4e  thermore, the IN
c440: 20 69 73 20 69 6e 20 61 20 57 48 45 52 45 20 63   is in a WHERE c
c450: 6c 61 75 73 65 20 61 6e 64 20 74 68 61 74 20 77  lause and that w
c460: 65 20 72 65 61 6c 6c 79 20 77 61 6e 74 0a 2a 2a  e really want.**
c470: 20 74 6f 20 69 74 65 72 61 74 65 20 6f 76 65 72   to iterate over
c480: 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
c490: 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 6f  IN operator in o
c4a0: 72 64 65 72 20 74 6f 20 71 75 69 63 6b 6c 79 20  rder to quickly 
c4b0: 6c 6f 63 61 74 65 0a 2a 2a 20 61 6c 6c 20 63 6f  locate.** all co
c4c0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 4c 48 53 20  rresponding LHS 
c4d0: 65 6c 65 6d 65 6e 74 73 2e 20 20 41 6c 6c 20 74  elements.  All t
c4e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
c4f0: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 0a 2a   is initialize.*
c500: 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 20 67  * the register g
c510: 69 76 65 6e 20 62 79 20 72 4d 61 79 48 61 76 65  iven by rMayHave
c520: 4e 75 6c 6c 20 74 6f 20 4e 55 4c 4c 2e 20 20 43  Null to NULL.  C
c530: 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  alling routines 
c540: 77 69 6c 6c 20 74 61 6b 65 0a 2a 2a 20 63 61 72  will take.** car
c550: 65 20 6f 66 20 63 68 61 6e 67 69 6e 67 20 74 68  e of changing th
c560: 69 73 20 72 65 67 69 73 74 65 72 20 76 61 6c 75  is register valu
c570: 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66  e to non-NULL if
c580: 20 74 68 65 20 52 48 53 20 69 73 20 4e 55 4c 4c   the RHS is NULL
c590: 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  -free..**.** If 
c5a0: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 69 73 20  rMayHaveNull is 
c5b0: 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73  zero, that means
c5c0: 20 74 68 61 74 20 74 68 65 20 73 75 62 71 75 65   that the subque
c5d0: 72 79 20 69 73 20 62 65 69 6e 67 20 75 73 65 64  ry is being used
c5e0: 0a 2a 2a 20 66 6f 72 20 6d 65 6d 62 65 72 73 68  .** for membersh
c5f0: 69 70 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 2e  ip testing only.
c600: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65    There is no ne
c610: 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ed to initialize
c620: 20 61 6e 79 0a 2a 2a 20 72 65 67 69 73 74 65 72   any.** register
c630: 73 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  s to indicate th
c640: 65 20 70 72 65 73 65 6e 73 65 20 6f 72 20 61 62  e presense or ab
c650: 73 65 6e 63 65 20 6f 66 20 4e 55 4c 4c 73 20 6f  sence of NULLs o
c660: 6e 20 74 68 65 20 52 48 53 2e 0a 2a 2f 0a 23 69  n the RHS..*/.#i
c670: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c680: 54 5f 53 55 42 51 55 45 52 59 0a 76 6f 69 64 20  T_SUBQUERY.void 
c690: 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
c6a0: 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
c6b0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
c6c0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
c6d0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
c6e0: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  xpr,            
c6f0: 2f 2a 20 54 68 65 20 49 4e 2c 20 53 45 4c 45 43  /* The IN, SELEC
c700: 54 2c 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65  T, or EXISTS ope
c710: 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72  rator */.  int r
c720: 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 20 20 20  MayHaveNull,    
c730: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74     /* Register t
c740: 68 61 74 20 72 65 63 6f 72 64 73 20 77 68 65 74  hat records whet
c750: 68 65 72 20 4e 55 4c 4c 73 20 65 78 69 73 74 20  her NULLs exist 
c760: 69 6e 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20  in RHS */.  int 
c770: 69 73 52 6f 77 69 64 20 20 20 20 20 20 20 20 20  isRowid         
c780: 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
c790: 4c 48 53 20 6f 66 20 49 4e 20 6f 70 65 72 61 74  LHS of IN operat
c7a0: 6f 72 20 69 73 20 61 20 72 6f 77 69 64 20 2a 2f  or is a rowid */
c7b0: 0a 29 7b 0a 20 20 69 6e 74 20 74 65 73 74 41 64  .){.  int testAd
c7c0: 64 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  dr = 0;         
c7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c7e0: 20 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74 20 61   One-time test a
c7f0: 64 64 72 65 73 73 20 2a 2f 0a 20 20 56 64 62 65  ddress */.  Vdbe
c800: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
c810: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
c820: 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20  if( NEVER(v==0) 
c830: 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
c840: 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
c850: 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20  (pParse);..  /* 
c860: 54 68 69 73 20 63 6f 64 65 20 6d 75 73 74 20 62  This code must b
c870: 65 20 72 75 6e 20 69 6e 20 69 74 73 20 65 6e 74  e run in its ent
c880: 69 72 65 74 79 20 65 76 65 72 79 20 74 69 6d 65  irety every time
c890: 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   it is encounter
c8a0: 65 64 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 6f  ed.  ** if any o
c8b0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
c8c0: 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20  is true:.  **.  
c8d0: 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67  **    *  The rig
c8e0: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
c8f0: 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
c900: 71 75 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20  query.  **    * 
c910: 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
c920: 73 69 64 65 20 69 73 20 61 6e 20 65 78 70 72 65  side is an expre
c930: 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61  ssion list conta
c940: 69 6e 69 6e 67 20 76 61 72 69 61 62 6c 65 73 0a  ining variables.
c950: 20 20 2a 2a 20 20 20 20 2a 20 20 57 65 20 61 72    **    *  We ar
c960: 65 20 69 6e 73 69 64 65 20 61 20 74 72 69 67 67  e inside a trigg
c970: 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  er.  **.  ** If 
c980: 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65  all of the above
c990: 20 61 72 65 20 66 61 6c 73 65 2c 20 74 68 65 6e   are false, then
c9a0: 20 77 65 20 63 61 6e 20 72 75 6e 20 74 68 69 73   we can run this
c9b0: 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a   code just once.
c9c0: 20 20 2a 2a 20 73 61 76 65 20 74 68 65 20 72 65    ** save the re
c9d0: 73 75 6c 74 73 2c 20 61 6e 64 20 72 65 75 73 65  sults, and reuse
c9e0: 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74   the same result
c9f0: 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69   on subsequent i
ca00: 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f  nvocations..  */
ca10: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 41  .  if( !ExprHasA
ca20: 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  nyProperty(pExpr
ca30: 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20  , EP_VarSelect) 
ca40: 26 26 20 21 70 50 61 72 73 65 2d 3e 74 72 69 67  && !pParse->trig
ca50: 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 69 6e 74  Stack ){.    int
ca60: 20 6d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d   mem = ++pParse-
ca70: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
ca80: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
ca90: 4f 50 5f 49 66 2c 20 6d 65 6d 29 3b 0a 20 20 20  OP_If, mem);.   
caa0: 20 74 65 73 74 41 64 64 72 20 3d 20 73 71 6c 69   testAddr = sqli
cab0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
cac0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
cad0: 6d 65 6d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  mem);.    assert
cae0: 28 20 74 65 73 74 41 64 64 72 3e 30 20 7c 7c 20  ( testAddr>0 || 
caf0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
cb00: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7d 0a  ocFailed );.  }.
cb10: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
cb20: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
cb30: 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
cb40: 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20  char affinity;. 
cb50: 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 6b 65 79       KeyInfo key
cb60: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 6e 74 20  Info;.      int 
cb70: 61 64 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  addr;        /* 
cb80: 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70  Address of OP_Op
cb90: 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
cba0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ruction */.     
cbb0: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
cbc0: 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 0a 20 20  Expr->pLeft;..  
cbd0: 20 20 20 20 69 66 28 20 72 4d 61 79 48 61 76 65      if( rMayHave
cbe0: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Null ){.        
cbf0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cc00: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
cc10: 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 29 3b 0a   rMayHaveNull);.
cc20: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
cc30: 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65  ffinity = sqlite
cc40: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c  3ExprAffinity(pL
cc50: 65 66 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  eft);..      /* 
cc60: 57 68 65 74 68 65 72 20 74 68 69 73 20 69 73 20  Whether this is 
cc70: 61 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e  an 'x IN(SELECT.
cc80: 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e  ..)' or an 'x IN
cc90: 28 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20  (<exprlist>)'.  
cca0: 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
ccb0: 6e 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20  n it is handled 
ccc0: 74 68 65 20 73 61 6d 65 20 77 61 79 2e 20 41 20  the same way. A 
ccd0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 73  virtual table is
cce0: 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65   .      ** fille
ccf0: 64 20 77 69 74 68 20 73 69 6e 67 6c 65 2d 66 69  d with single-fi
cd00: 65 6c 64 20 69 6e 64 65 78 20 6b 65 79 73 20 72  eld index keys r
cd10: 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20  epresenting the 
cd20: 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a  results.      **
cd30: 20 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54   from the SELECT
cd40: 20 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73   or the <exprlis
cd50: 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  t>..      **.   
cd60: 20 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27     ** If the 'x'
cd70: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
cd80: 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f   column value, o
cd90: 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a  r the SELECT....
cda0: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
cdb0: 6e 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c  nt returns a col
cdc0: 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  umn value, then 
cdd0: 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20  the affinity of 
cde0: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f  that.      ** co
cdf0: 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20  lumn is used to 
ce00: 62 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20  build the index 
ce10: 6b 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78  keys. If both 'x
ce20: 27 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20  ' and the.      
ce30: 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61  ** SELECT... sta
ce40: 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d  tement are colum
ce50: 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63  ns, then numeric
ce60: 20 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65   affinity is use
ce70: 64 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69  d.      ** if ei
ce80: 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20  ther column has 
ce90: 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47  NUMERIC or INTEG
cea0: 45 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20  ER affinity. If 
ceb0: 6e 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a  neither.      **
cec0: 20 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c   'x' nor the SEL
ced0: 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74  ECT... statement
cee0: 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68   are columns, th
cef0: 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  en numeric affin
cf00: 69 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ity.      ** is 
cf10: 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  used..      */. 
cf20: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
cf30: 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  le = pParse->nTa
cf40: 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20  b++;.      addr 
cf50: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
cf60: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
cf70: 68 65 6d 65 72 61 6c 2c 20 70 45 78 70 72 2d 3e  hemeral, pExpr->
cf80: 69 54 61 62 6c 65 2c 20 21 69 73 52 6f 77 69 64  iTable, !isRowid
cf90: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  );.      memset(
cfa0: 26 6b 65 79 49 6e 66 6f 2c 20 30 2c 20 73 69 7a  &keyInfo, 0, siz
cfb0: 65 6f 66 28 6b 65 79 49 6e 66 6f 29 29 3b 0a 20  eof(keyInfo));. 
cfc0: 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 6e 46 69       keyInfo.nFi
cfd0: 65 6c 64 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20  eld = 1;..      
cfe0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
cff0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
d000: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
d010: 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20      /* Case 1:  
d020: 20 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45     expr IN (SELE
d030: 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20  CT ...).        
d040: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65  **.        ** Ge
d050: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77  nerate code to w
d060: 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73  rite the results
d070: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 69   of the select i
d080: 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72  nto the temporar
d090: 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62  y.        ** tab
d0a0: 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  le allocated and
d0b0: 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20   opened above.. 
d0c0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
d0d0: 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
d0e0: 74 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c  t;.        ExprL
d0f0: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20  ist *pEList;..  
d100: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 69        assert( !i
d110: 73 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20  sRowid );.      
d120: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
d130: 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
d140: 52 54 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e 69  RT_Set, pExpr->i
d150: 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  Table);.        
d160: 64 65 73 74 2e 61 66 66 69 6e 69 74 79 20 3d 20  dest.affinity = 
d170: 28 75 38 29 61 66 66 69 6e 69 74 79 3b 0a 20 20  (u8)affinity;.  
d180: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
d190: 45 78 70 72 2d 3e 69 54 61 62 6c 65 26 30 78 30  Expr->iTable&0x0
d1a0: 30 30 30 46 46 46 46 29 3d 3d 70 45 78 70 72 2d  000FFFF)==pExpr-
d1b0: 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20  >iTable );.     
d1c0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
d1d0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78  lect(pParse, pEx
d1e0: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26  pr->x.pSelect, &
d1f0: 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  dest) ){.       
d200: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
d210: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 45 4c     }.        pEL
d220: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
d230: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
d240: 20 20 20 20 20 20 20 20 69 66 28 20 41 4c 57 41          if( ALWA
d250: 59 53 28 70 45 4c 69 73 74 21 3d 30 20 26 26 20  YS(pEList!=0 && 
d260: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 29  pEList->nExpr>0)
d270: 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 6b   ){ .          k
d280: 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20  eyInfo.aColl[0] 
d290: 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
d2a0: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
d2b0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
d2c0: 66 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ft,.            
d2d0: 20 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70    pEList->a[0].p
d2e0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Expr);.        }
d2f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
d300: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21   pExpr->x.pList!
d310: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
d320: 20 43 61 73 65 20 32 3a 20 20 20 20 20 65 78 70   Case 2:     exp
d330: 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a  r IN (exprlist).
d340: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
d350: 20 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 65     ** For each e
d360: 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64  xpression, build
d370: 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72   an index key fr
d380: 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f  om the evaluatio
d390: 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  n and.        **
d3a0: 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65   store it in the
d3b0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
d3c0: 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61  . If <expr> is a
d3d0: 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73   column, then us
d3e0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  e.        ** tha
d3f0: 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69  t columns affini
d400: 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67  ty when building
d410: 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20   index keys. If 
d420: 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20  <expr> is not.  
d430: 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d        ** a colum
d440: 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61  n, use numeric a
d450: 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20  ffinity..       
d460: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
d470: 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c  i;.        ExprL
d480: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
d490: 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
d4a0: 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
d4b0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
d4c0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31  ;.        int r1
d4d0: 2c 20 72 32 2c 20 72 33 3b 0a 0a 20 20 20 20 20  , r2, r3;..     
d4e0: 20 20 20 69 66 28 20 21 61 66 66 69 6e 69 74 79     if( !affinity
d4f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66   ){.          af
d500: 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
d510: 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
d520: 20 20 7d 0a 20 20 20 20 20 20 20 20 6b 65 79 49    }.        keyI
d530: 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73  nfo.aColl[0] = s
d540: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
d550: 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  q(pParse, pExpr-
d560: 3e 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20 20  >pLeft);..      
d570: 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
d580: 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
d590: 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e  n in <exprlist>.
d5a0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 31 20 3d   */.        r1 =
d5b0: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
d5c0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
d5d0: 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
d5e0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
d5f0: 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
d600: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d610: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32 29   OP_Null, 0, r2)
d620: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
d630: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49  pList->nExpr, pI
d640: 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e  tem=pList->a; i>
d650: 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; i--, pItem++)
d660: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
d670: 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70   *pE2 = pItem->p
d680: 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 20 20 20  Expr;..         
d690: 20 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72 65   /* If the expre
d6a0: 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e  ssion is not con
d6b0: 73 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77 69  stant then we wi
d6c0: 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20  ll need to.     
d6d0: 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20       ** disable 
d6e0: 74 68 65 20 74 65 73 74 20 74 68 61 74 20 77 61  the test that wa
d6f0: 73 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f 76  s generated abov
d700: 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72  e that makes sur
d710: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  e.          ** t
d720: 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78  his code only ex
d730: 65 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42 65  ecutes once.  Be
d740: 63 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d  cause for a non-
d750: 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20 20  constant.       
d760: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
d770: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72 75   we need to reru
d780: 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61 63 68  n this code each
d790: 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 20   time..         
d7a0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
d7b0: 28 20 74 65 73 74 41 64 64 72 20 26 26 20 21 73  ( testAddr && !s
d7c0: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
d7d0: 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20  tant(pE2) ){.   
d7e0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d7f0: 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
d800: 28 76 2c 20 74 65 73 74 41 64 64 72 2d 31 2c 20  (v, testAddr-1, 
d810: 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2);.            
d820: 74 65 73 74 41 64 64 72 20 3d 20 30 3b 0a 20 20  testAddr = 0;.  
d830: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
d840: 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65       /* Evaluate
d850: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
d860: 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e  and insert it in
d870: 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c  to the temp tabl
d880: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  e */.          r
d890: 33 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  3 = sqlite3ExprC
d8a0: 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
d8b0: 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20 20 20 20  , pE2, r1);.    
d8c0: 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69        if( isRowi
d8d0: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d ){.           
d8e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d8f0: 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p2(v, OP_MustBeI
d900: 6e 74 2c 20 72 33 2c 20 73 71 6c 69 74 65 33 56  nt, r3, sqlite3V
d910: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
d920: 29 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )+2);.          
d930: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d940: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
d950: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
d960: 20 72 32 2c 20 72 33 29 3b 0a 20 20 20 20 20 20   r2, r3);.      
d970: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d980: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d990: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
d9a0: 61 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31  akeRecord, r3, 1
d9b0: 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c  , r2, &affinity,
d9c0: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   1);.           
d9d0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
d9e0: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
d9f0: 70 50 61 72 73 65 2c 20 72 33 2c 20 31 29 3b 0a  pParse, r3, 1);.
da00: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
da10: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
da20: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
da30: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32  Expr->iTable, r2
da40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
da50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
da60: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
da70: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
da80: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
da90: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
daa0: 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
dab0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
dac0: 20 21 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20   !isRowid ){.   
dad0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dae0: 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72  ChangeP4(v, addr
daf0: 2c 20 28 76 6f 69 64 20 2a 29 26 6b 65 79 49 6e  , (void *)&keyIn
db00: 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
db10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
db20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
db30: 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
db40: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
db50: 45 43 54 3a 0a 20 20 20 20 64 65 66 61 75 6c 74  ECT:.    default
db60: 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
db70: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
db80: 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20  K_EXISTS );.    
db90: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
dba0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
dbb0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
dbc0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
dbd0: 45 58 49 53 54 53 20 7c 7c 20 70 45 78 70 72 2d  EXISTS || pExpr-
dbe0: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
dbf0: 3b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ;.      /* If th
dc00: 69 73 20 68 61 73 20 74 6f 20 62 65 20 61 20 73  is has to be a s
dc10: 63 61 6c 61 72 20 53 45 4c 45 43 54 2e 20 20 47  calar SELECT.  G
dc20: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
dc30: 70 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  put the.      **
dc40: 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 73   value of this s
dc50: 65 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f 72  elect in a memor
dc60: 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f 72  y cell and recor
dc70: 64 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20  d the number.   
dc80: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d     ** of the mem
dc90: 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c  ory cell in iCol
dca0: 75 6d 6e 2e 20 20 49 66 20 74 68 69 73 20 69 73  umn.  If this is
dcb0: 20 61 6e 20 45 58 49 53 54 53 2c 20 77 72 69 74   an EXISTS, writ
dcc0: 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e  e.      ** an in
dcd0: 74 65 67 65 72 20 30 20 28 6e 6f 74 20 65 78 69  teger 0 (not exi
dce0: 73 74 73 29 20 6f 72 20 31 20 28 65 78 69 73 74  sts) or 1 (exist
dcf0: 73 29 20 69 6e 74 6f 20 61 20 6d 65 6d 6f 72 79  s) into a memory
dd00: 20 63 65 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61   cell.      ** a
dd10: 6e 64 20 72 65 63 6f 72 64 20 74 68 61 74 20 6d  nd record that m
dd20: 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43  emory cell in iC
dd30: 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  olumn..      */.
dd40: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
dd50: 73 74 20 54 6f 6b 65 6e 20 6f 6e 65 20 3d 20 7b  st Token one = {
dd60: 20 22 31 22 2c 20 31 20 7d 3b 20 20 2f 2a 20 54   "1", 1 };  /* T
dd70: 6f 6b 65 6e 20 66 6f 72 20 6c 69 74 65 72 61 6c  oken for literal
dd80: 20 76 61 6c 75 65 20 31 20 2a 2f 0a 20 20 20 20   value 1 */.    
dd90: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20    Select *pSel; 
dda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddb0: 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43          /* SELEC
ddc0: 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65  T statement to e
ddd0: 6e 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 53  ncode */.      S
dde0: 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20  electDest dest; 
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de00: 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64       /* How to d
de10: 65 61 6c 20 77 69 74 68 20 53 45 4c 45 43 74 20  eal with SELECt 
de20: 72 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 20 20 20  result */..     
de30: 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
de40: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
de50: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
de60: 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70 45  .      pSel = pE
de70: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a  xpr->x.pSelect;.
de80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
de90: 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
dea0: 74 2c 20 30 2c 20 2b 2b 70 50 61 72 73 65 2d 3e  t, 0, ++pParse->
deb0: 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28  nMem);.      if(
dec0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
ded0: 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20  ELECT ){.       
dee0: 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52   dest.eDest = SR
def0: 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 73  T_Mem;.        s
df00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
df10: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
df20: 64 65 73 74 2e 69 50 61 72 6d 29 3b 0a 20 20 20  dest.iParm);.   
df30: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
df40: 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62 71 75  ((v, "Init subqu
df50: 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20  ery result"));. 
df60: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
df70: 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d      dest.eDest =
df80: 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20   SRT_Exists;.   
df90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dfa0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
dfb0: 65 67 65 72 2c 20 30 2c 20 64 65 73 74 2e 69 50  eger, 0, dest.iP
dfc0: 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64  arm);.        Vd
dfd0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49  beComment((v, "I
dfe0: 6e 69 74 20 45 58 49 53 54 53 20 72 65 73 75 6c  nit EXISTS resul
dff0: 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t"));.      }.  
e000: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
e010: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
e020: 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b  , pSel->pLimit);
e030: 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69  .      pSel->pLi
e040: 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78  mit = sqlite3PEx
e050: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e  pr(pParse, TK_IN
e060: 54 45 47 45 52 2c 20 30 2c 20 30 2c 20 26 6f 6e  TEGER, 0, 0, &on
e070: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  e);.      if( sq
e080: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
e090: 73 65 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29  se, pSel, &dest)
e0a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
e0b0: 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
e0c0: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
e0d0: 20 3d 20 64 65 73 74 2e 69 50 61 72 6d 3b 0a 20   = dest.iParm;. 
e0e0: 20 20 20 20 20 45 78 70 72 53 65 74 49 72 72 65       ExprSetIrre
e0f0: 64 75 63 69 62 6c 65 28 70 45 78 70 72 29 3b 0a  ducible(pExpr);.
e100: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e110: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 74 65   }.  }..  if( te
e120: 73 74 41 64 64 72 20 29 7b 0a 20 20 20 20 73 71  stAddr ){.    sq
e130: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
e140: 65 28 76 2c 20 74 65 73 74 41 64 64 72 2d 31 29  e(v, testAddr-1)
e150: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
e160: 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
e170: 73 65 2c 20 31 29 3b 0a 0a 20 20 72 65 74 75 72  se, 1);..  retur
e180: 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  n;.}.#endif /* S
e190: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
e1a0: 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 75  ERY */../*.** Du
e1b0: 70 6c 69 63 61 74 65 20 61 6e 20 38 2d 62 79 74  plicate an 8-byt
e1c0: 65 20 76 61 6c 75 65 0a 2a 2f 0a 73 74 61 74 69  e value.*/.stati
e1d0: 63 20 63 68 61 72 20 2a 64 75 70 38 62 79 74 65  c char *dup8byte
e1e0: 73 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74  s(Vdbe *v, const
e1f0: 20 63 68 61 72 20 2a 69 6e 29 7b 0a 20 20 63 68   char *in){.  ch
e200: 61 72 20 2a 6f 75 74 20 3d 20 73 71 6c 69 74 65  ar *out = sqlite
e210: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 73 71 6c  3DbMallocRaw(sql
e220: 69 74 65 33 56 64 62 65 44 62 28 76 29 2c 20 38  ite3VdbeDb(v), 8
e230: 29 3b 0a 20 20 69 66 28 20 6f 75 74 20 29 7b 0a  );.  if( out ){.
e240: 20 20 20 20 6d 65 6d 63 70 79 28 6f 75 74 2c 20      memcpy(out, 
e250: 69 6e 2c 20 38 29 3b 0a 20 20 7d 0a 20 20 72 65  in, 8);.  }.  re
e260: 74 75 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 2f 2a 0a  turn out;.}../*.
e270: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69  ** Generate an i
e280: 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
e290: 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c 6f  will put the flo
e2a0: 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76  ating point.** v
e2b0: 61 6c 75 65 20 64 65 73 63 72 69 62 65 64 20 62  alue described b
e2c0: 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f  y z[0..n-1] into
e2d0: 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a   register iMem..
e2e0: 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74  **.** The z[] st
e2f0: 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62  ring will probab
e300: 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74  ly not be zero-t
e310: 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20  erminated.  But 
e320: 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61  the .** z[n] cha
e330: 72 61 63 74 65 72 20 69 73 20 67 75 61 72 61 6e  racter is guaran
e340: 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74  teed to be somet
e350: 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e  hing that does n
e360: 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20  ot look.** like 
e370: 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e  the continuation
e380: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a   of the number..
e390: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
e3a0: 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76 2c  odeReal(Vdbe *v,
e3b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
e3c0: 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c 20  int negateFlag, 
e3d0: 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66 28  int iMem){.  if(
e3e0: 20 41 4c 57 41 59 53 28 7a 21 3d 30 29 20 29 7b   ALWAYS(z!=0) ){
e3f0: 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c 75  .    double valu
e400: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 3b  e;.    char *zV;
e410: 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46  .    sqlite3AtoF
e420: 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20  (z, &value);.   
e430: 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 4e 61   if( sqlite3IsNa
e440: 4e 28 76 61 6c 75 65 29 20 29 7b 0a 20 20 20 20  N(value) ){.    
e450: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e460: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
e470: 30 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 7d 65  0, iMem);.    }e
e480: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  lse{.      if( n
e490: 65 67 61 74 65 46 6c 61 67 20 29 20 76 61 6c 75  egateFlag ) valu
e4a0: 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20  e = -value;.    
e4b0: 20 20 7a 56 20 3d 20 64 75 70 38 62 79 74 65 73    zV = dup8bytes
e4c0: 28 76 2c 20 28 63 68 61 72 2a 29 26 76 61 6c 75  (v, (char*)&valu
e4d0: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
e4e0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
e4f0: 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c  P_Real, 0, iMem,
e500: 20 30 2c 20 7a 56 2c 20 50 34 5f 52 45 41 4c 29   0, zV, P4_REAL)
e510: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a  ;.    }.  }.}...
e520: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
e530: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
e540: 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20  at will put the 
e550: 69 6e 74 65 67 65 72 20 64 65 73 63 72 69 62 65  integer describe
e560: 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e   by.** text z[0.
e570: 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73  .n-1] into regis
e580: 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20  ter iMem..**.** 
e590: 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77  The z[] string w
e5a0: 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74  ill probably not
e5b0: 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61   be zero-termina
e5c0: 74 65 64 2e 20 20 42 75 74 20 74 68 65 20 0a 2a  ted.  But the .*
e5d0: 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65 72  * z[n] character
e5e0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
e5f0: 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 20 74  o be something t
e600: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f  hat does not loo
e610: 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f  k.** like the co
e620: 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68  ntinuation of th
e630: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61  e number..*/.sta
e640: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74  tic void codeInt
e650: 65 67 65 72 28 56 64 62 65 20 2a 76 2c 20 45 78  eger(Vdbe *v, Ex
e660: 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6e  pr *pExpr, int n
e670: 65 67 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d  egFlag, int iMem
e680: 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  ){.  if( pExpr->
e690: 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61  flags & EP_IntVa
e6a0: 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  lue ){.    int i
e6b0: 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c   = pExpr->u.iVal
e6c0: 75 65 3b 0a 20 20 20 20 69 66 28 20 6e 65 67 46  ue;.    if( negF
e6d0: 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20  lag ) i = -i;.  
e6e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e6f0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
e700: 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d  r, i, iMem);.  }
e710: 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20  else{.    const 
e720: 63 68 61 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d  char *z = pExpr-
e730: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61  >u.zToken;.    a
e740: 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20  ssert( z!=0 );. 
e750: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
e760: 74 73 49 6e 36 34 42 69 74 73 28 7a 2c 20 6e 65  tsIn64Bits(z, ne
e770: 67 46 6c 61 67 29 20 29 7b 0a 20 20 20 20 20 20  gFlag) ){.      
e780: 69 36 34 20 76 61 6c 75 65 3b 0a 20 20 20 20 20  i64 value;.     
e790: 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20 20 20 20   char *zV;.     
e7a0: 20 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 7a   sqlite3Atoi64(z
e7b0: 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 20  , &value);.     
e7c0: 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20 76   if( negFlag ) v
e7d0: 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20  alue = -value;. 
e7e0: 20 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79       zV = dup8by
e7f0: 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76  tes(v, (char*)&v
e800: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  alue);.      sql
e810: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
e820: 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69  , OP_Int64, 0, i
e830: 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 49  Mem, 0, zV, P4_I
e840: 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c 73 65  NT64);.    }else
e850: 7b 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c  {.      codeReal
e860: 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c 20  (v, z, negFlag, 
e870: 69 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  iMem);.    }.  }
e880: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
e890: 61 20 63 61 63 68 65 20 65 6e 74 72 79 2e 0a 2a  a cache entry..*
e8a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61  /.static void ca
e8b0: 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 50 61  cheEntryClear(Pa
e8c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72  rse *pParse, str
e8d0: 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
e8e0: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74 65 6d 70  ){.  if( p->temp
e8f0: 52 65 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70  Reg ){.    if( p
e900: 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c  Parse->nTempReg<
e910: 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65  ArraySize(pParse
e920: 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20  ->aTempReg) ){. 
e930: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65       pParse->aTe
e940: 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54  mpReg[pParse->nT
e950: 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 2d 3e 69  empReg++] = p->i
e960: 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  Reg;.    }.    p
e970: 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20  ->tempReg = 0;. 
e980: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63   }.}.../*.** Rec
e990: 6f 72 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  ord in the colum
e9a0: 6e 20 63 61 63 68 65 20 74 68 61 74 20 61 20 70  n cache that a p
e9b0: 61 72 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e  articular column
e9c0: 20 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69   from a.** parti
e9d0: 63 75 6c 61 72 20 74 61 62 6c 65 20 69 73 20 73  cular table is s
e9e0: 74 6f 72 65 64 20 69 6e 20 61 20 70 61 72 74 69  tored in a parti
e9f0: 63 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e 0a  cular register..
ea00: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
ea10: 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 50 61  xprCacheStore(Pa
ea20: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
ea30: 20 69 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c   iTab, int iCol,
ea40: 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e   int iReg){.  in
ea50: 74 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72  t i;.  int minLr
ea60: 75 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72 75 3b  u;.  int idxLru;
ea70: 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
ea80: 63 68 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 46 69  che *p;..  /* Fi
ea90: 72 73 74 20 72 65 70 6c 61 63 65 20 61 6e 79 20  rst replace any 
eaa0: 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 2a  existing entry *
eab0: 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  /.  for(i=0, p=p
eac0: 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
ead0: 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
eae0: 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
eaf0: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65  {.    if( p->iRe
eb00: 67 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d  g && p->iTable==
eb10: 69 54 61 62 20 26 26 20 70 2d 3e 69 43 6f 6c 75  iTab && p->iColu
eb20: 6d 6e 3d 3d 69 43 6f 6c 20 29 7b 0a 20 20 20 20  mn==iCol ){.    
eb30: 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61    cacheEntryClea
eb40: 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  r(pParse, p);.  
eb50: 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20      p->iLevel = 
eb60: 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
eb70: 76 65 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52  vel;.      p->iR
eb80: 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 20  eg = iReg;.     
eb90: 20 70 2d 3e 61 66 66 43 68 61 6e 67 65 20 3d 20   p->affChange = 
eba0: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20  0;.      p->lru 
ebb0: 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
ebc0: 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74  Cnt++;.      ret
ebd0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  urn;.    }.  }. 
ebe0: 20 69 66 28 20 69 52 65 67 3c 3d 30 20 29 20 72   if( iReg<=0 ) r
ebf0: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 46 69 6e  eturn;..  /* Fin
ec00: 64 20 61 6e 20 65 6d 70 74 79 20 73 6c 6f 74 20  d an empty slot 
ec10: 61 6e 64 20 72 65 70 6c 61 63 65 20 69 74 20 2a  and replace it *
ec20: 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  /.  for(i=0, p=p
ec30: 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
ec40: 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
ec50: 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
ec60: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65  {.    if( p->iRe
ec70: 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  g==0 ){.      p-
ec80: 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65  >iLevel = pParse
ec90: 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20  ->iCacheLevel;. 
eca0: 20 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d       p->iTable =
ecb0: 20 69 54 61 62 3b 0a 20 20 20 20 20 20 70 2d 3e   iTab;.      p->
ecc0: 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a  iColumn = iCol;.
ecd0: 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20        p->iReg = 
ece0: 69 52 65 67 3b 0a 20 20 20 20 20 20 70 2d 3e 61  iReg;.      p->a
ecf0: 66 66 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  ffChange = 0;.  
ed00: 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d      p->tempReg =
ed10: 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75   0;.      p->lru
ed20: 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
ed30: 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 72 65  eCnt++;.      re
ed40: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
ed50: 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68  .  /* Replace th
ed60: 65 20 6c 61 73 74 20 72 65 63 65 6e 74 6c 79 20  e last recently 
ed70: 75 73 65 64 20 2a 2f 0a 20 20 6d 69 6e 4c 72 75  used */.  minLru
ed80: 20 3d 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20   = 0x7fffffff;. 
ed90: 20 69 64 78 4c 72 75 20 3d 20 2d 31 3b 0a 20 20   idxLru = -1;.  
eda0: 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
edb0: 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
edc0: 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
edd0: 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
ede0: 20 20 69 66 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e    if( p->lru<min
edf0: 4c 72 75 20 29 7b 0a 20 20 20 20 20 20 69 64 78  Lru ){.      idx
ee00: 4c 72 75 20 3d 20 69 3b 0a 20 20 20 20 20 20 6d  Lru = i;.      m
ee10: 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72 75 3b 0a  inLru = p->lru;.
ee20: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
ee30: 69 64 78 4c 72 75 3e 3d 30 20 29 7b 0a 20 20 20  idxLru>=0 ){.   
ee40: 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43   p = &pParse->aC
ee50: 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72 75 5d 3b  olCache[idxLru];
ee60: 0a 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d  .    p->iLevel =
ee70: 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
ee80: 65 76 65 6c 3b 0a 20 20 20 20 70 2d 3e 69 54 61  evel;.    p->iTa
ee90: 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  ble = iTab;.    
eea0: 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f  p->iColumn = iCo
eeb0: 6c 3b 0a 20 20 20 20 70 2d 3e 69 52 65 67 20 3d  l;.    p->iReg =
eec0: 20 69 52 65 67 3b 0a 20 20 20 20 70 2d 3e 61 66   iReg;.    p->af
eed0: 66 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  fChange = 0;.   
eee0: 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b   p->tempReg = 0;
eef0: 0a 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50  .    p->lru = pP
ef00: 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b  arse->iCacheCnt+
ef10: 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  +;.    return;. 
ef20: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69   }.}../*.** Indi
ef30: 63 61 74 65 20 74 68 61 74 20 61 20 72 65 67 69  cate that a regi
ef40: 73 74 65 72 20 69 73 20 62 65 69 6e 67 20 6f 76  ster is being ov
ef50: 65 72 77 72 69 74 74 65 6e 2e 20 20 50 75 72 67  erwritten.  Purg
ef60: 65 20 74 68 65 20 72 65 67 69 73 74 65 72 0a 2a  e the register.*
ef70: 2a 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d  * from the colum
ef80: 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69 64  n cache..*/.void
ef90: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
efa0: 65 52 65 6d 6f 76 65 28 50 61 72 73 65 20 2a 70  eRemove(Parse *p
efb0: 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29  Parse, int iReg)
efc0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
efd0: 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
efe0: 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ;.  for(i=0, p=p
eff0: 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
f000: 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
f010: 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
f020: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65  {.    if( p->iRe
f030: 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20 20  g==iReg ){.     
f040: 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72   cacheEntryClear
f050: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
f060: 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a     p->iReg = 0;.
f070: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
f080: 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20  ** Remember the 
f090: 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 63  current column c
f0a0: 61 63 68 65 20 63 6f 6e 74 65 78 74 2e 20 20 41  ache context.  A
f0b0: 6e 79 20 6e 65 77 20 65 6e 74 72 69 65 73 20 61  ny new entries a
f0c0: 64 64 65 64 0a 2a 2a 20 61 64 64 65 64 20 74 6f  dded.** added to
f0d0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
f0e0: 65 20 61 66 74 65 72 20 74 68 69 73 20 63 61 6c  e after this cal
f0f0: 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20 77 68  l are removed wh
f100: 65 6e 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73  en the.** corres
f110: 70 6f 6e 64 69 6e 67 20 70 6f 70 20 6f 63 63 75  ponding pop occu
f120: 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rs..*/.void sqli
f130: 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
f140: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
f150: 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  .  pParse->iCach
f160: 65 4c 65 76 65 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a  eLevel++;.}../*.
f170: 2a 2a 20 52 65 6d 6f 76 65 20 66 72 6f 6d 20 74  ** Remove from t
f180: 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
f190: 61 6e 79 20 65 6e 74 72 69 65 73 20 74 68 61 74  any entries that
f1a0: 20 77 65 72 65 20 61 64 64 65 64 20 73 69 6e 63   were added sinc
f1b0: 65 20 74 68 65 0a 2a 2a 20 74 68 65 20 70 72 65  e the.** the pre
f1c0: 76 69 6f 75 73 20 4e 20 50 75 73 68 20 6f 70 65  vious N Push ope
f1d0: 72 61 74 69 6f 6e 73 2e 20 20 49 6e 20 6f 74 68  rations.  In oth
f1e0: 65 72 20 77 6f 72 64 73 2c 20 72 65 73 74 6f 72  er words, restor
f1f0: 65 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 74  e the cache.** t
f200: 6f 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  o the state it w
f210: 61 73 20 69 6e 20 4e 20 50 75 73 68 65 73 20 61  as in N Pushes a
f220: 67 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  go..*/.void sqli
f230: 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
f240: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
f250: 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  nt N){.  int i;.
f260: 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
f270: 68 65 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  he *p;.  assert(
f280: 20 4e 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74   N>0 );.  assert
f290: 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  ( pParse->iCache
f2a0: 4c 65 76 65 6c 3e 3d 4e 20 29 3b 0a 20 20 70 50  Level>=N );.  pP
f2b0: 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
f2c0: 6c 20 2d 3d 20 4e 3b 0a 20 20 66 6f 72 28 69 3d  l -= N;.  for(i=
f2d0: 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
f2e0: 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
f2f0: 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
f300: 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , p++){.    if( 
f310: 70 2d 3e 69 52 65 67 20 26 26 20 70 2d 3e 69 4c  p->iReg && p->iL
f320: 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43 61  evel>pParse->iCa
f330: 63 68 65 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20  cheLevel ){.    
f340: 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61    cacheEntryClea
f350: 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  r(pParse, p);.  
f360: 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b      p->iReg = 0;
f370: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
f380: 0a 2a 2a 20 57 68 65 6e 20 61 20 63 61 63 68 65  .** When a cache
f390: 64 20 63 6f 6c 75 6d 6e 20 69 73 20 72 65 75 73  d column is reus
f3a0: 65 64 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  ed, make sure th
f3b0: 61 74 20 69 74 73 20 72 65 67 69 73 74 65 72 20  at its register 
f3c0: 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20  is.** no longer 
f3d0: 61 76 61 69 6c 61 62 6c 65 20 61 73 20 61 20 74  available as a t
f3e0: 65 6d 70 20 72 65 67 69 73 74 65 72 2e 20 20 74  emp register.  t
f3f0: 69 63 6b 65 74 20 23 33 38 37 39 3a 20 20 74 68  icket #3879:  th
f400: 61 74 20 73 61 6d 65 0a 2a 2a 20 72 65 67 69 73  at same.** regis
f410: 74 65 72 20 6d 69 67 68 74 20 62 65 20 69 6e 20  ter might be in 
f420: 74 68 65 20 63 61 63 68 65 20 69 6e 20 6d 75 6c  the cache in mul
f430: 74 69 70 6c 65 20 70 6c 61 63 65 73 2c 20 73 6f  tiple places, so
f440: 20 62 65 20 73 75 72 65 20 74 6f 0a 2a 2a 20 67   be sure to.** g
f450: 65 74 20 74 68 65 6d 20 61 6c 6c 2e 0a 2a 2f 0a  et them all..*/.
f460: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
f470: 74 65 33 45 78 70 72 43 61 63 68 65 50 69 6e 52  te3ExprCachePinR
f480: 65 67 69 73 74 65 72 28 50 61 72 73 65 20 2a 70  egister(Parse *p
f490: 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29  Parse, int iReg)
f4a0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
f4b0: 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
f4c0: 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ;.  for(i=0, p=p
f4d0: 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
f4e0: 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
f4f0: 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
f500: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65  {.    if( p->iRe
f510: 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20 20  g==iReg ){.     
f520: 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b   p->tempReg = 0;
f530: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
f540: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
f550: 65 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72  e that will extr
f560: 61 63 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d  act the iColumn-
f570: 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a  th column from.*
f580: 2a 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64  * table pTab and
f590: 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d   store the colum
f5a0: 6e 20 76 61 6c 75 65 20 69 6e 20 61 20 72 65 67  n value in a reg
f5b0: 69 73 74 65 72 2e 20 20 41 6e 20 65 66 66 6f 72  ister.  An effor
f5c0: 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20  t.** is made to 
f5d0: 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e  store the column
f5e0: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
f5f0: 65 72 20 69 52 65 67 2c 20 62 75 74 20 74 68 69  er iReg, but thi
f600: 73 20 69 73 0a 2a 2a 20 6e 6f 74 20 67 75 61 72  s is.** not guar
f610: 61 6e 74 65 65 64 2e 20 20 54 68 65 20 6c 6f 63  anteed.  The loc
f620: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6c  ation of the col
f630: 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 72 65 74  umn value is ret
f640: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urned..**.** The
f650: 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70  re must be an op
f660: 65 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61  en cursor to pTa
f670: 62 20 69 6e 20 69 54 61 62 6c 65 20 77 68 65 6e  b in iTable when
f680: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
f690: 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20   is called.  If 
f6a0: 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63  iColumn<0 then c
f6b0: 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ode is generated
f6c0: 20 74 68 61 74 20 65 78 74 72 61 63 74 73 20 74   that extracts t
f6d0: 68 65 20 72 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20  he rowid..**.** 
f6e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  This routine mig
f6f0: 68 74 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65  ht attempt to re
f700: 75 73 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  use the value of
f710: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 68 61 74   the column that
f720: 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20  .** has already 
f730: 62 65 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74 6f  been loaded into
f740: 20 61 20 72 65 67 69 73 74 65 72 2e 20 20 54 68   a register.  Th
f750: 65 20 76 61 6c 75 65 20 77 69 6c 6c 20 61 6c 77  e value will alw
f760: 61 79 73 0a 2a 2a 20 62 65 20 75 73 65 64 20 69  ays.** be used i
f770: 66 20 69 74 20 68 61 73 20 6e 6f 74 20 75 6e 64  f it has not und
f780: 65 72 67 6f 6e 65 20 61 6e 79 20 61 66 66 69 6e  ergone any affin
f790: 69 74 79 20 63 68 61 6e 67 65 73 2e 20 20 42 75  ity changes.  Bu
f7a0: 74 20 69 66 0a 2a 2a 20 61 6e 20 61 66 66 69 6e  t if.** an affin
f7b0: 69 74 79 20 63 68 61 6e 67 65 20 68 61 73 20 6f  ity change has o
f7c0: 63 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68  ccurred, then th
f7d0: 65 20 63 61 63 68 65 64 20 76 61 6c 75 65 20 77  e cached value w
f7e0: 69 6c 6c 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 75  ill only be.** u
f7f0: 73 65 64 20 69 66 20 61 6c 6c 6f 77 41 66 66 43  sed if allowAffC
f800: 68 6e 67 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a  hng is true..*/.
f810: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
f820: 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20  odeGetColumn(.  
f830: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
f840: 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
f850: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
f860: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62  context */.  Tab
f870: 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a  le *pTab,     /*
f880: 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
f890: 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65  the table we are
f8a0: 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f   reading from */
f8b0: 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20  .  int iColumn, 
f8c0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
f8d0: 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  the table column
f8e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
f8f0: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75  ,      /* The cu
f900: 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
f910: 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
f920: 69 6e 74 20 69 52 65 67 2c 20 20 20 20 20 20 20  int iReg,       
f930: 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74   /* Store result
f940: 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  s here */.  int 
f950: 61 6c 6c 6f 77 41 66 66 43 68 6e 67 20 2f 2a 20  allowAffChng /* 
f960: 54 72 75 65 20 69 66 20 70 72 69 6f 72 20 61 66  True if prior af
f970: 66 69 6e 69 74 79 20 63 68 61 6e 67 65 73 20 61  finity changes a
f980: 72 65 20 4f 4b 20 2a 2f 0a 29 7b 0a 20 20 56 64  re OK */.){.  Vd
f990: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
f9a0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
f9b0: 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
f9c0: 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28 69 3d  he *p;..  for(i=
f9d0: 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
f9e0: 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
f9f0: 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
fa00: 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , p++){.    if( 
fa10: 70 2d 3e 69 52 65 67 3e 30 20 26 26 20 70 2d 3e  p->iReg>0 && p->
fa20: 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26  iTable==iTable &
fa30: 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43  & p->iColumn==iC
fa40: 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20 20 20  olumn.          
fa50: 20 26 26 20 28 21 70 2d 3e 61 66 66 43 68 61 6e   && (!p->affChan
fa60: 67 65 20 7c 7c 20 61 6c 6c 6f 77 41 66 66 43 68  ge || allowAffCh
fa70: 6e 67 29 20 29 7b 0a 23 69 66 20 30 0a 20 20 20  ng) ){.#if 0.   
fa80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fa90: 64 4f 70 30 28 76 2c 20 4f 50 5f 4e 6f 6f 70 29  dOp0(v, OP_Noop)
faa0: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
fab0: 65 6e 74 28 28 76 2c 20 22 4f 50 54 3a 20 74 61  ent((v, "OPT: ta
fac0: 62 25 64 2e 63 6f 6c 25 64 20 2d 3e 20 72 25 64  b%d.col%d -> r%d
fad0: 22 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75  ", iTable, iColu
fae0: 6d 6e 2c 20 70 2d 3e 69 52 65 67 29 29 3b 0a 23  mn, p->iReg));.#
faf0: 65 6e 64 69 66 0a 20 20 20 20 20 20 70 2d 3e 6c  endif.      p->l
fb00: 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  ru = pParse->iCa
fb10: 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  cheCnt++;.      
fb20: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
fb30: 50 69 6e 52 65 67 69 73 74 65 72 28 70 50 61 72  PinRegister(pPar
fb40: 73 65 2c 20 70 2d 3e 69 52 65 67 29 3b 0a 20 20  se, p->iReg);.  
fb50: 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 52      return p->iR
fb60: 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a  eg;.    }.  }  .
fb70: 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
fb80: 3b 0a 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c  ;.  if( iColumn<
fb90: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
fba0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
fbb0: 5f 52 6f 77 69 64 2c 20 69 54 61 62 6c 65 2c 20  _Rowid, iTable, 
fbc0: 69 52 65 67 29 3b 0a 20 20 7d 65 6c 73 65 20 69  iReg);.  }else i
fbd0: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
fbe0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fbf0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
fc00: 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d  , iTable, iColum
fc10: 6e 2c 20 69 52 65 67 29 3b 0a 20 20 7d 65 6c 73  n, iReg);.  }els
fc20: 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  e{.    int op = 
fc30: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
fc40: 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f  ? OP_VColumn : O
fc50: 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71  P_Column;.    sq
fc60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
fc70: 76 2c 20 6f 70 2c 20 69 54 61 62 6c 65 2c 20 69  v, op, iTable, i
fc80: 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20  Column, iReg);. 
fc90: 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
fca0: 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c  Default(v, pTab,
fcb0: 20 69 43 6f 6c 75 6d 6e 29 3b 0a 23 69 66 6e 64   iColumn);.#ifnd
fcc0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
fcd0: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
fce0: 20 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c    if( pTab->aCol
fcf0: 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69  [iColumn].affini
fd00: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ty==SQLITE_AFF_R
fd10: 45 41 4c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  EAL ){.      sql
fd20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
fd30: 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74  , OP_RealAffinit
fd40: 79 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 0a  y, iReg);.    }.
fd50: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c  #endif.  }.  sql
fd60: 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
fd70: 72 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 6c  re(pParse, iTabl
fd80: 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67  e, iColumn, iReg
fd90: 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67  );.  return iReg
fda0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
fdb0: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68   all column cach
fdc0: 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f  e entries..*/.vo
fdd0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
fde0: 63 68 65 43 6c 65 61 72 28 50 61 72 73 65 20 2a  cheClear(Parse *
fdf0: 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69  pParse){.  int i
fe00: 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
fe10: 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28  ache *p;..  for(
fe20: 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
fe30: 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
fe40: 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
fe50: 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
fe60: 28 20 70 2d 3e 69 52 65 67 20 29 7b 0a 20 20 20  ( p->iReg ){.   
fe70: 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65     cacheEntryCle
fe80: 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  ar(pParse, p);. 
fe90: 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30       p->iReg = 0
fea0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
feb0: 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20  *.** Record the 
fec0: 66 61 63 74 20 74 68 61 74 20 61 6e 20 61 66 66  fact that an aff
fed0: 69 6e 69 74 79 20 63 68 61 6e 67 65 20 68 61 73  inity change has
fee0: 20 6f 63 63 75 72 72 65 64 20 6f 6e 20 69 43 6f   occurred on iCo
fef0: 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65 72 73  unt.** registers
ff00: 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 69   starting with i
ff10: 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Start..*/.void s
ff20: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
ff30: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 50 61  ffinityChange(Pa
ff40: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
ff50: 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69 43 6f   iStart, int iCo
ff60: 75 6e 74 29 7b 0a 20 20 69 6e 74 20 69 45 6e 64  unt){.  int iEnd
ff70: 20 3d 20 69 53 74 61 72 74 20 2b 20 69 43 6f 75   = iStart + iCou
ff80: 6e 74 20 2d 20 31 3b 0a 20 20 69 6e 74 20 69 3b  nt - 1;.  int i;
ff90: 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
ffa0: 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d  che *p;.  for(i=
ffb0: 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
ffc0: 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
ffd0: 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
ffe0: 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  , p++){.    int 
fff0: 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20  r = p->iReg;.   
10000 20 69 66 28 20 72 3e 3d 69 53 74 61 72 74 20 26   if( r>=iStart &
10010 26 20 72 3c 3d 69 45 6e 64 20 29 7b 0a 20 20 20  & r<=iEnd ){.   
10020 20 20 20 70 2d 3e 61 66 66 43 68 61 6e 67 65 20     p->affChange 
10030 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 1;.    }.  }.}
10040 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
10050 20 63 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f   code to move co
10060 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65 67 69 73  ntent from regis
10070 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72  ters iFrom...iFr
10080 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65  om+nReg-1.** ove
10090 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52  r to iTo..iTo+nR
100a0 65 67 2d 31 2e 20 4b 65 65 70 20 74 68 65 20 63  eg-1. Keep the c
100b0 6f 6c 75 6d 6e 20 63 61 63 68 65 20 75 70 2d 74  olumn cache up-t
100c0 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20  o-date..*/.void 
100d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
100e0 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ove(Parse *pPars
100f0 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  e, int iFrom, in
10100 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29  t iTo, int nReg)
10110 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
10120 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
10130 3b 0a 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 69  ;.  if( iFrom==i
10140 54 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  To ) return;.  s
10150 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
10160 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
10170 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20  OP_Move, iFrom, 
10180 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 20 20 66 6f  iTo, nReg);.  fo
10190 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
101a0 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
101b0 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
101c0 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
101d0 69 6e 74 20 78 20 3d 20 70 2d 3e 69 52 65 67 3b  int x = p->iReg;
101e0 0a 20 20 20 20 69 66 28 20 78 3e 3d 69 46 72 6f  .    if( x>=iFro
101f0 6d 20 26 26 20 78 3c 69 46 72 6f 6d 2b 6e 52 65  m && x<iFrom+nRe
10200 67 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 52  g ){.      p->iR
10210 65 67 20 2b 3d 20 69 54 6f 2d 69 46 72 6f 6d 3b  eg += iTo-iFrom;
10220 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
10230 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
10240 65 20 74 6f 20 63 6f 70 79 20 63 6f 6e 74 65 6e  e to copy conten
10250 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73  t from registers
10260 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e   iFrom...iFrom+n
10270 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f  Reg-1.** over to
10280 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31   iTo..iTo+nReg-1
10290 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
102a0 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28 50 61  3ExprCodeCopy(Pa
102b0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
102c0 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c   iFrom, int iTo,
102d0 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e   int nReg){.  in
102e0 74 20 69 3b 0a 20 20 69 66 28 20 69 46 72 6f 6d  t i;.  if( iFrom
102f0 3d 3d 69 54 6f 20 29 20 72 65 74 75 72 6e 3b 0a  ==iTo ) return;.
10300 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
10310 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  g; i++){.    sql
10320 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70  ite3VdbeAddOp2(p
10330 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
10340 5f 43 6f 70 79 2c 20 69 46 72 6f 6d 2b 69 2c 20  _Copy, iFrom+i, 
10350 69 54 6f 2b 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  iTo+i);.  }.}../
10360 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
10370 20 69 66 20 61 6e 79 20 72 65 67 69 73 74 65 72   if any register
10380 20 69 6e 20 74 68 65 20 72 61 6e 67 65 20 69 46   in the range iF
10390 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c 75 73  rom..iTo (inclus
103a0 69 76 65 29 0a 2a 2a 20 69 73 20 75 73 65 64 20  ive).** is used 
103b0 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 63  as part of the c
103c0 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a  olumn cache..*/.
103d0 73 74 61 74 69 63 20 69 6e 74 20 75 73 65 64 41  static int usedA
103e0 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61 72  sColumnCache(Par
103f0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
10400 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b  iFrom, int iTo){
10410 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
10420 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
10430 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
10440 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
10450 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
10460 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
10470 0a 20 20 20 20 69 6e 74 20 72 20 3d 20 70 2d 3e  .    int r = p->
10480 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e  iReg;.    if( r>
10490 3d 69 46 72 6f 6d 20 26 26 20 72 3c 3d 69 54 6f  =iFrom && r<=iTo
104a0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
104b0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
104c0 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 61 73  /*.** If the las
104d0 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f  t instruction co
104e0 64 65 64 20 69 73 20 61 6e 20 65 70 68 65 6d 65  ded is an epheme
104f0 72 61 6c 20 63 6f 70 79 20 6f 66 20 61 6e 79 20  ral copy of any 
10500 6f 66 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74  of.** the regist
10510 65 72 73 20 69 6e 20 74 68 65 20 6e 52 65 67 20  ers in the nReg 
10520 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e  registers beginn
10530 69 6e 67 20 77 69 74 68 20 69 52 65 67 2c 20 74  ing with iReg, t
10540 68 65 6e 0a 2a 2a 20 63 6f 6e 76 65 72 74 20 74  hen.** convert t
10550 68 65 20 6c 61 73 74 20 69 6e 73 74 72 75 63 74  he last instruct
10560 69 6f 6e 20 66 72 6f 6d 20 4f 50 5f 53 43 6f 70  ion from OP_SCop
10570 79 20 74 6f 20 4f 50 5f 43 6f 70 79 2e 0a 2a 2f  y to OP_Copy..*/
10580 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
10590 72 48 61 72 64 43 6f 70 79 28 50 61 72 73 65 20  rHardCopy(Parse 
105a0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
105b0 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  g, int nReg){.  
105c0 69 6e 74 20 61 64 64 72 3b 0a 20 20 56 64 62 65  int addr;.  Vdbe
105d0 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 20  Op *pOp;.  Vdbe 
105e0 2a 76 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73  *v;..  v = pPars
105f0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 64 64 72  e->pVdbe;.  addr
10600 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
10610 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
10620 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
10630 65 47 65 74 4f 70 28 76 2c 20 61 64 64 72 2d 31  eGetOp(v, addr-1
10640 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
10650 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
10660 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
10670 20 20 69 66 28 20 70 4f 70 20 26 26 20 70 4f 70    if( pOp && pOp
10680 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 43 6f  ->opcode==OP_SCo
10690 70 79 20 26 26 20 70 4f 70 2d 3e 70 31 3e 3d 69  py && pOp->p1>=i
106a0 52 65 67 20 26 26 20 70 4f 70 2d 3e 70 31 3c 69  Reg && pOp->p1<i
106b0 52 65 67 2b 6e 52 65 67 20 29 7b 0a 20 20 20 20  Reg+nReg ){.    
106c0 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
106d0 5f 43 6f 70 79 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  _Copy;.  }.}../*
106e0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
106f0 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 76  e to store the v
10700 61 6c 75 65 20 6f 66 20 74 68 65 20 69 41 6c 69  alue of the iAli
10710 61 73 2d 74 68 20 61 6c 69 61 73 20 69 6e 20 72  as-th alias in r
10720 65 67 69 73 74 65 72 0a 2a 2a 20 74 61 72 67 65  egister.** targe
10730 74 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69  t.  The first ti
10740 6d 65 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  me this is calle
10750 64 2c 20 70 45 78 70 72 20 69 73 20 65 76 61 6c  d, pExpr is eval
10760 75 61 74 65 64 20 74 6f 20 63 6f 6d 70 75 74 65  uated to compute
10770 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
10780 20 74 68 65 20 61 6c 69 61 73 2e 20 20 54 68 65   the alias.  The
10790 20 76 61 6c 75 65 20 69 73 20 73 74 6f 72 65 64   value is stored
107a0 20 69 6e 20 61 6e 20 61 75 78 69 6c 69 61 72 79   in an auxiliary
107b0 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64   register.** and
107c0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
107d0 68 61 74 20 72 65 67 69 73 74 65 72 20 69 73 20  hat register is 
107e0 72 65 74 75 72 6e 65 64 2e 20 20 4f 6e 20 73 75  returned.  On su
107f0 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 2c 0a  bsequent calls,.
10800 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 20  ** the register 
10810 6e 75 6d 62 65 72 20 69 73 20 72 65 74 75 72 6e  number is return
10820 65 64 20 77 69 74 68 6f 75 74 20 67 65 6e 65 72  ed without gener
10830 61 74 69 6e 67 20 61 6e 79 20 63 6f 64 65 2e 0a  ating any code..
10840 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
10850 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69  in order for thi
10860 73 20 74 6f 20 77 6f 72 6b 2c 20 63 6f 64 65 20  s to work, code 
10870 6d 75 73 74 20 62 65 20 67 65 6e 65 72 61 74 65  must be generate
10880 64 20 69 6e 20 74 68 65 0a 2a 2a 20 73 61 6d 65  d in the.** same
10890 20 6f 72 64 65 72 20 74 68 61 74 20 69 74 20 69   order that it i
108a0 73 20 65 78 65 63 75 74 65 64 2e 0a 2a 2a 0a 2a  s executed..**.*
108b0 2a 20 41 6c 69 61 73 65 73 20 61 72 65 20 6e 75  * Aliases are nu
108c0 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67 20  mbered starting 
108d0 77 69 74 68 20 31 2e 20 20 53 6f 20 69 41 6c 69  with 1.  So iAli
108e0 61 73 20 69 73 20 69 6e 20 74 68 65 20 72 61 6e  as is in the ran
108f0 67 65 0a 2a 2a 20 6f 66 20 31 20 74 6f 20 70 50  ge.** of 1 to pP
10900 61 72 73 65 2d 3e 6e 41 6c 69 61 73 20 69 6e 63  arse->nAlias inc
10910 6c 75 73 69 76 65 2e 20 20 0a 2a 2a 0a 2a 2a 20  lusive.  .**.** 
10920 70 50 61 72 73 65 2d 3e 61 41 6c 69 61 73 5b 69  pParse->aAlias[i
10930 41 6c 69 61 73 2d 31 5d 20 72 65 63 6f 72 64 73  Alias-1] records
10940 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75   the register nu
10950 6d 62 65 72 20 77 68 65 72 65 20 74 68 65 20 76  mber where the v
10960 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 69  alue.** of the i
10970 41 6c 69 61 73 2d 74 68 20 61 6c 69 61 73 20 69  Alias-th alias i
10980 73 20 73 74 6f 72 65 64 2e 20 20 49 66 20 7a 65  s stored.  If ze
10990 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ro, that means t
109a0 68 61 74 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73  hat the.** alias
109b0 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
109c0 6e 20 63 6f 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73  n computed..*/.s
109d0 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 41 6c  tatic int codeAl
109e0 69 61 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ias(Parse *pPars
109f0 65 2c 20 69 6e 74 20 69 41 6c 69 61 73 2c 20 45  e, int iAlias, E
10a00 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
10a10 74 61 72 67 65 74 29 7b 0a 23 69 66 20 30 0a 20  target){.#if 0. 
10a20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
10a30 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
10a40 20 69 52 65 67 3b 0a 20 20 69 66 28 20 70 50 61   iReg;.  if( pPa
10a50 72 73 65 2d 3e 6e 41 6c 69 61 73 41 6c 6c 6f 63  rse->nAliasAlloc
10a60 3c 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 20  <pParse->nAlias 
10a70 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61  ){.    pParse->a
10a80 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 44  Alias = sqlite3D
10a90 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 64  bReallocOrFree(d
10aa0 62 2c 20 70 50 61 72 73 65 2d 3e 61 41 6c 69 61  b, pParse->aAlia
10ab0 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
10ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ad0 20 20 20 20 73 69 7a 65 6f 66 28 70 50 61 72 73      sizeof(pPars
10ae0 65 2d 3e 61 41 6c 69 61 73 5b 30 5d 29 2a 70 50  e->aAlias[0])*pP
10af0 61 72 73 65 2d 3e 6e 41 6c 69 61 73 20 29 3b 0a  arse->nAlias );.
10b00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64 62      testcase( db
10b10 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
10b20 26 20 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73  & pParse->nAlias
10b30 41 6c 6c 6f 63 3e 30 20 29 3b 0a 20 20 20 20 69  Alloc>0 );.    i
10b40 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
10b50 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  led ) return 0;.
10b60 20 20 20 20 6d 65 6d 73 65 74 28 26 70 50 61 72      memset(&pPar
10b70 73 65 2d 3e 61 41 6c 69 61 73 5b 70 50 61 72 73  se->aAlias[pPars
10b80 65 2d 3e 6e 41 6c 69 61 73 41 6c 6c 6f 63 5d 2c  e->nAliasAlloc],
10b90 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28   0,.           (
10ba0 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 2d 70  pParse->nAlias-p
10bb0 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 41 6c 6c  Parse->nAliasAll
10bc0 6f 63 29 2a 73 69 7a 65 6f 66 28 70 50 61 72 73  oc)*sizeof(pPars
10bd0 65 2d 3e 61 41 6c 69 61 73 5b 30 5d 29 29 3b 0a  e->aAlias[0]));.
10be0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 41 6c 69      pParse->nAli
10bf0 61 73 41 6c 6c 6f 63 20 3d 20 70 50 61 72 73 65  asAlloc = pParse
10c00 2d 3e 6e 41 6c 69 61 73 3b 0a 20 20 7d 0a 20 20  ->nAlias;.  }.  
10c10 61 73 73 65 72 74 28 20 69 41 6c 69 61 73 3e 30  assert( iAlias>0
10c20 20 26 26 20 69 41 6c 69 61 73 3c 3d 70 50 61 72   && iAlias<=pPar
10c30 73 65 2d 3e 6e 41 6c 69 61 73 20 29 3b 0a 20 20  se->nAlias );.  
10c40 69 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 61  iReg = pParse->a
10c50 41 6c 69 61 73 5b 69 41 6c 69 61 73 2d 31 5d 3b  Alias[iAlias-1];
10c60 0a 20 20 69 66 28 20 69 52 65 67 3d 3d 30 20 29  .  if( iReg==0 )
10c70 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  {.    if( pParse
10c80 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3e 30 20  ->iCacheLevel>0 
10c90 29 7b 0a 20 20 20 20 20 20 69 52 65 67 20 3d 20  ){.      iReg = 
10ca0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
10cb0 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
10cc0 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
10cd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
10ce0 52 65 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Reg = ++pParse->
10cf0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  nMem;.      sqli
10d00 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
10d10 73 65 2c 20 70 45 78 70 72 2c 20 69 52 65 67 29  se, pExpr, iReg)
10d20 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
10d30 61 41 6c 69 61 73 5b 69 41 6c 69 61 73 2d 31 5d  aAlias[iAlias-1]
10d40 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20   = iReg;.    }. 
10d50 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67   }.  return iReg
10d60 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
10d70 5f 50 41 52 41 4d 45 54 45 52 28 69 41 6c 69 61  _PARAMETER(iAlia
10d80 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  s);.  return sql
10d90 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
10da0 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
10db0 2c 20 74 61 72 67 65 74 29 3b 0a 23 65 6e 64 69  , target);.#endi
10dc0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  f.}../*.** Gener
10dd0 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
10de0 65 20 63 75 72 72 65 6e 74 20 56 64 62 65 20 74  e current Vdbe t
10df0 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 67  o evaluate the g
10e00 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  iven.** expressi
10e10 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20  on.  Attempt to 
10e20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
10e30 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 22 74  s in register "t
10e40 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72  arget"..** Retur
10e50 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20 77  n the register w
10e60 68 65 72 65 20 72 65 73 75 6c 74 73 20 61 72 65  here results are
10e70 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57   stored..**.** W
10e80 69 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ith this routine
10e90 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75  , there is no gu
10ea0 61 72 61 6e 74 65 65 20 74 68 61 74 20 72 65 73  arantee that res
10eb0 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  ults will.** be 
10ec0 73 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74  stored in target
10ed0 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69  .  The result mi
10ee0 67 68 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e  ght be stored in
10ef0 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72   some other.** r
10f00 65 67 69 73 74 65 72 20 69 66 20 69 74 20 69 73  egister if it is
10f10 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64   convenient to d
10f20 6f 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69  o so.  The calli
10f30 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d  ng function.** m
10f40 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65  ust check the re
10f50 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f  turn code and mo
10f60 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 74  ve the results t
10f70 6f 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a  o the desired.**
10f80 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e   register..*/.in
10f90 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
10fa0 65 54 61 72 67 65 74 28 50 61 72 73 65 20 2a 70  eTarget(Parse *p
10fb0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
10fc0 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
10fd0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
10fe0 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20  rse->pVdbe;  /* 
10ff0 54 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e  The VM under con
11000 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
11010 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
11020 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
11030 6f 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64  opcode being cod
11040 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65  ed */.  int inRe
11050 67 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20 20  g = target;     
11060 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74 6f    /* Results sto
11070 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20  red in register 
11080 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72  inReg */.  int r
11090 65 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20 20  egFree1 = 0;    
110a0 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a       /* If non-z
110b0 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65  ero free this te
110c0 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
110d0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65   */.  int regFre
110e0 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  e2 = 0;         
110f0 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66  /* If non-zero f
11100 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61  ree this tempora
11110 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  ry register */. 
11120 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 2c   int r1, r2, r3,
11130 20 72 34 3b 20 20 20 20 20 20 20 2f 2a 20 56 61   r4;       /* Va
11140 72 69 6f 75 73 20 72 65 67 69 73 74 65 72 20 6e  rious register n
11150 75 6d 62 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69  umbers */.  sqli
11160 74 65 33 20 2a 64 62 3b 0a 0a 20 20 64 62 20 3d  te3 *db;..  db =
11170 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
11180 73 73 65 72 74 28 20 76 21 3d 30 20 7c 7c 20 64  ssert( v!=0 || d
11190 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
111a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  );.  assert( tar
111b0 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c  get>0 && target<
111c0 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b  =pParse->nMem );
111d0 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
111e0 74 75 72 6e 20 30 3b 0a 0a 20 20 69 66 28 20 70  turn 0;..  if( p
111f0 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f  Expr==0 ){.    o
11200 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d  p = TK_NULL;.  }
11210 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70  else{.    op = p
11220 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20  Expr->op;.  }.  
11230 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
11240 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
11250 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67  LUMN: {.      Ag
11260 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20  gInfo *pAggInfo 
11270 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66  = pExpr->pAggInf
11280 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  o;.      struct 
11290 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
112a0 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61  l = &pAggInfo->a
112b0 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d  Col[pExpr->iAgg]
112c0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 41 67  ;.      if( !pAg
112d0 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
112e0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e ){.        ass
112f0 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e  ert( pCol->iMem>
11300 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52  0 );.        inR
11310 65 67 20 3d 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b  eg = pCol->iMem;
11320 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
11330 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
11340 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72  pAggInfo->useSor
11350 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20  tingIdx ){.     
11360 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11370 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
11380 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72  n, pAggInfo->sor
11390 74 69 6e 67 49 64 78 2c 0a 20 20 20 20 20 20 20  tingIdx,.       
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 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
113c0 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67  rterColumn, targ
113d0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  et);.        bre
113e0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
113f0 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    /* Otherwise, 
11400 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74  fall thru into t
11410 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73  he TK_COLUMN cas
11420 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63  e */.    }.    c
11430 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
11440 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
11450 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20  ->iTable<0 ){.  
11460 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 6f 6e        /* This on
11470 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  ly happens when 
11480 63 6f 64 69 6e 67 20 63 68 65 63 6b 20 63 6f 6e  coding check con
11490 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20  straints */.    
114a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
114b0 73 65 2d 3e 63 6b 42 61 73 65 3e 30 20 29 3b 0a  se->ckBase>0 );.
114c0 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20          inReg = 
114d0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2b  pExpr->iColumn +
114e0 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3b   pParse->ckBase;
114f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
11500 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
11510 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  (pExpr->flags & 
11520 45 50 5f 41 6e 79 41 66 66 29 21 3d 30 20 29 3b  EP_AnyAff)!=0 );
11530 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
11540 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
11550 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  GetColumn(pParse
11560 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20  , pExpr->pTab,. 
11570 20 20 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 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  pExpr->iColumn, 
115a0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74  pExpr->iTable, t
115b0 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20  arget,.         
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 70 45 78 70 72 2d 3e 66          pExpr->f
115e0 6c 61 67 73 20 26 20 45 50 5f 41 6e 79 41 66 66  lags & EP_AnyAff
115f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
11600 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
11610 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
11620 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49  R: {.      codeI
11630 6e 74 65 67 65 72 28 76 2c 20 70 45 78 70 72 2c  nteger(v, pExpr,
11640 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
11650 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
11660 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41      case TK_FLOA
11670 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T: {.      asser
11680 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
11690 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
116a0 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
116b0 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 45 78   codeReal(v, pEx
116c0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c  pr->u.zToken, 0,
116d0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
116e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
116f0 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
11700 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
11710 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
11720 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
11730 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 73  alue) );.      s
11740 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
11750 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
11760 30 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 70 45  0, target, 0, pE
11770 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30  xpr->u.zToken, 0
11780 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
11790 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
117a0 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  K_NULL: {.      
117b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
117c0 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
117d0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
117e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
117f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11800 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20  _BLOB_LITERAL.  
11810 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20    case TK_BLOB: 
11820 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20  {.      int n;. 
11830 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
11840 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  *z;.      char *
11850 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73 73  zBlob;.      ass
11860 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
11870 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
11880 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
11890 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
118a0 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27  ->u.zToken[0]=='
118b0 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a  x' || pExpr->u.z
118c0 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b  Token[0]=='X' );
118d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
118e0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31  Expr->u.zToken[1
118f0 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20  ]=='\'' );.     
11900 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a   z = &pExpr->u.z
11910 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20  Token[2];.      
11920 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
11930 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20  n30(z) - 1;.    
11940 20 20 61 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d    assert( z[n]==
11950 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 42  '\'' );.      zB
11960 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 48 65 78  lob = sqlite3Hex
11970 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33 56 64  ToBlob(sqlite3Vd
11980 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a  beDb(v), z, n);.
11990 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
119a0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c  eAddOp4(v, OP_Bl
119b0 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c  ob, n/2, target,
119c0 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59   0, zBlob, P4_DY
119d0 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 62 72  NAMIC);.      br
119e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
119f0 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41  f.    case TK_VA
11a00 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20  RIABLE: {.      
11a10 69 6e 74 20 69 50 72 69 6f 72 3b 0a 20 20 20 20  int iPrior;.    
11a20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
11a30 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
11a40 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
11a50 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
11a60 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
11a70 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
11a80 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  en!=0 );.      a
11a90 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
11aa0 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a  zToken[0]!=0 );.
11ab0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
11ac0 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 30 0a  >u.zToken[1]==0.
11ad0 20 20 20 20 20 20 20 20 20 26 26 20 28 69 50 72           && (iPr
11ae0 69 6f 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ior = sqlite3Vdb
11af0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d  eCurrentAddr(v)-
11b00 31 29 3e 3d 30 0a 20 20 20 20 20 20 20 20 20 26  1)>=0.         &
11b10 26 20 28 70 4f 70 20 3d 20 73 71 6c 69 74 65 33  & (pOp = sqlite3
11b20 56 64 62 65 47 65 74 4f 70 28 76 2c 20 69 50 72  VdbeGetOp(v, iPr
11b30 69 6f 72 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ior))->opcode==O
11b40 50 5f 56 61 72 69 61 62 6c 65 0a 20 20 20 20 20  P_Variable.     
11b50 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 31 2b 70      && pOp->p1+p
11b60 4f 70 2d 3e 70 33 3d 3d 70 45 78 70 72 2d 3e 69  Op->p3==pExpr->i
11b70 54 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 26  Table.         &
11b80 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70  & pOp->p2+pOp->p
11b90 33 3d 3d 74 61 72 67 65 74 0a 20 20 20 20 20 20  3==target.      
11ba0 20 20 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 3d     && pOp->p4.z=
11bb0 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  =0.      ){.    
11bc0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 72      /* If the pr
11bd0 65 76 69 6f 75 73 20 69 6e 73 74 72 75 63 74 69  evious instructi
11be0 6f 6e 20 77 61 73 20 61 20 63 6f 70 79 20 6f 66  on was a copy of
11bf0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 75 6e   the previous un
11c00 6e 61 6d 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  named.        **
11c10 20 70 61 72 61 6d 65 74 65 72 20 69 6e 74 6f 20   parameter into 
11c20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 65 67  the previous reg
11c30 69 73 74 65 72 2c 20 74 68 65 6e 20 73 69 6d 70  ister, then simp
11c40 6c 79 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  ly increment the
11c50 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70 65  .        ** repe
11c60 61 74 20 63 6f 75 6e 74 20 6f 6e 20 74 68 65 20  at count on the 
11c70 70 72 69 6f 72 20 69 6e 73 74 72 75 63 74 69 6f  prior instructio
11c80 6e 20 72 61 74 68 65 72 20 74 68 61 6e 20 6d 61  n rather than ma
11c90 6b 69 6e 67 20 61 20 6e 65 77 0a 20 20 20 20 20  king a new.     
11ca0 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f     ** instructio
11cb0 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  n..        */.  
11cc0 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 2b 2b 3b        pOp->p3++;
11cd0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
11ce0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11cf0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 56 61  eAddOp3(v, OP_Va
11d00 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69  riable, pExpr->i
11d10 54 61 62 6c 65 2c 20 74 61 72 67 65 74 2c 20 31  Table, target, 1
11d20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
11d30 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31  Expr->u.zToken[1
11d40 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]!=0 ){.        
11d50 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
11d60 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 70 45 78  ngeP4(v, -1, pEx
11d70 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29  pr->u.zToken, 0)
11d80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11d90 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
11da0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
11db0 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20  TK_REGISTER: {. 
11dc0 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78       inReg = pEx
11dd0 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
11de0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
11df0 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b     case TK_AS: {
11e00 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 63  .      inReg = c
11e10 6f 64 65 41 6c 69 61 73 28 70 50 61 72 73 65 2c  odeAlias(pParse,
11e20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
11e30 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61  pExpr->pLeft, ta
11e40 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65  rget);.      bre
11e50 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
11e60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41  f SQLITE_OMIT_CA
11e70 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  ST.    case TK_C
11e80 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  AST: {.      /* 
11e90 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  Expressions of t
11ea0 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28  he form:   CAST(
11eb0 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20  pLeft AS token) 
11ec0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66  */.      int aff
11ed0 2c 20 74 6f 5f 6f 70 3b 0a 20 20 20 20 20 20 69  , to_op;.      i
11ee0 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
11ef0 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
11f00 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
11f10 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  t, target);.    
11f20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
11f30 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
11f40 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
11f50 3b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 73 71  ;.      aff = sq
11f60 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
11f70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  e(pExpr->u.zToke
11f80 6e 29 3b 0a 20 20 20 20 20 20 74 6f 5f 6f 70 20  n);.      to_op 
11f90 3d 20 61 66 66 20 2d 20 53 51 4c 49 54 45 5f 41  = aff - SQLITE_A
11fa0 46 46 5f 54 45 58 54 20 2b 20 4f 50 5f 54 6f 54  FF_TEXT + OP_ToT
11fb0 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ext;.      asser
11fc0 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54  t( to_op==OP_ToT
11fd0 65 78 74 20 20 20 20 7c 7c 20 61 66 66 21 3d 53  ext    || aff!=S
11fe0 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20  QLITE_AFF_TEXT  
11ff0 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72    );.      asser
12000 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42  t( to_op==OP_ToB
12010 6c 6f 62 20 20 20 20 7c 7c 20 61 66 66 21 3d 53  lob    || aff!=S
12020 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 20  QLITE_AFF_NONE  
12030 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72    );.      asser
12040 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e  t( to_op==OP_ToN
12050 75 6d 65 72 69 63 20 7c 7c 20 61 66 66 21 3d 53  umeric || aff!=S
12060 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
12070 43 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  C );.      asser
12080 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49  t( to_op==OP_ToI
12090 6e 74 20 20 20 20 20 7c 7c 20 61 66 66 21 3d 53  nt     || aff!=S
120a0 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
120b0 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  R );.      asser
120c0 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52  t( to_op==OP_ToR
120d0 65 61 6c 20 20 20 20 7c 7c 20 61 66 66 21 3d 53  eal    || aff!=S
120e0 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 20  QLITE_AFF_REAL  
120f0 20 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63    );.      testc
12100 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ase( to_op==OP_T
12110 6f 54 65 78 74 20 29 3b 0a 20 20 20 20 20 20 74  oText );.      t
12120 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d  estcase( to_op==
12130 4f 50 5f 54 6f 42 6c 6f 62 20 29 3b 0a 20 20 20  OP_ToBlob );.   
12140 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f     testcase( to_
12150 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69 63  op==OP_ToNumeric
12160 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
12170 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  se( to_op==OP_To
12180 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  Int );.      tes
12190 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50  tcase( to_op==OP
121a0 5f 54 6f 52 65 61 6c 20 29 3b 0a 20 20 20 20 20  _ToReal );.     
121b0 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67   if( inReg!=targ
121c0 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  et ){.        sq
121d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
121e0 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52  v, OP_SCopy, inR
121f0 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  eg, target);.   
12200 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72       inReg = tar
12210 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  get;.      }.   
12220 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12230 64 4f 70 31 28 76 2c 20 74 6f 5f 6f 70 2c 20 69  dOp1(v, to_op, i
12240 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 74 65 73  nReg);.      tes
12250 74 63 61 73 65 28 20 75 73 65 64 41 73 43 6f 6c  tcase( usedAsCol
12260 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c  umnCache(pParse,
12270 20 69 6e 52 65 67 2c 20 69 6e 52 65 67 29 20 29   inReg, inReg) )
12280 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
12290 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
122a0 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69  Change(pParse, i
122b0 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 20 20  nReg, 1);.      
122c0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
122d0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
122e0 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63  IT_CAST */.    c
122f0 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
12300 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
12310 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
12320 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
12330 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
12340 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
12350 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54     assert( TK_LT
12360 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20  ==OP_Lt );.     
12370 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d   assert( TK_LE==
12380 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20 61  OP_Le );.      a
12390 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50  ssert( TK_GT==OP
123a0 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Gt );.      ass
123b0 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47  ert( TK_GE==OP_G
123c0 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
123d0 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20  t( TK_EQ==OP_Eq 
123e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
123f0 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b   TK_NE==OP_Ne );
12400 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
12410 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20   op==TK_LT );.  
12420 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
12430 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20  ==TK_LE );.     
12440 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
12450 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65  K_GT );.      te
12460 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47  stcase( op==TK_G
12470 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
12480 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29  ase( op==TK_EQ )
12490 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
124a0 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20  ( op==TK_NE );. 
124b0 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
124c0 4f 70 65 72 61 6e 64 73 28 70 50 61 72 73 65 2c  Operands(pParse,
124d0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
124e0 72 31 2c 20 26 72 65 67 46 72 65 65 31 2c 0a 20  r1, &regFree1,. 
124f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12510 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
12520 26 72 32 2c 20 26 72 65 67 46 72 65 65 32 29 3b  &r2, &regFree2);
12530 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
12540 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
12550 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
12560 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
12570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
12580 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c  , r2, inReg, SQL
12590 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20  ITE_STOREP2);.  
125a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
125b0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
125c0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
125d0 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
125e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
125f0 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a     case TK_AND:.
12600 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a      case TK_OR:.
12610 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53      case TK_PLUS
12620 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
12630 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AR:.    case TK_
12640 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20  MINUS:.    case 
12650 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65  TK_REM:.    case
12660 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20   TK_BITAND:.    
12670 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20  case TK_BITOR:. 
12680 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48     case TK_SLASH
12690 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53  :.    case TK_LS
126a0 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54  HIFT:.    case T
126b0 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63  K_RSHIFT: .    c
126c0 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b  ase TK_CONCAT: {
126d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
126e0 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b  K_AND==OP_And );
126f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
12700 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20  K_OR==OP_Or );. 
12710 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
12720 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a  PLUS==OP_Add );.
12730 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
12740 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72  _MINUS==OP_Subtr
12750 61 63 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  act );.      ass
12760 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f  ert( TK_REM==OP_
12770 52 65 6d 61 69 6e 64 65 72 20 29 3b 0a 20 20 20  Remainder );.   
12780 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
12790 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20  TAND==OP_BitAnd 
127a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
127b0 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69   TK_BITOR==OP_Bi
127c0 74 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  tOr );.      ass
127d0 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f  ert( TK_SLASH==O
127e0 50 5f 44 69 76 69 64 65 20 29 3b 0a 20 20 20 20  P_Divide );.    
127f0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48    assert( TK_LSH
12800 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66  IFT==OP_ShiftLef
12810 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
12820 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50  t( TK_RSHIFT==OP
12830 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b 0a 20  _ShiftRight );. 
12840 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
12850 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61  CONCAT==OP_Conca
12860 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
12870 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20  ase( op==TK_AND 
12880 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
12890 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a  e( op==TK_OR );.
128a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
128b0 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20  op==TK_PLUS );. 
128c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
128d0 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20  p==TK_MINUS );. 
128e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
128f0 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20  p==TK_REM );.   
12900 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
12910 3d 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20  =TK_BITAND );.  
12920 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
12930 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20  ==TK_BITOR );.  
12940 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
12950 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20  ==TK_SLASH );.  
12960 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
12970 3d 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20  ==TK_LSHIFT );. 
12980 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
12990 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a  p==TK_RSHIFT );.
129a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
129b0 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b  op==TK_CONCAT );
129c0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
129d0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
129e0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
129f0 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
12a00 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
12a10 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
12a20 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
12a30 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
12a40 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
12a50 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f  3VdbeAddOp3(v, o
12a60 70 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65  p, r2, r1, targe
12a70 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
12a80 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
12a90 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
12aa0 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
12ab0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
12ac0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
12ad0 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
12ae0 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
12af0 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
12b00 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74     assert( pLeft
12b10 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
12b20 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41  eft->op==TK_FLOA
12b30 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  T ){.        ass
12b40 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
12b50 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
12b60 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
12b70 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c       codeReal(v,
12b80 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e   pLeft->u.zToken
12b90 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 1, target);.  
12ba0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c      }else if( pL
12bb0 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  eft->op==TK_INTE
12bc0 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 63  GER ){.        c
12bd0 6f 64 65 49 6e 74 65 67 65 72 28 76 2c 20 70 4c  odeInteger(v, pL
12be0 65 66 74 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  eft, 1, target);
12bf0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12c00 20 20 20 20 20 20 72 65 67 46 72 65 65 31 20 3d        regFree1 =
12c10 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
12c20 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
12c30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12c40 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12c50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 31 29  _Integer, 0, r1)
12c60 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73  ;.        r2 = s
12c70 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
12c80 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
12c90 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
12ca0 65 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e2);.        sql
12cb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
12cc0 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72  , OP_Subtract, r
12cd0 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a  2, r1, target);.
12ce0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
12cf0 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
12d00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
12d10 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20  nReg = target;. 
12d20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
12d30 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  }.    case TK_BI
12d40 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54  TNOT:.    case T
12d50 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61  K_NOT: {.      a
12d60 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54  ssert( TK_BITNOT
12d70 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 0a 20  ==OP_BitNot );. 
12d80 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
12d90 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20  NOT==OP_Not );. 
12da0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
12db0 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a  p==TK_BITNOT );.
12dc0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
12dd0 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20  op==TK_NOT );.  
12de0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
12df0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
12e00 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
12e10 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
12e20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
12e30 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
12e40 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67      inReg = targ
12e50 65 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  et;.      sqlite
12e60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
12e70 70 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20  p, r1, inReg);. 
12e80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
12e90 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
12ea0 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
12eb0 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
12ec0 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
12ed0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53     assert( TK_IS
12ee0 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  NULL==OP_IsNull 
12ef0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
12f00 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f   TK_NOTNULL==OP_
12f10 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20  NotNull );.     
12f20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
12f30 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  K_ISNULL );.    
12f40 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
12f50 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20  TK_NOTNULL );.  
12f60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12f70 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
12f80 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  ger, 1, target);
12f90 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
12fa0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
12fb0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
12fc0 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
12fd0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
12fe0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
12ff0 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
13000 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
13010 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20  v, op, r1);.    
13020 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13030 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
13040 2c 20 74 61 72 67 65 74 2c 20 2d 31 29 3b 0a 20  , target, -1);. 
13050 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13060 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
13070 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
13080 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
13090 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20  K_AGG_FUNCTION: 
130a0 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20  {.      AggInfo 
130b0 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e  *pInfo = pExpr->
130c0 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
130d0 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a  if( pInfo==0 ){.
130e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
130f0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
13100 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
13110 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
13120 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
13130 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20  pParse, "misuse 
13140 6f 66 20 61 67 67 72 65 67 61 74 65 3a 20 25 73  of aggregate: %s
13150 28 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ()", pExpr->u.zT
13160 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  oken);.      }el
13170 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65  se{.        inRe
13180 67 20 3d 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63  g = pInfo->aFunc
13190 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d  [pExpr->iAgg].iM
131a0 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  em;.      }.    
131b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
131c0 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54     case TK_CONST
131d0 5f 46 55 4e 43 3a 0a 20 20 20 20 63 61 73 65 20  _FUNC:.    case 
131e0 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  TK_FUNCTION: {. 
131f0 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
13200 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c  Farg;       /* L
13210 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ist of function 
13220 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
13230 20 20 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20     int nFarg;   
13240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
13250 62 65 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ber of function 
13260 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
13270 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
13280 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
13290 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69   function defini
132a0 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  tion object */. 
132b0 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20 20       int nId;   
132c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
132d0 65 6e 67 74 68 20 6f 66 20 74 68 65 20 66 75 6e  ength of the fun
132e0 63 74 69 6f 6e 20 6e 61 6d 65 20 69 6e 20 62 79  ction name in by
132f0 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  tes */.      con
13300 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20  st char *zId;   
13310 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74      /* The funct
13320 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ion name */.    
13330 20 20 69 6e 74 20 63 6f 6e 73 74 4d 61 73 6b 20    int constMask 
13340 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4d 61 73 6b  = 0;     /* Mask
13350 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67   of function arg
13360 75 6d 65 6e 74 73 20 74 68 61 74 20 61 72 65 20  uments that are 
13370 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20  constant */.    
13380 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
13390 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
133a0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
133b0 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64    u8 enc = ENC(d
133c0 62 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  b);      /* The 
133d0 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 75 73  text encoding us
133e0 65 64 20 62 79 20 74 68 69 73 20 64 61 74 61 62  ed by this datab
133f0 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c  ase */.      Col
13400 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b  lSeq *pColl = 0;
13410 20 20 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69      /* A collati
13420 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a  ng sequence */..
13430 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
13440 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
13450 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
13460 63 74 29 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ct) );.      tes
13470 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f  tcase( op==TK_CO
13480 4e 53 54 5f 46 55 4e 43 20 29 3b 0a 20 20 20 20  NST_FUNC );.    
13490 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
134a0 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  TK_FUNCTION );. 
134b0 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
134c0 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70  AnyProperty(pExp
134d0 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  r, EP_TokenOnly)
134e0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72   ){.        pFar
134f0 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  g = 0;.      }el
13500 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72  se{.        pFar
13510 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  g = pExpr->x.pLi
13520 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  st;.      }.    
13530 20 20 6e 46 61 72 67 20 3d 20 70 46 61 72 67 20    nFarg = pFarg 
13540 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a  ? pFarg->nExpr :
13550 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
13560 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
13570 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
13580 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
13590 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a  zId = pExpr->u.z
135a0 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 49 64  Token;.      nId
135b0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
135c0 33 30 28 7a 49 64 29 3b 0a 20 20 20 20 20 20 70  30(zId);.      p
135d0 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
135e0 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49  dFunction(db, zI
135f0 64 2c 20 6e 49 64 2c 20 6e 46 61 72 67 2c 20 65  d, nId, nFarg, e
13600 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  nc, 0);.      as
13610 73 65 72 74 28 20 70 44 65 66 21 3d 30 20 29 3b  sert( pDef!=0 );
13620 0a 20 20 20 20 20 20 69 66 28 20 70 46 61 72 67  .      if( pFarg
13630 20 29 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d   ){.        r1 =
13640 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
13650 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 46 61  ange(pParse, nFa
13660 72 67 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rg);.        sql
13670 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
13680 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 46 61  List(pParse, pFa
13690 72 67 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20  rg, r1, 1);.    
136a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
136b0 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d   r1 = 0;.      }
136c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
136d0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
136e0 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69  E.      /* Possi
136f0 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74 68 65  bly overload the
13700 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 65   function if the
13710 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
13720 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 76 69  is.      ** a vi
13730 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75  rtual table colu
13740 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  mn..      **.   
13750 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20     ** For infix 
13760 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c  functions (LIKE,
13770 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20 61   GLOB, REGEXP, a
13780 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20 74 68  nd MATCH) use th
13790 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e  e.      ** secon
137a0 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20  d argument, not 
137b0 74 68 65 20 66 69 72 73 74 2c 20 61 73 20 74 68  the first, as th
137c0 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 65  e argument to te
137d0 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73  st to.      ** s
137e0 65 65 20 69 66 20 69 74 20 69 73 20 61 20 63 6f  ee if it is a co
137f0 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74 75 61  lumn in a virtua
13800 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69  l table.  This i
13810 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65 0a 20  s done because. 
13820 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74       ** the left
13830 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 66 69   operand of infi
13840 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74 68 65  x functions (the
13850 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61 6e 74   operand we want
13860 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e   to.      ** con
13870 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67  trol overloading
13880 29 20 65 6e 64 73 20 75 70 20 61 73 20 74 68 65  ) ends up as the
13890 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
138a0 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
138b0 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
138c0 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20 67 6c  expression "A gl
138d0 6f 62 20 42 22 20 69 73 20 65 71 75 69 76 61 6c  ob B" is equival
138e0 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  ent to .      **
138f0 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65   "glob(B,A).  We
13900 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74 68 65   want to use the
13910 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20 42 22   A in "A glob B"
13920 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20 20 2a   to test.      *
13930 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f  * for function o
13940 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74  verloading.  But
13950 20 77 65 20 75 73 65 20 74 68 65 20 42 20 74 65   we use the B te
13960 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29  rm in "glob(B,A)
13970 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  "..      */.    
13980 20 20 69 66 28 20 6e 46 61 72 67 3e 3d 32 20 26    if( nFarg>=2 &
13990 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  & (pExpr->flags 
139a0 26 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29 20  & EP_InfixFunc) 
139b0 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20  ){.        pDef 
139c0 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65  = sqlite3VtabOve
139d0 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62  rloadFunction(db
139e0 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70  , pDef, nFarg, p
139f0 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  Farg->a[1].pExpr
13a00 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
13a10 66 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20 20  f( nFarg>0 ){.  
13a20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
13a30 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64  ite3VtabOverload
13a40 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65  Function(db, pDe
13a50 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d  f, nFarg, pFarg-
13a60 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[0].pExpr);.  
13a70 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
13a80 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46     for(i=0; i<nF
13a90 61 72 67 20 26 26 20 69 3c 33 32 3b 20 69 2b 2b  arg && i<32; i++
13aa0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
13ab0 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
13ac0 74 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d  tant(pFarg->a[i]
13ad0 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
13ae0 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c       constMask |
13af0 3d 20 28 31 3c 3c 69 29 3b 0a 20 20 20 20 20 20  = (1<<i);.      
13b00 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
13b10 28 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53  (pDef->flags & S
13b20 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43  QLITE_FUNC_NEEDC
13b30 4f 4c 4c 29 21 3d 30 20 26 26 20 21 70 43 6f 6c  OLL)!=0 && !pCol
13b40 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  l ){.          p
13b50 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
13b60 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
13b70 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45  , pFarg->a[i].pE
13b80 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xpr);.        }.
13b90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
13ba0 28 20 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20  ( pDef->flags & 
13bb0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44  SQLITE_FUNC_NEED
13bc0 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  COLL ){.        
13bd0 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
13be0 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
13bf0 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c  ll; .        sql
13c00 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
13c10 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c  , OP_CollSeq, 0,
13c20 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70   0, 0, (char *)p
13c30 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
13c40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
13c50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13c60 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f  p4(v, OP_Functio
13c70 6e 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31  n, constMask, r1
13c80 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20  , target,.      
13c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ca0 20 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50    (char*)pDef, P
13cb0 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  4_FUNCDEF);.    
13cc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
13cd0 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 46 61  ngeP5(v, (u8)nFa
13ce0 72 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  rg);.      if( n
13cf0 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Farg ){.        
13d00 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
13d10 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
13d20 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20  r1, nFarg);.    
13d30 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
13d40 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
13d50 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
13d60 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20   r1, nFarg);.   
13d70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
13d80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13d90 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
13da0 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
13db0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
13dc0 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  ECT: {.      tes
13dd0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 58  tcase( op==TK_EX
13de0 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65  ISTS );.      te
13df0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53  stcase( op==TK_S
13e00 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 69  ELECT );.      i
13e10 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
13e20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
13e30 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
13e40 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78  lect(pParse, pEx
13e50 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  pr, 0, 0);.     
13e60 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   }.      inReg =
13e70 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
13e80 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13e90 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
13ea0 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  IN: {.      int 
13eb0 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 30 3b 0a 20  rNotFound = 0;. 
13ec0 20 20 20 20 20 69 6e 74 20 72 4d 61 79 48 61 76       int rMayHav
13ed0 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  eNull = 0;.     
13ee0 20 69 6e 74 20 6a 32 2c 20 6a 33 2c 20 6a 34 2c   int j2, j3, j4,
13ef0 20 6a 35 3b 0a 20 20 20 20 20 20 63 68 61 72 20   j5;.      char 
13f00 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20  affinity;.      
13f10 69 6e 74 20 65 54 79 70 65 3b 0a 0a 20 20 20 20  int eType;..    
13f20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
13f30 74 28 28 76 2c 20 22 62 65 67 69 6e 20 49 4e 20  t((v, "begin IN 
13f40 65 78 70 72 20 72 25 64 22 2c 20 74 61 72 67 65  expr r%d", targe
13f50 74 29 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65  t));.      eType
13f60 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
13f70 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 45  Index(pParse, pE
13f80 78 70 72 2c 20 26 72 4d 61 79 48 61 76 65 4e 75  xpr, &rMayHaveNu
13f90 6c 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ll);.      if( r
13fa0 4d 61 79 48 61 76 65 4e 75 6c 6c 20 29 7b 0a 20  MayHaveNull ){. 
13fb0 20 20 20 20 20 20 20 72 4e 6f 74 46 6f 75 6e 64         rNotFound
13fc0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
13fd0 6d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  m;.      }..    
13fe0 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
13ff0 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20  the affinity to 
14000 75 73 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  use to create a 
14010 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 72 65 73  key from the res
14020 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ults.      ** of
14030 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
14040 20 61 66 66 69 6e 69 74 79 53 74 72 20 73 74 6f   affinityStr sto
14050 72 65 73 20 61 20 73 74 61 74 69 63 20 73 74 72  res a static str
14060 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72  ing suitable for
14070 0a 20 20 20 20 20 20 2a 2a 20 50 34 20 6f 66 20  .      ** P4 of 
14080 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20  OP_MakeRecord.. 
14090 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 66       */.      af
140a0 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72 69  finity = compari
140b0 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70  sonAffinity(pExp
140c0 72 29 3b 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 43  r);...      /* C
140d0 6f 64 65 20 74 68 65 20 3c 65 78 70 72 3e 20 66  ode the <expr> f
140e0 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28  rom "<expr> IN (
140f0 2e 2e 2e 29 22 2e 20 54 68 65 20 74 65 6d 70 6f  ...)". The tempo
14100 72 61 72 79 20 74 61 62 6c 65 0a 20 20 20 20 20  rary table.     
14110 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   ** pExpr->iTabl
14120 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76  e contains the v
14130 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20  alues that make 
14140 75 70 20 74 68 65 20 28 2e 2e 2e 29 20 73 65 74  up the (...) set
14150 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14160 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
14170 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
14180 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
14190 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
141a0 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65  pr->pLeft, targe
141b0 74 29 3b 0a 20 20 20 20 20 20 6a 32 20 3d 20 73  t);.      j2 = s
141c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
141d0 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 74  (v, OP_IsNull, t
141e0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66  arget);.      if
141f0 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  ( eType==IN_INDE
14200 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20  X_ROWID ){.     
14210 20 20 20 6a 33 20 3d 20 73 71 6c 69 74 65 33 56     j3 = sqlite3V
14220 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
14230 4d 75 73 74 42 65 49 6e 74 2c 20 74 61 72 67 65  MustBeInt, targe
14240 74 29 3b 0a 20 20 20 20 20 20 20 20 6a 34 20 3d  t);.        j4 =
14250 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14260 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73  p3(v, OP_NotExis
14270 74 73 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  ts, pExpr->iTabl
14280 65 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  e, 0, target);. 
14290 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
142a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
142b0 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65  nteger, 1, targe
142c0 74 29 3b 0a 20 20 20 20 20 20 20 20 6a 35 20 3d  t);.        j5 =
142d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
142e0 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a  p0(v, OP_Goto);.
142f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14300 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
14310 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  3);.        sqli
14320 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
14330 76 2c 20 6a 34 29 3b 0a 20 20 20 20 20 20 20 20  v, j4);.        
14340 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14350 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
14360 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
14370 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14380 20 20 72 32 20 3d 20 72 65 67 46 72 65 65 32 20    r2 = regFree2 
14390 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
143a0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  Reg(pParse);..  
143b0 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20        /* Create 
143c0 61 20 72 65 63 6f 72 64 20 61 6e 64 20 74 65 73  a record and tes
143d0 74 20 66 6f 72 20 73 65 74 20 6d 65 6d 62 65 72  t for set member
143e0 73 68 69 70 2e 20 49 66 20 74 68 65 20 73 65 74  ship. If the set
143f0 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20   contains.      
14400 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 2c 20    ** the value, 
14410 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65  then jump to the
14420 20 65 6e 64 20 6f 66 20 74 68 65 20 74 65 73 74   end of the test
14430 20 63 6f 64 65 2e 20 54 68 65 20 74 61 72 67 65   code. The targe
14440 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 67  t.        ** reg
14450 69 73 74 65 72 20 73 74 69 6c 6c 20 63 6f 6e 74  ister still cont
14460 61 69 6e 73 20 74 68 65 20 74 72 75 65 20 28 31  ains the true (1
14470 29 20 76 61 6c 75 65 20 77 72 69 74 74 65 6e 20  ) value written 
14480 74 6f 20 69 74 20 65 61 72 6c 69 65 72 2e 0a 20  to it earlier.. 
14490 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
144a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
144b0 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
144c0 63 6f 72 64 2c 20 74 61 72 67 65 74 2c 20 31 2c  cord, target, 1,
144d0 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20   r2, &affinity, 
144e0 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
144f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14500 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
14510 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
14520 20 6a 35 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j5 = sqlite3Vdb
14530 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 46 6f  eAddOp3(v, OP_Fo
14540 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
14550 6c 65 2c 20 30 2c 20 72 32 29 3b 0a 0a 20 20 20  le, 0, r2);..   
14560 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73       /* If the s
14570 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  et membership te
14580 73 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74  st fails, then t
14590 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
145a0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 78 20   .        ** "x 
145b0 49 4e 20 28 2e 2e 2e 29 22 20 65 78 70 72 65 73  IN (...)" expres
145c0 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 69 74  sion must be eit
145d0 68 65 72 20 30 20 6f 72 20 4e 55 4c 4c 2e 20 49  her 0 or NULL. I
145e0 66 20 74 68 65 20 73 65 74 0a 20 20 20 20 20 20  f the set.      
145f0 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f    ** contains no
14600 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68   NULL values, th
14610 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  en the result is
14620 20 30 2e 20 49 66 20 74 68 65 20 73 65 74 20 0a   0. If the set .
14630 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61          ** conta
14640 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
14650 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65  NULL values, the
14660 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  n the result of 
14670 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  the.        ** e
14680 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6c 73  xpression is als
14690 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20  o NULL..        
146a0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  */.        if( r
146b0 4e 6f 74 46 6f 75 6e 64 3d 3d 30 20 29 7b 0a 20  NotFound==0 ){. 
146c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
146d0 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20   branch runs if 
146e0 69 74 20 69 73 20 6b 6e 6f 77 6e 20 61 74 20 63  it is known at c
146f0 6f 6d 70 69 6c 65 20 74 69 6d 65 20 28 6e 6f 77  ompile time (now
14700 29 20 74 68 61 74 20 0a 20 20 20 20 20 20 20 20  ) that .        
14710 20 20 2a 2a 20 74 68 65 20 73 65 74 20 63 6f 6e    ** the set con
14720 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 20 76 61  tains no NULL va
14730 6c 75 65 73 2e 20 54 68 69 73 20 68 61 70 70 65  lues. This happe
14740 6e 73 20 61 73 20 74 68 65 20 72 65 73 75 6c 74  ns as the result
14750 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  .          ** of
14760 20 61 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f   a "NOT NULL" co
14770 6e 73 74 72 61 69 6e 74 20 69 6e 20 74 68 65 20  nstraint in the 
14780 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
14790 20 4e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20 20   No need.       
147a0 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68     ** to test th
147b0 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
147c0 20 61 74 20 72 75 6e 74 69 6d 65 20 69 6e 20 74   at runtime in t
147d0 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20  his case..      
147e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
147f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14800 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
14810 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
14820 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14830 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
14840 6c 6f 63 6b 20 70 6f 70 75 6c 61 74 65 73 20 74  lock populates t
14850 68 65 20 72 4e 6f 74 46 6f 75 6e 64 20 72 65 67  he rNotFound reg
14860 69 73 74 65 72 20 77 69 74 68 20 65 69 74 68 65  ister with eithe
14870 72 20 4e 55 4c 4c 0a 20 20 20 20 20 20 20 20 20  r NULL.         
14880 20 2a 2a 20 6f 72 20 30 20 28 61 6e 20 69 6e 74   ** or 0 (an int
14890 65 67 65 72 20 76 61 6c 75 65 29 2e 20 49 66 20  eger value). If 
148a0 74 68 65 20 64 61 74 61 20 73 74 72 75 63 74 75  the data structu
148b0 72 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 0a  re contains one.
148c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
148d0 6d 6f 72 65 20 4e 55 4c 4c 73 2c 20 74 68 65 6e  more NULLs, then
148e0 20 73 65 74 20 72 4e 6f 74 46 6f 75 6e 64 20 74   set rNotFound t
148f0 6f 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73  o NULL. Otherwis
14900 65 2c 20 73 65 74 20 69 74 0a 20 20 20 20 20 20  e, set it.      
14910 20 20 20 20 2a 2a 20 74 6f 20 30 2e 20 49 66 20      ** to 0. If 
14920 72 65 67 69 73 74 65 72 20 72 4d 61 79 48 61 76  register rMayHav
14930 65 4e 75 6c 6c 20 69 73 20 61 6c 72 65 61 64 79  eNull is already
14940 20 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c   set to some val
14950 75 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ue.          ** 
14960 6f 74 68 65 72 20 74 68 61 6e 20 4e 55 4c 4c 2c  other than NULL,
14970 20 74 68 65 6e 20 74 68 65 20 74 65 73 74 20 68   then the test h
14980 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
14990 72 75 6e 20 61 6e 64 20 0a 20 20 20 20 20 20 20  run and .       
149a0 20 20 20 2a 2a 20 72 4e 6f 74 46 6f 75 6e 64 20     ** rNotFound 
149b0 69 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c  is already popul
149c0 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20  ated..          
149d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  */.          sta
149e0 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6e  tic const char n
149f0 75 6c 6c 52 65 63 6f 72 64 5b 5d 20 3d 20 7b 20  ullRecord[] = { 
14a00 30 78 30 32 2c 20 30 78 30 30 20 7d 3b 0a 20 20  0x02, 0x00 };.  
14a10 20 20 20 20 20 20 20 20 6a 33 20 3d 20 73 71 6c          j3 = sql
14a20 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
14a30 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 4d  , OP_NotNull, rM
14a40 61 79 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20 20  ayHaveNull);.   
14a50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14a60 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
14a70 75 6c 6c 2c 20 30 2c 20 72 4e 6f 74 46 6f 75 6e  ull, 0, rNotFoun
14a80 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  d);.          sq
14a90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
14aa0 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 32 2c 20 72  v, OP_Blob, 2, r
14ab0 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 30 2c 20  MayHaveNull, 0, 
14ac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75                nu
14ae0 6c 6c 52 65 63 6f 72 64 2c 20 50 34 5f 53 54 41  llRecord, P4_STA
14af0 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20  TIC);.          
14b00 6a 34 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j4 = sqlite3Vdbe
14b10 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 46 6f 75  AddOp3(v, OP_Fou
14b20 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
14b30 65 2c 20 30 2c 20 72 4d 61 79 48 61 76 65 4e 75  e, 0, rMayHaveNu
14b40 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ll);.          s
14b50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14b60 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
14b70 30 2c 20 72 4e 6f 74 46 6f 75 6e 64 29 3b 0a 20  0, rNotFound);. 
14b80 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14b90 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
14ba0 6a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  j4);.          s
14bb0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
14bc0 72 65 28 76 2c 20 6a 33 29 3b 0a 0a 20 20 20 20  re(v, j3);..    
14bd0 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68        /* Copy th
14be0 65 20 76 61 6c 75 65 20 6f 66 20 72 65 67 69 73  e value of regis
14bf0 74 65 72 20 72 4e 6f 74 46 6f 75 6e 64 20 28 77  ter rNotFound (w
14c00 68 69 63 68 20 69 73 20 65 69 74 68 65 72 20 4e  hich is either N
14c10 55 4c 4c 20 6f 72 20 30 29 0a 20 20 20 20 20 20  ULL or 0).      
14c20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
14c30 74 61 72 67 65 74 20 72 65 67 69 73 74 65 72 2e  target register.
14c40 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68   This will be th
14c50 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a  e result of the.
14c60 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70            ** exp
14c70 72 65 73 73 69 6f 6e 2e 0a 20 20 20 20 20 20 20  ression..       
14c80 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
14c90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14ca0 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 4e  2(v, OP_Copy, rN
14cb0 6f 74 46 6f 75 6e 64 2c 20 74 61 72 67 65 74 29  otFound, target)
14cc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14cd0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
14ce0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
14cf0 20 6a 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   j2);.      sqli
14d00 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
14d10 76 2c 20 6a 35 29 3b 0a 20 20 20 20 20 20 73 71  v, j5);.      sq
14d20 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
14d30 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20  p(pParse, 1);.  
14d40 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
14d50 28 76 2c 20 22 65 6e 64 20 49 4e 20 65 78 70 72  (v, "end IN expr
14d60 20 72 25 64 22 2c 20 74 61 72 67 65 74 29 29 3b   r%d", target));
14d70 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14d80 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f    }.#endif.    /
14d90 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45  *.    **    x BE
14da0 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20  TWEEN y AND z.  
14db0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
14dc0 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
14dd0 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  o.    **.    ** 
14de0 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a     x>=y AND x<=z
14df0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58  .    **.    ** X
14e00 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
14e10 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20  xpr->pLeft..    
14e20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20 69  ** Y is stored i
14e30 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  n pExpr->pList->
14e40 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20  a[0].pExpr..    
14e50 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69  ** Z is stored i
14e60 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  n pExpr->pList->
14e70 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20  a[1].pExpr..    
14e80 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  */.    case TK_B
14e90 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
14ea0 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
14eb0 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
14ec0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
14ed0 74 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d  t_item *pLItem =
14ee0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
14ef0 3e 61 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  >a;.      Expr *
14f00 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d  pRight = pLItem-
14f10 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 63  >pExpr;..      c
14f20 6f 64 65 43 6f 6d 70 61 72 65 4f 70 65 72 61 6e  odeCompareOperan
14f30 64 73 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  ds(pParse, pLeft
14f40 2c 20 26 72 31 2c 20 26 72 65 67 46 72 65 65 31  , &r1, &regFree1
14f50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f70 20 20 20 20 70 52 69 67 68 74 2c 20 26 72 32 2c      pRight, &r2,
14f80 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
14f90 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
14fa0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
14fb0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
14fc0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
14fd0 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r3 = sqlite3Get
14fe0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
14ff0 0a 20 20 20 20 20 20 72 34 20 3d 20 73 71 6c 69  .      r4 = sqli
15000 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
15010 61 72 73 65 29 3b 0a 20 20 20 20 20 20 63 6f 64  arse);.      cod
15020 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
15030 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
15040 4f 50 5f 47 65 2c 0a 20 20 20 20 20 20 20 20 20  OP_Ge,.         
15050 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
15060 20 72 33 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52   r3, SQLITE_STOR
15070 45 50 32 29 3b 0a 20 20 20 20 20 20 70 4c 49 74  EP2);.      pLIt
15080 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69 67  em++;.      pRig
15090 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78  ht = pLItem->pEx
150a0 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
150b0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
150c0 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
150d0 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
150e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
150f0 70 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  p(pParse, pRight
15100 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
15110 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
15120 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
15130 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
15140 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
15150 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 72 31 2c  ight, OP_Le, r1,
15160 20 72 32 2c 20 72 34 2c 20 53 51 4c 49 54 45 5f   r2, r4, SQLITE_
15170 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20  STOREP2);.      
15180 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15190 33 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 72 33 2c  3(v, OP_And, r3,
151a0 20 72 34 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   r4, target);.  
151b0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
151c0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
151d0 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r3);.      sql
151e0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
151f0 65 67 28 70 50 61 72 73 65 2c 20 72 34 29 3b 0a  eg(pParse, r4);.
15200 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15210 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
15220 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e  PLUS: {.      in
15230 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
15240 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
15250 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
15260 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
15270 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
15280 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     /*.    ** For
15290 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  m A:.    **   CA
152a0 53 45 20 78 20 57 48 45 4e 20 65 31 20 54 48 45  SE x WHEN e1 THE
152b0 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45  N r1 WHEN e2 THE
152c0 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e  N r2 ... WHEN eN
152d0 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20   THEN rN ELSE y 
152e0 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  END.    **.    *
152f0 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a  * Form B:.    **
15300 20 20 20 43 41 53 45 20 57 48 45 4e 20 65 31 20     CASE WHEN e1 
15310 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20  THEN r1 WHEN e2 
15320 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e  THEN r2 ... WHEN
15330 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45   eN THEN rN ELSE
15340 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20   y END.    **.  
15350 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69 73 20 63    ** Form A is c
15360 61 6e 20 62 65 20 74 72 61 6e 73 66 6f 72 6d 65  an be transforme
15370 64 20 69 6e 74 6f 20 74 68 65 20 65 71 75 69 76  d into the equiv
15380 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20 61 73 20  alent form B as 
15390 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20  follows:.    ** 
153a0 20 20 43 41 53 45 20 57 48 45 4e 20 78 3d 65 31    CASE WHEN x=e1
153b0 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 78 3d   THEN r1 WHEN x=
153c0 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20  e2 THEN r2 .... 
153d0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 57 48 45     **        WHE
153e0 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45  N x=eN THEN rN E
153f0 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a  LSE y END.    **
15400 0a 20 20 20 20 2a 2a 20 58 20 28 69 66 20 69 74  .    ** X (if it
15410 20 65 78 69 73 74 73 29 20 69 73 20 69 6e 20 70   exists) is in p
15420 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20  Expr->pLeft..   
15430 20 2a 2a 20 59 20 69 73 20 69 6e 20 70 45 78 70   ** Y is in pExp
15440 72 2d 3e 70 52 69 67 68 74 2e 20 20 54 68 65 20  r->pRight.  The 
15450 59 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e  Y is also option
15460 61 6c 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  al.  If there is
15470 20 6e 6f 0a 20 20 20 20 2a 2a 20 45 4c 53 45 20   no.    ** ELSE 
15480 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 20 6f 74  clause and no ot
15490 68 65 72 20 74 65 72 6d 20 6d 61 74 63 68 65 73  her term matches
154a0 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
154b0 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  t of the.    ** 
154c0 65 78 70 72 73 73 69 6f 6e 20 69 73 20 4e 55 4c  exprssion is NUL
154d0 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20 69 73 20  L..    ** Ei is 
154e0 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  in pExpr->pList-
154f0 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20 69  >a[i*2] and Ri i
15500 73 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  s pExpr->pList->
15510 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a  a[i*2+1]..    **
15520 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73 75  .    ** The resu
15530 6c 74 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  lt of the expres
15540 73 69 6f 6e 20 69 73 20 74 68 65 20 52 69 20 66  sion is the Ri f
15550 6f 72 20 74 68 65 20 66 69 72 73 74 20 6d 61 74  or the first mat
15560 63 68 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a  ching Ei,.    **
15570 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 20   or if there is 
15580 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 20  no matching Ei, 
15590 74 68 65 20 45 4c 53 45 20 74 65 72 6d 20 59 2c  the ELSE term Y,
155a0 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 0a   or if there is.
155b0 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74      ** no ELSE t
155c0 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a  erm, NULL..    *
155d0 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41  /.    case TK_CA
155e0 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  SE: {.      int 
155f0 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20 20 20  endLabel;       
15600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15610 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20   GOTO label for 
15620 65 6e 64 20 6f 66 20 43 41 53 45 20 73 74 6d 74  end of CASE stmt
15630 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 65   */.      int ne
15640 78 74 43 61 73 65 3b 20 20 20 20 20 20 20 20 20  xtCase;         
15650 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
15660 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65  OTO label for ne
15670 78 74 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a  xt WHEN clause *
15680 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70  /.      int nExp
15690 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
156a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 78 20            /* 2x 
156b0 6e 75 6d 62 65 72 20 6f 66 20 57 48 45 4e 20 74  number of WHEN t
156c0 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  erms */.      in
156d0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
156e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156f0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
15700 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
15710 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
15720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
15730 73 74 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73  st of WHEN terms
15740 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
15750 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
15760 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41  aListelem;  /* A
15770 72 72 61 79 20 6f 66 20 57 48 45 4e 20 74 65 72  rray of WHEN ter
15780 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  ms */.      Expr
15790 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20 20 20   opCompare;     
157a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
157b0 20 54 68 65 20 58 3d 3d 45 69 20 65 78 70 72 65   The X==Ei expre
157c0 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ssion */.      E
157d0 78 70 72 20 63 61 63 68 65 58 3b 20 20 20 20 20  xpr cacheX;     
157e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157f0 20 2f 2a 20 43 61 63 68 65 64 20 65 78 70 72 65   /* Cached expre
15800 73 73 69 6f 6e 20 58 20 2a 2f 0a 20 20 20 20 20  ssion X */.     
15810 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20   Expr *pX;      
15820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15830 20 20 20 2f 2a 20 54 68 65 20 58 20 65 78 70 72     /* The X expr
15840 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
15850 45 78 70 72 20 2a 70 54 65 73 74 20 3d 20 30 3b  Expr *pTest = 0;
15860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15870 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d    /* X==Ei (form
15880 20 41 29 20 6f 72 20 6a 75 73 74 20 45 69 20 28   A) or just Ei (
15890 66 6f 72 6d 20 42 29 20 2a 2f 0a 20 20 20 20 20  form B) */.     
158a0 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 69   VVA_ONLY( int i
158b0 43 61 63 68 65 4c 65 76 65 6c 20 3d 20 70 50 61  CacheLevel = pPa
158c0 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
158d0 3b 20 29 0a 0a 20 20 20 20 20 20 61 73 73 65 72  ; )..      asser
158e0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
158f0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
15900 73 53 65 6c 65 63 74 29 20 26 26 20 70 45 78 70  sSelect) && pExp
15910 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20  r->x.pList );.  
15920 20 20 20 20 61 73 73 65 72 74 28 28 70 45 78 70      assert((pExp
15930 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
15940 72 20 25 20 32 29 20 3d 3d 20 30 29 3b 0a 20 20  r % 2) == 0);.  
15950 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70 72      assert(pExpr
15960 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
15970 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c   > 0);.      pEL
15980 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
15990 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73  List;.      aLis
159a0 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e  telem = pEList->
159b0 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d  a;.      nExpr =
159c0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
159d0 20 20 20 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d        endLabel =
159e0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
159f0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
15a00 69 66 28 20 28 70 58 20 3d 20 70 45 78 70 72 2d  if( (pX = pExpr-
15a10 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20  >pLeft)!=0 ){.  
15a20 20 20 20 20 20 20 63 61 63 68 65 58 20 3d 20 2a        cacheX = *
15a30 70 58 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  pX;.        test
15a40 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  case( pX->op==TK
15a50 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 58 2d 3e 6f  _COLUMN || pX->o
15a60 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
15a70 3b 0a 20 20 20 20 20 20 20 20 63 61 63 68 65 58  ;.        cacheX
15a80 2e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65  .iTable = sqlite
15a90 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
15aa0 61 72 73 65 2c 20 70 58 2c 20 26 72 65 67 46 72  arse, pX, &regFr
15ab0 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 74 65  ee1);.        te
15ac0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
15ad0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 63  ==0 );.        c
15ae0 61 63 68 65 58 2e 6f 70 20 3d 20 54 4b 5f 52 45  acheX.op = TK_RE
15af0 47 49 53 54 45 52 3b 0a 20 20 20 20 20 20 20 20  GISTER;.        
15b00 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54  opCompare.op = T
15b10 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20 6f 70  K_EQ;.        op
15b20 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d 20  Compare.pLeft = 
15b30 26 63 61 63 68 65 58 3b 0a 20 20 20 20 20 20 20  &cacheX;.       
15b40 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d 70   pTest = &opComp
15b50 61 72 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  are;.      }.   
15b60 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
15b70 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20  xpr; i=i+2){.   
15b80 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
15b90 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
15ba0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
15bb0 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  X ){.          a
15bc0 73 73 65 72 74 28 20 70 54 65 73 74 21 3d 30 20  ssert( pTest!=0 
15bd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 43  );.          opC
15be0 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d 20  ompare.pRight = 
15bf0 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78  aListelem[i].pEx
15c00 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  pr;.        }els
15c10 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65  e{.          pTe
15c20 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69  st = aListelem[i
15c30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
15c40 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74 43   }.        nextC
15c50 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ase = sqlite3Vdb
15c60 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
15c70 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
15c80 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43   pTest->op==TK_C
15c90 4f 4c 55 4d 4e 20 7c 7c 20 70 54 65 73 74 2d 3e  OLUMN || pTest->
15ca0 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
15cb0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
15cc0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
15cd0 61 72 73 65 2c 20 70 54 65 73 74 2c 20 6e 65 78  arse, pTest, nex
15ce0 74 43 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55  tCase, SQLITE_JU
15cf0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
15d00 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4c 69     testcase( aLi
15d10 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70  stelem[i+1].pExp
15d20 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
15d30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
15d40 63 61 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b  case( aListelem[
15d50 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d  i+1].pExpr->op==
15d60 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20  TK_REGISTER );. 
15d70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
15d80 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61  prCode(pParse, a
15d90 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45  Listelem[i+1].pE
15da0 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
15db0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15dc0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
15dd0 74 6f 2c 20 30 2c 20 65 6e 64 4c 61 62 65 6c 29  to, 0, endLabel)
15de0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15df0 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
15e00 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20  arse, 1);.      
15e10 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
15e20 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65 78  olveLabel(v, nex
15e30 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  tCase);.      }.
15e40 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
15e50 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  >pRight ){.     
15e60 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
15e70 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
15e80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15e90 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
15ea0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
15eb0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
15ec0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
15ed0 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b  ePop(pParse, 1);
15ee0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
15ef0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15f00 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
15f10 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
15f20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
15f30 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
15f40 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  Failed || pParse
15f50 2d 3e 6e 45 72 72 3e 30 20 0a 20 20 20 20 20 20  ->nErr>0 .      
15f60 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e       || pParse->
15f70 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 69 43 61  iCacheLevel==iCa
15f80 63 68 65 4c 65 76 65 6c 20 29 3b 0a 20 20 20 20  cheLevel );.    
15f90 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
15fa0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
15fb0 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 62 72  Label);.      br
15fc0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
15fd0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
15fe0 52 49 47 47 45 52 0a 20 20 20 20 63 61 73 65 20  RIGGER.    case 
15ff0 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20  TK_RAISE: {.    
16000 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 74    if( !pParse->t
16010 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20 20  rigStack ){.    
16020 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
16030 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
16040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16050 20 20 20 22 52 41 49 53 45 28 29 20 6d 61 79 20     "RAISE() may 
16060 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74  only be used wit
16070 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72  hin a trigger-pr
16080 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20  ogram");.       
16090 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
160a0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   }.      if( pEx
160b0 70 72 2d 3e 61 66 66 69 6e 69 74 79 21 3d 4f 45  pr->affinity!=OE
160c0 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20  _Ignore ){.     
160d0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
160e0 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
160f0 52 6f 6c 6c 62 61 63 6b 20 7c 7c 0a 20 20 20 20  Rollback ||.    
16100 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
16110 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 3d 20  pr->affinity == 
16120 4f 45 5f 41 62 6f 72 74 20 7c 7c 0a 20 20 20 20  OE_Abort ||.    
16130 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
16140 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 3d 20  pr->affinity == 
16150 4f 45 5f 46 61 69 6c 20 29 3b 0a 20 20 20 20 20  OE_Fail );.     
16160 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
16170 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
16180 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
16190 20 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c   );.         sql
161a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
161b0 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54  , OP_Halt, SQLIT
161c0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 70 45  E_CONSTRAINT, pE
161d0 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20 30  xpr->affinity, 0
161e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
161f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
16200 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29  pr->u.zToken, 0)
16210 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ;.      } else {
16220 0a 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74  .         assert
16230 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  ( pExpr->affinit
16240 79 20 3d 3d 20 4f 45 5f 49 67 6e 6f 72 65 20 29  y == OE_Ignore )
16250 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  ;.         sqlit
16260 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16270 4f 50 5f 43 6f 6e 74 65 78 74 50 6f 70 2c 20 30  OP_ContextPop, 0
16280 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 73  , 0);.         s
16290 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
162a0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
162b0 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63  pParse->trigStac
162c0 6b 2d 3e 69 67 6e 6f 72 65 4a 75 6d 70 29 3b 0a  k->ignoreJump);.
162d0 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d           VdbeCom
162e0 6d 65 6e 74 28 28 76 2c 20 22 72 61 69 73 65 28  ment((v, "raise(
162f0 49 47 4e 4f 52 45 29 22 29 29 3b 0a 20 20 20 20  IGNORE)"));.    
16300 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
16310 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
16320 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
16330 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
16340 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73  , regFree1);.  s
16350 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
16360 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
16370 46 72 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e  Free2);.  return
16380 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   inReg;.}../*.**
16390 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
163a0 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 65 78  o evaluate an ex
163b0 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f  pression and sto
163c0 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  re the results.*
163d0 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65  * into a registe
163e0 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  r.  Return the r
163f0 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77  egister number w
16400 68 65 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  here the results
16410 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 2e 0a  .** are stored..
16420 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 67  **.** If the reg
16430 69 73 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f  ister is a tempo
16440 72 61 72 79 20 72 65 67 69 73 74 65 72 20 74 68  rary register th
16450 61 74 20 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f  at can be deallo
16460 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77  cated,.** then w
16470 72 69 74 65 20 69 74 73 20 6e 75 6d 62 65 72 20  rite its number 
16480 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49 66 20  into *pReg.  If 
16490 74 68 65 20 72 65 73 75 6c 74 20 72 65 67 69 73  the result regis
164a0 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20  ter is not.** a 
164b0 74 65 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e 20  temporary, then 
164c0 73 65 74 20 2a 70 52 65 67 20 74 6f 20 7a 65 72  set *pReg to zer
164d0 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
164e0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 50 61  3ExprCodeTemp(Pa
164f0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
16500 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70  r *pExpr, int *p
16510 52 65 67 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d  Reg){.  int r1 =
16520 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
16530 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e  eg(pParse);.  in
16540 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78  t r2 = sqlite3Ex
16550 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
16560 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29 3b  rse, pExpr, r1);
16570 0a 20 20 69 66 28 20 72 32 3d 3d 72 31 20 29 7b  .  if( r2==r1 ){
16580 0a 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b  .    *pReg = r1;
16590 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
165a0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
165b0 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
165c0 0a 20 20 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a  .    *pReg = 0;.
165d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32 3b    }.  return r2;
165e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
165f0 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
16600 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65  l evaluate expre
16610 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20  ssion pExpr and 
16620 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73  store the.** res
16630 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72  ults in register
16640 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65   target.  The re
16650 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e  sults are guaran
16660 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a  teed to appear.*
16670 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  * in register ta
16680 72 67 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rget..*/.int sql
16690 69 74 65 33 45 78 70 72 43 6f 64 65 28 50 61 72  ite3ExprCode(Par
166a0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
166b0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
166c0 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65  get){.  int inRe
166d0 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61  g;..  assert( ta
166e0 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74  rget>0 && target
166f0 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29  <=pParse->nMem )
16700 3b 0a 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69  ;.  inReg = sqli
16710 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
16720 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
16730 20 74 61 72 67 65 74 29 3b 0a 20 20 61 73 73 65   target);.  asse
16740 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62  rt( pParse->pVdb
16750 65 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  e || pParse->db-
16760 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
16770 0a 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61  .  if( inReg!=ta
16780 72 67 65 74 20 26 26 20 70 50 61 72 73 65 2d 3e  rget && pParse->
16790 70 56 64 62 65 20 29 7b 0a 20 20 20 20 73 71 6c  pVdbe ){.    sql
167a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70  ite3VdbeAddOp2(p
167b0 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
167c0 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74  _SCopy, inReg, t
167d0 61 72 67 65 74 29 3b 0a 20 20 7d 0a 20 20 72 65  arget);.  }.  re
167e0 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 7d 0a 0a  turn target;.}..
167f0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
16800 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 74 65  ode that evalute
16810 73 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  s the given expr
16820 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74 73 20  ession and puts 
16830 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  the result.** in
16840 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
16850 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b  ..**.** Also mak
16860 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
16870 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73 75 6c  expression resul
16880 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20  ts into another 
16890 22 63 61 63 68 65 22 20 72 65 67 69 73 74 65 72  "cache" register
168a0 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20 74  .** and modify t
168b0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f  he expression so
168c0 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 74   that the next t
168d0 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c 75 61  ime it is evalua
168e0 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75  ted,.** the resu
168f0 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  lt is a copy of 
16900 74 68 65 20 63 61 63 68 65 20 72 65 67 69 73 74  the cache regist
16910 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
16920 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
16930 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  or expressions t
16940 68 61 74 20 61 72 65 20 75 73 65 64 20 6d 75 6c  hat are used mul
16950 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e  tiple .** times.
16960 20 20 54 68 65 79 20 61 72 65 20 65 76 61 6c 75    They are evalu
16970 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20 74 68  ated once and th
16980 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
16990 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61   expression.** a
169a0 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 69 6e  re reused..*/.in
169b0 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
169c0 65 41 6e 64 43 61 63 68 65 28 50 61 72 73 65 20  eAndCache(Parse 
169d0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
169e0 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
169f0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
16a00 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
16a10 69 6e 74 20 69 6e 52 65 67 3b 0a 20 20 69 6e 52  int inReg;.  inR
16a20 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
16a30 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
16a40 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 61  pr, target);.  a
16a50 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
16a60 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  );.  if( pExpr->
16a70 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op!=TK_REGISTER 
16a80 29 7b 20 20 0a 20 20 20 20 69 6e 74 20 69 4d 65  ){  .    int iMe
16a90 6d 3b 0a 20 20 20 20 69 4d 65 6d 20 3d 20 2b 2b  m;.    iMem = ++
16aa0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
16ab0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16ac0 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
16ad0 69 6e 52 65 67 2c 20 69 4d 65 6d 29 3b 0a 20 20  inReg, iMem);.  
16ae0 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
16af0 3d 20 69 4d 65 6d 3b 0a 20 20 20 20 70 45 78 70  = iMem;.    pExp
16b00 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53  r->op = TK_REGIS
16b10 54 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  TER;.  }.  retur
16b20 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  n inReg;.}../*.*
16b30 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
16b40 20 70 45 78 70 72 20 69 73 20 61 6e 20 63 6f 6e   pExpr is an con
16b50 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  stant expression
16b60 20 74 68 61 74 20 69 73 20 61 70 70 72 6f 70 72   that is appropr
16b70 69 61 74 65 0a 2a 2a 20 66 6f 72 20 66 61 63 74  iate.** for fact
16b80 6f 72 69 6e 67 20 6f 75 74 20 6f 66 20 61 20 6c  oring out of a l
16b90 6f 6f 70 2e 20 20 41 70 70 72 6f 70 72 69 61 74  oop.  Appropriat
16ba0 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  e expressions ar
16bb0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 41  e:.**.**    *  A
16bc0 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  ny expression th
16bd0 61 74 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  at evaluates to 
16be0 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 70 63 6f  two or more opco
16bf0 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  des..**.**    * 
16c00 20 41 6e 79 20 4f 50 5f 49 6e 74 65 67 65 72 2c   Any OP_Integer,
16c10 20 4f 50 5f 52 65 61 6c 2c 20 4f 50 5f 53 74 72   OP_Real, OP_Str
16c20 69 6e 67 2c 20 4f 50 5f 42 6c 6f 62 2c 20 4f 50  ing, OP_Blob, OP
16c30 5f 4e 75 6c 6c 2c 20 0a 2a 2a 20 20 20 20 20 20  _Null, .**      
16c40 20 6f 72 20 4f 50 5f 56 61 72 69 61 62 6c 65 20   or OP_Variable 
16c50 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  that does not ne
16c60 65 64 20 74 6f 20 62 65 20 70 6c 61 63 65 64 20  ed to be placed 
16c70 69 6e 20 61 20 0a 2a 2a 20 20 20 20 20 20 20 73  in a .**       s
16c80 70 65 63 69 66 69 63 20 72 65 67 69 73 74 65 72  pecific register
16c90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  ..**.** There is
16ca0 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 66 61 63   no point in fac
16cb0 74 6f 72 69 6e 67 20 6f 75 74 20 73 69 6e 67 6c  toring out singl
16cc0 65 2d 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f  e-instruction co
16cd0 6e 73 74 61 6e 74 0a 2a 2a 20 65 78 70 72 65 73  nstant.** expres
16ce0 73 69 6f 6e 73 20 74 68 61 74 20 6e 65 65 64 20  sions that need 
16cf0 74 6f 20 62 65 20 70 6c 61 63 65 64 20 69 6e 20  to be placed in 
16d00 61 20 70 61 72 74 69 63 75 6c 61 72 20 72 65 67  a particular reg
16d10 69 73 74 65 72 2e 20 20 0a 2a 2a 20 57 65 20 63  ister.  .** We c
16d20 6f 75 6c 64 20 66 61 63 74 6f 72 20 74 68 65 6d  ould factor them
16d30 20 6f 75 74 2c 20 62 75 74 20 74 68 65 6e 20 77   out, but then w
16d40 65 20 77 6f 75 6c 64 20 65 6e 64 20 75 70 20 61  e would end up a
16d50 64 64 69 6e 67 20 61 6e 0a 2a 2a 20 4f 50 5f 53  dding an.** OP_S
16d60 43 6f 70 79 20 69 6e 73 74 72 75 63 74 69 6f 6e  Copy instruction
16d70 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 76 61 6c   to move the val
16d80 75 65 20 69 6e 74 6f 20 74 68 65 20 63 6f 72 72  ue into the corr
16d90 65 63 74 20 72 65 67 69 73 74 65 72 0a 2a 2a 20  ect register.** 
16da0 6c 61 74 65 72 2e 20 20 57 65 20 6d 69 67 68 74  later.  We might
16db0 20 61 73 20 77 65 6c 6c 20 6a 75 73 74 20 75 73   as well just us
16dc0 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 69  e the original i
16dd0 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 0a 2a  nstruction and.*
16de0 2a 20 61 76 6f 69 64 20 74 68 65 20 4f 50 5f 53  * avoid the OP_S
16df0 43 6f 70 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Copy..*/.static 
16e00 69 6e 74 20 69 73 41 70 70 72 6f 70 72 69 61 74  int isAppropriat
16e10 65 46 6f 72 46 61 63 74 6f 72 69 6e 67 28 45 78  eForFactoring(Ex
16e20 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 21 73  pr *p){.  if( !s
16e30 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
16e40 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 29 20 29  tantNotJoin(p) )
16e50 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
16e60 20 2f 2a 20 4f 6e 6c 79 20 63 6f 6e 73 74 61 6e   /* Only constan
16e70 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  t expressions ar
16e80 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  e appropriate fo
16e90 72 20 66 61 63 74 6f 72 69 6e 67 20 2a 2f 0a 20  r factoring */. 
16ea0 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 66 6c 61   }.  if( (p->fla
16eb0 67 73 20 26 20 45 50 5f 46 69 78 65 64 44 65 73  gs & EP_FixedDes
16ec0 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  t)==0 ){.    ret
16ed0 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6e 79 20 63  urn 1;  /* Any c
16ee0 6f 6e 73 74 61 6e 74 20 77 69 74 68 6f 75 74 20  onstant without 
16ef0 61 20 66 69 78 65 64 20 64 65 73 74 69 6e 61 74  a fixed destinat
16f00 69 6f 6e 20 69 73 20 61 70 70 72 6f 70 72 69 61  ion is appropria
16f10 74 65 20 2a 2f 0a 20 20 7d 0a 20 20 77 68 69 6c  te */.  }.  whil
16f20 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c  e( p->op==TK_UPL
16f30 55 53 20 29 20 70 20 3d 20 70 2d 3e 70 4c 65 66  US ) p = p->pLef
16f40 74 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e  t;.  switch( p->
16f50 6f 70 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  op ){.#ifndef SQ
16f60 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c  LITE_OMIT_BLOB_L
16f70 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20  ITERAL.    case 
16f80 54 4b 5f 42 4c 4f 42 3a 0a 23 65 6e 64 69 66 0a  TK_BLOB:.#endif.
16f90 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
16fa0 41 42 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  ABLE:.    case T
16fb0 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63  K_INTEGER:.    c
16fc0 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20  ase TK_FLOAT:.  
16fd0 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a    case TK_NULL:.
16fe0 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
16ff0 4e 47 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  NG: {.      test
17000 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  case( p->op==TK_
17010 42 4c 4f 42 20 29 3b 0a 20 20 20 20 20 20 74 65  BLOB );.      te
17020 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
17030 4b 5f 56 41 52 49 41 42 4c 45 20 29 3b 0a 20 20  K_VARIABLE );.  
17040 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
17050 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20  >op==TK_INTEGER 
17060 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
17070 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f  e( p->op==TK_FLO
17080 41 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  AT );.      test
17090 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  case( p->op==TK_
170a0 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65  NULL );.      te
170b0 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
170c0 4b 5f 53 54 52 49 4e 47 20 29 3b 0a 20 20 20 20  K_STRING );.    
170d0 20 20 2f 2a 20 53 69 6e 67 6c 65 2d 69 6e 73 74    /* Single-inst
170e0 72 75 63 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74  ruction constant
170f0 73 20 77 69 74 68 20 61 20 66 69 78 65 64 20 64  s with a fixed d
17100 65 73 74 69 6e 61 74 69 6f 6e 20 61 72 65 0a 20  estination are. 
17110 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20 64       ** better d
17120 6f 6e 65 20 69 6e 2d 6c 69 6e 65 2e 20 20 49 66  one in-line.  If
17130 20 77 65 20 66 61 63 74 6f 72 20 74 68 65 6d 2c   we factor them,
17140 20 74 68 65 79 20 77 69 6c 6c 20 6a 75 73 74 20   they will just 
17150 65 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75 70 20  end.      ** up 
17160 67 65 6e 65 72 61 74 69 6e 67 20 61 6e 20 4f 50  generating an OP
17170 5f 53 43 6f 70 79 20 74 6f 20 6d 6f 76 65 20 74  _SCopy to move t
17180 68 65 20 76 61 6c 75 65 20 74 6f 20 74 68 65 20  he value to the 
17190 64 65 73 74 69 6e 61 74 69 6f 6e 0a 20 20 20 20  destination.    
171a0 20 20 2a 2a 20 72 65 67 69 73 74 65 72 2e 20 2a    ** register. *
171b0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  /.      return 0
171c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
171d0 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20   TK_UMINUS: {.  
171e0 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66       if( p->pLef
171f0 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  t->op==TK_FLOAT 
17200 7c 7c 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  || p->pLeft->op=
17210 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  =TK_INTEGER ){. 
17220 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
17230 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ;.       }.     
17240 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
17250 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
17260 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17270 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
17280 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 45 78  .}../*.** If pEx
17290 70 72 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  pr is a constant
172a0 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
172b0 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
172c0 66 6f 72 0a 2a 2a 20 66 61 63 74 6f 72 69 6e 67  for.** factoring
172d0 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2c 20   out of a loop, 
172e0 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20 74 68  then evaluate th
172f0 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
17300 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 20  into a register 
17310 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 68 65 20  and convert the 
17320 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 74 6f 20  expression into 
17330 61 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 2a 2a  a TK_REGISTER.**
17340 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a   expression..*/.
17350 73 74 61 74 69 63 20 69 6e 74 20 65 76 61 6c 43  static int evalC
17360 6f 6e 73 74 45 78 70 72 28 57 61 6c 6b 65 72 20  onstExpr(Walker 
17370 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
17380 70 45 78 70 72 29 7b 0a 20 20 50 61 72 73 65 20  pExpr){.  Parse 
17390 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65  *pParse = pWalke
173a0 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 77 69  r->pParse;.  swi
173b0 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
173c0 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  {.    case TK_RE
173d0 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20  GISTER: {.      
173e0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
173f0 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
17400 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  TION:.    case T
17410 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a  K_AGG_FUNCTION:.
17420 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53      case TK_CONS
17430 54 5f 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20  T_FUNC: {.      
17440 2f 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73  /* The arguments
17450 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 68   to a function h
17460 61 76 65 20 61 20 66 69 78 65 64 20 64 65 73 74  ave a fixed dest
17470 69 6e 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  ination..      *
17480 2a 20 4d 61 72 6b 20 74 68 65 6d 20 74 68 69 73  * Mark them this
17490 20 77 61 79 20 74 6f 20 61 76 6f 69 64 20 67 65   way to avoid ge
174a0 6e 65 72 61 74 65 64 20 75 6e 6e 65 65 64 65 64  nerated unneeded
174b0 20 4f 50 5f 53 43 6f 70 79 0a 20 20 20 20 20 20   OP_SCopy.      
174c0 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e  ** instructions.
174d0 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
174e0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
174f0 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
17500 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
17510 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
17520 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
17530 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
17540 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
17550 20 20 20 20 20 69 6e 74 20 69 20 3d 20 70 4c 69       int i = pLi
17560 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
17570 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
17580 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
17590 20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20   pList->a;.     
175a0 20 20 20 66 6f 72 28 3b 20 69 3e 30 3b 20 69 2d     for(; i>0; i-
175b0 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
175c0 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
175d0 2d 3e 70 45 78 70 72 20 29 20 70 49 74 65 6d 2d  ->pExpr ) pItem-
175e0 3e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d  >pExpr->flags |=
175f0 20 45 50 5f 46 69 78 65 64 44 65 73 74 3b 0a 20   EP_FixedDest;. 
17600 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
17610 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
17620 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73    }.  }.  if( is
17630 41 70 70 72 6f 70 72 69 61 74 65 46 6f 72 46 61  AppropriateForFa
17640 63 74 6f 72 69 6e 67 28 70 45 78 70 72 29 20 29  ctoring(pExpr) )
17650 7b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20 2b  {.    int r1 = +
17660 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
17670 20 20 20 69 6e 74 20 72 32 3b 0a 20 20 20 20 72     int r2;.    r
17680 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
17690 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
176a0 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20  , pExpr, r1);.  
176b0 20 20 69 66 28 20 72 31 21 3d 72 32 20 29 20 73    if( r1!=r2 ) s
176c0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
176d0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
176e0 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20  ;.    pExpr->op 
176f0 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20  = TK_REGISTER;. 
17700 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
17710 20 3d 20 72 32 3b 0a 20 20 20 20 72 65 74 75 72   = r2;.    retur
17720 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
17730 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
17740 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
17750 20 50 72 65 65 76 61 6c 75 61 74 65 20 63 6f 6e   Preevaluate con
17760 73 74 61 6e 74 20 73 75 62 65 78 70 72 65 73 73  stant subexpress
17770 69 6f 6e 73 20 77 69 74 68 69 6e 20 70 45 78 70  ions within pExp
17780 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a  r and store the.
17790 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65  ** results in re
177a0 67 69 73 74 65 72 73 2e 20 20 4d 6f 64 69 66 79  gisters.  Modify
177b0 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 74   pExpr so that t
177c0 68 65 20 63 6f 6e 73 74 61 6e 74 20 73 75 62 65  he constant sube
177d0 78 70 72 65 73 69 6f 6e 73 0a 2a 2a 20 61 72 65  xpresions.** are
177e0 20 54 4b 5f 52 45 47 49 53 54 45 52 20 6f 70 63   TK_REGISTER opc
177f0 6f 64 65 73 20 74 68 61 74 20 72 65 66 65 72 20  odes that refer 
17800 74 6f 20 74 68 65 20 70 72 65 63 6f 6d 70 75 74  to the precomput
17810 65 64 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 76 6f  ed values..*/.vo
17820 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
17830 64 65 43 6f 6e 73 74 61 6e 74 73 28 50 61 72 73  deConstants(Pars
17840 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
17850 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65  *pExpr){.  Walke
17860 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  r w;.  w.xExprCa
17870 6c 6c 62 61 63 6b 20 3d 20 65 76 61 6c 43 6f 6e  llback = evalCon
17880 73 74 45 78 70 72 3b 0a 20 20 77 2e 78 53 65 6c  stExpr;.  w.xSel
17890 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b  ectCallback = 0;
178a0 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50  .  w.pParse = pP
178b0 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57  arse;.  sqlite3W
178c0 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70  alkExpr(&w, pExp
178d0 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  r);.}.../*.** Ge
178e0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
178f0 20 70 75 73 68 65 73 20 74 68 65 20 76 61 6c 75   pushes the valu
17900 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65  e of every eleme
17910 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a  nt of the given.
17920 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
17930 73 74 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e  st into a sequen
17940 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ce of registers 
17950 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72  beginning at tar
17960 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  get..**.** Retur
17970 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
17980 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74  elements evaluat
17990 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
179a0 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
179b0 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
179c0 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73  rse,     /* Pars
179d0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
179e0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
179f0 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65  ,   /* The expre
17a00 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65  ssion list to be
17a10 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
17a20 74 61 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f  target,        /
17a30 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65  * Where to write
17a40 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
17a50 74 20 64 6f 48 61 72 64 43 6f 70 79 20 20 20 20  t doHardCopy    
17a60 20 2f 2a 20 4d 61 6b 65 20 61 20 68 61 72 64 20   /* Make a hard 
17a70 63 6f 70 79 20 6f 66 20 65 76 65 72 79 20 65 6c  copy of every el
17a80 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 74  ement */.){.  st
17a90 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
17aa0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
17ab0 20 69 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74 28   i, n;.  assert(
17ac0 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61   pList!=0 );.  a
17ad0 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
17ae0 29 3b 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e  );.  n = pList->
17af0 6e 45 78 70 72 3b 0a 20 20 66 6f 72 28 70 49 74  nExpr;.  for(pIt
17b00 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
17b10 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65  ; i<n; i++, pIte
17b20 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 49  m++){.    if( pI
17b30 74 65 6d 2d 3e 69 41 6c 69 61 73 20 29 7b 0a 20  tem->iAlias ){. 
17b40 20 20 20 20 20 69 6e 74 20 69 52 65 67 20 3d 20       int iReg = 
17b50 63 6f 64 65 41 6c 69 61 73 28 70 50 61 72 73 65  codeAlias(pParse
17b60 2c 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 2c  , pItem->iAlias,
17b70 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 74   pItem->pExpr, t
17b80 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20  arget+i);.      
17b90 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
17ba0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
17bb0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 52 65 67  ;.      if( iReg
17bc0 21 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20  !=target+i ){.  
17bd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17be0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
17bf0 6f 70 79 2c 20 69 52 65 67 2c 20 74 61 72 67 65  opy, iReg, targe
17c00 74 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t+i);.      }.  
17c10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
17c20 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
17c30 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45  Parse, pItem->pE
17c40 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a  xpr, target+i);.
17c50 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 6f      }.    if( do
17c60 48 61 72 64 43 6f 70 79 20 29 7b 0a 20 20 20 20  HardCopy ){.    
17c70 20 20 73 71 6c 69 74 65 33 45 78 70 72 48 61 72    sqlite3ExprHar
17c80 64 43 6f 70 79 28 70 50 61 72 73 65 2c 20 74 61  dCopy(pParse, ta
17c90 72 67 65 74 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a  rget, n);.    }.
17ca0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a    }.  return n;.
17cb0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
17cc0 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f  e code for a boo
17cd0 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lean expression 
17ce0 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70  such that a jump
17cf0 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74   is made.** to t
17d00 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20  he label "dest" 
17d10 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
17d20 6e 20 69 73 20 74 72 75 65 20 62 75 74 20 65 78  n is true but ex
17d30 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69  ecution.** conti
17d40 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68  nues straight th
17d50 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ru if the expres
17d60 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a  sion is false..*
17d70 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
17d80 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  ession evaluates
17d90 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65   to NULL (neithe
17da0 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65  r true nor false
17db0 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20  ), then.** take 
17dc0 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20  the jump if the 
17dd0 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20  jumpIfNull flag 
17de0 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  is SQLITE_JUMPIF
17df0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  NULL..**.** This
17e00 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e   code depends on
17e10 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 63   the fact that c
17e20 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c  ertain token val
17e30 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a  ues (ex: TK_EQ).
17e40 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  ** are the same 
17e50 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73  as opcode values
17e60 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61   (ex: OP_Eq) tha
17e70 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  t implement the 
17e80 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
17e90 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65   operation.  Spe
17ea0 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e  cial comments in
17eb0 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20   vdbe.c and the 
17ec0 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63  mkopcodeh.awk sc
17ed0 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d  ript in.** the m
17ee0 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75 73  ake process caus
17ef0 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74  e these values t
17f00 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74  o align.  Assert
17f10 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a  ()s in the code.
17f20 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20  ** below verify 
17f30 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73  that the numbers
17f40 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72   are aligned cor
17f50 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  rectly..*/.void 
17f60 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
17f70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
17f80 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
17f90 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70  t dest, int jump
17fa0 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20  IfNull){.  Vdbe 
17fb0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
17fc0 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30  be;.  int op = 0
17fd0 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31  ;.  int regFree1
17fe0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
17ff0 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree2 = 0;.  int 
18000 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72  r1, r2;..  asser
18010 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  t( jumpIfNull==S
18020 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
18030 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   || jumpIfNull==
18040 30 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  0 );.  if( v==0 
18050 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  || pExpr==0 ) re
18060 74 75 72 6e 3b 0a 20 20 6f 70 20 3d 20 70 45 78  turn;.  op = pEx
18070 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68  pr->op;.  switch
18080 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
18090 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20   TK_AND: {.     
180a0 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65   int d2 = sqlite
180b0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
180c0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
180d0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
180e0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
180f0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
18100 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
18110 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
18120 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
18130 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66  pLeft, d2,jumpIf
18140 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50  Null^SQLITE_JUMP
18150 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
18160 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
18170 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
18180 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
18190 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
181a0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
181b0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b  lveLabel(v, d2);
181c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
181d0 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
181e0 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65  e, 1);.      bre
181f0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
18200 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20  se TK_OR: {.    
18210 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
18220 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
18230 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
18240 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
18250 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
18260 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
18270 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
18280 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
18290 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
182a0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
182b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
182c0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
182d0 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OT: {.      test
182e0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
182f0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
18300 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
18310 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
18320 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
18330 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
18340 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
18350 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
18360 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
18370 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
18380 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
18390 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
183a0 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
183b0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
183c0 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20  T==OP_Lt );.    
183d0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d    assert( TK_LE=
183e0 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20  =OP_Le );.      
183f0 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f  assert( TK_GT==O
18400 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Gt );.      as
18410 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f  sert( TK_GE==OP_
18420 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Ge );.      asse
18430 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71  rt( TK_EQ==OP_Eq
18440 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
18450 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29  ( TK_NE==OP_Ne )
18460 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
18470 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20  ( op==TK_LT );. 
18480 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
18490 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20  p==TK_LE );.    
184a0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
184b0 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74  TK_GT );.      t
184c0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
184d0 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GE );.      test
184e0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20  case( op==TK_EQ 
184f0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
18500 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a  e( op==TK_NE );.
18510 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
18520 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
18530 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
18540 72 65 4f 70 65 72 61 6e 64 73 28 70 50 61 72 73  reOperands(pPars
18550 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
18560 20 26 72 31 2c 20 26 72 65 67 46 72 65 65 31 2c   &r1, &regFree1,
18570 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18590 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
185a0 2c 20 26 72 32 2c 20 26 72 65 67 46 72 65 65 32  , &r2, &regFree2
185b0 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
185c0 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
185d0 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
185e0 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
185f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18600 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75  r1, r2, dest, ju
18610 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
18620 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
18630 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
18640 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
18650 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
18660 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
18670 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
18680 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
18690 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ULL: {.      ass
186a0 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d  ert( TK_ISNULL==
186b0 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20  OP_IsNull );.   
186c0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
186d0 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  TNULL==OP_NotNul
186e0 6c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  l );.      testc
186f0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
18700 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LL );.      test
18710 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
18720 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31  NULL );.      r1
18730 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
18740 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
18750 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
18760 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73  gFree1);.      s
18770 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18780 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74  (v, op, r1, dest
18790 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
187a0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
187b0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
187c0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
187d0 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
187e0 20 20 2f 2a 20 20 20 20 78 20 42 45 54 57 45 45    /*    x BETWEE
187f0 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 20 20  N y AND z.      
18800 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 73 20 65  **.      ** Is e
18810 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20  quivalent to .  
18820 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
18830 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a     x>=y AND x<=z
18840 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
18850 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73 75  ** Code it as su
18860 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65 20  ch, taking care 
18870 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e  to do the common
18880 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 20   subexpression. 
18890 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 61       ** elementa
188a0 74 69 6f 6e 20 6f 66 20 78 2e 0a 20 20 20 20 20  tion of x..     
188b0 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 65   */.      Expr e
188c0 78 70 72 41 6e 64 3b 0a 20 20 20 20 20 20 45 78  xprAnd;.      Ex
188d0 70 72 20 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 20  pr compLeft;.   
188e0 20 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68     Expr compRigh
188f0 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 65 78  t;.      Expr ex
18900 70 72 58 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  prX;..      asse
18910 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
18920 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
18930 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
18940 20 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70     exprX = *pExp
18950 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
18960 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f  exprAnd.op = TK_
18970 41 4e 44 3b 0a 20 20 20 20 20 20 65 78 70 72 41  AND;.      exprA
18980 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70  nd.pLeft = &comp
18990 4c 65 66 74 3b 0a 20 20 20 20 20 20 65 78 70 72  Left;.      expr
189a0 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26 63 6f  And.pRight = &co
189b0 6d 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 63  mpRight;.      c
189c0 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f  ompLeft.op = TK_
189d0 47 45 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65  GE;.      compLe
189e0 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72  ft.pLeft = &expr
189f0 58 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66  X;.      compLef
18a00 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72  t.pRight = pExpr
18a10 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ->x.pList->a[0].
18a20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 63 6f 6d  pExpr;.      com
18a30 70 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c  pRight.op = TK_L
18a40 45 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52 69 67  E;.      compRig
18a50 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72  ht.pLeft = &expr
18a60 58 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52 69 67  X;.      compRig
18a70 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70  ht.pRight = pExp
18a80 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d  r->x.pList->a[1]
18a90 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 65 78  .pExpr;.      ex
18aa0 70 72 58 2e 69 54 61 62 6c 65 20 3d 20 73 71 6c  prX.iTable = sql
18ab0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
18ac0 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 58 2c  (pParse, &exprX,
18ad0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
18ae0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
18af0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
18b00 20 20 65 78 70 72 58 2e 6f 70 20 3d 20 54 4b 5f    exprX.op = TK_
18b10 52 45 47 49 53 54 45 52 3b 0a 20 20 20 20 20 20  REGISTER;.      
18b20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
18b30 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
18b40 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
18b50 75 65 28 70 50 61 72 73 65 2c 20 26 65 78 70 72  ue(pParse, &expr
18b60 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  And, dest, jumpI
18b70 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
18b80 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
18b90 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
18ba0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
18bb0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
18bc0 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65   pExpr, &regFree
18bd0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
18be0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
18bf0 50 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c 20  P_If, r1, dest, 
18c00 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a  jumpIfNull!=0);.
18c10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
18c20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
18c30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
18c40 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
18c50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18c60 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
18c70 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
18c80 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
18c90 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
18ca0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
18cb0 2c 20 72 65 67 46 72 65 65 32 29 3b 20 20 0a 7d  , regFree2);  .}
18cc0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
18cd0 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c   code for a bool
18ce0 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73  ean expression s
18cf0 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20  uch that a jump 
18d00 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68  is made.** to th
18d10 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69  e label "dest" i
18d20 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
18d30 20 69 73 20 66 61 6c 73 65 20 62 75 74 20 65 78   is false but ex
18d40 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69  ecution.** conti
18d50 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68  nues straight th
18d60 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ru if the expres
18d70 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a  sion is true..**
18d80 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
18d90 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20  ssion evaluates 
18da0 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72  to NULL (neither
18db0 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29   true nor false)
18dc0 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66   then.** jump if
18dd0 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 53   jumpIfNull is S
18de0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
18df0 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68   or fall through
18e00 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a   if jumpIfNull.*
18e10 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20  * is 0..*/.void 
18e20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
18e30 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  se(Parse *pParse
18e40 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
18e50 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d  nt dest, int jum
18e60 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65  pIfNull){.  Vdbe
18e70 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
18e80 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20  dbe;.  int op = 
18e90 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
18ea0 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  1 = 0;.  int reg
18eb0 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74  Free2 = 0;.  int
18ec0 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65   r1, r2;..  asse
18ed0 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  rt( jumpIfNull==
18ee0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
18ef0 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  L || jumpIfNull=
18f00 3d 30 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  =0 );.  if( v==0
18f10 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29 20 72   || pExpr==0 ) r
18f20 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65  eturn;..  /* The
18f30 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72 2d   value of pExpr-
18f40 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65 20 72  >op and op are r
18f50 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77  elated as follow
18f60 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
18f70 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20     pExpr->op    
18f80 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20          op.  ** 
18f90 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20        --------- 
18fa0 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d           -------
18fb0 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ---.  **       T
18fc0 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20 20 20  K_ISNULL        
18fd0 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a    OP_NotNull.  *
18fe0 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55  *       TK_NOTNU
18ff0 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f 49 73  LL         OP_Is
19000 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20  Null.  **       
19010 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20 20 20  TK_NE           
19020 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20     OP_Eq.  **   
19030 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20 20 20      TK_EQ       
19040 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a         OP_Ne.  *
19050 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20 20 20  *       TK_GT   
19060 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 65             OP_Le
19070 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c  .  **       TK_L
19080 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
19090 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Gt.  **       
190a0 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20 20 20  TK_GE           
190b0 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20     OP_Lt.  **   
190c0 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20 20 20      TK_LT       
190d0 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a         OP_Ge.  *
190e0 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72  *.  ** For other
190f0 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78 70 72   values of pExpr
19100 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64 65  ->op, op is unde
19110 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73 65 64  fined and unused
19120 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65  ..  ** The value
19130 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20   of TK_ and OP_ 
19140 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 61 72  constants are ar
19150 72 61 6e 67 65 64 20 73 75 63 68 20 74 68 61 74  ranged such that
19160 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d   we.  ** can com
19170 70 75 74 65 20 74 68 65 20 6d 61 70 70 69 6e 67  pute the mapping
19180 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74 68 65   above using the
19190 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65   following expre
191a0 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65  ssion..  ** Asse
191b0 72 74 28 29 73 20 76 65 72 69 66 79 20 74 68 61  rt()s verify tha
191c0 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f  t the computatio
191d0 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20  n is correct..  
191e0 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45 78 70  */.  op = ((pExp
191f0 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c  r->op+(TK_ISNULL
19200 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55  &1))^1)-(TK_ISNU
19210 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72  LL&1);..  /* Ver
19220 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c 69 67  ify correct alig
19230 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64  nment of TK_ and
19240 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20   OP_ constants. 
19250 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45   */.  assert( pE
19260 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55  xpr->op!=TK_ISNU
19270 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74  LL || op==OP_Not
19280 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Null );.  assert
19290 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
192a0 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f  NOTNULL || op==O
192b0 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73  P_IsNull );.  as
192c0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
192d0 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_NE || op==OP
192e0 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Eq );.  assert(
192f0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45   pExpr->op!=TK_E
19300 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29  Q || op==OP_Ne )
19310 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
19320 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20  r->op!=TK_LT || 
19330 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61  op==OP_Ge );.  a
19340 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
19350 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_LE || op==O
19360 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Gt );.  assert
19370 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
19380 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20  GT || op==OP_Le 
19390 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
193a0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c  pr->op!=TK_GE ||
193b0 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20   op==OP_Lt );.. 
193c0 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
193d0 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
193e0 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 74  K_AND: {.      t
193f0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
19400 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
19410 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
19420 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
19430 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
19440 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
19450 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
19460 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
19470 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
19480 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
19490 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
194a0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  }.    case TK_OR
194b0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32  : {.      int d2
194c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
194d0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
194e0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
194f0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
19500 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
19510 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
19520 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
19530 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
19540 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
19550 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51  2, jumpIfNull^SQ
19560 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
19570 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
19580 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
19590 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
195a0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
195b0 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
195c0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
195d0 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20  el(v, d2);.     
195e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
195f0 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b  ePop(pParse, 1);
19600 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19610 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
19620 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  NOT: {.      sql
19630 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
19640 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
19650 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
19660 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
19670 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
19680 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
19690 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
196a0 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
196b0 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
196c0 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
196d0 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
196e0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
196f0 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20  =TK_LT );.      
19700 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
19710 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _LE );.      tes
19720 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 54  tcase( op==TK_GT
19730 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
19740 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b  se( op==TK_GE );
19750 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
19760 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20   op==TK_EQ );.  
19770 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
19780 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20  ==TK_NE );.     
19790 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
197a0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
197b0 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 4f 70 65    codeCompareOpe
197c0 72 61 6e 64 73 28 70 50 61 72 73 65 2c 20 70 45  rands(pParse, pE
197d0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 31 2c  xpr->pLeft, &r1,
197e0 20 26 72 65 67 46 72 65 65 31 2c 0a 20 20 20 20   &regFree1,.    
197f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
19810 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 32  xpr->pRight, &r2
19820 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
19830 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
19840 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
19850 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
19860 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20  ght, op,.       
19870 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
19880 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  2, dest, jumpIfN
19890 75 6c 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ull);.      test
198a0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
198b0 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
198c0 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
198d0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
198e0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
198f0 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
19900 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
19910 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
19920 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op==TK_ISNULL 
19930 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
19940 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
19950 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  L );.      r1 = 
19960 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
19970 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
19980 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
19990 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee1);.      sqli
199a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
199b0 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a   op, r1, dest);.
199c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
199d0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
199e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
199f0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  }.    case TK_BE
19a00 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 2f  TWEEN: {.      /
19a10 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79  *    x BETWEEN y
19a20 20 41 4e 44 20 7a 0a 20 20 20 20 20 20 2a 2a 0a   AND z.      **.
19a30 20 20 20 20 20 20 2a 2a 20 49 73 20 65 71 75 69        ** Is equi
19a40 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20  valent to .     
19a50 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20   **.      **    
19a60 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20  x>=y AND x<=z.  
19a70 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
19a80 43 6f 64 65 20 69 74 20 61 73 20 73 75 63 68 2c  Code it as such,
19a90 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20   taking care to 
19aa0 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75  do the common su
19ab0 62 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20  bexpression.    
19ac0 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 61 74 69 6f    ** elementatio
19ad0 6e 20 6f 66 20 78 2e 0a 20 20 20 20 20 20 2a 2f  n of x..      */
19ae0 0a 20 20 20 20 20 20 45 78 70 72 20 65 78 70 72  .      Expr expr
19af0 41 6e 64 3b 0a 20 20 20 20 20 20 45 78 70 72 20  And;.      Expr 
19b00 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  compLeft;.      
19b10 45 78 70 72 20 63 6f 6d 70 52 69 67 68 74 3b 0a  Expr compRight;.
19b20 20 20 20 20 20 20 45 78 70 72 20 65 78 70 72 58        Expr exprX
19b30 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
19b40 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
19b50 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
19b60 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
19b70 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e  exprX = *pExpr->
19b80 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 65 78 70  pLeft;.      exp
19b90 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44  rAnd.op = TK_AND
19ba0 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64 2e  ;.      exprAnd.
19bb0 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66  pLeft = &compLef
19bc0 74 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64  t;.      exprAnd
19bd0 2e 70 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52  .pRight = &compR
19be0 69 67 68 74 3b 0a 20 20 20 20 20 20 63 6f 6d 70  ight;.      comp
19bf0 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b  Left.op = TK_GE;
19c00 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e  .      compLeft.
19c10 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a  pLeft = &exprX;.
19c20 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70        compLeft.p
19c30 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78  Right = pExpr->x
19c40 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  .pList->a[0].pEx
19c50 70 72 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52 69  pr;.      compRi
19c60 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a  ght.op = TK_LE;.
19c70 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e        compRight.
19c80 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a  pLeft = &exprX;.
19c90 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e        compRight.
19ca0 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
19cb0 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  x.pList->a[1].pE
19cc0 78 70 72 3b 0a 20 20 20 20 20 20 65 78 70 72 58  xpr;.      exprX
19cd0 2e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65  .iTable = sqlite
19ce0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
19cf0 61 72 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72  arse, &exprX, &r
19d00 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
19d10 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
19d20 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65  e1==0 );.      e
19d30 78 70 72 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47  xprX.op = TK_REG
19d40 49 53 54 45 52 3b 0a 20 20 20 20 20 20 74 65 73  ISTER;.      tes
19d50 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
19d60 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
19d70 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
19d80 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e  (pParse, &exprAn
19d90 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  d, dest, jumpIfN
19da0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
19db0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
19dc0 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 31  ault: {.      r1
19dd0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
19de0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
19df0 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29  Expr, &regFree1)
19e00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
19e10 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
19e20 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c  IfNot, r1, dest,
19e30 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b   jumpIfNull!=0);
19e40 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
19e50 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
19e60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19e70 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
19e80 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19e90 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
19ea0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
19eb0 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
19ec0 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
19ed0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
19ee0 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a  e, regFree2);.}.
19ef0 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70  ./*.** Do a deep
19f00 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74   comparison of t
19f10 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  wo expression tr
19f20 65 65 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ees.  Return TRU
19f30 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a 20  E (non-zero).** 
19f40 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e  if they are iden
19f50 74 69 63 61 6c 20 61 6e 64 20 72 65 74 75 72 6e  tical and return
19f60 20 46 41 4c 53 45 20 69 66 20 74 68 65 79 20 64   FALSE if they d
19f70 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79  iffer in any way
19f80 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  ..**.** Sometime
19f90 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
19fa0 69 6c 6c 20 72 65 74 75 72 6e 20 46 41 4c 53 45  ill return FALSE
19fb0 20 65 76 65 6e 20 69 66 20 74 68 65 20 74 77 6f   even if the two
19fc0 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
19fd0 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75 69 76  really are equiv
19fe0 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20 63 61  alent.  If we ca
19ff0 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61 74 20  nnot prove that 
1a000 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
1a010 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c  are.** identical
1a020 2c 20 77 65 20 72 65 74 75 72 6e 20 46 41 4c 53  , we return FALS
1a030 45 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66  E just to be saf
1a040 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20 72  e.  So if this r
1a050 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
1a060 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 79 6f  s false, then yo
1a070 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20  u do not really 
1a080 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e  know for certain
1a090 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65   if the two.** e
1a0a0 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74  xpressions are t
1a0b0 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66  he same.  But if
1a0c0 20 79 6f 75 20 67 65 74 20 61 20 54 52 55 45 20   you get a TRUE 
1a0d0 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75  return, then you
1a0e0 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65 20  .** can be sure 
1a0f0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
1a100 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 49  are the same.  I
1a110 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77 68 65  n the places whe
1a120 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
1a130 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74 20 64  ne is used, it d
1a140 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f 20  oes not hurt to 
1a150 67 65 74 20 61 6e 20 65 78 74 72 61 20 46 41 4c  get an extra FAL
1a160 53 45 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73  SE - that.** jus
1a170 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69  t might result i
1a180 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20  n some slightly 
1a190 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20 42 75  slower code.  Bu
1a1a0 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61  t returning.** a
1a1b0 6e 20 69 6e 63 6f 72 72 65 63 74 20 54 52 55 45  n incorrect TRUE
1a1c0 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61   could lead to a
1a1d0 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f   malfunction..*/
1a1e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
1a1f0 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41  Compare(Expr *pA
1a200 2c 20 45 78 70 72 20 2a 70 42 29 7b 0a 20 20 69  , Expr *pB){.  i
1a210 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d  nt i;.  if( pA==
1a220 30 7c 7c 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20  0||pB==0 ){.    
1a230 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 3b 0a 20  return pB==pA;. 
1a240 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 45 78   }.  assert( !Ex
1a250 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
1a260 28 70 41 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  (pA, EP_TokenOnl
1a270 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
1a280 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
1a290 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
1a2a0 42 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  B, EP_TokenOnly|
1a2b0 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
1a2c0 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
1a2d0 65 72 74 79 28 70 41 2c 20 45 50 5f 78 49 73 53  erty(pA, EP_xIsS
1a2e0 65 6c 65 63 74 29 20 7c 7c 20 45 78 70 72 48 61  elect) || ExprHa
1a2f0 73 50 72 6f 70 65 72 74 79 28 70 42 2c 20 45 50  sProperty(pB, EP
1a300 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
1a310 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1a320 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67  .  if( (pA->flag
1a330 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29  s & EP_Distinct)
1a340 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45  !=(pB->flags & E
1a350 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72 65  P_Distinct) ) re
1a360 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41  turn 0;.  if( pA
1a370 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 20 72  ->op!=pB->op ) r
1a380 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
1a390 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
1a3a0 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42  re(pA->pLeft, pB
1a3b0 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75 72  ->pLeft) ) retur
1a3c0 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  n 0;.  if( !sqli
1a3d0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
1a3e0 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70  A->pRight, pB->p
1a3f0 52 69 67 68 74 29 20 29 20 72 65 74 75 72 6e 20  Right) ) return 
1a400 30 3b 0a 0a 20 20 69 66 28 20 70 41 2d 3e 78 2e  0;..  if( pA->x.
1a410 70 4c 69 73 74 20 26 26 20 70 42 2d 3e 78 2e 70  pList && pB->x.p
1a420 4c 69 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20  List ){.    if( 
1a430 70 41 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pA->x.pList->nEx
1a440 70 72 21 3d 70 42 2d 3e 78 2e 70 4c 69 73 74 2d  pr!=pB->x.pList-
1a450 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20  >nExpr ) return 
1a460 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
1a470 69 3c 70 41 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  i<pA->x.pList->n
1a480 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
1a490 20 20 45 78 70 72 20 2a 70 45 78 70 72 41 20 3d    Expr *pExprA =
1a4a0 20 70 41 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b   pA->x.pList->a[
1a4b0 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
1a4c0 45 78 70 72 20 2a 70 45 78 70 72 42 20 3d 20 70  Expr *pExprB = p
1a4d0 42 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d  B->x.pList->a[i]
1a4e0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  .pExpr;.      if
1a4f0 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f  ( !sqlite3ExprCo
1a500 6d 70 61 72 65 28 70 45 78 70 72 41 2c 20 70 45  mpare(pExprA, pE
1a510 78 70 72 42 29 20 29 20 72 65 74 75 72 6e 20 30  xprB) ) return 0
1a520 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
1a530 69 66 28 20 70 41 2d 3e 78 2e 70 4c 69 73 74 20  if( pA->x.pList 
1a540 7c 7c 20 70 42 2d 3e 78 2e 70 4c 69 73 74 20 29  || pB->x.pList )
1a550 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
1a560 20 20 7d 0a 0a 20 20 69 66 28 20 70 41 2d 3e 69    }..  if( pA->i
1a570 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c  Table!=pB->iTabl
1a580 65 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e  e || pA->iColumn
1a590 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20  !=pB->iColumn ) 
1a5a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
1a5b0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1a5c0 70 41 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pA, EP_IntValue)
1a5d0 20 29 7b 0a 20 20 20 20 69 66 28 20 21 45 78 70   ){.    if( !Exp
1a5e0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 42 2c  rHasProperty(pB,
1a5f0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c   EP_IntValue) ||
1a600 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65 21 3d 70   pA->u.iValue!=p
1a610 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20  B->u.iValue ){. 
1a620 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1a630 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
1a640 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55   pA->op!=TK_COLU
1a650 4d 4e 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b  MN && pA->u.zTok
1a660 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 45 78  en ){.    if( Ex
1a670 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 42  prHasProperty(pB
1a680 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c  , EP_IntValue) |
1a690 7c 20 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 3d 3d  | pB->u.zToken==
1a6a0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1a6b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
1a6c0 49 43 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65  ICmp(pA->u.zToke
1a6d0 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21  n,pB->u.zToken)!
1a6e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
1a6f0 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
1a700 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 0a    return 1;.}...
1a710 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
1a720 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70  element to the p
1a730 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
1a740 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74  array.  Return t
1a750 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74  he index of.** t
1a760 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20  he new element. 
1a770 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   Return a negati
1a780 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c  ve number if mal
1a790 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  loc fails..*/.st
1a7a0 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49  atic int addAggI
1a7b0 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65  nfoColumn(sqlite
1a7c0 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a  3 *db, AggInfo *
1a7d0 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b  pInfo){.  int i;
1a7e0 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d  .  pInfo->aCol =
1a7f0 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c   sqlite3ArrayAll
1a800 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62  ocate(.       db
1a810 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  ,.       pInfo->
1a820 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a  aCol,.       siz
1a830 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  eof(pInfo->aCol[
1a840 30 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a 20  0]),.       3,. 
1a850 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43        &pInfo->nC
1a860 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 70  olumn,.       &p
1a870 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 41 6c 6c  Info->nColumnAll
1a880 6f 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20  oc,.       &i.  
1a890 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  );.  return i;.}
1a8a0 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20      ../*.** Add 
1a8b0 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
1a8c0 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61   the pAggInfo->a
1a8d0 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52  Func[] array.  R
1a8e0 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
1a8f0 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c  of.** the new el
1a900 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61  ement.  Return a
1a910 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
1a920 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
1a930 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a940 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 73  addAggInfoFunc(s
1a950 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49  qlite3 *db, AggI
1a960 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69  nfo *pInfo){.  i
1a970 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61  nt i;.  pInfo->a
1a980 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41 72  Func = sqlite3Ar
1a990 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20  rayAllocate(.   
1a9a0 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20 20      db, .       
1a9b0 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20  pInfo->aFunc,.  
1a9c0 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66       sizeof(pInf
1a9d0 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20  o->aFunc[0]),.  
1a9e0 20 20 20 20 20 33 2c 0a 20 20 20 20 20 20 20 26       3,.       &
1a9f0 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20  pInfo->nFunc,.  
1aa00 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75       &pInfo->nFu
1aa10 6e 63 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 20  ncAlloc,.       
1aa20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  &i.  );.  return
1aa30 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a   i;.}    ../*.**
1aa40 20 54 68 69 73 20 69 73 20 74 68 65 20 78 45 78   This is the xEx
1aa50 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  prCallback for a
1aa60 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 20 20 49   tree walker.  I
1aa70 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20  t is used to.** 
1aa80 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65  implement sqlite
1aa90 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
1aaa0 65 67 61 74 65 73 28 29 2e 20 20 53 65 65 20 73  egates().  See s
1aab0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
1aac0 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66  eAggregates.** f
1aad0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
1aae0 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  formation..*/.st
1aaf0 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65  atic int analyze
1ab00 41 67 67 72 65 67 61 74 65 28 57 61 6c 6b 65 72  Aggregate(Walker
1ab10 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
1ab20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69  *pExpr){.  int i
1ab30 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
1ab40 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  *pNC = pWalker->
1ab50 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a  u.pNC;.  Parse *
1ab60 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
1ab70 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20  arse;.  SrcList 
1ab80 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d  *pSrcList = pNC-
1ab90 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67  >pSrcList;.  Agg
1aba0 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d  Info *pAggInfo =
1abb0 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a   pNC->pAggInfo;.
1abc0 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
1abd0 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
1abe0 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a   TK_AGG_COLUMN:.
1abf0 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
1ac00 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  MN: {.      test
1ac10 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
1ac20 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
1ac30 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1ac40 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
1ac50 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
1ac60 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
1ac70 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  if the column is
1ac80 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   in one of the t
1ac90 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
1aca0 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73  M.      ** claus
1acb0 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61  e of the aggrega
1acc0 74 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  te query */.    
1acd0 20 20 69 66 28 20 70 53 72 63 4c 69 73 74 20 29    if( pSrcList )
1ace0 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
1acf0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1ad00 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d  Item = pSrcList-
1ad10 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  >a;.        for(
1ad20 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d  i=0; i<pSrcList-
1ad30 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
1ad40 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
1ad50 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
1ad60 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20  ol *pCol;.      
1ad70 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1ad80 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28  rHasAnyProperty(
1ad90 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f  pExpr, EP_TokenO
1ada0 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
1adb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1adc0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
1add0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29  pItem->iCursor )
1ade0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
1adf0 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
1ae00 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e  s point, it mean
1ae10 73 20 74 68 61 74 20 70 45 78 70 72 20 72 65 66  s that pExpr ref
1ae20 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a 20  ers to a table. 
1ae30 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
1ae40 61 74 20 69 73 20 69 6e 20 74 68 65 20 46 52 4f  at is in the FRO
1ae50 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1ae60 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e  aggregate query.
1ae70 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a    .            *
1ae80 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  *.            **
1ae90 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66   Make an entry f
1aea0 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e  or the column in
1aeb0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
1aec0 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 20  ] if there.     
1aed0 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74         ** is not
1aee0 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65 20   an entry there 
1aef0 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20 20  already..       
1af00 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1af10 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
1af20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70 41         pCol = pA
1af30 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20  ggInfo->aCol;.  
1af40 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d            for(k=
1af50 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; k<pAggInfo->n
1af60 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f  Column; k++, pCo
1af70 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l++){.          
1af80 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54      if( pCol->iT
1af90 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61  able==pExpr->iTa
1afa0 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20  ble &&.         
1afb0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
1afc0 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69  Column==pExpr->i
1afd0 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
1afe0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1aff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1b000 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1b010 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
1b020 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f  k>=pAggInfo->nCo
1b030 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20 20  lumn).          
1b040 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41 67     && (k = addAg
1b050 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72  gInfoColumn(pPar
1b060 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f  se->db, pAggInfo
1b070 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20 20  ))>=0 .         
1b080 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
1b090 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67 67      pCol = &pAgg
1b0a0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20  Info->aCol[k];. 
1b0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
1b0c0 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72 2d  l->pTab = pExpr-
1b0d0 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  >pTab;.         
1b0e0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c       pCol->iTabl
1b0f0 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  e = pExpr->iTabl
1b100 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
1b110 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d   pCol->iColumn =
1b120 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
1b130 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1b140 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50  Col->iMem = ++pP
1b150 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1b160 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
1b170 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20  iSorterColumn = 
1b180 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
1b190 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20    pCol->pExpr = 
1b1a0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
1b1b0 20 20 20 20 20 69 66 28 20 70 41 67 67 49 6e 66       if( pAggInf
1b1c0 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  o->pGroupBy ){. 
1b1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1b1e0 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20  nt j, n;.       
1b1f0 20 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73           ExprLis
1b200 74 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e 66  t *pGB = pAggInf
1b210 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  o->pGroupBy;.   
1b220 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
1b230 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
1b240 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e  m *pTerm = pGB->
1b250 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  a;.             
1b260 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70     n = pGB->nExp
1b270 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
1b280 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b     for(j=0; j<n;
1b290 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   j++, pTerm++){.
1b2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2b0 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54 65    Expr *pE = pTe
1b2c0 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
1b2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1b2e0 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55   pE->op==TK_COLU
1b2f0 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c 65  MN && pE->iTable
1b300 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
1b310 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
1b320 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43 6f           pE->iCo
1b330 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f  lumn==pExpr->iCo
1b340 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
1b350 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
1b360 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20  ->iSorterColumn 
1b370 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = j;.           
1b380 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1b390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1b3b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1b3c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1b3d0 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53      if( pCol->iS
1b3e0 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b  orterColumn<0 ){
1b3f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b400 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
1b410 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d  lumn = pAggInfo-
1b420 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b  >nSortingColumn+
1b430 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  +;.             
1b440 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
1b450 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
1b460 54 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e 20  There is now an 
1b470 65 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72 20  entry for pExpr 
1b480 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  in pAggInfo->aCo
1b490 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20 20  l[] (either.    
1b4a0 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61 75          ** becau
1b4b0 73 65 20 69 74 20 77 61 73 20 74 68 65 72 65 20  se it was there 
1b4c0 62 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75 73  before or becaus
1b4d0 65 20 77 65 20 6a 75 73 74 20 63 72 65 61 74 65  e we just create
1b4e0 64 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20 20  d it)..         
1b4f0 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68     ** Convert th
1b500 65 20 70 45 78 70 72 20 74 6f 20 62 65 20 61 20  e pExpr to be a 
1b510 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65  TK_AGG_COLUMN re
1b520 66 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74 0a  ferring to that.
1b530 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
1b540 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
1b550 65 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20 20  entry..         
1b560 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
1b570 20 20 45 78 70 72 53 65 74 49 72 72 65 64 75 63    ExprSetIrreduc
1b580 69 62 6c 65 28 70 45 78 70 72 29 3b 0a 20 20 20  ible(pExpr);.   
1b590 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
1b5a0 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49  pAggInfo = pAggI
1b5b0 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nfo;.           
1b5c0 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
1b5d0 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20  AGG_COLUMN;.    
1b5e0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
1b5f0 41 67 67 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20  Agg = k;.       
1b600 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b610 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66        } /* endif
1b620 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
1b630 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a  pItem->iCursor *
1b640 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65  /.        } /* e
1b650 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72  nd loop over pSr
1b660 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d  cList */.      }
1b670 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
1b680 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20  C_Prune;.    }. 
1b690 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
1b6a0 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
1b6b0 20 2f 2a 20 54 68 65 20 70 4e 43 2d 3e 6e 44 65   /* The pNC->nDe
1b6c0 70 74 68 3d 3d 30 20 74 65 73 74 20 63 61 75 73  pth==0 test caus
1b6d0 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  es aggregate fun
1b6e0 63 74 69 6f 6e 73 20 69 6e 20 73 75 62 71 75 65  ctions in subque
1b6f0 72 69 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f  ries.      ** to
1b700 20 62 65 20 69 67 6e 6f 72 65 64 20 2a 2f 0a 20   be ignored */. 
1b710 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 6e 44       if( pNC->nD
1b720 65 70 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20  epth==0 ){.     
1b730 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
1b740 65 65 20 69 66 20 70 45 78 70 72 20 69 73 20 61  ee if pExpr is a
1b750 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e   duplicate of an
1b760 6f 74 68 65 72 20 61 67 67 72 65 67 61 74 65 20  other aggregate 
1b770 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  .        ** func
1b780 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72  tion that is alr
1b790 65 61 64 79 20 69 6e 20 74 68 65 20 70 41 67 67  eady in the pAgg
1b7a0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20  Info structure. 
1b7b0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1b7c0 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
1b7d0 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70  _func *pItem = p
1b7e0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a  AggInfo->aFunc;.
1b7f0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
1b800 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
1b810 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  nc; i++, pItem++
1b820 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1b830 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
1b840 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  are(pItem->pExpr
1b850 2c 20 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  , pExpr) ){.    
1b860 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1b870 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1b880 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1b890 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46   i>=pAggInfo->nF
1b8a0 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unc ){.         
1b8b0 20 2f 2a 20 70 45 78 70 72 20 69 73 20 6f 72 69   /* pExpr is ori
1b8c0 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e  ginal.  Make a n
1b8d0 65 77 20 65 6e 74 72 79 20 69 6e 20 70 41 67 67  ew entry in pAgg
1b8e0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20  Info->aFunc[].  
1b8f0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1b900 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e       u8 enc = EN
1b910 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20  C(pParse->db);. 
1b920 20 20 20 20 20 20 20 20 20 69 20 3d 20 61 64 64           i = add
1b930 41 67 67 49 6e 66 6f 46 75 6e 63 28 70 50 61 72  AggInfoFunc(pPar
1b940 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f  se->db, pAggInfo
1b950 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1b960 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   i>=0 ){.       
1b970 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1b980 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1b990 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
1b9a0 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  t) );.          
1b9b0 20 20 70 49 74 65 6d 20 3d 20 26 70 41 67 67 49    pItem = &pAggI
1b9c0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20  nfo->aFunc[i];. 
1b9d0 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
1b9e0 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ->pExpr = pExpr;
1b9f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
1ba00 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  em->iMem = ++pPa
1ba10 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
1ba20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
1ba30 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1ba40 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
1ba50 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ue) );.         
1ba60 20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20     pItem->pFunc 
1ba70 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
1ba80 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62  ction(pParse->db
1ba90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1baa0 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54       pExpr->u.zT
1bab0 6f 6b 65 6e 2c 20 73 71 6c 69 74 65 33 53 74 72  oken, sqlite3Str
1bac0 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a  len30(pExpr->u.z
1bad0 54 6f 6b 65 6e 29 2c 0a 20 20 20 20 20 20 20 20  Token),.        
1bae0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1baf0 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45 78 70  ->x.pList ? pExp
1bb00 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
1bb10 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a  r : 0, enc, 0);.
1bb20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1bb30 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
1bb40 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  P_Distinct ){.  
1bb50 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
1bb60 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70  m->iDistinct = p
1bb70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
1bb80 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
1bb90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1bba0 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74  pItem->iDistinct
1bbb0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
1bbc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
1bbd0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1bbe0 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72     /* Make pExpr
1bbf0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70   point to the ap
1bc00 70 72 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e  propriate pAggIn
1bc10 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72  fo->aFunc[] entr
1bc20 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  y.        */.   
1bc30 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1bc40 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
1bc50 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e  (pExpr, EP_Token
1bc60 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
1bc70 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72   );.        Expr
1bc80 53 65 74 49 72 72 65 64 75 63 69 62 6c 65 28 70  SetIrreducible(p
1bc90 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70  Expr);.        p
1bca0 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a  Expr->iAgg = i;.
1bcb0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
1bcc0 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e  AggInfo = pAggIn
1bcd0 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  fo;.        retu
1bce0 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
1bcf0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1bd00 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
1bd10 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20  tinue;.}.static 
1bd20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  int analyzeAggre
1bd30 67 61 74 65 73 49 6e 53 65 6c 65 63 74 28 57 61  gatesInSelect(Wa
1bd40 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
1bd50 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
1bd60 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
1bd70 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75  pNC = pWalker->u
1bd80 2e 70 4e 43 3b 0a 20 20 69 66 28 20 70 4e 43 2d  .pNC;.  if( pNC-
1bd90 3e 6e 44 65 70 74 68 3d 3d 30 20 29 7b 0a 20 20  >nDepth==0 ){.  
1bda0 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2b 2b 3b    pNC->nDepth++;
1bdb0 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  .    sqlite3Walk
1bdc0 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
1bdd0 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 70 4e  pSelect);.    pN
1bde0 43 2d 3e 6e 44 65 70 74 68 2d 2d 3b 0a 20 20 20  C->nDepth--;.   
1bdf0 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
1be00 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
1be10 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
1be20 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  nue;.  }.}../*.*
1be30 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 67 69  * Analyze the gi
1be40 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  ven expression l
1be50 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65  ooking for aggre
1be60 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  gate functions a
1be70 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62  nd.** for variab
1be80 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  les that need to
1be90 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
1bea0 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20   pParse->aAgg[] 
1beb0 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b 65 20 61  array..** Make a
1bec0 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65  dditional entrie
1bed0 73 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d  s to the pParse-
1bee0 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 20 61 73  >aAgg[] array as
1bef0 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a   necessary..**.*
1bf00 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
1bf10 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
1bf20 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65  lled after the e
1bf30 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65  xpression has be
1bf40 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62  en.** analyzed b
1bf50 79 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  y sqlite3Resolve
1bf60 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a  ExprNames()..*/.
1bf70 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1bf80 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
1bf90 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70  s(NameContext *p
1bfa0 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  NC, Expr *pExpr)
1bfb0 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
1bfc0 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
1bfd0 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  = analyzeAggrega
1bfe0 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  te;.  w.xSelectC
1bff0 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a  allback = analyz
1c000 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c  eAggregatesInSel
1c010 65 63 74 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d  ect;.  w.u.pNC =
1c020 20 70 4e 43 3b 0a 20 20 73 71 6c 69 74 65 33 57   pNC;.  sqlite3W
1c030 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70  alkExpr(&w, pExp
1c040 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  r);.}../*.** Cal
1c050 6c 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  l sqlite3ExprAna
1c060 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
1c070 20 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65   for every expre
1c080 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65  ssion in an.** e
1c090 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
1c0a0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
1c0b0 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a  er of errors..**
1c0c0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1c0d0 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e  is found, the an
1c0e0 61 6c 79 73 69 73 20 69 73 20 63 75 74 20 73 68  alysis is cut sh
1c0f0 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ort..*/.void sql
1c100 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
1c110 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65  ggList(NameConte
1c120 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73  xt *pNC, ExprLis
1c130 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72  t *pList){.  str
1c140 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
1c150 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
1c160 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  i;.  if( pList )
1c170 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d  {.    for(pItem=
1c180 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
1c190 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
1c1a0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
1c1b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
1c1c0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
1c1d0 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78  (pNC, pItem->pEx
1c1e0 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  pr);.    }.  }.}
1c1f0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
1c200 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 72 65   a single new re
1c210 67 69 73 74 65 72 20 66 6f 72 20 75 73 65 20 74  gister for use t
1c220 6f 20 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65  o hold some inte
1c230 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 2e  rmediate result.
1c240 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47  .*/.int sqlite3G
1c250 65 74 54 65 6d 70 52 65 67 28 50 61 72 73 65 20  etTempReg(Parse 
1c260 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20  *pParse){.  if( 
1c270 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
1c280 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1c290 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  n ++pParse->nMem
1c2a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1c2b0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
1c2c0 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  --pParse->nTempR
1c2d0 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  eg];.}../*.** De
1c2e0 61 6c 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73  allocate a regis
1c2f0 74 65 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69  ter, making avai
1c300 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 20  lable for reuse 
1c310 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a  for some other.*
1c320 2a 20 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a  * purpose..**.**
1c330 20 49 66 20 61 20 72 65 67 69 73 74 65 72 20 69   If a register i
1c340 73 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  s currently bein
1c350 67 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f  g used by the co
1c360 6c 75 6d 6e 20 63 61 63 68 65 2c 20 74 68 65 6e  lumn cache, then
1c370 0a 2a 2a 20 74 68 65 20 64 61 6c 6c 6f 63 61 74  .** the dallocat
1c380 69 6f 6e 20 69 73 20 64 65 66 65 72 72 65 64 20  ion is deferred 
1c390 75 6e 74 69 6c 20 74 68 65 20 63 6f 6c 75 6d 6e  until the column
1c3a0 20 63 61 63 68 65 20 6c 69 6e 65 20 74 68 61 74   cache line that
1c3b0 20 75 73 65 73 0a 2a 2a 20 74 68 65 20 72 65 67   uses.** the reg
1c3c0 69 73 74 65 72 20 62 65 63 6f 6d 65 73 20 73 74  ister becomes st
1c3d0 61 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ale..*/.void sql
1c3e0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1c3f0 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eg(Parse *pParse
1c400 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69  , int iReg){.  i
1c410 66 28 20 69 52 65 67 20 26 26 20 70 50 61 72 73  f( iReg && pPars
1c420 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61  e->nTempReg<Arra
1c430 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54  ySize(pParse->aT
1c440 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20 69  empReg) ){.    i
1c450 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74  nt i;.    struct
1c460 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20   yColCache *p;. 
1c470 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50     for(i=0, p=pP
1c480 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
1c490 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
1c4a0 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
1c4b0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 52  .      if( p->iR
1c4c0 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20  eg==iReg ){.    
1c4d0 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d      p->tempReg =
1c4e0 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   1;.        retu
1c4f0 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
1c500 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54  }.    pParse->aT
1c510 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e  empReg[pParse->n
1c520 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65  TempReg++] = iRe
1c530 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g;.  }.}../*.** 
1c540 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c  Allocate or deal
1c550 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f  locate a block o
1c560 66 20 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69  f nReg consecuti
1c570 76 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2f 0a  ve registers.*/.
1c580 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65  int sqlite3GetTe
1c590 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70  mpRange(Parse *p
1c5a0 50 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29  Parse, int nReg)
1c5b0 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  {.  int i, n;.  
1c5c0 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61 6e  i = pParse->iRan
1c5d0 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61  geReg;.  n = pPa
1c5e0 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a  rse->nRangeReg;.
1c5f0 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 26 26    if( nReg<=n &&
1c600 20 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61   !usedAsColumnCa
1c610 63 68 65 28 70 50 61 72 73 65 2c 20 69 2c 20 69  che(pParse, i, i
1c620 2b 6e 2d 31 29 20 29 7b 0a 20 20 20 20 70 50 61  +n-1) ){.    pPa
1c630 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b  rse->iRangeReg +
1c640 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72  = nReg;.    pPar
1c650 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d  se->nRangeReg -=
1c660 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nReg;.  }else{.
1c670 20 20 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e      i = pParse->
1c680 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72  nMem+1;.    pPar
1c690 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67  se->nMem += nReg
1c6a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
1c6b0 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
1c6c0 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
1c6d0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1c6e0 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52  int iReg, int nR
1c6f0 65 67 29 7b 0a 20 20 69 66 28 20 6e 52 65 67 3e  eg){.  if( nReg>
1c700 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
1c710 67 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  g ){.    pParse-
1c720 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65  >nRangeReg = nRe
1c730 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69  g;.    pParse->i
1c740 52 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b  RangeReg = iReg;
1c750 0a 20 20 7d 0a 7d 0a                             .  }.}.