/ Hex Artifact Content
Login

Artifact 0851fab95daa554fee9c807f418661c9f76a159d:


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 32 20 32 30 30 39 2f 30 35 2f 33 30 20  .442 2009/05/30 
0220: 31 34 3a 31 36 3a 33 32 20 64 72 68 20 45 78 70  14:16:32 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 61 73 73 65 72  che *p;..  asser
ea90: 74 28 20 69 52 65 67 3e 30 20 29 3b 20 20 2f 2a  t( iReg>0 );  /*
eaa0: 20 52 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   Register number
eab0: 73 20 61 72 65 20 61 6c 77 61 79 73 20 70 6f 73  s are always pos
eac0: 69 74 69 76 65 20 2a 2f 0a 20 20 61 73 73 65 72  itive */.  asser
ead0: 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26 26 20 69  t( iCol>=-1 && i
eae0: 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20 20 2f 2a  Col<32768 );  /*
eaf0: 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d 6e 20 6e   Finite column n
eb00: 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20  umbers */..  /* 
eb10: 46 69 72 73 74 20 72 65 70 6c 61 63 65 20 61 6e  First replace an
eb20: 79 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79  y existing entry
eb30: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
eb40: 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
eb50: 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
eb60: 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
eb70: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
eb80: 52 65 67 20 26 26 20 70 2d 3e 69 54 61 62 6c 65  Reg && p->iTable
eb90: 3d 3d 69 54 61 62 20 26 26 20 70 2d 3e 69 43 6f  ==iTab && p->iCo
eba0: 6c 75 6d 6e 3d 3d 69 43 6f 6c 20 29 7b 0a 20 20  lumn==iCol ){.  
ebb0: 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c      cacheEntryCl
ebc0: 65 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ear(pParse, p);.
ebd0: 20 20 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20        p->iLevel 
ebe0: 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
ebf0: 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20 70 2d 3e  Level;.      p->
ec00: 69 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 20  iReg = iReg;.   
ec10: 20 20 20 70 2d 3e 61 66 66 43 68 61 6e 67 65 20     p->affChange 
ec20: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 6c 72  = 0;.      p->lr
ec30: 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  u = pParse->iCac
ec40: 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 72  heCnt++;.      r
ec50: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
ec60: 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 6e 20 65  ..  /* Find an e
ec70: 6d 70 74 79 20 73 6c 6f 74 20 61 6e 64 20 72 65  mpty slot and re
ec80: 70 6c 61 63 65 20 69 74 20 2a 2f 0a 20 20 66 6f  place it */.  fo
ec90: 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
eca0: 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
ecb0: 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
ecc0: 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
ecd0: 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 30 20 29  if( p->iReg==0 )
ece0: 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 65 76 65  {.      p->iLeve
ecf0: 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  l = pParse->iCac
ed00: 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20 70  heLevel;.      p
ed10: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b  ->iTable = iTab;
ed20: 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d  .      p->iColum
ed30: 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  n = iCol;.      
ed40: 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a  p->iReg = iReg;.
ed50: 20 20 20 20 20 20 70 2d 3e 61 66 66 43 68 61 6e        p->affChan
ed60: 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  ge = 0;.      p-
ed70: 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  >tempReg = 0;.  
ed80: 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61      p->lru = pPa
ed90: 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b  rse->iCacheCnt++
eda0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
edb0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
edc0: 52 65 70 6c 61 63 65 20 74 68 65 20 6c 61 73 74  Replace the last
edd0: 20 72 65 63 65 6e 74 6c 79 20 75 73 65 64 20 2a   recently used *
ede0: 2f 0a 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37  /.  minLru = 0x7
edf0: 66 66 66 66 66 66 66 3b 0a 20 20 69 64 78 4c 72  fffffff;.  idxLr
ee00: 75 20 3d 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d  u = -1;.  for(i=
ee10: 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
ee20: 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
ee30: 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
ee40: 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , p++){.    if( 
ee50: 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20 29 7b  p->lru<minLru ){
ee60: 0a 20 20 20 20 20 20 69 64 78 4c 72 75 20 3d 20  .      idxLru = 
ee70: 69 3b 0a 20 20 20 20 20 20 6d 69 6e 4c 72 75 20  i;.      minLru 
ee80: 3d 20 70 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d 0a  = p->lru;.    }.
ee90: 20 20 7d 0a 20 20 69 66 28 20 41 4c 57 41 59 53    }.  if( ALWAYS
eea0: 28 69 64 78 4c 72 75 3e 3d 30 29 20 29 7b 0a 20  (idxLru>=0) ){. 
eeb0: 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e     p = &pParse->
eec0: 61 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72 75  aColCache[idxLru
eed0: 5d 3b 0a 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c  ];.    p->iLevel
eee0: 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
eef0: 65 4c 65 76 65 6c 3b 0a 20 20 20 20 70 2d 3e 69  eLevel;.    p->i
ef00: 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20  Table = iTab;.  
ef10: 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69    p->iColumn = i
ef20: 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69 52 65 67  Col;.    p->iReg
ef30: 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 70 2d 3e   = iReg;.    p->
ef40: 61 66 66 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  affChange = 0;. 
ef50: 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20     p->tempReg = 
ef60: 30 3b 0a 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20  0;.    p->lru = 
ef70: 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e  pParse->iCacheCn
ef80: 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  t++;.    return;
ef90: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
efa0: 64 69 63 61 74 65 20 74 68 61 74 20 61 20 72 65  dicate that a re
efb0: 67 69 73 74 65 72 20 69 73 20 62 65 69 6e 67 20  gister is being 
efc0: 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 50 75  overwritten.  Pu
efd0: 72 67 65 20 74 68 65 20 72 65 67 69 73 74 65 72  rge the register
efe0: 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c  .** from the col
eff0: 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f  umn cache..*/.vo
f000: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
f010: 63 68 65 52 65 6d 6f 76 65 28 50 61 72 73 65 20  cheRemove(Parse 
f020: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
f030: 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  g){.  int i;.  s
f040: 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
f050: 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  *p;.  for(i=0, p
f060: 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
f070: 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
f080: 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
f090: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
f0a0: 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20  Reg==iReg ){.   
f0b0: 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65     cacheEntryCle
f0c0: 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  ar(pParse, p);. 
f0d0: 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30       p->iReg = 0
f0e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
f0f0: 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68  *.** Remember th
f100: 65 20 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e  e current column
f110: 20 63 61 63 68 65 20 63 6f 6e 74 65 78 74 2e 20   cache context. 
f120: 20 41 6e 79 20 6e 65 77 20 65 6e 74 72 69 65 73   Any new entries
f130: 20 61 64 64 65 64 0a 2a 2a 20 61 64 64 65 64 20   added.** added 
f140: 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  to the column ca
f150: 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20 63  che after this c
f160: 61 6c 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20  all are removed 
f170: 77 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f 72 72  when the.** corr
f180: 65 73 70 6f 6e 64 69 6e 67 20 70 6f 70 20 6f 63  esponding pop oc
f190: 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  curs..*/.void sq
f1a0: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
f1b0: 73 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  sh(Parse *pParse
f1c0: 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61  ){.  pParse->iCa
f1d0: 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a 7d 0a 0a 2f  cheLevel++;.}../
f1e0: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 66 72 6f 6d  *.** Remove from
f1f0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
f200: 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 74 68  e any entries th
f210: 61 74 20 77 65 72 65 20 61 64 64 65 64 20 73 69  at were added si
f220: 6e 63 65 20 74 68 65 0a 2a 2a 20 74 68 65 20 70  nce the.** the p
f230: 72 65 76 69 6f 75 73 20 4e 20 50 75 73 68 20 6f  revious N Push o
f240: 70 65 72 61 74 69 6f 6e 73 2e 20 20 49 6e 20 6f  perations.  In o
f250: 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 73 74  ther words, rest
f260: 6f 72 65 20 74 68 65 20 63 61 63 68 65 0a 2a 2a  ore the cache.**
f270: 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 69 74   to the state it
f280: 20 77 61 73 20 69 6e 20 4e 20 50 75 73 68 65 73   was in N Pushes
f290: 20 61 67 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   ago..*/.void sq
f2a0: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
f2b0: 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  p(Parse *pParse,
f2c0: 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20 69   int N){.  int i
f2d0: 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
f2e0: 61 63 68 65 20 2a 70 3b 0a 20 20 61 73 73 65 72  ache *p;.  asser
f2f0: 74 28 20 4e 3e 30 20 29 3b 0a 20 20 61 73 73 65  t( N>0 );.  asse
f300: 72 74 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63  rt( pParse->iCac
f310: 68 65 4c 65 76 65 6c 3e 3d 4e 20 29 3b 0a 20 20  heLevel>=N );.  
f320: 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
f330: 76 65 6c 20 2d 3d 20 4e 3b 0a 20 20 66 6f 72 28  vel -= N;.  for(
f340: 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
f350: 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
f360: 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
f370: 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
f380: 28 20 70 2d 3e 69 52 65 67 20 26 26 20 70 2d 3e  ( p->iReg && p->
f390: 69 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e 69  iLevel>pParse->i
f3a0: 43 61 63 68 65 4c 65 76 65 6c 20 29 7b 0a 20 20  CacheLevel ){.  
f3b0: 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c      cacheEntryCl
f3c0: 65 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ear(pParse, p);.
f3d0: 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20        p->iReg = 
f3e0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
f3f0: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 63 61 63  /*.** When a cac
f400: 68 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20 72 65  hed column is re
f410: 75 73 65 64 2c 20 6d 61 6b 65 20 73 75 72 65 20  used, make sure 
f420: 74 68 61 74 20 69 74 73 20 72 65 67 69 73 74 65  that its registe
f430: 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65  r is.** no longe
f440: 72 20 61 76 61 69 6c 61 62 6c 65 20 61 73 20 61  r available as a
f450: 20 74 65 6d 70 20 72 65 67 69 73 74 65 72 2e 20   temp register. 
f460: 20 74 69 63 6b 65 74 20 23 33 38 37 39 3a 20 20   ticket #3879:  
f470: 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 72 65 67  that same.** reg
f480: 69 73 74 65 72 20 6d 69 67 68 74 20 62 65 20 69  ister might be i
f490: 6e 20 74 68 65 20 63 61 63 68 65 20 69 6e 20 6d  n the cache in m
f4a0: 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2c 20  ultiple places, 
f4b0: 73 6f 20 62 65 20 73 75 72 65 20 74 6f 0a 2a 2a  so be sure to.**
f4c0: 20 67 65 74 20 74 68 65 6d 20 61 6c 6c 2e 0a 2a   get them all..*
f4d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
f4e0: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69  lite3ExprCachePi
f4f0: 6e 52 65 67 69 73 74 65 72 28 50 61 72 73 65 20  nRegister(Parse 
f500: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
f510: 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  g){.  int i;.  s
f520: 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
f530: 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  *p;.  for(i=0, p
f540: 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
f550: 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
f560: 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
f570: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
f580: 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20  Reg==iReg ){.   
f590: 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20     p->tempReg = 
f5a0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
f5b0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
f5c0: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 78  ode that will ex
f5d0: 74 72 61 63 74 20 74 68 65 20 69 43 6f 6c 75 6d  tract the iColum
f5e0: 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d  n-th column from
f5f0: 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61 62 20 61  .** table pTab a
f600: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c  nd store the col
f610: 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 61 20 72  umn value in a r
f620: 65 67 69 73 74 65 72 2e 20 20 41 6e 20 65 66 66  egister.  An eff
f630: 6f 72 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74  ort.** is made t
f640: 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75  o store the colu
f650: 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  mn value in regi
f660: 73 74 65 72 20 69 52 65 67 2c 20 62 75 74 20 74  ster iReg, but t
f670: 68 69 73 20 69 73 0a 2a 2a 20 6e 6f 74 20 67 75  his is.** not gu
f680: 61 72 61 6e 74 65 65 64 2e 20 20 54 68 65 20 6c  aranteed.  The l
f690: 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63  ocation of the c
f6a0: 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 72  olumn value is r
f6b0: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
f6c0: 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20  here must be an 
f6d0: 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 6f 20 70  open cursor to p
f6e0: 54 61 62 20 69 6e 20 69 54 61 62 6c 65 20 77 68  Tab in iTable wh
f6f0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
f700: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 49  ** is called.  I
f710: 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e  f iColumn<0 then
f720: 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74   code is generat
f730: 65 64 20 74 68 61 74 20 65 78 74 72 61 63 74 73  ed that extracts
f740: 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2a 0a 2a   the rowid..**.*
f750: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
f760: 69 67 68 74 20 61 74 74 65 6d 70 74 20 74 6f 20  ight attempt to 
f770: 72 65 75 73 65 20 74 68 65 20 76 61 6c 75 65 20  reuse the value 
f780: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 68  of the column th
f790: 61 74 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64  at.** has alread
f7a0: 79 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 69 6e  y been loaded in
f7b0: 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e 20 20  to a register.  
f7c0: 54 68 65 20 76 61 6c 75 65 20 77 69 6c 6c 20 61  The value will a
f7d0: 6c 77 61 79 73 0a 2a 2a 20 62 65 20 75 73 65 64  lways.** be used
f7e0: 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 75   if it has not u
f7f0: 6e 64 65 72 67 6f 6e 65 20 61 6e 79 20 61 66 66  ndergone any aff
f800: 69 6e 69 74 79 20 63 68 61 6e 67 65 73 2e 20 20  inity changes.  
f810: 42 75 74 20 69 66 0a 2a 2a 20 61 6e 20 61 66 66  But if.** an aff
f820: 69 6e 69 74 79 20 63 68 61 6e 67 65 20 68 61 73  inity change has
f830: 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65 6e 20   occurred, then 
f840: 74 68 65 20 63 61 63 68 65 64 20 76 61 6c 75 65  the cached value
f850: 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 0a 2a 2a   will only be.**
f860: 20 75 73 65 64 20 69 66 20 61 6c 6c 6f 77 41 66   used if allowAf
f870: 66 43 68 6e 67 20 69 73 20 74 72 75 65 2e 0a 2a  fChng is true..*
f880: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
f890: 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a  rCodeGetColumn(.
f8a0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
f8b0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
f8c0: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
f8d0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
f8e0: 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
f8f0: 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f  /* Description o
f900: 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61  f the table we a
f910: 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  re reading from 
f920: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
f930: 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f  ,     /* Index o
f940: 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75  f the table colu
f950: 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  mn */.  int iTab
f960: 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  le,      /* The 
f970: 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  cursor pointing 
f980: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  to the table */.
f990: 20 20 69 6e 74 20 69 52 65 67 2c 20 20 20 20 20    int iReg,     
f9a0: 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75     /* Store resu
f9b0: 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  lts here */.  in
f9c0: 74 20 61 6c 6c 6f 77 41 66 66 43 68 6e 67 20 2f  t allowAffChng /
f9d0: 2a 20 54 72 75 65 20 69 66 20 70 72 69 6f 72 20  * True if prior 
f9e0: 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65 73  affinity changes
f9f0: 20 61 72 65 20 4f 4b 20 2a 2f 0a 29 7b 0a 20 20   are OK */.){.  
fa00: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
fa10: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
fa20: 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
fa30: 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28  ache *p;..  for(
fa40: 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
fa50: 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
fa60: 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
fa70: 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
fa80: 28 20 70 2d 3e 69 52 65 67 3e 30 20 26 26 20 70  ( p->iReg>0 && p
fa90: 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65  ->iTable==iTable
faa0: 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d   && p->iColumn==
fab0: 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20  iColumn.        
fac0: 20 20 20 26 26 20 28 21 70 2d 3e 61 66 66 43 68     && (!p->affCh
fad0: 61 6e 67 65 20 7c 7c 20 61 6c 6c 6f 77 41 66 66  ange || allowAff
fae0: 43 68 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 70  Chng) ){.      p
faf0: 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e  ->lru = pParse->
fb00: 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20  iCacheCnt++;.   
fb10: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
fb20: 63 68 65 50 69 6e 52 65 67 69 73 74 65 72 28 70  chePinRegister(p
fb30: 50 61 72 73 65 2c 20 70 2d 3e 69 52 65 67 29 3b  Parse, p->iReg);
fb40: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d  .      return p-
fb50: 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d  >iReg;.    }.  }
fb60: 20 20 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d    .  assert( v!=
fb70: 30 20 29 3b 0a 20 20 69 66 28 20 69 43 6f 6c 75  0 );.  if( iColu
fb80: 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  mn<0 ){.    sqli
fb90: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
fba0: 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 6c   OP_Rowid, iTabl
fbb0: 65 2c 20 69 52 65 67 29 3b 0a 20 20 7d 65 6c 73  e, iReg);.  }els
fbc0: 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 54 61  e if( ALWAYS(pTa
fbd0: 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 69 6e 74  b!=0) ){.    int
fbe0: 20 6f 70 20 3d 20 49 73 56 69 72 74 75 61 6c 28   op = IsVirtual(
fbf0: 70 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75  pTab) ? OP_VColu
fc00: 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a  mn : OP_Column;.
fc10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fc20: 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54 61  ddOp3(v, op, iTa
fc30: 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52  ble, iColumn, iR
fc40: 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  eg);.    sqlite3
fc50: 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c  ColumnDefault(v,
fc60: 20 70 54 61 62 2c 20 69 43 6f 6c 75 6d 6e 29 3b   pTab, iColumn);
fc70: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
fc80: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
fc90: 49 4e 54 0a 20 20 20 20 69 66 28 20 70 54 61 62  INT.    if( pTab
fca0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e  ->aCol[iColumn].
fcb0: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
fcc0: 5f 41 46 46 5f 52 45 41 4c 20 29 7b 0a 20 20 20  _AFF_REAL ){.   
fcd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fce0: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41  dOp1(v, OP_RealA
fcf0: 66 66 69 6e 69 74 79 2c 20 69 52 65 67 29 3b 0a  ffinity, iReg);.
fd00: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
fd10: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
fd20: 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c  cheStore(pParse,
fd30: 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e   iTable, iColumn
fd40: 2c 20 69 52 65 67 29 3b 0a 20 20 72 65 74 75 72  , iReg);.  retur
fd50: 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n iReg;.}../*.**
fd60: 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6c 75 6d   Clear all colum
fd70: 6e 20 63 61 63 68 65 20 65 6e 74 72 69 65 73 2e  n cache entries.
fd80: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
fd90: 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 50  ExprCacheClear(P
fda0: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
fdb0: 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
fdc0: 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a   yColCache *p;..
fdd0: 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
fde0: 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
fdf0: 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
fe00: 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
fe10: 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20      if( p->iReg 
fe20: 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e  ){.      cacheEn
fe30: 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c  tryClear(pParse,
fe40: 20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52   p);.      p->iR
fe50: 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  eg = 0;.    }.  
fe60: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72  }.}../*.** Recor
fe70: 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  d the fact that 
fe80: 61 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e  an affinity chan
fe90: 67 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 20  ge has occurred 
fea0: 6f 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67  on iCount.** reg
feb0: 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20  isters starting 
fec0: 77 69 74 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a  with iStart..*/.
fed0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
fee0: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
fef0: 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
ff00: 65 2c 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69  e, int iStart, i
ff10: 6e 74 20 69 43 6f 75 6e 74 29 7b 0a 20 20 69 6e  nt iCount){.  in
ff20: 74 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74 20  t iEnd = iStart 
ff30: 2b 20 69 43 6f 75 6e 74 20 2d 20 31 3b 0a 20 20  + iCount - 1;.  
ff40: 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
ff50: 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20  yColCache *p;.  
ff60: 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
ff70: 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
ff80: 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
ff90: 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
ffa0: 20 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65    int r = p->iRe
ffb0: 67 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 53  g;.    if( r>=iS
ffc0: 74 61 72 74 20 26 26 20 72 3c 3d 69 45 6e 64 20  tart && r<=iEnd 
ffd0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 66 66 43  ){.      p->affC
ffe0: 68 61 6e 67 65 20 3d 20 31 3b 0a 20 20 20 20 7d  hange = 1;.    }
fff0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
10000 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d  nerate code to m
10010 6f 76 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ove content from
10020 20 72 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d   registers iFrom
10030 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a  ...iFrom+nReg-1.
10040 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e  ** over to iTo..
10050 69 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70  iTo+nReg-1. Keep
10060 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
10070 65 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f  e up-to-date..*/
10080 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
10090 72 43 6f 64 65 4d 6f 76 65 28 50 61 72 73 65 20  rCodeMove(Parse 
100a0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72  *pParse, int iFr
100b0 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74  om, int iTo, int
100c0 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b   nReg){.  int i;
100d0 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
100e0 63 68 65 20 2a 70 3b 0a 20 20 69 66 28 20 4e 45  che *p;.  if( NE
100f0 56 45 52 28 69 46 72 6f 6d 3d 3d 69 54 6f 29 20  VER(iFrom==iTo) 
10100 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
10110 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 50  te3VdbeAddOp3(pP
10120 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
10130 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f  Move, iFrom, iTo
10140 2c 20 6e 52 65 67 29 3b 0a 20 20 66 6f 72 28 69  , nReg);.  for(i
10150 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
10160 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
10170 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
10180 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  +, p++){.    int
10190 20 78 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20   x = p->iReg;.  
101a0 20 20 69 66 28 20 78 3e 3d 69 46 72 6f 6d 20 26    if( x>=iFrom &
101b0 26 20 78 3c 69 46 72 6f 6d 2b 6e 52 65 67 20 29  & x<iFrom+nReg )
101c0 7b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20  {.      p->iReg 
101d0 2b 3d 20 69 54 6f 2d 69 46 72 6f 6d 3b 0a 20 20  += iTo-iFrom;.  
101e0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
101f0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
10200 6f 20 63 6f 70 79 20 63 6f 6e 74 65 6e 74 20 66  o copy content f
10210 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20 69 46  rom registers iF
10220 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67  rom...iFrom+nReg
10230 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54  -1.** over to iT
10240 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 0a 2a  o..iTo+nReg-1..*
10250 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
10260 70 72 43 6f 64 65 43 6f 70 79 28 50 61 72 73 65  prCodeCopy(Parse
10270 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46   *pParse, int iF
10280 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e  rom, int iTo, in
10290 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t nReg){.  int i
102a0 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 69 46  ;.  if( NEVER(iF
102b0 72 6f 6d 3d 3d 69 54 6f 29 20 29 20 72 65 74 75  rom==iTo) ) retu
102c0 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
102d0 3c 6e 52 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nReg; i++){.   
102e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
102f0 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p2(pParse->pVdbe
10300 2c 20 4f 50 5f 43 6f 70 79 2c 20 69 46 72 6f 6d  , OP_Copy, iFrom
10310 2b 69 2c 20 69 54 6f 2b 69 29 3b 0a 20 20 7d 0a  +i, iTo+i);.  }.
10320 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
10330 74 72 75 65 20 69 66 20 61 6e 79 20 72 65 67 69  true if any regi
10340 73 74 65 72 20 69 6e 20 74 68 65 20 72 61 6e 67  ster in the rang
10350 65 20 69 46 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e  e iFrom..iTo (in
10360 63 6c 75 73 69 76 65 29 0a 2a 2a 20 69 73 20 75  clusive).** is u
10370 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  sed as part of t
10380 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
10390 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
103a0 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65  sedAsColumnCache
103b0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
103c0 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
103d0 54 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  To){.  int i;.  
103e0 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
103f0 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20   *p;.  for(i=0, 
10400 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
10410 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
10420 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
10430 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d  ++){.    int r =
10440 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66   p->iReg;.    if
10450 28 20 72 3e 3d 69 46 72 6f 6d 20 26 26 20 72 3c  ( r>=iFrom && r<
10460 3d 69 54 6f 20 29 20 72 65 74 75 72 6e 20 31 3b  =iTo ) return 1;
10470 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
10480 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
10490 20 6c 61 73 74 20 69 6e 73 74 72 75 63 74 69 6f   last instructio
104a0 6e 20 63 6f 64 65 64 20 69 73 20 61 6e 20 65 70  n coded is an ep
104b0 68 65 6d 65 72 61 6c 20 63 6f 70 79 20 6f 66 20  hemeral copy of 
104c0 61 6e 79 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65  any of.** the re
104d0 67 69 73 74 65 72 73 20 69 6e 20 74 68 65 20 6e  gisters in the n
104e0 52 65 67 20 72 65 67 69 73 74 65 72 73 20 62 65  Reg registers be
104f0 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 69 52 65  ginning with iRe
10500 67 2c 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 76 65  g, then.** conve
10510 72 74 20 74 68 65 20 6c 61 73 74 20 69 6e 73 74  rt the last inst
10520 72 75 63 74 69 6f 6e 20 66 72 6f 6d 20 4f 50 5f  ruction from OP_
10530 53 43 6f 70 79 20 74 6f 20 4f 50 5f 43 6f 70 79  SCopy to OP_Copy
10540 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
10550 33 45 78 70 72 48 61 72 64 43 6f 70 79 28 50 61  3ExprHardCopy(Pa
10560 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
10570 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29   iReg, int nReg)
10580 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b  {.  VdbeOp *pOp;
10590 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61  .  Vdbe *v;..  a
105a0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
105b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
105c0 3d 30 20 29 3b 0a 20 20 76 20 3d 20 70 50 61 72  =0 );.  v = pPar
105d0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
105e0 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 70  ert( v!=0 );.  p
105f0 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
10600 47 65 74 4f 70 28 76 2c 20 2d 31 29 3b 0a 20 20  GetOp(v, -1);.  
10610 61 73 73 65 72 74 28 20 70 4f 70 21 3d 30 20 29  assert( pOp!=0 )
10620 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  ;.  if( pOp->opc
10630 6f 64 65 3d 3d 4f 50 5f 53 43 6f 70 79 20 26 26  ode==OP_SCopy &&
10640 20 70 4f 70 2d 3e 70 31 3e 3d 69 52 65 67 20 26   pOp->p1>=iReg &
10650 26 20 70 4f 70 2d 3e 70 31 3c 69 52 65 67 2b 6e  & pOp->p1<iReg+n
10660 52 65 67 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  Reg ){.    pOp->
10670 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 43 6f 70 79  opcode = OP_Copy
10680 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
10690 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
106a0 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  store the value 
106b0 6f 66 20 74 68 65 20 69 41 6c 69 61 73 2d 74 68  of the iAlias-th
106c0 20 61 6c 69 61 73 20 69 6e 20 72 65 67 69 73 74   alias in regist
106d0 65 72 0a 2a 2a 20 74 61 72 67 65 74 2e 20 20 54  er.** target.  T
106e0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
106f0 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 70 45  is is called, pE
10700 78 70 72 20 69 73 20 65 76 61 6c 75 61 74 65 64  xpr is evaluated
10710 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74   to compute.** t
10720 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
10730 61 6c 69 61 73 2e 20 20 54 68 65 20 76 61 6c 75  alias.  The valu
10740 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  e is stored in a
10750 6e 20 61 75 78 69 6c 69 61 72 79 20 72 65 67 69  n auxiliary regi
10760 73 74 65 72 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ster.** and the 
10770 6e 75 6d 62 65 72 20 6f 66 20 74 68 61 74 20 72  number of that r
10780 65 67 69 73 74 65 72 20 69 73 20 72 65 74 75 72  egister is retur
10790 6e 65 64 2e 20 20 4f 6e 20 73 75 62 73 65 71 75  ned.  On subsequ
107a0 65 6e 74 20 63 61 6c 6c 73 2c 0a 2a 2a 20 74 68  ent calls,.** th
107b0 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  e register numbe
107c0 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 77 69  r is returned wi
107d0 74 68 6f 75 74 20 67 65 6e 65 72 61 74 69 6e 67  thout generating
107e0 20 61 6e 79 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a   any code..**.**
107f0 20 4e 6f 74 65 20 74 68 61 74 20 69 6e 20 6f 72   Note that in or
10800 64 65 72 20 66 6f 72 20 74 68 69 73 20 74 6f 20  der for this to 
10810 77 6f 72 6b 2c 20 63 6f 64 65 20 6d 75 73 74 20  work, code must 
10820 62 65 20 67 65 6e 65 72 61 74 65 64 20 69 6e 20  be generated in 
10830 74 68 65 0a 2a 2a 20 73 61 6d 65 20 6f 72 64 65  the.** same orde
10840 72 20 74 68 61 74 20 69 74 20 69 73 20 65 78 65  r that it is exe
10850 63 75 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6c 69  cuted..**.** Ali
10860 61 73 65 73 20 61 72 65 20 6e 75 6d 62 65 72 65  ases are numbere
10870 64 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  d starting with 
10880 31 2e 20 20 53 6f 20 69 41 6c 69 61 73 20 69 73  1.  So iAlias is
10890 20 69 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a   in the range.**
108a0 20 6f 66 20 31 20 74 6f 20 70 50 61 72 73 65 2d   of 1 to pParse-
108b0 3e 6e 41 6c 69 61 73 20 69 6e 63 6c 75 73 69 76  >nAlias inclusiv
108c0 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 70 50 61 72 73  e.  .**.** pPars
108d0 65 2d 3e 61 41 6c 69 61 73 5b 69 41 6c 69 61 73  e->aAlias[iAlias
108e0 2d 31 5d 20 72 65 63 6f 72 64 73 20 74 68 65 20  -1] records the 
108f0 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20  register number 
10900 77 68 65 72 65 20 74 68 65 20 76 61 6c 75 65 0a  where the value.
10910 2a 2a 20 6f 66 20 74 68 65 20 69 41 6c 69 61 73  ** of the iAlias
10920 2d 74 68 20 61 6c 69 61 73 20 69 73 20 73 74 6f  -th alias is sto
10930 72 65 64 2e 20 20 49 66 20 7a 65 72 6f 2c 20 74  red.  If zero, t
10940 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74  hat means that t
10950 68 65 0a 2a 2a 20 61 6c 69 61 73 20 68 61 73 20  he.** alias has 
10960 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 6d  not yet been com
10970 70 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  puted..*/.static
10980 20 69 6e 74 20 63 6f 64 65 41 6c 69 61 73 28 50   int codeAlias(P
10990 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
109a0 74 20 69 41 6c 69 61 73 2c 20 45 78 70 72 20 2a  t iAlias, Expr *
109b0 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
109c0 74 29 7b 0a 23 69 66 20 30 0a 20 20 73 71 6c 69  t){.#if 0.  sqli
109d0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
109e0 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 52 65 67  ->db;.  int iReg
109f0 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
10a00 6e 41 6c 69 61 73 41 6c 6c 6f 63 3c 70 50 61 72  nAliasAlloc<pPar
10a10 73 65 2d 3e 6e 41 6c 69 61 73 20 29 7b 0a 20 20  se->nAlias ){.  
10a20 20 20 70 50 61 72 73 65 2d 3e 61 41 6c 69 61 73    pParse->aAlias
10a30 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
10a40 6c 6f 63 4f 72 46 72 65 65 28 64 62 2c 20 70 50  locOrFree(db, pP
10a50 61 72 73 65 2d 3e 61 41 6c 69 61 73 2c 0a 20 20  arse->aAlias,.  
10a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
10a80 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 41  izeof(pParse->aA
10a90 6c 69 61 73 5b 30 5d 29 2a 70 50 61 72 73 65 2d  lias[0])*pParse-
10aa0 3e 6e 41 6c 69 61 73 20 29 3b 0a 20 20 20 20 74  >nAlias );.    t
10ab0 65 73 74 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c  estcase( db->mal
10ac0 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 70 50 61  locFailed && pPa
10ad0 72 73 65 2d 3e 6e 41 6c 69 61 73 41 6c 6c 6f 63  rse->nAliasAlloc
10ae0 3e 30 20 29 3b 0a 20 20 20 20 69 66 28 20 64 62  >0 );.    if( db
10af0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
10b00 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 6d   return 0;.    m
10b10 65 6d 73 65 74 28 26 70 50 61 72 73 65 2d 3e 61  emset(&pParse->a
10b20 41 6c 69 61 73 5b 70 50 61 72 73 65 2d 3e 6e 41  Alias[pParse->nA
10b30 6c 69 61 73 41 6c 6c 6f 63 5d 2c 20 30 2c 0a 20  liasAlloc], 0,. 
10b40 20 20 20 20 20 20 20 20 20 20 28 70 50 61 72 73            (pPars
10b50 65 2d 3e 6e 41 6c 69 61 73 2d 70 50 61 72 73 65  e->nAlias-pParse
10b60 2d 3e 6e 41 6c 69 61 73 41 6c 6c 6f 63 29 2a 73  ->nAliasAlloc)*s
10b70 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 41  izeof(pParse->aA
10b80 6c 69 61 73 5b 30 5d 29 29 3b 0a 20 20 20 20 70  lias[0]));.    p
10b90 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 41 6c 6c  Parse->nAliasAll
10ba0 6f 63 20 3d 20 70 50 61 72 73 65 2d 3e 6e 41 6c  oc = pParse->nAl
10bb0 69 61 73 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ias;.  }.  asser
10bc0 74 28 20 69 41 6c 69 61 73 3e 30 20 26 26 20 69  t( iAlias>0 && i
10bd0 41 6c 69 61 73 3c 3d 70 50 61 72 73 65 2d 3e 6e  Alias<=pParse->n
10be0 41 6c 69 61 73 20 29 3b 0a 20 20 69 52 65 67 20  Alias );.  iReg 
10bf0 3d 20 70 50 61 72 73 65 2d 3e 61 41 6c 69 61 73  = pParse->aAlias
10c00 5b 69 41 6c 69 61 73 2d 31 5d 3b 0a 20 20 69 66  [iAlias-1];.  if
10c10 28 20 69 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20  ( iReg==0 ){.   
10c20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 43 61   if( pParse->iCa
10c30 63 68 65 4c 65 76 65 6c 3e 30 20 29 7b 0a 20 20  cheLevel>0 ){.  
10c40 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74      iReg = sqlit
10c50 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
10c60 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
10c70 74 61 72 67 65 74 29 3b 0a 20 20 20 20 7d 65 6c  target);.    }el
10c80 73 65 7b 0a 20 20 20 20 20 20 69 52 65 67 20 3d  se{.      iReg =
10c90 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
10ca0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
10cb0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
10cc0 45 78 70 72 2c 20 69 52 65 67 29 3b 0a 20 20 20  Expr, iReg);.   
10cd0 20 20 20 70 50 61 72 73 65 2d 3e 61 41 6c 69 61     pParse->aAlia
10ce0 73 5b 69 41 6c 69 61 73 2d 31 5d 20 3d 20 69 52  s[iAlias-1] = iR
10cf0 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  eg;.    }.  }.  
10d00 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 23 65 6c  return iReg;.#el
10d10 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
10d20 4d 45 54 45 52 28 69 41 6c 69 61 73 29 3b 0a 20  METER(iAlias);. 
10d30 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
10d40 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
10d50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
10d60 67 65 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  get);.#endif.}..
10d70 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
10d80 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75 72  ode into the cur
10d90 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76 61  rent Vdbe to eva
10da0 6c 75 61 74 65 20 74 68 65 20 67 69 76 65 6e 0a  luate the given.
10db0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ** expression.  
10dc0 41 74 74 65 6d 70 74 20 74 6f 20 73 74 6f 72 65  Attempt to store
10dd0 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
10de0 72 65 67 69 73 74 65 72 20 22 74 61 72 67 65 74  register "target
10df0 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  "..** Return the
10e00 20 72 65 67 69 73 74 65 72 20 77 68 65 72 65 20   register where 
10e10 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72  results are stor
10e20 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74  ed..**.** With t
10e30 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  his routine, the
10e40 72 65 20 69 73 20 6e 6f 20 67 75 61 72 61 6e 74  re is no guarant
10e50 65 65 20 74 68 61 74 20 72 65 73 75 6c 74 73 20  ee that results 
10e60 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72 65  will.** be store
10e70 64 20 69 6e 20 74 61 72 67 65 74 2e 20 20 54 68  d in target.  Th
10e80 65 20 72 65 73 75 6c 74 20 6d 69 67 68 74 20 62  e result might b
10e90 65 20 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65  e stored in some
10ea0 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67 69 73 74   other.** regist
10eb0 65 72 20 69 66 20 69 74 20 69 73 20 63 6f 6e 76  er if it is conv
10ec0 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f 2e  enient to do so.
10ed0 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75    The calling fu
10ee0 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63  nction.** must c
10ef0 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20  heck the return 
10f00 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65 20 74 68  code and move th
10f10 65 20 72 65 73 75 6c 74 73 20 74 6f 20 74 68 65  e results to the
10f20 20 64 65 73 69 72 65 64 0a 2a 2a 20 72 65 67 69   desired.** regi
10f30 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ster..*/.int sql
10f40 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
10f50 65 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  et(Parse *pParse
10f60 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
10f70 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64  nt target){.  Vd
10f80 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
10f90 70 56 64 62 65 3b 20 20 2f 2a 20 54 68 65 20 56  pVdbe;  /* The V
10fa0 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  M under construc
10fb0 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tion */.  int op
10fc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10fd0 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64      /* The opcod
10fe0 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  e being coded */
10ff0 0a 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 74  .  int inReg = t
11000 61 72 67 65 74 3b 20 20 20 20 20 20 20 2f 2a 20  arget;       /* 
11010 52 65 73 75 6c 74 73 20 73 74 6f 72 65 64 20 69  Results stored i
11020 6e 20 72 65 67 69 73 74 65 72 20 69 6e 52 65 67  n register inReg
11030 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65   */.  int regFre
11040 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  e1 = 0;         
11050 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66  /* If non-zero f
11060 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61  ree this tempora
11070 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  ry register */. 
11080 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20   int regFree2 = 
11090 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  0;         /* If
110a0 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74   non-zero free t
110b0 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65  his temporary re
110c0 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
110d0 72 31 2c 20 72 32 2c 20 72 33 2c 20 72 34 3b 20  r1, r2, r3, r4; 
110e0 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73        /* Various
110f0 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
11100 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
11110 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
11120 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
11130 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a   connection */..
11140 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
11150 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50  >0 && target<=pP
11160 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  arse->nMem );.  
11170 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20  if( v==0 ){.    
11180 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
11190 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
111a0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   );.    return 0
111b0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 45 78  ;.  }..  if( pEx
111c0 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20  pr==0 ){.    op 
111d0 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c  = TK_NULL;.  }el
111e0 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78  se{.    op = pEx
111f0 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77  pr->op;.  }.  sw
11200 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
11210 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
11220 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49  MN: {.      AggI
11230 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20  nfo *pAggInfo = 
11240 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b  pExpr->pAggInfo;
11250 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67  .      struct Ag
11260 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20  gInfo_col *pCol 
11270 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  = &pAggInfo->aCo
11280 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a  l[pExpr->iAgg];.
11290 20 20 20 20 20 20 69 66 28 20 21 70 41 67 67 49        if( !pAggI
112a0 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20  nfo->directMode 
112b0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
112c0 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20  t( pCol->iMem>0 
112d0 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  );.        inReg
112e0 20 3d 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20   = pCol->iMem;. 
112f0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
11300 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41      }else if( pA
11310 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69  ggInfo->useSorti
11320 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20  ngIdx ){.       
11330 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11340 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
11350 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69   pAggInfo->sorti
11360 6e 67 49 64 78 2c 0a 20 20 20 20 20 20 20 20 20  ngIdx,.         
11370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11380 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
11390 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74  erColumn, target
113a0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
113b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
113c0 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61  /* Otherwise, fa
113d0 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65  ll thru into the
113e0 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20   TK_COLUMN case 
113f0 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  */.    }.    cas
11400 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
11410 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
11420 69 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20  iTable<0 ){.    
11430 20 20 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79      /* This only
11440 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f   happens when co
11450 64 69 6e 67 20 63 68 65 63 6b 20 63 6f 6e 73 74  ding check const
11460 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  raints */.      
11470 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
11480 2d 3e 63 6b 42 61 73 65 3e 30 20 29 3b 0a 20 20  ->ckBase>0 );.  
11490 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45        inReg = pE
114a0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70  xpr->iColumn + p
114b0 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3b 0a 20  Parse->ckBase;. 
114c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
114d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
114e0 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
114f0 5f 41 6e 79 41 66 66 29 21 3d 30 20 29 3b 0a 20  _AnyAff)!=0 );. 
11500 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73         inReg = s
11510 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
11520 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  tColumn(pParse, 
11530 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20 20 20  pExpr->pTab,.   
11540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
11560 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 45  xpr->iColumn, pE
11570 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72  xpr->iTable, tar
11580 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  get,.           
11590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115a0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61        pExpr->fla
115b0 67 73 20 26 20 45 50 5f 41 6e 79 41 66 66 29 3b  gs & EP_AnyAff);
115c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
115d0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
115e0 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
115f0 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74   {.      codeInt
11600 65 67 65 72 28 76 2c 20 70 45 78 70 72 2c 20 30  eger(v, pExpr, 0
11610 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
11620 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
11630 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
11640 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
11650 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
11660 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
11670 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 63  alue) );.      c
11680 6f 64 65 52 65 61 6c 28 76 2c 20 70 45 78 70 72  odeReal(v, pExpr
11690 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74  ->u.zToken, 0, t
116a0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
116b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
116c0 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
116d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
116e0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
116f0 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
11700 75 65 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ue) );.      sql
11710 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
11720 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
11730 20 74 61 72 67 65 74 2c 20 30 2c 20 70 45 78 70   target, 0, pExp
11740 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b  r->u.zToken, 0);
11750 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11760 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
11770 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  NULL: {.      sq
11780 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11790 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
117a0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
117b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
117c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
117d0 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20  LOB_LITERAL.    
117e0 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a  case TK_BLOB: {.
117f0 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
11800 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
11810 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42  ;.      char *zB
11820 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72  lob;.      asser
11830 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
11840 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
11850 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
11860 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
11870 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27  u.zToken[0]=='x'
11880 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f   || pExpr->u.zTo
11890 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20  ken[0]=='X' );. 
118a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
118b0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d  pr->u.zToken[1]=
118c0 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a  ='\'' );.      z
118d0 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f   = &pExpr->u.zTo
118e0 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20  ken[2];.      n 
118f0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
11900 30 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20 20 20  0(z) - 1;.      
11910 61 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c  assert( z[n]=='\
11920 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f  '' );.      zBlo
11930 62 20 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f  b = sqlite3HexTo
11940 42 6c 6f 62 28 73 71 6c 69 74 65 33 56 64 62 65  Blob(sqlite3Vdbe
11950 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20  Db(v), z, n);.  
11960 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11970 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62  ddOp4(v, OP_Blob
11980 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20 30  , n/2, target, 0
11990 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41  , zBlob, P4_DYNA
119a0 4d 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61  MIC);.      brea
119b0 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
119c0 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
119d0 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 56 64  ABLE: {.      Vd
119e0 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20  beOp *pOp;.     
119f0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
11a00 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
11a10 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
11a20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
11a30 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d  Expr->u.zToken!=
11a40 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
11a50 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
11a60 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20  en[0]!=0 );.    
11a70 20 20 69 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a    if( pExpr->u.z
11a80 54 6f 6b 65 6e 5b 31 5d 3d 3d 30 0a 20 20 20 20  Token[1]==0.    
11a90 20 20 20 20 20 26 26 20 28 70 4f 70 20 3d 20 73       && (pOp = s
11aa0 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
11ab0 76 2c 20 2d 31 29 29 2d 3e 6f 70 63 6f 64 65 3d  v, -1))->opcode=
11ac0 3d 4f 50 5f 56 61 72 69 61 62 6c 65 0a 20 20 20  =OP_Variable.   
11ad0 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 31        && pOp->p1
11ae0 2b 70 4f 70 2d 3e 70 33 3d 3d 70 45 78 70 72 2d  +pOp->p3==pExpr-
11af0 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20 20  >iTable.        
11b00 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d   && pOp->p2+pOp-
11b10 3e 70 33 3d 3d 74 61 72 67 65 74 0a 20 20 20 20  >p3==target.    
11b20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 34 2e       && pOp->p4.
11b30 7a 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20  z==0.      ){.  
11b40 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
11b50 70 72 65 76 69 6f 75 73 20 69 6e 73 74 72 75 63  previous instruc
11b60 74 69 6f 6e 20 77 61 73 20 61 20 63 6f 70 79 20  tion was a copy 
11b70 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  of the previous 
11b80 75 6e 6e 61 6d 65 64 0a 20 20 20 20 20 20 20 20  unnamed.        
11b90 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 6e 74  ** parameter int
11ba0 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72  o the previous r
11bb0 65 67 69 73 74 65 72 2c 20 74 68 65 6e 20 73 69  egister, then si
11bc0 6d 70 6c 79 20 69 6e 63 72 65 6d 65 6e 74 20 74  mply increment t
11bd0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  he.        ** re
11be0 70 65 61 74 20 63 6f 75 6e 74 20 6f 6e 20 74 68  peat count on th
11bf0 65 20 70 72 69 6f 72 20 69 6e 73 74 72 75 63 74  e prior instruct
11c00 69 6f 6e 20 72 61 74 68 65 72 20 74 68 61 6e 20  ion rather than 
11c10 6d 61 6b 69 6e 67 20 61 20 6e 65 77 0a 20 20 20  making a new.   
11c20 20 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74       ** instruct
11c30 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ion..        */.
11c40 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 2b          pOp->p3+
11c50 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  +;.      }else{.
11c60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
11c70 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
11c80 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d  Variable, pExpr-
11c90 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74 2c  >iTable, target,
11ca0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
11cb0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
11cc0 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  [1]!=0 ){.      
11cd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
11ce0 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 70  hangeP4(v, -1, p
11cf0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
11d00 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
11d10 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
11d20 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
11d30 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b  e TK_REGISTER: {
11d40 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70  .      inReg = p
11d50 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
11d60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11d70 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a  .    case TK_AS:
11d80 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   {.      inReg =
11d90 20 63 6f 64 65 41 6c 69 61 73 28 70 50 61 72 73   codeAlias(pPars
11da0 65 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e, pExpr->iTable
11db0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
11dc0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62  target);.      b
11dd0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
11de0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11df0 43 41 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b  CAST.    case TK
11e00 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f  _CAST: {.      /
11e10 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  * Expressions of
11e20 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53   the form:   CAS
11e30 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e  T(pLeft AS token
11e40 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  ) */.      int a
11e50 66 66 2c 20 74 6f 5f 6f 70 3b 0a 20 20 20 20 20  ff, to_op;.     
11e60 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
11e70 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
11e80 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
11e90 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  eft, target);.  
11ea0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
11eb0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
11ec0 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
11ed0 20 29 3b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   );.      aff = 
11ee0 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
11ef0 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  ype(pExpr->u.zTo
11f00 6b 65 6e 29 3b 0a 20 20 20 20 20 20 74 6f 5f 6f  ken);.      to_o
11f10 70 20 3d 20 61 66 66 20 2d 20 53 51 4c 49 54 45  p = aff - SQLITE
11f20 5f 41 46 46 5f 54 45 58 54 20 2b 20 4f 50 5f 54  _AFF_TEXT + OP_T
11f30 6f 54 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73  oText;.      ass
11f40 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ert( to_op==OP_T
11f50 6f 54 65 78 74 20 20 20 20 7c 7c 20 61 66 66 21  oText    || aff!
11f60 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
11f70 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73      );.      ass
11f80 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ert( to_op==OP_T
11f90 6f 42 6c 6f 62 20 20 20 20 7c 7c 20 61 66 66 21  oBlob    || aff!
11fa0 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
11fb0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73      );.      ass
11fc0 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ert( to_op==OP_T
11fd0 6f 4e 75 6d 65 72 69 63 20 7c 7c 20 61 66 66 21  oNumeric || aff!
11fe0 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
11ff0 52 49 43 20 29 3b 0a 20 20 20 20 20 20 61 73 73  RIC );.      ass
12000 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ert( to_op==OP_T
12010 6f 49 6e 74 20 20 20 20 20 7c 7c 20 61 66 66 21  oInt     || aff!
12020 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45  =SQLITE_AFF_INTE
12030 47 45 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73  GER );.      ass
12040 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ert( to_op==OP_T
12050 6f 52 65 61 6c 20 20 20 20 7c 7c 20 61 66 66 21  oReal    || aff!
12060 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
12070 20 20 20 20 29 3b 0a 20 20 20 20 20 20 74 65 73      );.      tes
12080 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50  tcase( to_op==OP
12090 5f 54 6f 54 65 78 74 20 29 3b 0a 20 20 20 20 20  _ToText );.     
120a0 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70   testcase( to_op
120b0 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 29 3b 0a 20  ==OP_ToBlob );. 
120c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74       testcase( t
120d0 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72  o_op==OP_ToNumer
120e0 69 63 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ic );.      test
120f0 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  case( to_op==OP_
12100 54 6f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 74  ToInt );.      t
12110 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d  estcase( to_op==
12120 4f 50 5f 54 6f 52 65 61 6c 20 29 3b 0a 20 20 20  OP_ToReal );.   
12130 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61     if( inReg!=ta
12140 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  rget ){.        
12150 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12160 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69  2(v, OP_SCopy, i
12170 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20  nReg, target);. 
12180 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74         inReg = t
12190 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20  arget;.      }. 
121a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
121b0 41 64 64 4f 70 31 28 76 2c 20 74 6f 5f 6f 70 2c  AddOp1(v, to_op,
121c0 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 74   inReg);.      t
121d0 65 73 74 63 61 73 65 28 20 75 73 65 64 41 73 43  estcase( usedAsC
121e0 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73  olumnCache(pPars
121f0 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65 67 29  e, inReg, inReg)
12200 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
12210 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
12220 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
12230 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20 20   inReg, 1);.    
12240 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
12250 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
12260 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20  OMIT_CAST */.   
12270 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
12280 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
12290 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
122a0 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
122b0 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
122c0 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
122d0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
122e0 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20  LT==OP_Lt );.   
122f0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45     assert( TK_LE
12300 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20  ==OP_Le );.     
12310 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d   assert( TK_GT==
12320 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61  OP_Gt );.      a
12330 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50  ssert( TK_GE==OP
12340 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Ge );.      ass
12350 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45  ert( TK_EQ==OP_E
12360 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  q );.      asser
12370 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20  t( TK_NE==OP_Ne 
12380 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
12390 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a  e( op==TK_LT );.
123a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
123b0 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20  op==TK_LE );.   
123c0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
123d0 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20  =TK_GT );.      
123e0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
123f0 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GE );.      tes
12400 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51  tcase( op==TK_EQ
12410 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
12420 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b  se( op==TK_NE );
12430 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
12440 72 65 4f 70 65 72 61 6e 64 73 28 70 50 61 72 73  reOperands(pPars
12450 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
12460 20 26 72 31 2c 20 26 72 65 67 46 72 65 65 31 2c   &r1, &regFree1,
12470 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12490 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
124a0 2c 20 26 72 32 2c 20 26 72 65 67 46 72 65 65 32  , &r2, &regFree2
124b0 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
124c0 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
124d0 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
124e0 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
124f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12500 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53  r1, r2, inReg, S
12510 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a  QLITE_STOREP2);.
12520 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
12530 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
12540 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
12550 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
12560 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
12570 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
12580 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  :.    case TK_OR
12590 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c  :.    case TK_PL
125a0 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
125b0 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54  STAR:.    case T
125c0 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73  K_MINUS:.    cas
125d0 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61  e TK_REM:.    ca
125e0 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20  se TK_BITAND:.  
125f0 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a    case TK_BITOR:
12600 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41  .    case TK_SLA
12610 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  SH:.    case TK_
12620 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65  LSHIFT:.    case
12630 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20   TK_RSHIFT: .   
12640 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a   case TK_CONCAT:
12650 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
12660 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20   TK_AND==OP_And 
12670 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
12680 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b   TK_OR==OP_Or );
12690 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
126a0 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29  K_PLUS==OP_Add )
126b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
126c0 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62  TK_MINUS==OP_Sub
126d0 74 72 61 63 74 20 29 3b 0a 20 20 20 20 20 20 61  tract );.      a
126e0 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f  ssert( TK_REM==O
126f0 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 0a 20  P_Remainder );. 
12700 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
12710 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e  BITAND==OP_BitAn
12720 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d );.      asser
12730 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f  t( TK_BITOR==OP_
12740 42 69 74 4f 72 20 29 3b 0a 20 20 20 20 20 20 61  BitOr );.      a
12750 73 73 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d  ssert( TK_SLASH=
12760 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b 0a 20 20  =OP_Divide );.  
12770 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
12780 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c  SHIFT==OP_ShiftL
12790 65 66 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  eft );.      ass
127a0 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d  ert( TK_RSHIFT==
127b0 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b  OP_ShiftRight );
127c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
127d0 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e  K_CONCAT==OP_Con
127e0 63 61 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  cat );.      tes
127f0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e  tcase( op==TK_AN
12800 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  D );.      testc
12810 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29  ase( op==TK_OR )
12820 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
12830 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b  ( op==TK_PLUS );
12840 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
12850 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b   op==TK_MINUS );
12860 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
12870 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20   op==TK_REM );. 
12880 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
12890 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a  p==TK_BITAND );.
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 42 49 54 4f 52 20 29 3b 0a  op==TK_BITOR );.
128c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
128d0 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a  op==TK_SLASH );.
128e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
128f0 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b  op==TK_LSHIFT );
12900 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
12910 20 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29   op==TK_RSHIFT )
12920 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
12930 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20  ( op==TK_CONCAT 
12940 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
12950 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
12960 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
12970 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
12980 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
12990 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
129a0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
129b0 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
129c0 65 65 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee2);.      sqli
129d0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
129e0 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74 61 72   op, r2, r1, tar
129f0 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  get);.      test
12a00 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
12a10 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
12a20 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
12a30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
12a40 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
12a50 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
12a60 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
12a70 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
12a80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65       assert( pLe
12a90 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ft );.      if( 
12aa0 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c  pLeft->op==TK_FL
12ab0 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61  OAT ){.        a
12ac0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
12ad0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
12ae0 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
12af0 20 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28         codeReal(
12b00 76 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b  v, pLeft->u.zTok
12b10 65 6e 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a  en, 1, target);.
12b20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
12b30 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pLeft->op==TK_IN
12b40 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20  TEGER ){.       
12b50 20 63 6f 64 65 49 6e 74 65 67 65 72 28 76 2c 20   codeInteger(v, 
12b60 70 4c 65 66 74 2c 20 31 2c 20 74 61 72 67 65 74  pLeft, 1, target
12b70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
12b80 20 20 20 20 20 20 20 20 72 65 67 46 72 65 65 31          regFree1
12b90 20 3d 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47   = r1 = sqlite3G
12ba0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
12bb0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
12bc0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12bd0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
12be0 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d  1);.        r2 =
12bf0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
12c00 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
12c10 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
12c20 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20 73  ree2);.        s
12c30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
12c40 28 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c  (v, OP_Subtract,
12c50 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29   r2, r1, target)
12c60 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
12c70 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
12c80 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
12c90 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
12ca0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12cb0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
12cc0 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65  BITNOT:.    case
12cd0 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
12ce0 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e   assert( TK_BITN
12cf0 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b  OT==OP_BitNot );
12d00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
12d10 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b  K_NOT==OP_Not );
12d20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
12d30 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29   op==TK_BITNOT )
12d40 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
12d50 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a  ( op==TK_NOT );.
12d60 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
12d70 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
12d80 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
12d90 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
12da0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
12db0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
12dc0 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61        inReg = ta
12dd0 72 67 65 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  rget;.      sqli
12de0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12df0 20 6f 70 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b   op, r1, inReg);
12e00 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12e10 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
12e20 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
12e30 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
12e40 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
12e50 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
12e60 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c  ISNULL==OP_IsNul
12e70 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  l );.      asser
12e80 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f  t( TK_NOTNULL==O
12e90 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20  P_NotNull );.   
12ea0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
12eb0 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20  =TK_ISNULL );.  
12ec0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
12ed0 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a  ==TK_NOTNULL );.
12ee0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12ef0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
12f00 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74  teger, 1, target
12f10 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
12f20 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
12f30 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
12f40 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
12f50 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
12f60 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
12f70 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
12f80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12f90 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20  1(v, op, r1);.  
12fa0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12fb0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
12fc0 6d 6d 2c 20 74 61 72 67 65 74 2c 20 2d 31 29 3b  mm, target, -1);
12fd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12fe0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
12ff0 64 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  dr);.      break
13000 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
13010 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
13020 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66  : {.      AggInf
13030 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70 72  o *pInfo = pExpr
13040 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20  ->pAggInfo;.    
13050 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29    if( pInfo==0 )
13060 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
13070 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
13080 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
13090 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
130a0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
130b0 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73  g(pParse, "misus
130c0 65 20 6f 66 20 61 67 67 72 65 67 61 74 65 3a 20  e of aggregate: 
130d0 25 73 28 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e  %s()", pExpr->u.
130e0 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d  zToken);.      }
130f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
13100 52 65 67 20 3d 20 70 49 6e 66 6f 2d 3e 61 46 75  Reg = pInfo->aFu
13110 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e  nc[pExpr->iAgg].
13120 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iMem;.      }.  
13130 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
13140 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e  .    case TK_CON
13150 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63 61 73  ST_FUNC:.    cas
13160 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  e TK_FUNCTION: {
13170 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
13180 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a  *pFarg;       /*
13190 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f   List of functio
131a0 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  n arguments */. 
131b0 20 20 20 20 20 69 6e 74 20 6e 46 61 72 67 3b 20       int nFarg; 
131c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
131d0 75 6d 62 65 72 20 6f 66 20 66 75 6e 63 74 69 6f  umber of functio
131e0 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  n arguments */. 
131f0 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
13200 65 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ef;         /* T
13210 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69  he function defi
13220 6e 69 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f  nition object */
13230 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20  .      int nId; 
13240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13250 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 66   Length of the f
13260 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 69 6e 20  unction name in 
13270 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 63  bytes */.      c
13280 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20  onst char *zId; 
13290 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e        /* The fun
132a0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
132b0 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 4d 61 73      int constMas
132c0 6b 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4d 61  k = 0;     /* Ma
132d0 73 6b 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61  sk of function a
132e0 72 67 75 6d 65 6e 74 73 20 74 68 61 74 20 61 72  rguments that ar
132f0 65 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20  e constant */.  
13300 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
13310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
13320 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
13330 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43      u8 enc = ENC
13340 28 64 62 29 3b 20 20 20 20 20 20 2f 2a 20 54 68  (db);      /* Th
13350 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20  e text encoding 
13360 75 73 65 64 20 62 79 20 74 68 69 73 20 64 61 74  used by this dat
13370 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43  abase */.      C
13380 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
13390 30 3b 20 20 20 20 2f 2a 20 41 20 63 6f 6c 6c 61  0;    /* A colla
133a0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f  ting sequence */
133b0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
133c0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
133d0 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
133e0 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 74  lect) );.      t
133f0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
13400 43 4f 4e 53 54 5f 46 55 4e 43 20 29 3b 0a 20 20  CONST_FUNC );.  
13410 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
13420 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 3b  ==TK_FUNCTION );
13430 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
13440 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45  asAnyProperty(pE
13450 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  xpr, EP_TokenOnl
13460 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  y) ){.        pF
13470 61 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  arg = 0;.      }
13480 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46  else{.        pF
13490 61 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  arg = pExpr->x.p
134a0 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  List;.      }.  
134b0 20 20 20 20 6e 46 61 72 67 20 3d 20 70 46 61 72      nFarg = pFar
134c0 67 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70 72  g ? pFarg->nExpr
134d0 20 3a 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   : 0;.      asse
134e0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
134f0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
13500 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
13510 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 75    zId = pExpr->u
13520 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e  .zToken;.      n
13530 49 64 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  Id = sqlite3Strl
13540 65 6e 33 30 28 7a 49 64 29 3b 0a 20 20 20 20 20  en30(zId);.     
13550 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46   pDef = sqlite3F
13560 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  indFunction(db, 
13570 7a 49 64 2c 20 6e 49 64 2c 20 6e 46 61 72 67 2c  zId, nId, nFarg,
13580 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
13590 61 73 73 65 72 74 28 20 70 44 65 66 21 3d 30 20  assert( pDef!=0 
135a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 61  );.      if( pFa
135b0 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72 31  rg ){.        r1
135c0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
135d0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
135e0 46 61 72 67 29 3b 0a 20 20 20 20 20 20 20 20 73  Farg);.        s
135f0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
13600 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
13610 46 61 72 67 2c 20 72 31 2c 20 31 29 3b 0a 20 20  Farg, r1, 1);.  
13620 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13630 20 20 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 20     r1 = 0;.     
13640 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
13650 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
13660 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73  BLE.      /* Pos
13670 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74  sibly overload t
13680 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74  he function if t
13690 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
136a0 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20  t is.      ** a 
136b0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f  virtual table co
136c0 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  lumn..      **. 
136d0 20 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69       ** For infi
136e0 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b  x functions (LIK
136f0 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c  E, GLOB, REGEXP,
13700 20 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20   and MATCH) use 
13710 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63  the.      ** sec
13720 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f  ond argument, no
13730 74 20 74 68 65 20 66 69 72 73 74 2c 20 61 73 20  t the first, as 
13740 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
13750 74 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a  test to.      **
13760 20 73 65 65 20 69 66 20 69 74 20 69 73 20 61 20   see if it is a 
13770 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74  column in a virt
13780 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73  ual table.  This
13790 20 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65   is done because
137a0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65  .      ** the le
137b0 66 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e  ft operand of in
137c0 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74  fix functions (t
137d0 68 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61  he operand we wa
137e0 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63  nt to.      ** c
137f0 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69  ontrol overloadi
13800 6e 67 29 20 65 6e 64 73 20 75 70 20 61 73 20 74  ng) ends up as t
13810 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
13820 6e 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  nt to the.      
13830 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  ** function.  Th
13840 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20  e expression "A 
13850 67 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69 76  glob B" is equiv
13860 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20  alent to .      
13870 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20  ** "glob(B,A).  
13880 57 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74  We want to use t
13890 68 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20  he A in "A glob 
138a0 42 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20  B" to test.     
138b0 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e   ** for function
138c0 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42   overloading.  B
138d0 75 74 20 77 65 20 75 73 65 20 74 68 65 20 42 20  ut we use the B 
138e0 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c  term in "glob(B,
138f0 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  A)"..      */.  
13900 20 20 20 20 69 66 28 20 6e 46 61 72 67 3e 3d 32      if( nFarg>=2
13910 20 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67   && (pExpr->flag
13920 73 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e 63  s & EP_InfixFunc
13930 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  ) ){.        pDe
13940 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f  f = sqlite3VtabO
13950 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28  verloadFunction(
13960 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c  db, pDef, nFarg,
13970 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78   pFarg->a[1].pEx
13980 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  pr);.      }else
13990 20 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a   if( nFarg>0 ){.
139a0 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73          pDef = s
139b0 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f  qlite3VtabOverlo
139c0 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70  adFunction(db, p
139d0 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72  Def, nFarg, pFar
139e0 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  g->a[0].pExpr);.
139f0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
13a00 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
13a10 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFarg; i++){.   
13a20 20 20 20 20 20 69 66 28 20 69 3c 33 32 20 26 26       if( i<32 &&
13a30 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
13a40 6e 73 74 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b  nstant(pFarg->a[
13a50 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
13a60 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b         constMask
13a70 20 7c 3d 20 28 31 3c 3c 69 29 3b 0a 20 20 20 20   |= (1<<i);.    
13a80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
13a90 28 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20 26  ( (pDef->flags &
13aa0 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
13ab0 44 43 4f 4c 4c 29 21 3d 30 20 26 26 20 21 70 43  DCOLL)!=0 && !pC
13ac0 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oll ){.         
13ad0 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
13ae0 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
13af0 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e  se, pFarg->a[i].
13b00 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
13b10 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
13b20 69 66 28 20 70 44 65 66 2d 3e 66 6c 61 67 73 20  if( pDef->flags 
13b30 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45  & SQLITE_FUNC_NE
13b40 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20  EDCOLL ){.      
13b50 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
13b60 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
13b70 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73  Coll; .        s
13b80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
13b90 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
13ba0 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a  0, 0, 0, (char *
13bb0 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
13bc0 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  EQ);.      }.   
13bd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13be0 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74  dOp4(v, OP_Funct
13bf0 69 6f 6e 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20  ion, constMask, 
13c00 72 31 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20  r1, target,.    
13c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c20 20 20 20 20 28 63 68 61 72 2a 29 70 44 65 66 2c      (char*)pDef,
13c30 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
13c40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
13c50 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e  hangeP5(v, (u8)n
13c60 46 61 72 67 29 3b 0a 20 20 20 20 20 20 69 66 28  Farg);.      if(
13c70 20 6e 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20   nFarg ){.      
13c80 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
13c90 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
13ca0 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20  , r1, nFarg);.  
13cb0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
13cc0 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
13cd0 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
13ce0 65 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20  e, r1, nFarg);. 
13cf0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13d00 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
13d10 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
13d20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
13d30 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
13d40 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 74  ELECT: {.      t
13d50 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
13d60 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20  EXISTS );.      
13d70 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
13d80 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20  _SELECT );.     
13d90 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
13da0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
13db0 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  xpr, 0, 0);.    
13dc0 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d    inReg = pExpr-
13dd0 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
13de0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
13df0 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
13e00 20 20 20 20 20 69 6e 74 20 72 4e 6f 74 46 6f 75       int rNotFou
13e10 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  nd = 0;.      in
13e20 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d  t rMayHaveNull =
13e30 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 32   0;.      int j2
13e40 2c 20 6a 33 2c 20 6a 34 2c 20 6a 35 3b 0a 20 20  , j3, j4, j5;.  
13e50 20 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74      char affinit
13e60 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 65 54 79  y;.      int eTy
13e70 70 65 3b 0a 0a 20 20 20 20 20 20 56 64 62 65 4e  pe;..      VdbeN
13e80 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
13e90 62 65 67 69 6e 20 49 4e 20 65 78 70 72 20 72 25  begin IN expr r%
13ea0 64 22 2c 20 74 61 72 67 65 74 29 29 3b 0a 20 20  d", target));.  
13eb0 20 20 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69      eType = sqli
13ec0 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70  te3FindInIndex(p
13ed0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72  Parse, pExpr, &r
13ee0 4d 61 79 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20  MayHaveNull);.  
13ef0 20 20 20 20 69 66 28 20 72 4d 61 79 48 61 76 65      if( rMayHave
13f00 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Null ){.        
13f10 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 2b 2b 70 50  rNotFound = ++pP
13f20 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
13f30 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69    }..      /* Fi
13f40 67 75 72 65 20 6f 75 74 20 74 68 65 20 61 66 66  gure out the aff
13f50 69 6e 69 74 79 20 74 6f 20 75 73 65 20 74 6f 20  inity to use to 
13f60 63 72 65 61 74 65 20 61 20 6b 65 79 20 66 72 6f  create a key fro
13f70 6d 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20  m the results.  
13f80 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 65 78      ** of the ex
13f90 70 72 65 73 73 69 6f 6e 2e 20 61 66 66 69 6e 69  pression. affini
13fa0 74 79 53 74 72 20 73 74 6f 72 65 73 20 61 20 73  tyStr stores a s
13fb0 74 61 74 69 63 20 73 74 72 69 6e 67 20 73 75 69  tatic string sui
13fc0 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 20 20  table for.      
13fd0 2a 2a 20 50 34 20 6f 66 20 4f 50 5f 4d 61 6b 65  ** P4 of OP_Make
13fe0 52 65 63 6f 72 64 2e 0a 20 20 20 20 20 20 2a 2f  Record..      */
13ff0 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20  .      affinity 
14000 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69  = comparisonAffi
14010 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 0a 0a 20  nity(pExpr);... 
14020 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
14030 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65   <expr> from "<e
14040 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20  xpr> IN (...)". 
14050 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  The temporary ta
14060 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 70 45 78  ble.      ** pEx
14070 70 72 2d 3e 69 54 61 62 6c 65 20 63 6f 6e 74 61  pr->iTable conta
14080 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20 74  ins the values t
14090 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20  hat make up the 
140a0 28 2e 2e 2e 29 20 73 65 74 2e 0a 20 20 20 20 20  (...) set..     
140b0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
140c0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
140d0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
140e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
140f0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
14100 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ft, target);.   
14110 20 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56     j2 = sqlite3V
14120 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
14130 49 73 4e 75 6c 6c 2c 20 74 61 72 67 65 74 29 3b  IsNull, target);
14140 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
14150 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  ==IN_INDEX_ROWID
14160 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 33 20 3d   ){.        j3 =
14170 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14180 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p1(v, OP_MustBeI
14190 6e 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  nt, target);.   
141a0 20 20 20 20 20 6a 34 20 3d 20 73 71 6c 69 74 65       j4 = sqlite
141b0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
141c0 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 70 45 78  P_NotExists, pEx
141d0 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20 74  pr->iTable, 0, t
141e0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
141f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14200 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
14210 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
14220 20 20 20 20 20 6a 35 20 3d 20 73 71 6c 69 74 65       j5 = sqlite
14230 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
14240 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 20 20 20  P_Goto);.       
14250 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
14260 48 65 72 65 28 76 2c 20 6a 33 29 3b 0a 20 20 20  Here(v, j3);.   
14270 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14280 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 34 29 3b  JumpHere(v, j4);
14290 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
142a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
142b0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 74 61 72  _Integer, 0, tar
142c0 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  get);.      }els
142d0 65 7b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20  e{.        r2 = 
142e0 72 65 67 46 72 65 65 32 20 3d 20 73 71 6c 69 74  regFree2 = sqlit
142f0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
14300 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  rse);..        /
14310 2a 20 43 72 65 61 74 65 20 61 20 72 65 63 6f 72  * Create a recor
14320 64 20 61 6e 64 20 74 65 73 74 20 66 6f 72 20 73  d and test for s
14330 65 74 20 6d 65 6d 62 65 72 73 68 69 70 2e 20 49  et membership. I
14340 66 20 74 68 65 20 73 65 74 20 63 6f 6e 74 61 69  f the set contai
14350 6e 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ns.        ** th
14360 65 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 6a 75  e value, then ju
14370 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
14380 20 74 68 65 20 74 65 73 74 20 63 6f 64 65 2e 20   the test code. 
14390 54 68 65 20 74 61 72 67 65 74 0a 20 20 20 20 20  The target.     
143a0 20 20 20 2a 2a 20 72 65 67 69 73 74 65 72 20 73     ** register s
143b0 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 74 68  till contains th
143c0 65 20 74 72 75 65 20 28 31 29 20 76 61 6c 75 65  e true (1) value
143d0 20 77 72 69 74 74 65 6e 20 74 6f 20 69 74 20 65   written to it e
143e0 61 72 6c 69 65 72 2e 0a 20 20 20 20 20 20 20 20  arlier..        
143f0 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
14400 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
14410 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 74  OP_MakeRecord, t
14420 61 72 67 65 74 2c 20 31 2c 20 72 32 2c 20 26 61  arget, 1, r2, &a
14430 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20  ffinity, 1);.   
14440 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14450 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
14460 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29  eger, 1, target)
14470 3b 0a 20 20 20 20 20 20 20 20 6a 35 20 3d 20 73  ;.        j5 = s
14480 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
14490 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45  (v, OP_Found, pE
144a0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20  xpr->iTable, 0, 
144b0 72 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  r2);..        /*
144c0 20 49 66 20 74 68 65 20 73 65 74 20 6d 65 6d 62   If the set memb
144d0 65 72 73 68 69 70 20 74 65 73 74 20 66 61 69 6c  ership test fail
144e0 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  s, then the resu
144f0 6c 74 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20  lt of the .     
14500 20 20 20 2a 2a 20 22 78 20 49 4e 20 28 2e 2e 2e     ** "x IN (...
14510 29 22 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75  )" expression mu
14520 73 74 20 62 65 20 65 69 74 68 65 72 20 30 20 6f  st be either 0 o
14530 72 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20 73  r NULL. If the s
14540 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  et.        ** co
14550 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 20 76  ntains no NULL v
14560 61 6c 75 65 73 2c 20 74 68 65 6e 20 74 68 65 20  alues, then the 
14570 72 65 73 75 6c 74 20 69 73 20 30 2e 20 49 66 20  result is 0. If 
14580 74 68 65 20 73 65 74 20 0a 20 20 20 20 20 20 20  the set .       
14590 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65   ** contains one
145a0 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61   or more NULL va
145b0 6c 75 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72  lues, then the r
145c0 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 20  esult of the.   
145d0 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69       ** expressi
145e0 6f 6e 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e  on is also NULL.
145f0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
14600 20 20 20 20 69 66 28 20 72 4e 6f 74 46 6f 75 6e      if( rNotFoun
14610 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
14620 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
14630 20 72 75 6e 73 20 69 66 20 69 74 20 69 73 20 6b   runs if it is k
14640 6e 6f 77 6e 20 61 74 20 63 6f 6d 70 69 6c 65 20  nown at compile 
14650 74 69 6d 65 20 28 6e 6f 77 29 20 74 68 61 74 20  time (now) that 
14660 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
14670 65 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6e  e set contains n
14680 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 20 54  o NULL values. T
14690 68 69 73 20 68 61 70 70 65 6e 73 20 61 73 20 74  his happens as t
146a0 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  he result.      
146b0 20 20 20 20 2a 2a 20 6f 66 20 61 20 22 4e 4f 54      ** of a "NOT
146c0 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e   NULL" constrain
146d0 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  t in the databas
146e0 65 20 73 63 68 65 6d 61 2e 20 4e 6f 20 6e 65 65  e schema. No nee
146f0 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  d.          ** t
14700 6f 20 74 65 73 74 20 74 68 65 20 64 61 74 61 20  o test the data 
14710 73 74 72 75 63 74 75 72 65 20 61 74 20 72 75 6e  structure at run
14720 74 69 6d 65 20 69 6e 20 74 68 69 73 20 63 61 73  time in this cas
14730 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
14740 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14750 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14760 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 74 61  P_Integer, 0, ta
14770 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  rget);.        }
14780 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
14790 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 70 6f  /* This block po
147a0 70 75 6c 61 74 65 73 20 74 68 65 20 72 4e 6f 74  pulates the rNot
147b0 46 6f 75 6e 64 20 72 65 67 69 73 74 65 72 20 77  Found register w
147c0 69 74 68 20 65 69 74 68 65 72 20 4e 55 4c 4c 0a  ith either NULL.
147d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
147e0 30 20 28 61 6e 20 69 6e 74 65 67 65 72 20 76 61  0 (an integer va
147f0 6c 75 65 29 2e 20 49 66 20 74 68 65 20 64 61 74  lue). If the dat
14800 61 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  a structure cont
14810 61 69 6e 73 20 6f 6e 65 0a 20 20 20 20 20 20 20  ains one.       
14820 20 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 4e 55     ** or more NU
14830 4c 4c 73 2c 20 74 68 65 6e 20 73 65 74 20 72 4e  LLs, then set rN
14840 6f 74 46 6f 75 6e 64 20 74 6f 20 4e 55 4c 4c 2e  otFound to NULL.
14850 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20   Otherwise, set 
14860 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  it.          ** 
14870 74 6f 20 30 2e 20 49 66 20 72 65 67 69 73 74 65  to 0. If registe
14880 72 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 69  r rMayHaveNull i
14890 73 20 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f  s already set to
148a0 20 73 6f 6d 65 20 76 61 6c 75 65 0a 20 20 20 20   some value.    
148b0 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 74        ** other t
148c0 68 61 6e 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  han NULL, then t
148d0 68 65 20 74 65 73 74 20 68 61 73 20 61 6c 72 65  he test has alre
148e0 61 64 79 20 62 65 65 6e 20 72 75 6e 20 61 6e 64  ady been run and
148f0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72   .          ** r
14900 4e 6f 74 46 6f 75 6e 64 20 69 73 20 61 6c 72 65  NotFound is alre
14910 61 64 79 20 70 6f 70 75 6c 61 74 65 64 2e 0a 20  ady populated.. 
14920 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
14930 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
14940 73 74 20 63 68 61 72 20 6e 75 6c 6c 52 65 63 6f  st char nullReco
14950 72 64 5b 5d 20 3d 20 7b 20 30 78 30 32 2c 20 30  rd[] = { 0x02, 0
14960 78 30 30 20 7d 3b 0a 20 20 20 20 20 20 20 20 20  x00 };.         
14970 20 6a 33 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j3 = sqlite3Vdb
14980 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f  eAddOp1(v, OP_No
14990 74 4e 75 6c 6c 2c 20 72 4d 61 79 48 61 76 65 4e  tNull, rMayHaveN
149a0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ull);.          
149b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
149c0 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
149d0 20 72 4e 6f 74 46 6f 75 6e 64 29 3b 0a 20 20 20   rNotFound);.   
149e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
149f0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42  beAddOp4(v, OP_B
14a00 6c 6f 62 2c 20 32 2c 20 72 4d 61 79 48 61 76 65  lob, 2, rMayHave
14a10 4e 75 6c 6c 2c 20 30 2c 20 0a 20 20 20 20 20 20  Null, 0, .      
14a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a30 20 20 20 20 20 20 20 6e 75 6c 6c 52 65 63 6f 72         nullRecor
14a40 64 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20  d, P4_STATIC);. 
14a50 20 20 20 20 20 20 20 20 20 6a 34 20 3d 20 73 71           j4 = sq
14a60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
14a70 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78  v, OP_Found, pEx
14a80 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72  pr->iTable, 0, r
14a90 4d 61 79 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20  MayHaveNull);.  
14aa0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14ab0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14ac0 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 4e 6f 74  Integer, 0, rNot
14ad0 46 6f 75 6e 64 29 3b 0a 20 20 20 20 20 20 20 20  Found);.        
14ae0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
14af0 70 48 65 72 65 28 76 2c 20 6a 34 29 3b 0a 20 20  pHere(v, j4);.  
14b00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14b10 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
14b20 33 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  3);..          /
14b30 2a 20 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65  * Copy the value
14b40 20 6f 66 20 72 65 67 69 73 74 65 72 20 72 4e 6f   of register rNo
14b50 74 46 6f 75 6e 64 20 28 77 68 69 63 68 20 69 73  tFound (which is
14b60 20 65 69 74 68 65 72 20 4e 55 4c 4c 20 6f 72 20   either NULL or 
14b70 30 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  0).          ** 
14b80 69 6e 74 6f 20 74 68 65 20 74 61 72 67 65 74 20  into the target 
14b90 72 65 67 69 73 74 65 72 2e 20 54 68 69 73 20 77  register. This w
14ba0 69 6c 6c 20 62 65 20 74 68 65 20 72 65 73 75 6c  ill be the resul
14bb0 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  t of the.       
14bc0 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
14bd0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
14be0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14bf0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14c00 5f 43 6f 70 79 2c 20 72 4e 6f 74 46 6f 75 6e 64  _Copy, rNotFound
14c10 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
14c20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
14c30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
14c40 6d 70 48 65 72 65 28 76 2c 20 6a 32 29 3b 0a 20  mpHere(v, j2);. 
14c50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14c60 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 35 29 3b  JumpHere(v, j5);
14c70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
14c80 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
14c90 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 56 64 62  e, 1);.      Vdb
14ca0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e  eComment((v, "en
14cb0 64 20 49 4e 20 65 78 70 72 20 72 25 64 22 2c 20  d IN expr r%d", 
14cc0 74 61 72 67 65 74 29 29 3b 0a 20 20 20 20 20 20  target));.      
14cd0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
14ce0 64 69 66 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  dif.    /*.    *
14cf0 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79  *    x BETWEEN y
14d00 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20   AND z.    **.  
14d10 20 20 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75    ** This is equ
14d20 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a  ivalent to.    *
14d30 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79  *.    **    x>=y
14d40 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a   AND x<=z.    **
14d50 0a 20 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f  .    ** X is sto
14d60 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
14d70 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73  eft..    ** Y is
14d80 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
14d90 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
14da0 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73  xpr..    ** Z is
14db0 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
14dc0 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ->pList->a[1].pE
14dd0 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xpr..    */.    
14de0 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
14df0 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70   {.      Expr *p
14e00 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
14e10 65 66 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63  eft;.      struc
14e20 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
14e30 2a 70 4c 49 74 65 6d 20 3d 20 70 45 78 70 72 2d  *pLItem = pExpr-
14e40 3e 78 2e 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  >x.pList->a;.   
14e50 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
14e60 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b  = pLItem->pExpr;
14e70 0a 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ..      codeComp
14e80 61 72 65 4f 70 65 72 61 6e 64 73 28 70 50 61 72  areOperands(pPar
14e90 73 65 2c 20 70 4c 65 66 74 2c 20 26 72 31 2c 20  se, pLeft, &r1, 
14ea0 26 72 65 67 46 72 65 65 31 2c 0a 20 20 20 20 20  &regFree1,.     
14eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69               pRi
14ed0 67 68 74 2c 20 26 72 32 2c 20 26 72 65 67 46 72  ght, &r2, &regFr
14ee0 65 65 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ee2);.      test
14ef0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
14f00 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
14f10 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
14f20 20 29 3b 0a 20 20 20 20 20 20 72 33 20 3d 20 73   );.      r3 = s
14f30 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
14f40 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
14f50 72 34 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r4 = sqlite3GetT
14f60 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
14f70 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
14f80 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
14f90 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 0a   pRight, OP_Ge,.
14fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fb0 20 20 72 31 2c 20 72 32 2c 20 72 33 2c 20 53 51    r1, r2, r3, SQ
14fc0 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20  LITE_STOREP2);. 
14fd0 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20       pLItem++;. 
14fe0 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c       pRight = pL
14ff0 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
15000 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
15010 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
15020 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20   regFree2);.    
15030 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
15040 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
15050 65 2c 20 70 52 69 67 68 74 2c 20 26 72 65 67 46  e, pRight, &regF
15060 72 65 65 32 29 3b 0a 20 20 20 20 20 20 74 65 73  ree2);.      tes
15070 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
15080 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  =0 );.      code
15090 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
150a0 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f  pLeft, pRight, O
150b0 50 5f 4c 65 2c 20 72 31 2c 20 72 32 2c 20 72 34  P_Le, r1, r2, r4
150c0 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  , SQLITE_STOREP2
150d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
150e0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
150f0 5f 41 6e 64 2c 20 72 33 2c 20 72 34 2c 20 74 61  _And, r3, r4, ta
15100 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  rget);.      sql
15110 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
15120 65 67 28 70 50 61 72 73 65 2c 20 72 33 29 3b 0a  eg(pParse, r3);.
15130 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
15140 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
15150 73 65 2c 20 72 34 29 3b 0a 20 20 20 20 20 20 62  se, r4);.      b
15160 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
15170 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b  case TK_UPLUS: {
15180 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73  .      inReg = s
15190 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
151a0 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
151b0 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65  pr->pLeft, targe
151c0 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
151d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
151e0 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a 20 20     ** Form A:.  
151f0 20 20 2a 2a 20 20 20 43 41 53 45 20 78 20 57 48    **   CASE x WH
15200 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57 48  EN e1 THEN r1 WH
15210 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e  EN e2 THEN r2 ..
15220 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72  . WHEN eN THEN r
15230 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20  N ELSE y END.   
15240 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20   **.    ** Form 
15250 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45  B:.    **   CASE
15260 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31   WHEN e1 THEN r1
15270 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32   WHEN e2 THEN r2
15280 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45   ... WHEN eN THE
15290 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a  N rN ELSE y END.
152a0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
152b0 72 6d 20 41 20 69 73 20 63 61 6e 20 62 65 20 74  rm A is can be t
152c0 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20  ransformed into 
152d0 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66  the equivalent f
152e0 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f 77 73  orm B as follows
152f0 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20  :.    **   CASE 
15300 57 48 45 4e 20 78 3d 65 31 20 54 48 45 4e 20 72  WHEN x=e1 THEN r
15310 31 20 57 48 45 4e 20 78 3d 65 32 20 54 48 45 4e  1 WHEN x=e2 THEN
15320 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20   r2 ....    **  
15330 20 20 20 20 20 20 57 48 45 4e 20 78 3d 65 4e 20        WHEN x=eN 
15340 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45  THEN rN ELSE y E
15350 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ND.    **.    **
15360 20 58 20 28 69 66 20 69 74 20 65 78 69 73 74 73   X (if it exists
15370 29 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70  ) is in pExpr->p
15380 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69  Left..    ** Y i
15390 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 52 69 67  s in pExpr->pRig
153a0 68 74 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c  ht.  The Y is al
153b0 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66  so optional.  If
153c0 20 74 68 65 72 65 20 69 73 20 6e 6f 0a 20 20 20   there is no.   
153d0 20 2a 2a 20 45 4c 53 45 20 63 6c 61 75 73 65 20   ** ELSE clause 
153e0 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 74 65 72  and no other ter
153f0 6d 20 6d 61 74 63 68 65 73 2c 20 74 68 65 6e 20  m matches, then 
15400 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
15410 65 0a 20 20 20 20 2a 2a 20 65 78 70 72 73 73 69  e.    ** exprssi
15420 6f 6e 20 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20  on is NULL..    
15430 2a 2a 20 45 69 20 69 73 20 69 6e 20 70 45 78 70  ** Ei is in pExp
15440 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d  r->pList->a[i*2]
15450 20 61 6e 64 20 52 69 20 69 73 20 70 45 78 70 72   and Ri is pExpr
15460 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31  ->pList->a[i*2+1
15470 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ]..    **.    **
15480 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   The result of t
15490 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
154a0 20 74 68 65 20 52 69 20 66 6f 72 20 74 68 65 20   the Ri for the 
154b0 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 45  first matching E
154c0 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66 20  i,.    ** or if 
154d0 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63  there is no matc
154e0 68 69 6e 67 20 45 69 2c 20 74 68 65 20 45 4c 53  hing Ei, the ELS
154f0 45 20 74 65 72 6d 20 59 2c 20 6f 72 20 69 66 20  E term Y, or if 
15500 74 68 65 72 65 20 69 73 0a 20 20 20 20 2a 2a 20  there is.    ** 
15510 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55  no ELSE term, NU
15520 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  LL..    */.    c
15530 61 73 65 20 54 4b 5f 43 41 53 45 3a 20 7b 0a 20  ase TK_CASE: {. 
15540 20 20 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65       int endLabe
15550 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
15560 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c         /* GOTO l
15570 61 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20  abel for end of 
15580 43 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20  CASE stmt */.   
15590 20 20 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b     int nextCase;
155a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155b0 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62       /* GOTO lab
155c0 65 6c 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e  el for next WHEN
155d0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
155e0 20 69 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20   int nExpr;     
155f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15600 20 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20     /* 2x number 
15610 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f  of WHEN terms */
15620 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
15630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15640 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
15650 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
15660 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
15670 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
15680 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57      /* List of W
15690 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
156a0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
156b0 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c  st_item *aListel
156c0 65 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66  em;  /* Array of
156d0 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
156e0 20 20 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70       Expr opComp
156f0 61 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  are;            
15700 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d         /* The X=
15710 3d 45 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  =Ei expression *
15720 2f 0a 20 20 20 20 20 20 45 78 70 72 20 63 61 63  /.      Expr cac
15730 68 65 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  heX;            
15740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63            /* Cac
15750 68 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20 58  hed expression X
15760 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
15770 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
15780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15790 68 65 20 58 20 65 78 70 72 65 73 73 69 6f 6e 20  he X expression 
157a0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
157b0 54 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Test = 0;       
157c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58 3d             /* X=
157d0 3d 45 69 20 28 66 6f 72 6d 20 41 29 20 6f 72 20  =Ei (form A) or 
157e0 6a 75 73 74 20 45 69 20 28 66 6f 72 6d 20 42 29  just Ei (form B)
157f0 20 2a 2f 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e   */.      VVA_ON
15800 4c 59 28 20 69 6e 74 20 69 43 61 63 68 65 4c 65  LY( int iCacheLe
15810 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43  vel = pParse->iC
15820 61 63 68 65 4c 65 76 65 6c 3b 20 29 0a 0a 20 20  acheLevel; )..  
15830 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
15840 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
15850 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
15860 29 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ) && pExpr->x.pL
15870 69 73 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ist );.      ass
15880 65 72 74 28 28 70 45 78 70 72 2d 3e 78 2e 70 4c  ert((pExpr->x.pL
15890 69 73 74 2d 3e 6e 45 78 70 72 20 25 20 32 29 20  ist->nExpr % 2) 
158a0 3d 3d 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  == 0);.      ass
158b0 65 72 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69  ert(pExpr->x.pLi
158c0 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a  st->nExpr > 0);.
158d0 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70        pEList = p
158e0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
158f0 20 20 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d       aListelem =
15900 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20   pEList->a;.    
15910 20 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74    nExpr = pEList
15920 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65  ->nExpr;.      e
15930 6e 64 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65  ndLabel = sqlite
15940 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
15950 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58  );.      if( (pX
15960 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29   = pExpr->pLeft)
15970 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  !=0 ){.        c
15980 61 63 68 65 58 20 3d 20 2a 70 58 3b 0a 20 20 20  acheX = *pX;.   
15990 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
159a0 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  X->op==TK_COLUMN
159b0 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 52   || pX->op==TK_R
159c0 45 47 49 53 54 45 52 20 29 3b 0a 20 20 20 20 20  EGISTER );.     
159d0 20 20 20 63 61 63 68 65 58 2e 69 54 61 62 6c 65     cacheX.iTable
159e0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
159f0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
15a00 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  X, &regFree1);. 
15a10 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
15a20 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
15a30 20 20 20 20 20 20 20 20 63 61 63 68 65 58 2e 6f          cacheX.o
15a40 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b  p = TK_REGISTER;
15a50 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61  .        opCompa
15a60 72 65 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20  re.op = TK_EQ;. 
15a70 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65         opCompare
15a80 2e 70 4c 65 66 74 20 3d 20 26 63 61 63 68 65 58  .pLeft = &cacheX
15a90 3b 0a 20 20 20 20 20 20 20 20 70 54 65 73 74 20  ;.        pTest 
15aa0 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20  = &opCompare;.  
15ab0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
15ac0 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 3d  i=0; i<nExpr; i=
15ad0 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i+2){.        sq
15ae0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
15af0 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
15b00 20 20 20 20 69 66 28 20 70 58 20 29 7b 0a 20 20      if( pX ){.  
15b10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
15b20 70 54 65 73 74 21 3d 30 20 29 3b 0a 20 20 20 20  pTest!=0 );.    
15b30 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e        opCompare.
15b40 70 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65 6c  pRight = aListel
15b50 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  em[i].pExpr;.   
15b60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15b70 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 61 4c        pTest = aL
15b80 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72  istelem[i].pExpr
15b90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15ba0 20 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20 73      nextCase = s
15bb0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
15bc0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
15bd0 74 65 73 74 63 61 73 65 28 20 70 54 65 73 74 2d  testcase( pTest-
15be0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op==TK_COLUMN |
15bf0 7c 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f  | pTest->op==TK_
15c00 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 20 20  REGISTER );.    
15c10 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
15c20 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
15c30 54 65 73 74 2c 20 6e 65 78 74 43 61 73 65 2c 20  Test, nextCase, 
15c40 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
15c50 4c 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  L);.        test
15c60 63 61 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b  case( aListelem[
15c70 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d  i+1].pExpr->op==
15c80 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
15c90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
15ca0 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45  Listelem[i+1].pE
15cb0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49  xpr->op==TK_REGI
15cc0 53 54 45 52 20 29 3b 0a 20 20 20 20 20 20 20 20  STER );.        
15cd0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
15ce0 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65  pParse, aListele
15cf0 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61  m[i+1].pExpr, ta
15d00 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73  rget);.        s
15d10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15d20 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
15d30 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20  endLabel);.     
15d40 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
15d50 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31  chePop(pParse, 1
15d60 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
15d70 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
15d80 65 6c 28 76 2c 20 6e 65 78 74 43 61 73 65 29 3b  el(v, nextCase);
15d90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
15da0 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  f( pExpr->pRight
15db0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
15dc0 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
15dd0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
15de0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
15df0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
15e00 3e 70 52 69 67 68 74 2c 20 74 61 72 67 65 74 29  >pRight, target)
15e10 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15e20 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
15e30 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20  arse, 1);.      
15e40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
15e50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15e60 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
15e70 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d  target);.      }
15e80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64  .      assert( d
15e90 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
15ea0 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  || pParse->nErr>
15eb0 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  0 .           ||
15ec0 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
15ed0 65 76 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76 65  evel==iCacheLeve
15ee0 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  l );.      sqlit
15ef0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
15f00 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b  el(v, endLabel);
15f10 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
15f20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
15f30 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
15f40 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53      case TK_RAIS
15f50 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 21  E: {.      if( !
15f60 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63  pParse->trigStac
15f70 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  k ){.        sql
15f80 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
15f90 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
15fa0 20 20 20 20 20 20 20 20 20 20 20 20 22 52 41 49              "RAI
15fb0 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65  SE() may only be
15fc0 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 74   used within a t
15fd0 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29  rigger-program")
15fe0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
15ff0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
16000 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66    if( pExpr->aff
16010 69 6e 69 74 79 21 3d 4f 45 5f 49 67 6e 6f 72 65  inity!=OE_Ignore
16020 20 29 7b 0a 20 20 20 20 20 20 20 20 20 61 73 73   ){.         ass
16030 65 72 74 28 20 70 45 78 70 72 2d 3e 61 66 66 69  ert( pExpr->affi
16040 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63  nity==OE_Rollbac
16050 6b 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  k ||.           
16060 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66        pExpr->aff
16070 69 6e 69 74 79 20 3d 3d 20 4f 45 5f 41 62 6f 72  inity == OE_Abor
16080 74 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  t ||.           
16090 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66        pExpr->aff
160a0 69 6e 69 74 79 20 3d 3d 20 4f 45 5f 46 61 69 6c  inity == OE_Fail
160b0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 61 73 73   );.         ass
160c0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
160d0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
160e0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
160f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16100 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61  eAddOp4(v, OP_Ha
16110 6c 74 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  lt, SQLITE_CONST
16120 52 41 49 4e 54 2c 20 70 45 78 70 72 2d 3e 61 66  RAINT, pExpr->af
16130 66 69 6e 69 74 79 2c 20 30 2c 0a 20 20 20 20 20  finity, 0,.     
16140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16150 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a        pExpr->u.z
16160 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20  Token, 0);.     
16170 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
16180 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
16190 2d 3e 61 66 66 69 6e 69 74 79 20 3d 3d 20 4f 45  ->affinity == OE
161a0 5f 49 67 6e 6f 72 65 20 29 3b 0a 20 20 20 20 20  _Ignore );.     
161b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
161c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 6e 74  ddOp2(v, OP_Cont
161d0 65 78 74 50 6f 70 2c 20 30 2c 20 30 29 3b 0a 20  extPop, 0, 0);. 
161e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
161f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16200 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d  Goto, 0, pParse-
16210 3e 74 72 69 67 53 74 61 63 6b 2d 3e 69 67 6e 6f  >trigStack->igno
16220 72 65 4a 75 6d 70 29 3b 0a 20 20 20 20 20 20 20  reJump);.       
16230 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
16240 2c 20 22 72 61 69 73 65 28 49 47 4e 4f 52 45 29  , "raise(IGNORE)
16250 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  "));.      }.   
16260 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16270 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c  #endif.  }.  sql
16280 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
16290 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
162a0 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ee1);.  sqlite3R
162b0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
162c0 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b  arse, regFree2);
162d0 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b  .  return inReg;
162e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
162f0 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
16300 61 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ate an expressio
16310 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  n and store the 
16320 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20  results.** into 
16330 61 20 72 65 67 69 73 74 65 72 2e 20 20 52 65 74  a register.  Ret
16340 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
16350 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74 68   number where th
16360 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65  e results.** are
16370 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   stored..**.** I
16380 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69  f the register i
16390 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65  s a temporary re
163a0 67 69 73 74 65 72 20 74 68 61 74 20 63 61 6e 20  gister that can 
163b0 62 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a  be deallocated,.
163c0 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 69 74  ** then write it
163d0 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  s number into *p
163e0 52 65 67 2e 20 20 49 66 20 74 68 65 20 72 65 73  Reg.  If the res
163f0 75 6c 74 20 72 65 67 69 73 74 65 72 20 69 73 20  ult register is 
16400 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61  not.** a tempora
16410 72 79 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ry, then set *pR
16420 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 69  eg to zero..*/.i
16430 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
16440 64 65 54 65 6d 70 28 50 61 72 73 65 20 2a 70 50  deTemp(Parse *pP
16450 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
16460 72 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20  r, int *pReg){. 
16470 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
16480 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
16490 73 65 29 3b 0a 20 20 69 6e 74 20 72 32 20 3d 20  se);.  int r2 = 
164a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
164b0 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
164c0 78 70 72 2c 20 72 31 29 3b 0a 20 20 69 66 28 20  xpr, r1);.  if( 
164d0 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20 2a 70  r2==r1 ){.    *p
164e0 52 65 67 20 3d 20 72 31 3b 0a 20 20 7d 65 6c 73  Reg = r1;.  }els
164f0 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  e{.    sqlite3Re
16500 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
16510 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 2a 70  rse, r1);.    *p
16520 52 65 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Reg = 0;.  }.  r
16530 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a  eturn r2;.}../*.
16540 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
16550 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75   that will evalu
16560 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  ate expression p
16570 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74  Expr and store t
16580 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e  he.** results in
16590 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
165a0 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  .  The results a
165b0 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
165c0 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65   appear.** in re
165d0 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a  gister target..*
165e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
165f0 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61  rCode(Parse *pPa
16600 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
16610 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
16620 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61   int inReg;..  a
16630 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
16640 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73  && target<=pPars
16650 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 6e 52  e->nMem );.  inR
16660 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
16670 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
16680 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
16690 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
166a0 72 73 65 2d 3e 70 56 64 62 65 20 7c 7c 20 70 50  rse->pVdbe || pP
166b0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
166c0 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
166d0 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 26 26  inReg!=target &&
166e0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29   pParse->pVdbe )
166f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
16700 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e  eAddOp2(pParse->
16710 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c  pVdbe, OP_SCopy,
16720 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b   inReg, target);
16730 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 74 61  .  }.  return ta
16740 72 67 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rget;.}../*.** G
16750 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
16760 74 20 65 76 61 6c 75 74 65 73 20 74 68 65 20 67  t evalutes the g
16770 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
16780 61 6e 64 20 70 75 74 73 20 74 68 65 20 72 65 73  and puts the res
16790 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  ult.** in regist
167a0 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a  er target..**.**
167b0 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70   Also make a cop
167c0 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  y of the express
167d0 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 74 6f  ion results into
167e0 20 61 6e 6f 74 68 65 72 20 22 63 61 63 68 65 22   another "cache"
167f0 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64   register.** and
16800 20 6d 6f 64 69 66 79 20 74 68 65 20 65 78 70 72   modify the expr
16810 65 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 74  ession so that t
16820 68 65 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20  he next time it 
16830 69 73 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a  is evaluated,.**
16840 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61   the result is a
16850 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 63   copy of the cac
16860 68 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a  he register..**.
16870 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
16880 69 73 20 75 73 65 64 20 66 6f 72 20 65 78 70 72  is used for expr
16890 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65  essions that are
168a0 20 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a   used multiple .
168b0 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68 65 79 20  ** times.  They 
168c0 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 6f 6e  are evaluated on
168d0 63 65 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c  ce and the resul
168e0 74 73 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ts of the expres
168f0 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73  sion.** are reus
16900 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
16910 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63  e3ExprCodeAndCac
16920 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  he(Parse *pParse
16930 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
16940 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64  nt target){.  Vd
16950 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
16960 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 6e 52  pVdbe;.  int inR
16970 65 67 3b 0a 20 20 69 6e 52 65 67 20 3d 20 73 71  eg;.  inReg = sq
16980 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
16990 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
169a0 67 65 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  get);.  assert( 
169b0 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 69 66  target>0 );.  if
169c0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
169d0 52 45 47 49 53 54 45 52 20 29 7b 20 20 0a 20 20  REGISTER ){  .  
169e0 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 20 20    int iMem;.    
169f0 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
16a00 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
16a10 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16a20 4f 50 5f 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20  OP_Copy, inReg, 
16a30 69 4d 65 6d 29 3b 0a 20 20 20 20 70 45 78 70 72  iMem);.    pExpr
16a40 2d 3e 69 54 61 62 6c 65 20 3d 20 69 4d 65 6d 3b  ->iTable = iMem;
16a50 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d  .    pExpr->op =
16a60 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20   TK_REGISTER;.  
16a70 7d 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67  }.  return inReg
16a80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
16a90 6e 20 54 52 55 45 20 69 66 20 70 45 78 70 72 20  n TRUE if pExpr 
16aa0 69 73 20 61 6e 20 63 6f 6e 73 74 61 6e 74 20 65  is an constant e
16ab0 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69  xpression that i
16ac0 73 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  s appropriate.**
16ad0 20 66 6f 72 20 66 61 63 74 6f 72 69 6e 67 20 6f   for factoring o
16ae0 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 20 20 41  ut of a loop.  A
16af0 70 70 72 6f 70 72 69 61 74 65 20 65 78 70 72 65  ppropriate expre
16b00 73 73 69 6f 6e 73 20 61 72 65 3a 0a 2a 2a 0a 2a  ssions are:.**.*
16b10 2a 20 20 20 20 2a 20 20 41 6e 79 20 65 78 70 72  *    *  Any expr
16b20 65 73 73 69 6f 6e 20 74 68 61 74 20 65 76 61 6c  ession that eval
16b30 75 61 74 65 73 20 74 6f 20 74 77 6f 20 6f 72 20  uates to two or 
16b40 6d 6f 72 65 20 6f 70 63 6f 64 65 73 2e 0a 2a 2a  more opcodes..**
16b50 0a 2a 2a 20 20 20 20 2a 20 20 41 6e 79 20 4f 50  .**    *  Any OP
16b60 5f 49 6e 74 65 67 65 72 2c 20 4f 50 5f 52 65 61  _Integer, OP_Rea
16b70 6c 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 4f 50  l, OP_String, OP
16b80 5f 42 6c 6f 62 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  _Blob, OP_Null, 
16b90 0a 2a 2a 20 20 20 20 20 20 20 6f 72 20 4f 50 5f  .**       or OP_
16ba0 56 61 72 69 61 62 6c 65 20 74 68 61 74 20 64 6f  Variable that do
16bb0 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
16bc0 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 0a 2a  e placed in a .*
16bd0 2a 20 20 20 20 20 20 20 73 70 65 63 69 66 69 63  *       specific
16be0 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a   register..**.**
16bf0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69   There is no poi
16c00 6e 74 20 69 6e 20 66 61 63 74 6f 72 69 6e 67 20  nt in factoring 
16c10 6f 75 74 20 73 69 6e 67 6c 65 2d 69 6e 73 74 72  out single-instr
16c20 75 63 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 0a  uction constant.
16c30 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  ** expressions t
16c40 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 70  hat need to be p
16c50 6c 61 63 65 64 20 69 6e 20 61 20 70 61 72 74 69  laced in a parti
16c60 63 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e 20  cular register. 
16c70 20 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 66 61   .** We could fa
16c80 63 74 6f 72 20 74 68 65 6d 20 6f 75 74 2c 20 62  ctor them out, b
16c90 75 74 20 74 68 65 6e 20 77 65 20 77 6f 75 6c 64  ut then we would
16ca0 20 65 6e 64 20 75 70 20 61 64 64 69 6e 67 20 61   end up adding a
16cb0 6e 0a 2a 2a 20 4f 50 5f 53 43 6f 70 79 20 69 6e  n.** OP_SCopy in
16cc0 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 6d 6f 76  struction to mov
16cd0 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 74 6f  e the value into
16ce0 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 65 67   the correct reg
16cf0 69 73 74 65 72 0a 2a 2a 20 6c 61 74 65 72 2e 20  ister.** later. 
16d00 20 57 65 20 6d 69 67 68 74 20 61 73 20 77 65 6c   We might as wel
16d10 6c 20 6a 75 73 74 20 75 73 65 20 74 68 65 20 6f  l just use the o
16d20 72 69 67 69 6e 61 6c 20 69 6e 73 74 72 75 63 74  riginal instruct
16d30 69 6f 6e 20 61 6e 64 0a 2a 2a 20 61 76 6f 69 64  ion and.** avoid
16d40 20 74 68 65 20 4f 50 5f 53 43 6f 70 79 2e 0a 2a   the OP_SCopy..*
16d50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 41  /.static int isA
16d60 70 70 72 6f 70 72 69 61 74 65 46 6f 72 46 61 63  ppropriateForFac
16d70 74 6f 72 69 6e 67 28 45 78 70 72 20 2a 70 29 7b  toring(Expr *p){
16d80 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45  .  if( !sqlite3E
16d90 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
16da0 4a 6f 69 6e 28 70 29 20 29 7b 0a 20 20 20 20 72  Join(p) ){.    r
16db0 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4f 6e 6c  eturn 0;  /* Onl
16dc0 79 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  y constant expre
16dd0 73 73 69 6f 6e 73 20 61 72 65 20 61 70 70 72 6f  ssions are appro
16de0 70 72 69 61 74 65 20 66 6f 72 20 66 61 63 74 6f  priate for facto
16df0 72 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  ring */.  }.  if
16e00 28 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  ( (p->flags & EP
16e10 5f 46 69 78 65 64 44 65 73 74 29 3d 3d 30 20 29  _FixedDest)==0 )
16e20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20  {.    return 1; 
16e30 20 2f 2a 20 41 6e 79 20 63 6f 6e 73 74 61 6e 74   /* Any constant
16e40 20 77 69 74 68 6f 75 74 20 61 20 66 69 78 65 64   without a fixed
16e50 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20   destination is 
16e60 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 20  appropriate */. 
16e70 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f   }.  while( p->o
16e80 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 20 70 20  p==TK_UPLUS ) p 
16e90 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 73 77  = p->pLeft;.  sw
16ea0 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 23  itch( p->op ){.#
16eb0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16ec0 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a  IT_BLOB_LITERAL.
16ed0 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
16ee0 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  :.#endif.    cas
16ef0 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20  e TK_VARIABLE:. 
16f00 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
16f10 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ER:.    case TK_
16f20 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20  FLOAT:.    case 
16f30 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  TK_NULL:.    cas
16f40 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20  e TK_STRING: {. 
16f50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
16f60 2d 3e 6f 70 3d 3d 54 4b 5f 42 4c 4f 42 20 29 3b  ->op==TK_BLOB );
16f70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
16f80 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41   p->op==TK_VARIA
16f90 42 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  BLE );.      tes
16fa0 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
16fb0 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20  _INTEGER );.    
16fc0 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f    testcase( p->o
16fd0 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 3b 0a 20  p==TK_FLOAT );. 
16fe0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
16ff0 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c 4c 20 29 3b  ->op==TK_NULL );
17000 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
17010 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e   p->op==TK_STRIN
17020 47 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 53 69  G );.      /* Si
17030 6e 67 6c 65 2d 69 6e 73 74 72 75 63 74 69 6f 6e  ngle-instruction
17040 20 63 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 20   constants with 
17050 61 20 66 69 78 65 64 20 64 65 73 74 69 6e 61 74  a fixed destinat
17060 69 6f 6e 20 61 72 65 0a 20 20 20 20 20 20 2a 2a  ion are.      **
17070 20 62 65 74 74 65 72 20 64 6f 6e 65 20 69 6e 2d   better done in-
17080 6c 69 6e 65 2e 20 20 49 66 20 77 65 20 66 61 63  line.  If we fac
17090 74 6f 72 20 74 68 65 6d 2c 20 74 68 65 79 20 77  tor them, they w
170a0 69 6c 6c 20 6a 75 73 74 20 65 6e 64 0a 20 20 20  ill just end.   
170b0 20 20 20 2a 2a 20 75 70 20 67 65 6e 65 72 61 74     ** up generat
170c0 69 6e 67 20 61 6e 20 4f 50 5f 53 43 6f 70 79 20  ing an OP_SCopy 
170d0 74 6f 20 6d 6f 76 65 20 74 68 65 20 76 61 6c 75  to move the valu
170e0 65 20 74 6f 20 74 68 65 20 64 65 73 74 69 6e 61  e to the destina
170f0 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 65  tion.      ** re
17100 67 69 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20 20  gister. */.     
17110 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
17120 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
17130 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 20 69 66  NUS: {.       if
17140 28 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d  ( p->pLeft->op==
17150 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70 2d 3e 70  TK_FLOAT || p->p
17160 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54  Left->op==TK_INT
17170 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20  EGER ){.        
17180 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
17190 20 20 7d 0a 20 20 20 20 20 20 20 62 72 65 61 6b    }.       break
171a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
171b0 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 62 72 65  ult: {.      bre
171c0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
171d0 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
171e0 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61  ** If pExpr is a
171f0 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73   constant expres
17200 73 69 6f 6e 20 74 68 61 74 20 69 73 20 61 70 70  sion that is app
17210 72 6f 70 72 69 61 74 65 20 66 6f 72 0a 2a 2a 20  ropriate for.** 
17220 66 61 63 74 6f 72 69 6e 67 20 6f 75 74 20 6f 66  factoring out of
17230 20 61 20 6c 6f 6f 70 2c 20 74 68 65 6e 20 65 76   a loop, then ev
17240 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65  aluate the expre
17250 73 73 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 61 20  ssion.** into a 
17260 72 65 67 69 73 74 65 72 20 61 6e 64 20 63 6f 6e  register and con
17270 76 65 72 74 20 74 68 65 20 65 78 70 72 65 73 73  vert the express
17280 69 6f 6e 20 69 6e 74 6f 20 61 20 54 4b 5f 52 45  ion into a TK_RE
17290 47 49 53 54 45 52 0a 2a 2a 20 65 78 70 72 65 73  GISTER.** expres
172a0 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sion..*/.static 
172b0 69 6e 74 20 65 76 61 6c 43 6f 6e 73 74 45 78 70  int evalConstExp
172c0 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  r(Walker *pWalke
172d0 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
172e0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
172f0 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
17300 73 65 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45  se;.  switch( pE
17310 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
17320 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a  ase TK_REGISTER:
17330 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
17340 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  1;.    }.    cas
17350 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  e TK_FUNCTION:. 
17360 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
17370 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73  UNCTION:.    cas
17380 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a  e TK_CONST_FUNC:
17390 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   {.      /* The 
173a0 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 20 66  arguments to a f
173b0 75 6e 63 74 69 6f 6e 20 68 61 76 65 20 61 20 66  unction have a f
173c0 69 78 65 64 20 64 65 73 74 69 6e 61 74 69 6f 6e  ixed destination
173d0 2e 0a 20 20 20 20 20 20 2a 2a 20 4d 61 72 6b 20  ..      ** Mark 
173e0 74 68 65 6d 20 74 68 69 73 20 77 61 79 20 74 6f  them this way to
173f0 20 61 76 6f 69 64 20 67 65 6e 65 72 61 74 65 64   avoid generated
17400 20 75 6e 6e 65 65 64 65 64 20 4f 50 5f 53 43 6f   unneeded OP_SCo
17410 70 79 0a 20 20 20 20 20 20 2a 2a 20 69 6e 73 74  py.      ** inst
17420 72 75 63 74 69 6f 6e 73 2e 20 0a 20 20 20 20 20  ructions. .     
17430 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69   */.      ExprLi
17440 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
17450 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
17460 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
17470 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
17480 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
17490 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  );.      if( pLi
174a0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  st ){.        in
174b0 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  t i = pList->nEx
174c0 70 72 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75  pr;.        stru
174d0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
174e0 20 2a 70 49 74 65 6d 20 3d 20 70 4c 69 73 74 2d   *pItem = pList-
174f0 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  >a;.        for(
17500 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65  ; i>0; i--, pIte
17510 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
17520 69 66 28 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  if( pItem->pExpr
17530 20 29 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2d   ) pItem->pExpr-
17540 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 46 69 78  >flags |= EP_Fix
17550 65 64 44 65 73 74 3b 0a 20 20 20 20 20 20 20 20  edDest;.        
17560 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
17570 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
17580 0a 20 20 69 66 28 20 69 73 41 70 70 72 6f 70 72  .  if( isAppropr
17590 69 61 74 65 46 6f 72 46 61 63 74 6f 72 69 6e 67  iateForFactoring
175a0 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 69  (pExpr) ){.    i
175b0 6e 74 20 72 31 20 3d 20 2b 2b 70 50 61 72 73 65  nt r1 = ++pParse
175c0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 74 20  ->nMem;.    int 
175d0 72 32 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c  r2;.    r2 = sql
175e0 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
175f0 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
17600 2c 20 72 31 29 3b 0a 20 20 20 20 69 66 28 20 72  , r1);.    if( r
17610 31 21 3d 72 32 20 29 20 73 71 6c 69 74 65 33 52  1!=r2 ) sqlite3R
17620 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
17630 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 70  arse, r1);.    p
17640 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45  Expr->op = TK_RE
17650 47 49 53 54 45 52 3b 0a 20 20 20 20 70 45 78 70  GISTER;.    pExp
17660 72 2d 3e 69 54 61 62 6c 65 20 3d 20 72 32 3b 0a  r->iTable = r2;.
17670 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
17680 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rune;.  }.  retu
17690 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
176a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 65 76 61  .}../*.** Preeva
176b0 6c 75 61 74 65 20 63 6f 6e 73 74 61 6e 74 20 73  luate constant s
176c0 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77 69  ubexpressions wi
176d0 74 68 69 6e 20 70 45 78 70 72 20 61 6e 64 20 73  thin pExpr and s
176e0 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75  tore the.** resu
176f0 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 73  lts in registers
17700 2e 20 20 4d 6f 64 69 66 79 20 70 45 78 70 72 20  .  Modify pExpr 
17710 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73  so that the cons
17720 74 61 6e 74 20 73 75 62 65 78 70 72 65 73 69 6f  tant subexpresio
17730 6e 73 0a 2a 2a 20 61 72 65 20 54 4b 5f 52 45 47  ns.** are TK_REG
17740 49 53 54 45 52 20 6f 70 63 6f 64 65 73 20 74 68  ISTER opcodes th
17750 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  at refer to the 
17760 70 72 65 63 6f 6d 70 75 74 65 64 20 76 61 6c 75  precomputed valu
17770 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
17780 74 65 33 45 78 70 72 43 6f 64 65 43 6f 6e 73 74  te3ExprCodeConst
17790 61 6e 74 73 28 50 61 72 73 65 20 2a 70 50 61 72  ants(Parse *pPar
177a0 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
177b0 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
177c0 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
177d0 3d 20 65 76 61 6c 43 6f 6e 73 74 45 78 70 72 3b  = evalConstExpr;
177e0 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
177f0 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 70 50  back = 0;.  w.pP
17800 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
17810 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
17820 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a  (&w, pExpr);.}..
17830 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
17840 63 6f 64 65 20 74 68 61 74 20 70 75 73 68 65 73  code that pushes
17850 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 76   the value of ev
17860 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ery element of t
17870 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
17880 65 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f  ession list into
17890 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72   a sequence of r
178a0 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69  egisters beginni
178b0 6e 67 20 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a  ng at target..**
178c0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
178d0 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
178e0 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2f 0a  s evaluated..*/.
178f0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
17900 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50  odeExprList(.  P
17910 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
17920 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
17930 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
17940 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20  st *pList,   /* 
17950 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  The expression l
17960 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20  ist to be coded 
17970 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74 2c  */.  int target,
17980 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
17990 20 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c 74   to write result
179a0 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 48 61 72  s */.  int doHar
179b0 64 43 6f 70 79 20 20 20 20 20 2f 2a 20 4d 61 6b  dCopy     /* Mak
179c0 65 20 61 20 68 61 72 64 20 63 6f 70 79 20 6f 66  e a hard copy of
179d0 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 2a   every element *
179e0 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78  /.){.  struct Ex
179f0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
17a00 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a  em;.  int i, n;.
17a10 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
17a20 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
17a30 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 6e 20  target>0 );.  n 
17a40 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
17a50 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
17a60 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20  t->a, i=0; i<n; 
17a70 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
17a80 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 41     if( pItem->iA
17a90 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 69 6e  lias ){.      in
17aa0 74 20 69 52 65 67 20 3d 20 63 6f 64 65 41 6c 69  t iReg = codeAli
17ab0 61 73 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  as(pParse, pItem
17ac0 2d 3e 69 41 6c 69 61 73 2c 20 70 49 74 65 6d 2d  ->iAlias, pItem-
17ad0 3e 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69  >pExpr, target+i
17ae0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 20 2a 76  );.      Vdbe *v
17af0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
17b00 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  e(pParse);.     
17b10 20 69 66 28 20 69 52 65 67 21 3d 74 61 72 67 65   if( iReg!=targe
17b20 74 2b 69 20 29 7b 0a 20 20 20 20 20 20 20 20 73  t+i ){.        s
17b30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17b40 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 52  (v, OP_SCopy, iR
17b50 65 67 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20  eg, target+i);. 
17b60 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
17b70 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
17b80 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
17b90 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 74 61  pItem->pExpr, ta
17ba0 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 7d 0a 20  rget+i);.    }. 
17bb0 20 20 20 69 66 28 20 64 6f 48 61 72 64 43 6f 70     if( doHardCop
17bc0 79 20 26 26 20 21 70 50 61 72 73 65 2d 3e 64 62  y && !pParse->db
17bd0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
17be0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
17bf0 78 70 72 48 61 72 64 43 6f 70 79 28 70 50 61 72  xprHardCopy(pPar
17c00 73 65 2c 20 74 61 72 67 65 74 2c 20 6e 29 3b 0a  se, target, n);.
17c10 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
17c20 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn n;.}../*.** G
17c30 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
17c40 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65   a boolean expre
17c50 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ssion such that 
17c60 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a  a jump is made.*
17c70 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22  * to the label "
17c80 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70  dest" if the exp
17c90 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20  ression is true 
17ca0 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
17cb0 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
17cc0 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
17cd0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
17ce0 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  lse..**.** If th
17cf0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61  e expression eva
17d00 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28  luates to NULL (
17d10 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72  neither true nor
17d20 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a   false), then.**
17d30 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   take the jump i
17d40 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c  f the jumpIfNull
17d50 20 66 6c 61 67 20 69 73 20 53 51 4c 49 54 45 5f   flag is SQLITE_
17d60 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  JUMPIFNULL..**.*
17d70 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70 65  * This code depe
17d80 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20  nds on the fact 
17d90 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b  that certain tok
17da0 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54  en values (ex: T
17db0 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65  K_EQ).** are the
17dc0 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20   same as opcode 
17dd0 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45  values (ex: OP_E
17de0 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  q) that implemen
17df0 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  t the correspond
17e00 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  ing.** operation
17e10 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65  .  Special comme
17e20 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e  nts in vdbe.c an
17e30 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  d the mkopcodeh.
17e40 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a  awk script in.**
17e50 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73   the make proces
17e60 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76 61  s cause these va
17e70 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20  lues to align.  
17e80 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68 65  Assert()s in the
17e90 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76   code.** below v
17ea0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e  erify that the n
17eb0 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e  umbers are align
17ec0 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f  ed correctly..*/
17ed0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
17ee0 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70  rIfTrue(Parse *p
17ef0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
17f00 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
17f10 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
17f20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
17f30 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
17f40 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  op = 0;.  int re
17f50 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e  gFree1 = 0;.  in
17f60 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a  t regFree2 = 0;.
17f70 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20    int r1, r2;.. 
17f80 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e   assert( jumpIfN
17f90 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50  ull==SQLITE_JUMP
17fa0 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66  IFNULL || jumpIf
17fb0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Null==0 );.  if(
17fc0 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d   v==0 || pExpr==
17fd0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f 70  0 ) return;.  op
17fe0 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
17ff0 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
18000 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b    case TK_AND: {
18010 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20  .      int d2 = 
18020 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
18030 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74  abel(v);.      t
18040 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
18050 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
18060 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
18070 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
18080 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
18090 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
180a0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c  Expr->pLeft, d2,
180b0 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54  jumpIfNull^SQLIT
180c0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
180d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
180e0 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
180f0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
18100 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
18110 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
18120 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
18130 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , d2);.      sql
18140 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
18150 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20  (pParse, 1);.   
18160 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
18170 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
18180 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
18190 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
181a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
181b0 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
181c0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
181d0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
181e0 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
181f0 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
18200 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
18210 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
18220 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
18230 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
18240 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
18250 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
18260 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
18270 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
18280 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
18290 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
182a0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
182b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
182c0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  }.    case TK_LT
182d0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
182e0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
182f0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
18300 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
18310 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
18320 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
18330 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29  ( TK_LT==OP_Lt )
18340 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
18350 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a  TK_LE==OP_Le );.
18360 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
18370 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20  _GT==OP_Gt );.  
18380 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
18390 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20  E==OP_Ge );.    
183a0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d    assert( TK_EQ=
183b0 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20  =OP_Eq );.      
183c0 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f  assert( TK_NE==O
183d0 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 74 65  P_Ne );.      te
183e0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c  stcase( op==TK_L
183f0 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
18400 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29  ase( op==TK_LE )
18410 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
18420 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20  ( op==TK_GT );. 
18430 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
18440 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20  p==TK_GE );.    
18450 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
18460 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 74  TK_EQ );.      t
18470 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
18480 4e 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  NE );.      test
18490 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
184a0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64  ==0 );.      cod
184b0 65 43 6f 6d 70 61 72 65 4f 70 65 72 61 6e 64 73  eCompareOperands
184c0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
184d0 70 4c 65 66 74 2c 20 26 72 31 2c 20 26 72 65 67  pLeft, &r1, &reg
184e0 46 72 65 65 31 2c 0a 20 20 20 20 20 20 20 20 20  Free1,.         
184f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18500 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
18510 70 52 69 67 68 74 2c 20 26 72 32 2c 20 26 72 65  pRight, &r2, &re
18520 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63  gFree2);.      c
18530 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
18540 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
18550 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
18560 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
18570 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65        r1, r2, de
18580 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
18590 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
185a0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
185b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
185c0 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
185d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
185e0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
185f0 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
18600 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
18610 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53     assert( TK_IS
18620 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  NULL==OP_IsNull 
18630 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
18640 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f   TK_NOTNULL==OP_
18650 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20  NotNull );.     
18660 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
18670 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  K_ISNULL );.    
18680 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
18690 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20  TK_NOTNULL );.  
186a0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
186b0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
186c0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
186d0 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
186e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
186f0 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31  AddOp2(v, op, r1
18700 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74  , dest);.      t
18710 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
18720 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  1==0 );.      br
18730 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
18740 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
18750 7b 0a 20 20 20 20 20 20 2f 2a 20 20 20 20 78 20  {.      /*    x 
18760 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a  BETWEEN y AND z.
18770 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
18780 2a 20 49 73 20 65 71 75 69 76 61 6c 65 6e 74 20  * Is equivalent 
18790 74 6f 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  to .      **.   
187a0 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e     **    x>=y AN
187b0 44 20 78 3c 3d 7a 0a 20 20 20 20 20 20 2a 2a 0a  D x<=z.      **.
187c0 20 20 20 20 20 20 2a 2a 20 43 6f 64 65 20 69 74        ** Code it
187d0 20 61 73 20 73 75 63 68 2c 20 74 61 6b 69 6e 67   as such, taking
187e0 20 63 61 72 65 20 74 6f 20 64 6f 20 74 68 65 20   care to do the 
187f0 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65 73  common subexpres
18800 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 65 6c  sion.      ** el
18810 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78 2e  ementation of x.
18820 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
18830 45 78 70 72 20 65 78 70 72 41 6e 64 3b 0a 20 20  Expr exprAnd;.  
18840 20 20 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66      Expr compLef
18850 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 63 6f  t;.      Expr co
18860 6d 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 45  mpRight;.      E
18870 78 70 72 20 65 78 70 72 58 3b 0a 0a 20 20 20 20  xpr exprX;..    
18880 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
18890 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
188a0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
188b0 29 3b 0a 20 20 20 20 20 20 65 78 70 72 58 20 3d  );.      exprX =
188c0 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a   *pExpr->pLeft;.
188d0 20 20 20 20 20 20 65 78 70 72 41 6e 64 2e 6f 70        exprAnd.op
188e0 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20   = TK_AND;.     
188f0 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d   exprAnd.pLeft =
18900 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 20 20   &compLeft;.    
18910 20 20 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74    exprAnd.pRight
18920 20 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20   = &compRight;. 
18930 20 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70       compLeft.op
18940 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 20 20 20 20   = TK_GE;.      
18950 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d  compLeft.pLeft =
18960 20 26 65 78 70 72 58 3b 0a 20 20 20 20 20 20 63   &exprX;.      c
18970 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20 3d  ompLeft.pRight =
18980 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
18990 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
189a0 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20     compRight.op 
189b0 3d 20 54 4b 5f 4c 45 3b 0a 20 20 20 20 20 20 63  = TK_LE;.      c
189c0 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d  ompRight.pLeft =
189d0 20 26 65 78 70 72 58 3b 0a 20 20 20 20 20 20 63   &exprX;.      c
189e0 6f 6d 70 52 69 67 68 74 2e 70 52 69 67 68 74 20  ompRight.pRight 
189f0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
18a00 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
18a10 20 20 20 20 65 78 70 72 58 2e 69 54 61 62 6c 65      exprX.iTable
18a20 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
18a30 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26  deTemp(pParse, &
18a40 65 78 70 72 58 2c 20 26 72 65 67 46 72 65 65 31  exprX, &regFree1
18a50 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
18a60 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
18a70 3b 0a 20 20 20 20 20 20 65 78 70 72 58 2e 6f 70  ;.      exprX.op
18a80 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a   = TK_REGISTER;.
18a90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
18aa0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
18ab0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
18ac0 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
18ad0 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c   &exprAnd, dest,
18ae0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
18af0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
18b00 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
18b10 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
18b20 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
18b30 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72  Parse, pExpr, &r
18b40 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
18b50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18b60 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20  3(v, OP_If, r1, 
18b70 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
18b80 21 3d 30 29 3b 0a 20 20 20 20 20 20 74 65 73 74  !=0);.      test
18b90 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
18ba0 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
18bb0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
18bc0 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
18bd0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  k;.    }.  }.  s
18be0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
18bf0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
18c00 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65  Free1);.  sqlite
18c10 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
18c20 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
18c30 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  );  .}../*.** Ge
18c40 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
18c50 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
18c60 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
18c70 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
18c80 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
18c90 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
18ca0 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20  ession is false 
18cb0 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
18cc0 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
18cd0 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
18ce0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
18cf0 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ue..**.** If the
18d00 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
18d10 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e  uates to NULL (n
18d20 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20  either true nor 
18d30 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a  false) then.** j
18d40 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c  ump if jumpIfNul
18d50 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50  l is SQLITE_JUMP
18d60 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74  IFNULL or fall t
18d70 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66  hrough if jumpIf
18d80 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f  Null.** is 0..*/
18d90 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
18da0 72 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a  rIfFalse(Parse *
18db0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
18dc0 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
18dd0 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
18de0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
18df0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
18e00 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72   op = 0;.  int r
18e10 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69  egFree1 = 0;.  i
18e20 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  nt regFree2 = 0;
18e30 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a  .  int r1, r2;..
18e40 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66    assert( jumpIf
18e50 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d  Null==SQLITE_JUM
18e60 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49  PIFNULL || jumpI
18e70 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  fNull==0 );.  if
18e80 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d  ( v==0 || pExpr=
18e90 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  =0 ) return;..  
18ea0 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  /* The value of 
18eb0 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70  pExpr->op and op
18ec0 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73 20   are related as 
18ed0 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
18ee0 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  **       pExpr->
18ef0 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f 70  op            op
18f00 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d  .  **       ----
18f10 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d  -----          -
18f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20  ---------.  **  
18f30 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20       TK_ISNULL  
18f40 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75          OP_NotNu
18f50 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  ll.  **       TK
18f60 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20  _NOTNULL        
18f70 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20   OP_IsNull.  ** 
18f80 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20        TK_NE     
18f90 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20           OP_Eq. 
18fa0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20   **       TK_EQ 
18fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
18fc0 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Ne.  **       TK
18fd0 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _GT             
18fe0 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Le.  **     
18ff0 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20    TK_LE         
19000 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20       OP_Gt.  ** 
19010 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20        TK_GE     
19020 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20           OP_Lt. 
19030 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20   **       TK_LT 
19040 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
19050 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72  Ge.  **.  ** For
19060 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66   other values of
19070 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69   pExpr->op, op i
19080 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20  s undefined and 
19090 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65  unused..  ** The
190a0 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e   value of TK_ an
190b0 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20  d OP_ constants 
190c0 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75 63  are arranged suc
190d0 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63  h that we.  ** c
190e0 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d  an compute the m
190f0 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69  apping above usi
19100 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
19110 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a   expression..  *
19120 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72 69  * Assert()s veri
19130 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70  fy that the comp
19140 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65  utation is corre
19150 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20  ct..  */.  op = 
19160 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f  ((pExpr->op+(TK_
19170 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54  ISNULL&1))^1)-(T
19180 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20  K_ISNULL&1);..  
19190 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65 63  /* Verify correc
191a0 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54  t alignment of T
191b0 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
191c0 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ants.  */.  asse
191d0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
191e0 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d  K_ISNULL || op==
191f0 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20  OP_NotNull );.  
19200 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
19210 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c  p!=TK_NOTNULL ||
19220 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29   op==OP_IsNull )
19230 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
19240 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20  r->op!=TK_NE || 
19250 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61  op==OP_Eq );.  a
19260 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
19270 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_EQ || op==O
19280 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ne );.  assert
19290 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
192a0 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20  LT || op==OP_Ge 
192b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
192c0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c  pr->op!=TK_LE ||
192d0 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20   op==OP_Gt );.  
192e0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
192f0 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d  p!=TK_GT || op==
19300 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Le );.  asser
19310 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
19320 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74  _GE || op==OP_Lt
19330 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70   );..  switch( p
19340 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
19350 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
19360 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
19370 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
19380 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
19390 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
193a0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
193b0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
193c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
193d0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
193e0 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
193f0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
19400 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
19410 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
19420 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
19430 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
19440 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
19450 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
19460 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
19470 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19480 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
19490 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
194a0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
194b0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
194c0 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66 4e  eft, d2, jumpIfN
194d0 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ull^SQLITE_JUMPI
194e0 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71  FNULL);.      sq
194f0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
19500 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
19510 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
19520 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
19530 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
19540 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b  lveLabel(v, d2);
19550 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
19560 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
19570 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65  e, 1);.      bre
19580 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
19590 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
195a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
195b0 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
195c0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
195d0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
195e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
195f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
19600 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
19610 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
19620 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
19630 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
19640 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
19650 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
19660 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a  e( op==TK_LT );.
19670 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19680 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20  op==TK_LE );.   
19690 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
196a0 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20  =TK_GT );.      
196b0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
196c0 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GE );.      tes
196d0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51  tcase( op==TK_EQ
196e0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
196f0 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b  se( op==TK_NE );
19700 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
19710 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
19720 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
19730 61 72 65 4f 70 65 72 61 6e 64 73 28 70 50 61 72  areOperands(pPar
19740 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
19750 2c 20 26 72 31 2c 20 26 72 65 67 46 72 65 65 31  , &r1, &regFree1
19760 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19780 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
19790 74 2c 20 26 72 32 2c 20 26 72 65 67 46 72 65 65  t, &r2, &regFree
197a0 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  2);.      codeCo
197b0 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
197c0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
197d0 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
197e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197f0 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a   r1, r2, dest, j
19800 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
19810 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
19820 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
19830 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
19840 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
19850 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
19860 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
19870 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
19880 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 74 65  NULL: {.      te
19890 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
198a0 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74  SNULL );.      t
198b0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
198c0 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  NOTNULL );.     
198d0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
198e0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
198f0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
19900 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
19910 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19920 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64  Op2(v, op, r1, d
19930 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
19940 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
19950 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
19960 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
19970 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
19980 20 20 20 20 20 2f 2a 20 20 20 20 78 20 42 45 54       /*    x BET
19990 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20  WEEN y AND z.   
199a0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
199b0 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
199c0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
199d0 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78  **    x>=y AND x
199e0 3c 3d 7a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  <=z.      **.   
199f0 20 20 20 2a 2a 20 43 6f 64 65 20 69 74 20 61 73     ** Code it as
19a00 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61   such, taking ca
19a10 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d  re to do the com
19a20 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f  mon subexpressio
19a30 6e 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65  n.      ** eleme
19a40 6e 74 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 20 20  ntation of x..  
19a50 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70      */.      Exp
19a60 72 20 65 78 70 72 41 6e 64 3b 0a 20 20 20 20 20  r exprAnd;.     
19a70 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 0a   Expr compLeft;.
19a80 20 20 20 20 20 20 45 78 70 72 20 63 6f 6d 70 52        Expr compR
19a90 69 67 68 74 3b 0a 20 20 20 20 20 20 45 78 70 72  ight;.      Expr
19aa0 20 65 78 70 72 58 3b 0a 0a 20 20 20 20 20 20 61   exprX;..      a
19ab0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
19ac0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
19ad0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
19ae0 20 20 20 20 20 20 65 78 70 72 58 20 3d 20 2a 70        exprX = *p
19af0 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
19b00 20 20 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20     exprAnd.op = 
19b10 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 65 78  TK_AND;.      ex
19b20 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63  prAnd.pLeft = &c
19b30 6f 6d 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 65  ompLeft;.      e
19b40 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20  xprAnd.pRight = 
19b50 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 20 20  &compRight;.    
19b60 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20    compLeft.op = 
19b70 54 4b 5f 47 45 3b 0a 20 20 20 20 20 20 63 6f 6d  TK_GE;.      com
19b80 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65  pLeft.pLeft = &e
19b90 78 70 72 58 3b 0a 20 20 20 20 20 20 63 6f 6d 70  xprX;.      comp
19ba0 4c 65 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45  Left.pRight = pE
19bb0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
19bc0 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  0].pExpr;.      
19bd0 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54  compRight.op = T
19be0 4b 5f 4c 45 3b 0a 20 20 20 20 20 20 63 6f 6d 70  K_LE;.      comp
19bf0 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65  Right.pLeft = &e
19c00 78 70 72 58 3b 0a 20 20 20 20 20 20 63 6f 6d 70  xprX;.      comp
19c10 52 69 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70  Right.pRight = p
19c20 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
19c30 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [1].pExpr;.     
19c40 20 65 78 70 72 58 2e 69 54 61 62 6c 65 20 3d 20   exprX.iTable = 
19c50 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
19c60 65 6d 70 28 70 50 61 72 73 65 2c 20 26 65 78 70  emp(pParse, &exp
19c70 72 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  rX, &regFree1);.
19c80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19c90 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
19ca0 20 20 20 20 20 65 78 70 72 58 2e 6f 70 20 3d 20       exprX.op = 
19cb0 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20  TK_REGISTER;.   
19cc0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
19cd0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
19ce0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
19cf0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 26  fFalse(pParse, &
19d00 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a  exprAnd, dest, j
19d10 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
19d20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
19d30 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
19d40 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
19d50 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
19d60 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67  rse, pExpr, &reg
19d70 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71  Free1);.      sq
19d80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
19d90 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c  v, OP_IfNot, r1,
19da0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
19db0 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 74 65 73  l!=0);.      tes
19dc0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
19dd0 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
19de0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
19df0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
19e00 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
19e10 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
19e20 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
19e30 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
19e40 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
19e50 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
19e60 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  2);.}../*.** Do 
19e70 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f  a deep compariso
19e80 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73  n of two express
19e90 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75  ion trees.  Retu
19ea0 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72  rn TRUE (non-zer
19eb0 6f 29 0a 2a 2a 20 69 66 20 74 68 65 79 20 61 72  o).** if they ar
19ec0 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20  e identical and 
19ed0 72 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  return FALSE if 
19ee0 74 68 65 79 20 64 69 66 66 65 72 20 69 6e 20 61  they differ in a
19ef0 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f  ny way..**.** So
19f00 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75  metimes this rou
19f10 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
19f20 20 46 41 4c 53 45 20 65 76 65 6e 20 69 66 20 74   FALSE even if t
19f30 68 65 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  he two expressio
19f40 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65  ns.** really are
19f50 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66   equivalent.  If
19f60 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65   we cannot prove
19f70 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
19f80 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65  sions are.** ide
19f90 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72  ntical, we retur
19fa0 6e 20 46 41 4c 53 45 20 6a 75 73 74 20 74 6f 20  n FALSE just to 
19fb0 62 65 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20  be safe.  So if 
19fc0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
19fd0 72 65 74 75 72 6e 73 20 66 61 6c 73 65 2c 20 74  returns false, t
19fe0 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72  hen you do not r
19ff0 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63  eally know for c
1a000 65 72 74 61 69 6e 20 69 66 20 74 68 65 20 74 77  ertain if the tw
1a010 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73  o.** expressions
1a020 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20   are the same.  
1a030 42 75 74 20 69 66 20 79 6f 75 20 67 65 74 20 61  But if you get a
1a040 20 54 52 55 45 20 72 65 74 75 72 6e 2c 20 74 68   TRUE return, th
1a050 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65  en you.** can be
1a060 20 73 75 72 65 20 74 68 65 20 65 78 70 72 65 73   sure the expres
1a070 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61  sions are the sa
1a080 6d 65 2e 20 20 49 6e 20 74 68 65 20 70 6c 61 63  me.  In the plac
1a090 65 73 20 77 68 65 72 65 0a 2a 2a 20 74 68 69 73  es where.** this
1a0a0 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
1a0b0 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 68 75  , it does not hu
1a0c0 72 74 20 74 6f 20 67 65 74 20 61 6e 20 65 78 74  rt to get an ext
1a0d0 72 61 20 46 41 4c 53 45 20 2d 20 74 68 61 74 0a  ra FALSE - that.
1a0e0 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20 72 65  ** just might re
1a0f0 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69  sult in some sli
1a100 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64  ghtly slower cod
1a110 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e 69 6e  e.  But returnin
1a120 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63  g.** an incorrec
1a130 74 20 54 52 55 45 20 63 6f 75 6c 64 20 6c 65 61  t TRUE could lea
1a140 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69  d to a malfuncti
1a150 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
1a160 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78  e3ExprCompare(Ex
1a170 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42  pr *pA, Expr *pB
1a180 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
1a190 28 20 70 41 3d 3d 30 7c 7c 70 42 3d 3d 30 20 29  ( pA==0||pB==0 )
1a1a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d  {.    return pB=
1a1b0 3d 70 41 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  =pA;.  }.  asser
1a1c0 74 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72  t( !ExprHasAnyPr
1a1d0 6f 70 65 72 74 79 28 70 41 2c 20 45 50 5f 54 6f  operty(pA, EP_To
1a1e0 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
1a1f0 65 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ed) );.  assert(
1a200 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70   !ExprHasAnyProp
1a210 65 72 74 79 28 70 42 2c 20 45 50 5f 54 6f 6b 65  erty(pB, EP_Toke
1a220 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
1a230 29 20 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48  ) );.  if( ExprH
1a240 61 73 50 72 6f 70 65 72 74 79 28 70 41 2c 20 45  asProperty(pA, E
1a250 50 5f 78 49 73 53 65 6c 65 63 74 29 20 7c 7c 20  P_xIsSelect) || 
1a260 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1a270 70 42 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pB, EP_xIsSelect
1a280 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1a290 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 41  0;.  }.  if( (pA
1a2a0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
1a2b0 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61  tinct)!=(pB->fla
1a2c0 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
1a2d0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
1a2e0 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e  if( pA->op!=pB->
1a2f0 6f 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  op ) return 0;. 
1a300 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
1a310 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65  rCompare(pA->pLe
1a320 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 29 20 29  ft, pB->pLeft) )
1a330 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
1a340 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d   !sqlite3ExprCom
1a350 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c  pare(pA->pRight,
1a360 20 70 42 2d 3e 70 52 69 67 68 74 29 20 29 20 72   pB->pRight) ) r
1a370 65 74 75 72 6e 20 30 3b 0a 0a 20 20 69 66 28 20  eturn 0;..  if( 
1a380 70 41 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 70  pA->x.pList && p
1a390 42 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20  B->x.pList ){.  
1a3a0 20 20 69 66 28 20 70 41 2d 3e 78 2e 70 4c 69 73    if( pA->x.pLis
1a3b0 74 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 78 2e  t->nExpr!=pB->x.
1a3c0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 20 72  pList->nExpr ) r
1a3d0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72  eturn 0;.    for
1a3e0 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 78 2e 70 4c  (i=0; i<pA->x.pL
1a3f0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
1a400 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
1a410 78 70 72 41 20 3d 20 70 41 2d 3e 78 2e 70 4c 69  xprA = pA->x.pLi
1a420 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
1a430 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
1a440 72 42 20 3d 20 70 42 2d 3e 78 2e 70 4c 69 73 74  rB = pB->x.pList
1a450 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
1a460 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
1a470 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70  ExprCompare(pExp
1a480 72 41 2c 20 70 45 78 70 72 42 29 20 29 20 72 65  rA, pExprB) ) re
1a490 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
1a4a0 7d 65 6c 73 65 20 69 66 28 20 70 41 2d 3e 78 2e  }else if( pA->x.
1a4b0 70 4c 69 73 74 20 7c 7c 20 70 42 2d 3e 78 2e 70  pList || pB->x.p
1a4c0 4c 69 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75  List ){.    retu
1a4d0 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  rn 0;.  }..  if(
1a4e0 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d   pA->iTable!=pB-
1a4f0 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41 2d 3e 69  >iTable || pA->i
1a500 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c  Column!=pB->iCol
1a510 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  umn ) return 0;.
1a520 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
1a530 70 65 72 74 79 28 70 41 2c 20 45 50 5f 49 6e 74  perty(pA, EP_Int
1a540 56 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 69 66  Value) ){.    if
1a550 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1a560 74 79 28 70 42 2c 20 45 50 5f 49 6e 74 56 61 6c  ty(pB, EP_IntVal
1a570 75 65 29 20 7c 7c 20 70 41 2d 3e 75 2e 69 56 61  ue) || pA->u.iVa
1a580 6c 75 65 21 3d 70 42 2d 3e 75 2e 69 56 61 6c 75  lue!=pB->u.iValu
1a590 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
1a5a0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  n 0;.    }.  }el
1a5b0 73 65 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54  se if( pA->op!=T
1a5c0 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e  K_COLUMN && pA->
1a5d0 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  u.zToken ){.    
1a5e0 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
1a5f0 72 74 79 28 70 42 2c 20 45 50 5f 49 6e 74 56 61  rty(pB, EP_IntVa
1a600 6c 75 65 29 20 7c 7c 20 70 42 2d 3e 75 2e 7a 54  lue) || pB->u.zT
1a610 6f 6b 65 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e  oken==0 ) return
1a620 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
1a630 74 65 33 53 74 72 49 43 6d 70 28 70 41 2d 3e 75  te3StrICmp(pA->u
1a640 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54  .zToken,pB->u.zT
1a650 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20  oken)!=0 ){.    
1a660 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
1a670 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  }.  }.  return 1
1a680 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  ;.}.../*.** Add 
1a690 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
1a6a0 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61   the pAggInfo->a
1a6b0 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52 65  Col[] array.  Re
1a6c0 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
1a6d0 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65  f.** the new ele
1a6e0 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ment.  Return a 
1a6f0 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
1a700 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e  if malloc fails.
1a710 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
1a720 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28  ddAggInfoColumn(
1a730 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67  sqlite3 *db, Agg
1a740 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20  Info *pInfo){.  
1a750 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e  int i;.  pInfo->
1a760 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41 72  aCol = sqlite3Ar
1a770 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20  rayAllocate(.   
1a780 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20 70      db,.       p
1a790 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20  Info->aCol,.    
1a7a0 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d     sizeof(pInfo-
1a7b0 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20  >aCol[0]),.     
1a7c0 20 20 33 2c 0a 20 20 20 20 20 20 20 26 70 49 6e    3,.       &pIn
1a7d0 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20  fo->nColumn,.   
1a7e0 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c      &pInfo->nCol
1a7f0 75 6d 6e 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20  umnAlloc,.      
1a800 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72   &i.  );.  retur
1a810 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a  n i;.}    ../*.*
1a820 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d  * Add a new elem
1a830 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49  ent to the pAggI
1a840 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72  nfo->aFunc[] arr
1a850 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ay.  Return the 
1a860 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20  index of.** the 
1a870 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65  new element.  Re
1a880 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
1a890 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63  number if malloc
1a8a0 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
1a8b0 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f  c int addAggInfo
1a8c0 46 75 6e 63 28 73 71 6c 69 74 65 33 20 2a 64 62  Func(sqlite3 *db
1a8d0 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f  , AggInfo *pInfo
1a8e0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49  ){.  int i;.  pI
1a8f0 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c  nfo->aFunc = sql
1a900 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
1a910 65 28 0a 20 20 20 20 20 20 20 64 62 2c 20 0a 20  e(.       db, . 
1a920 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75        pInfo->aFu
1a930 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f  nc,.       sizeo
1a940 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  f(pInfo->aFunc[0
1a950 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a 20 20  ]),.       3,.  
1a960 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75       &pInfo->nFu
1a970 6e 63 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66  nc,.       &pInf
1a980 6f 2d 3e 6e 46 75 6e 63 41 6c 6c 6f 63 2c 0a 20  o->nFuncAlloc,. 
1a990 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20        &i.  );.  
1a9a0 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a  return i;.}    .
1a9b0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
1a9c0 68 65 20 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  he xExprCallback
1a9d0 20 66 6f 72 20 61 20 74 72 65 65 20 77 61 6c 6b   for a tree walk
1a9e0 65 72 2e 20 20 49 74 20 69 73 20 75 73 65 64 20  er.  It is used 
1a9f0 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20  to.** implement 
1aa00 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
1aa10 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 2e 20  zeAggregates(). 
1aa20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78 70 72   See sqlite3Expr
1aa30 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
1aa40 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f  s.** for additio
1aa50 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
1aa60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
1aa70 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28  nalyzeAggregate(
1aa80 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
1aa90 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
1aaa0 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f   int i;.  NameCo
1aab0 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61  ntext *pNC = pWa
1aac0 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50  lker->u.pNC;.  P
1aad0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
1aae0 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72  NC->pParse;.  Sr
1aaf0 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20  cList *pSrcList 
1ab00 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
1ab10 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  .  AggInfo *pAgg
1ab20 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67  Info = pNC->pAgg
1ab30 49 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63 68 28  Info;..  switch(
1ab40 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
1ab50 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
1ab60 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  LUMN:.    case T
1ab70 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
1ab80 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
1ab90 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
1aba0 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  LUMN );.      te
1abb0 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
1abc0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
1abd0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
1abe0 6f 20 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c  o see if the col
1abf0 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66  umn is in one of
1ac00 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74   the tables in t
1ac10 68 65 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a  he FROM.      **
1ac20 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61   clause of the a
1ac30 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a  ggregate query *
1ac40 2f 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63  /.      if( pSrc
1ac50 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
1ac60 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1ac70 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72  tem *pItem = pSr
1ac80 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  cList->a;.      
1ac90 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
1aca0 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  cList->nSrc; i++
1acb0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1acc0 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
1acd0 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a  Info_col *pCol;.
1ace0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1acf0 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f  ( !ExprHasAnyPro
1ad00 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1ad10 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
1ad20 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20  uced) );.       
1ad30 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
1ad40 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75  able==pItem->iCu
1ad50 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rsor ){.        
1ad60 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61      /* If we rea
1ad70 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69  ch this point, i
1ad80 74 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78  t means that pEx
1ad90 70 72 20 72 65 66 65 72 73 20 74 6f 20 61 20 74  pr refers to a t
1ada0 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  able.           
1adb0 20 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74   ** that is in t
1adc0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1add0 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
1ade0 71 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20  query.  .       
1adf0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
1ae00 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65      ** Make an e
1ae10 6e 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c  ntry for the col
1ae20 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  umn in pAggInfo-
1ae30 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65  >aCol[] if there
1ae40 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1ae50 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20  is not an entry 
1ae60 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20  there already.. 
1ae70 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
1ae80 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b            int k;
1ae90 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
1aea0 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  l = pAggInfo->aC
1aeb0 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol;.            
1aec0 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49  for(k=0; k<pAggI
1aed0 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b  nfo->nColumn; k+
1aee0 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
1aef0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
1af00 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70  ol->iTable==pExp
1af10 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20  r->iTable &&.   
1af20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1af30 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45  Col->iColumn==pE
1af40 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a  xpr->iColumn ){.
1af50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af60 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
1af70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1af80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1af90 20 69 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66   if( (k>=pAggInf
1afa0 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20  o->nColumn).    
1afb0 20 20 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d           && (k =
1afc0 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d   addAggInfoColum
1afd0 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41  n(pParse->db, pA
1afe0 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20  ggInfo))>=0 .   
1aff0 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
1b000 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d            pCol =
1b010 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c   &pAggInfo->aCol
1b020 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [k];.           
1b030 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20     pCol->pTab = 
1b040 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20  pExpr->pTab;.   
1b050 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
1b060 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d  >iTable = pExpr-
1b070 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  >iTable;.       
1b080 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f         pCol->iCo
1b090 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43  lumn = pExpr->iC
1b0a0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20  olumn;.         
1b0b0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20       pCol->iMem 
1b0c0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1b0d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1b0e0 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
1b0f0 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
1b100 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45          pCol->pE
1b110 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  xpr = pExpr;.   
1b120 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
1b130 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42  AggInfo->pGroupB
1b140 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y ){.           
1b150 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20       int j, n;. 
1b160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
1b170 78 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70  xprList *pGB = p
1b180 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42  AggInfo->pGroupB
1b190 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y;.             
1b1a0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
1b1b0 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d  st_item *pTerm =
1b1c0 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20   pGB->a;.       
1b1d0 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42           n = pGB
1b1e0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
1b1f0 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
1b200 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72  ; j<n; j++, pTer
1b210 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
1b220 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
1b230 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
1b240 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b250 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
1b260 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e  K_COLUMN && pE->
1b270 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
1b280 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20  Table &&.       
1b290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1b2a0 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70  E->iColumn==pExp
1b2b0 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  r->iColumn ){.  
1b2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2d0 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
1b2e0 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20  olumn = j;.     
1b2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
1b300 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1b310 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b320 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1b330 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1b340 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
1b350 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
1b360 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  n<0 ){.         
1b370 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
1b380 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67  rterColumn = pAg
1b390 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43  gInfo->nSortingC
1b3a0 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20  olumn++;.       
1b3b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b3c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1b3d0 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
1b3e0 6f 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  ow an entry for 
1b3f0 70 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66  pExpr in pAggInf
1b400 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65  o->aCol[] (eithe
1b410 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  r.            **
1b420 20 62 65 63 61 75 73 65 20 69 74 20 77 61 73 20   because it was 
1b430 74 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20  there before or 
1b440 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 20  because we just 
1b450 63 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20  created it)..   
1b460 20 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76           ** Conv
1b470 65 72 74 20 74 68 65 20 70 45 78 70 72 20 74 6f  ert the pExpr to
1b480 20 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c   be a TK_AGG_COL
1b490 55 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f  UMN referring to
1b4a0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
1b4b0 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61    ** pAggInfo->a
1b4c0 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20  Col[] entry..   
1b4d0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
1b4e0 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74 49          ExprSetI
1b4f0 72 72 65 64 75 63 69 62 6c 65 28 70 45 78 70 72  rreducible(pExpr
1b500 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
1b510 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d  Expr->pAggInfo =
1b520 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20   pAggInfo;.     
1b530 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
1b540 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e   = TK_AGG_COLUMN
1b550 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
1b560 78 70 72 2d 3e 69 41 67 67 20 3d 20 6b 3b 0a 20  xpr->iAgg = k;. 
1b570 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1b580 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a  ;.          } /*
1b590 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54   endif pExpr->iT
1b5a0 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75  able==pItem->iCu
1b5b0 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rsor */.        
1b5c0 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76  } /* end loop ov
1b5d0 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20  er pSrcList */. 
1b5e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1b5f0 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
1b600 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1b610 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  _AGG_FUNCTION: {
1b620 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 4e  .      /* The pN
1b630 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 74 65 73  C->nDepth==0 tes
1b640 74 20 63 61 75 73 65 73 20 61 67 67 72 65 67 61  t causes aggrega
1b650 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20  te functions in 
1b660 73 75 62 71 75 65 72 69 65 73 0a 20 20 20 20 20  subqueries.     
1b670 20 2a 2a 20 74 6f 20 62 65 20 69 67 6e 6f 72 65   ** to be ignore
1b680 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  d */.      if( p
1b690 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 29 7b  NC->nDepth==0 ){
1b6a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
1b6b0 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45 78 70  k to see if pExp
1b6c0 72 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65  r is a duplicate
1b6d0 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72   of another aggr
1b6e0 65 67 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a  egate .        *
1b6f0 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  * function that 
1b700 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
1b710 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63  e pAggInfo struc
1b720 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ture.        */.
1b730 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
1b740 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74  ggInfo_func *pIt
1b750 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61  em = pAggInfo->a
1b760 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f  Func;.        fo
1b770 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  r(i=0; i<pAggInf
1b780 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
1b790 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
1b7a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
1b7b0 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d  prCompare(pItem-
1b7c0 3e 70 45 78 70 72 2c 20 70 45 78 70 72 29 20 29  >pExpr, pExpr) )
1b7d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  {.            br
1b7e0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
1b7f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b800 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e     if( i>=pAggIn
1b810 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20  fo->nFunc ){.   
1b820 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20         /* pExpr 
1b830 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61  is original.  Ma
1b840 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69  ke a new entry i
1b850 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  n pAggInfo->aFun
1b860 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  c[].          */
1b870 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65 6e  .          u8 en
1b880 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e  c = ENC(pParse->
1b890 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  db);.          i
1b8a0 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e   = addAggInfoFun
1b8b0 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41  c(pParse->db, pA
1b8c0 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ggInfo);.       
1b8d0 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20     if( i>=0 ){. 
1b8e0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
1b8f0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1b900 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
1b910 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
1b920 20 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20          pItem = 
1b930 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  &pAggInfo->aFunc
1b940 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [i];.           
1b950 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20   pItem->pExpr = 
1b960 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
1b970 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d     pItem->iMem =
1b980 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1b990 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
1b9a0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1b9b0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1b9c0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1b9d0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
1b9e0 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46  pFunc = sqlite3F
1b9f0 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  indFunction(pPar
1ba00 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  se->db,.        
1ba10 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1ba20 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 73 71 6c 69  ->u.zToken, sqli
1ba30 74 65 33 53 74 72 6c 65 6e 33 30 28 70 45 78 70  te3Strlen30(pExp
1ba40 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2c 0a 20 20  r->u.zToken),.  
1ba50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba60 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20   pExpr->x.pList 
1ba70 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ? pExpr->x.pList
1ba80 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63  ->nExpr : 0, enc
1ba90 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
1baa0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
1bab0 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
1bac0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1bad0 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e    pItem->iDistin
1bae0 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
1baf0 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  b++;.           
1bb00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1bb10 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69        pItem->iDi
1bb20 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20  stinct = -1;.   
1bb30 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1bb40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1bb50 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  .        /* Make
1bb60 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20   pExpr point to 
1bb70 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
1bb80 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
1bb90 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20  ] entry.        
1bba0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
1bbb0 74 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72  t( !ExprHasAnyPr
1bbc0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1bbd0 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
1bbe0 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20  duced) );.      
1bbf0 20 20 45 78 70 72 53 65 74 49 72 72 65 64 75 63    ExprSetIrreduc
1bc00 69 62 6c 65 28 70 45 78 70 72 29 3b 0a 20 20 20  ible(pExpr);.   
1bc10 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
1bc20 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 45   = i;.        pE
1bc30 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20  xpr->pAggInfo = 
1bc40 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
1bc50 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
1bc60 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ne;.      }.    
1bc70 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  }.  }.  return W
1bc80 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73  RC_Continue;.}.s
1bc90 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a  tatic int analyz
1bca0 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c  eAggregatesInSel
1bcb0 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ect(Walker *pWal
1bcc0 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  ker, Select *pSe
1bcd0 6c 65 63 74 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e  lect){.  NameCon
1bce0 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c  text *pNC = pWal
1bcf0 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 69 66  ker->u.pNC;.  if
1bd00 28 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30  ( pNC->nDepth==0
1bd10 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65   ){.    pNC->nDe
1bd20 70 74 68 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  pth++;.    sqlit
1bd30 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
1bd40 6c 6b 65 72 2c 20 70 53 65 6c 65 63 74 29 3b 0a  lker, pSelect);.
1bd50 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2d      pNC->nDepth-
1bd60 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  -;.    return WR
1bd70 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 65 6c 73 65  C_Prune;.  }else
1bd80 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
1bd90 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d  _Continue;.  }.}
1bda0 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  ../*.** Analyze 
1bdb0 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
1bdc0 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  sion looking for
1bdd0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
1bde0 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
1bdf0 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e  variables that n
1be00 65 65 64 20 74 6f 20 62 65 20 61 64 64 65 64 20  eed to be added 
1be10 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61  to the pParse->a
1be20 41 67 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 20  Agg[] array..** 
1be30 4d 61 6b 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  Make additional 
1be40 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65 20 70  entries to the p
1be50 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72  Parse->aAgg[] ar
1be60 72 61 79 20 61 73 20 6e 65 63 65 73 73 61 72 79  ray as necessary
1be70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1be80 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tine should only
1be90 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
1bea0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1beb0 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c  has been.** anal
1bec0 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 52  yzed by sqlite3R
1bed0 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
1bee0 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
1bef0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
1bf00 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74  regates(NameCont
1bf10 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a  ext *pNC, Expr *
1bf20 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72  pExpr){.  Walker
1bf30 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c   w;.  w.xExprCal
1bf40 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41  lback = analyzeA
1bf50 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78 53  ggregate;.  w.xS
1bf60 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
1bf70 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
1bf80 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e 75  sInSelect;.  w.u
1bf90 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 73 71  .pNC = pNC;.  sq
1bfa0 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
1bfb0 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a  , pExpr);.}../*.
1bfc0 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45  ** Call sqlite3E
1bfd0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
1bfe0 61 74 65 73 28 29 20 66 6f 72 20 65 76 65 72 79  ates() for every
1bff0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
1c000 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
1c010 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68  list.  Return th
1c020 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
1c030 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  rs..**.** If an 
1c040 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20  error is found, 
1c050 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20  the analysis is 
1c060 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f  cut short..*/.vo
1c070 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  id sqlite3ExprAn
1c080 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d  alyzeAggList(Nam
1c090 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45  eContext *pNC, E
1c0a0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
1c0b0 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
1c0c0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1c0d0 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
1c0e0 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
1c0f0 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
1c100 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
1c110 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
1c120 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
1c130 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
1c140 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65  egates(pNC, pIte
1c150 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d  m->pExpr);.    }
1c160 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
1c170 6c 6f 63 61 74 65 20 61 20 73 69 6e 67 6c 65 20  locate a single 
1c180 6e 65 77 20 72 65 67 69 73 74 65 72 20 66 6f 72  new register for
1c190 20 75 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d   use to hold som
1c1a0 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72  e intermediate r
1c1b0 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  esult..*/.int sq
1c1c0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
1c1d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
1c1e0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54    if( pParse->nT
1c1f0 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20  empReg==0 ){.   
1c200 20 72 65 74 75 72 6e 20 2b 2b 70 50 61 72 73 65   return ++pParse
1c210 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65  ->nMem;.  }.  re
1c220 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 61 54 65  turn pParse->aTe
1c230 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e  mpReg[--pParse->
1c240 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a  nTempReg];.}../*
1c250 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61  .** Deallocate a
1c260 20 72 65 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e   register, makin
1c270 67 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  g available for 
1c280 72 65 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f  reuse for some o
1c290 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e  ther.** purpose.
1c2a0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69  .**.** If a regi
1c2b0 73 74 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c  ster is currentl
1c2c0 79 20 62 65 69 6e 67 20 75 73 65 64 20 62 79 20  y being used by 
1c2d0 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
1c2e0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64 61  , then.** the da
1c2f0 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 64 65 66  llocation is def
1c300 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20  erred until the 
1c310 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 6c 69 6e  column cache lin
1c320 65 20 74 68 61 74 20 75 73 65 73 0a 2a 2a 20 74  e that uses.** t
1c330 68 65 20 72 65 67 69 73 74 65 72 20 62 65 63 6f  he register beco
1c340 6d 65 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f  mes stale..*/.vo
1c350 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  id sqlite3Releas
1c360 65 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a  eTempReg(Parse *
1c370 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
1c380 29 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26 26  ){.  if( iReg &&
1c390 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
1c3a0 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72  g<ArraySize(pPar
1c3b0 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b  se->aTempReg) ){
1c3c0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1c3d0 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
1c3e0 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30   *p;.    for(i=0
1c3f0 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
1c400 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
1c410 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
1c420 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   p++){.      if(
1c430 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29   p->iReg==iReg )
1c440 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 74 65 6d  {.        p->tem
1c450 70 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  pReg = 1;.      
1c460 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
1c470 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  }.    }.    pPar
1c480 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61  se->aTempReg[pPa
1c490 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d  rse->nTempReg++]
1c4a0 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a   = iReg;.  }.}..
1c4b0 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f  /*.** Allocate o
1c4c0 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62  r deallocate a b
1c4d0 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e  lock of nReg con
1c4e0 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65  secutive registe
1c4f0 72 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  rs.*/.int sqlite
1c500 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61  3GetTempRange(Pa
1c510 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1c520 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c   nReg){.  int i,
1c530 20 6e 3b 0a 20 20 69 20 3d 20 70 50 61 72 73 65   n;.  i = pParse
1c540 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e  ->iRangeReg;.  n
1c550 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67   = pParse->nRang
1c560 65 52 65 67 3b 0a 20 20 69 66 28 20 6e 52 65 67  eReg;.  if( nReg
1c570 3c 3d 6e 20 26 26 20 21 75 73 65 64 41 73 43 6f  <=n && !usedAsCo
1c580 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65  lumnCache(pParse
1c590 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29 7b 0a 20  , i, i+n-1) ){. 
1c5a0 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67     pParse->iRang
1c5b0 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20  eReg += nReg;.  
1c5c0 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65    pParse->nRange
1c5d0 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d  Reg -= nReg;.  }
1c5e0 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20 70 50  else{.    i = pP
1c5f0 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
1c600 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
1c610 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65  = nReg;.  }.  re
1c620 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73  turn i;.}.void s
1c630 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1c640 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  pRange(Parse *pP
1c650 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20  arse, int iReg, 
1c660 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 66 28  int nReg){.  if(
1c670 20 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52   nReg>pParse->nR
1c680 61 6e 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70  angeReg ){.    p
1c690 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
1c6a0 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61   = nReg;.    pPa
1c6b0 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d  rse->iRangeReg =
1c6c0 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a            iReg;.  }.}.