/ Hex Artifact Content
Login

Artifact b844f5f63bc46c160ce20ec7b76ca2fe4aa70323:


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 31 20 32 30 30 39 2f 30 35 2f 32 39 20  .441 2009/05/29 
0220: 31 39 3a 30 30 3a 31 33 20 64 72 68 20 45 78 70  19:00:13 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 20 26 26 20 69 3c 33 32 3b 20 69  nFarg && i<32; i
13a20 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
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 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
13da0 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  umn==0 ){.      
13db0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62    sqlite3CodeSub
13dc0 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
13dd0 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Expr, 0, 0);.   
13de0 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67     }.      inReg
13df0 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
13e00 6e 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  n;.      break;.
13e10 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
13e20 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_IN: {.      in
13e30 74 20 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 30 3b  t rNotFound = 0;
13e40 0a 20 20 20 20 20 20 69 6e 74 20 72 4d 61 79 48  .      int rMayH
13e50 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20  aveNull = 0;.   
13e60 20 20 20 69 6e 74 20 6a 32 2c 20 6a 33 2c 20 6a     int j2, j3, j
13e70 34 2c 20 6a 35 3b 0a 20 20 20 20 20 20 63 68 61  4, j5;.      cha
13e80 72 20 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  r affinity;.    
13e90 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 0a 20 20    int eType;..  
13ea0 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
13eb0 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 49  ent((v, "begin I
13ec0 4e 20 65 78 70 72 20 72 25 64 22 2c 20 74 61 72  N expr r%d", tar
13ed0 67 65 74 29 29 3b 0a 20 20 20 20 20 20 65 54 79  get));.      eTy
13ee0 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  pe = sqlite3Find
13ef0 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  InIndex(pParse, 
13f00 70 45 78 70 72 2c 20 26 72 4d 61 79 48 61 76 65  pExpr, &rMayHave
13f10 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  Null);.      if(
13f20 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 29 7b   rMayHaveNull ){
13f30 0a 20 20 20 20 20 20 20 20 72 4e 6f 74 46 6f 75  .        rNotFou
13f40 6e 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  nd = ++pParse->n
13f50 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  Mem;.      }..  
13f60 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
13f70 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74  t the affinity t
13f80 6f 20 75 73 65 20 74 6f 20 63 72 65 61 74 65 20  o use to create 
13f90 61 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 72  a key from the r
13fa0 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20  esults.      ** 
13fb0 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
13fc0 6e 2e 20 61 66 66 69 6e 69 74 79 53 74 72 20 73  n. affinityStr s
13fd0 74 6f 72 65 73 20 61 20 73 74 61 74 69 63 20 73  tores a static s
13fe0 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66  tring suitable f
13ff0 6f 72 0a 20 20 20 20 20 20 2a 2a 20 50 34 20 6f  or.      ** P4 o
14000 66 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e  f OP_MakeRecord.
14010 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14020 61 66 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61  affinity = compa
14030 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45  risonAffinity(pE
14040 78 70 72 29 3b 0a 0a 0a 20 20 20 20 20 20 2f 2a  xpr);...      /*
14050 20 43 6f 64 65 20 74 68 65 20 3c 65 78 70 72 3e   Code the <expr>
14060 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e   from "<expr> IN
14070 20 28 2e 2e 2e 29 22 2e 20 54 68 65 20 74 65 6d   (...)". The tem
14080 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 20 20 20  porary table.   
14090 20 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54 61     ** pExpr->iTa
140a0 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ble contains the
140b0 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b   values that mak
140c0 65 20 75 70 20 74 68 65 20 28 2e 2e 2e 29 20 73  e up the (...) s
140d0 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  et..      */.   
140e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
140f0 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
14100 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
14110 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
14120 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72  Expr->pLeft, tar
14130 67 65 74 29 3b 0a 20 20 20 20 20 20 6a 32 20 3d  get);.      j2 =
14140 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14150 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p1(v, OP_IsNull,
14160 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
14170 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e  if( eType==IN_IN
14180 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  DEX_ROWID ){.   
14190 20 20 20 20 20 6a 33 20 3d 20 73 71 6c 69 74 65       j3 = sqlite
141a0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
141b0 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 74 61 72  P_MustBeInt, tar
141c0 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6a 34  get);.        j4
141d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
141e0 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78  dOp3(v, OP_NotEx
141f0 69 73 74 73 2c 20 70 45 78 70 72 2d 3e 69 54 61  ists, pExpr->iTa
14200 62 6c 65 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ble, 0, target);
14210 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14220 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14230 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72  _Integer, 1, tar
14240 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6a 35  get);.        j5
14250 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
14260 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29  dOp0(v, OP_Goto)
14270 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
14280 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
14290 20 6a 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71   j3);.        sq
142a0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
142b0 65 28 76 2c 20 6a 34 29 3b 0a 20 20 20 20 20 20  e(v, j4);.      
142c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
142d0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
142e0 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 0, target);. 
142f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14300 20 20 20 20 72 32 20 3d 20 72 65 67 46 72 65 65      r2 = regFree
14310 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
14320 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 0a  mpReg(pParse);..
14330 20 20 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74          /* Creat
14340 65 20 61 20 72 65 63 6f 72 64 20 61 6e 64 20 74  e a record and t
14350 65 73 74 20 66 6f 72 20 73 65 74 20 6d 65 6d 62  est for set memb
14360 65 72 73 68 69 70 2e 20 49 66 20 74 68 65 20 73  ership. If the s
14370 65 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20  et contains.    
14380 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
14390 2c 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74  , then jump to t
143a0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 74 65  he end of the te
143b0 73 74 20 63 6f 64 65 2e 20 54 68 65 20 74 61 72  st code. The tar
143c0 67 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  get.        ** r
143d0 65 67 69 73 74 65 72 20 73 74 69 6c 6c 20 63 6f  egister still co
143e0 6e 74 61 69 6e 73 20 74 68 65 20 74 72 75 65 20  ntains the true 
143f0 28 31 29 20 76 61 6c 75 65 20 77 72 69 74 74 65  (1) value writte
14400 6e 20 74 6f 20 69 74 20 65 61 72 6c 69 65 72 2e  n to it earlier.
14410 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
14420 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14430 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
14440 52 65 63 6f 72 64 2c 20 74 61 72 67 65 74 2c 20  Record, target, 
14450 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79  1, r2, &affinity
14460 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 1);.        sq
14470 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14480 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
14490 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
144a0 20 20 20 6a 35 20 3d 20 73 71 6c 69 74 65 33 56     j5 = sqlite3V
144b0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
144c0 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54  Found, pExpr->iT
144d0 61 62 6c 65 2c 20 30 2c 20 72 32 29 3b 0a 0a 20  able, 0, r2);.. 
144e0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
144f0 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20   set membership 
14500 74 65 73 74 20 66 61 69 6c 73 2c 20 74 68 65 6e  test fails, then
14510 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
14520 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22  he .        ** "
14530 78 20 49 4e 20 28 2e 2e 2e 29 22 20 65 78 70 72  x IN (...)" expr
14540 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 65  ession must be e
14550 69 74 68 65 72 20 30 20 6f 72 20 4e 55 4c 4c 2e  ither 0 or NULL.
14560 20 49 66 20 74 68 65 20 73 65 74 0a 20 20 20 20   If the set.    
14570 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20      ** contains 
14580 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20  no NULL values, 
14590 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
145a0 69 73 20 30 2e 20 49 66 20 74 68 65 20 73 65 74  is 0. If the set
145b0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e   .        ** con
145c0 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
145d0 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74  e NULL values, t
145e0 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f  hen the result o
145f0 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
14600 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
14610 6c 73 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20  lso NULL..      
14620 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
14630 20 72 4e 6f 74 46 6f 75 6e 64 3d 3d 30 20 29 7b   rNotFound==0 ){
14640 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
14650 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69  is branch runs i
14660 66 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 61 74  f it is known at
14670 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 28 6e   compile time (n
14680 6f 77 29 20 74 68 61 74 20 0a 20 20 20 20 20 20  ow) that .      
14690 20 20 20 20 2a 2a 20 74 68 65 20 73 65 74 20 63      ** the set c
146a0 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 20  ontains no NULL 
146b0 76 61 6c 75 65 73 2e 20 54 68 69 73 20 68 61 70  values. This hap
146c0 70 65 6e 73 20 61 73 20 74 68 65 20 72 65 73 75  pens as the resu
146d0 6c 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  lt.          ** 
146e0 6f 66 20 61 20 22 4e 4f 54 20 4e 55 4c 4c 22 20  of a "NOT NULL" 
146f0 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20 74 68  constraint in th
14700 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
14710 61 2e 20 4e 6f 20 6e 65 65 64 0a 20 20 20 20 20  a. No need.     
14720 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20       ** to test 
14730 74 68 65 20 64 61 74 61 20 73 74 72 75 63 74 75  the data structu
14740 72 65 20 61 74 20 72 75 6e 74 69 6d 65 20 69 6e  re at runtime in
14750 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20   this case..    
14760 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
14770 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14780 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
14790 65 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  er, 0, target);.
147a0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
147b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
147c0 20 62 6c 6f 63 6b 20 70 6f 70 75 6c 61 74 65 73   block populates
147d0 20 74 68 65 20 72 4e 6f 74 46 6f 75 6e 64 20 72   the rNotFound r
147e0 65 67 69 73 74 65 72 20 77 69 74 68 20 65 69 74  egister with eit
147f0 68 65 72 20 4e 55 4c 4c 0a 20 20 20 20 20 20 20  her NULL.       
14800 20 20 20 2a 2a 20 6f 72 20 30 20 28 61 6e 20 69     ** or 0 (an i
14810 6e 74 65 67 65 72 20 76 61 6c 75 65 29 2e 20 49  nteger value). I
14820 66 20 74 68 65 20 64 61 74 61 20 73 74 72 75 63  f the data struc
14830 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  ture contains on
14840 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f  e.          ** o
14850 72 20 6d 6f 72 65 20 4e 55 4c 4c 73 2c 20 74 68  r more NULLs, th
14860 65 6e 20 73 65 74 20 72 4e 6f 74 46 6f 75 6e 64  en set rNotFound
14870 20 74 6f 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77   to NULL. Otherw
14880 69 73 65 2c 20 73 65 74 20 69 74 0a 20 20 20 20  ise, set it.    
14890 20 20 20 20 20 20 2a 2a 20 74 6f 20 30 2e 20 49        ** to 0. I
148a0 66 20 72 65 67 69 73 74 65 72 20 72 4d 61 79 48  f register rMayH
148b0 61 76 65 4e 75 6c 6c 20 69 73 20 61 6c 72 65 61  aveNull is alrea
148c0 64 79 20 73 65 74 20 74 6f 20 73 6f 6d 65 20 76  dy set to some v
148d0 61 6c 75 65 0a 20 20 20 20 20 20 20 20 20 20 2a  alue.          *
148e0 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 4e 55 4c  * other than NUL
148f0 4c 2c 20 74 68 65 6e 20 74 68 65 20 74 65 73 74  L, then the test
14900 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
14910 6e 20 72 75 6e 20 61 6e 64 20 0a 20 20 20 20 20  n run and .     
14920 20 20 20 20 20 2a 2a 20 72 4e 6f 74 46 6f 75 6e       ** rNotFoun
14930 64 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 70  d is already pop
14940 75 6c 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20  ulated..        
14950 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73    */.          s
14960 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
14970 20 6e 75 6c 6c 52 65 63 6f 72 64 5b 5d 20 3d 20   nullRecord[] = 
14980 7b 20 30 78 30 32 2c 20 30 78 30 30 20 7d 3b 0a  { 0x02, 0x00 };.
14990 20 20 20 20 20 20 20 20 20 20 6a 33 20 3d 20 73            j3 = s
149a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
149b0 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
149c0 72 4d 61 79 48 61 76 65 4e 75 6c 6c 29 3b 0a 20  rMayHaveNull);. 
149d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
149e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
149f0 5f 4e 75 6c 6c 2c 20 30 2c 20 72 4e 6f 74 46 6f  _Null, 0, rNotFo
14a00 75 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  und);.          
14a10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14a20 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 32 2c  4(v, OP_Blob, 2,
14a30 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 30   rMayHaveNull, 0
14a40 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
14a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a60 6e 75 6c 6c 52 65 63 6f 72 64 2c 20 50 34 5f 53  nullRecord, P4_S
14a70 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
14a80 20 20 6a 34 20 3d 20 73 71 6c 69 74 65 33 56 64    j4 = sqlite3Vd
14a90 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 46  beAddOp3(v, OP_F
14aa0 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  ound, pExpr->iTa
14ab0 62 6c 65 2c 20 30 2c 20 72 4d 61 79 48 61 76 65  ble, 0, rMayHave
14ac0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  Null);.         
14ad0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14ae0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
14af0 2c 20 30 2c 20 72 4e 6f 74 46 6f 75 6e 64 29 3b  , 0, rNotFound);
14b00 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
14b10 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
14b20 2c 20 6a 34 29 3b 0a 20 20 20 20 20 20 20 20 20  , j4);.         
14b30 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
14b40 48 65 72 65 28 76 2c 20 6a 33 29 3b 0a 0a 20 20  Here(v, j3);..  
14b50 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
14b60 74 68 65 20 76 61 6c 75 65 20 6f 66 20 72 65 67  the value of reg
14b70 69 73 74 65 72 20 72 4e 6f 74 46 6f 75 6e 64 20  ister rNotFound 
14b80 28 77 68 69 63 68 20 69 73 20 65 69 74 68 65 72  (which is either
14b90 20 4e 55 4c 4c 20 6f 72 20 30 29 0a 20 20 20 20   NULL or 0).    
14ba0 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68        ** into th
14bb0 65 20 74 61 72 67 65 74 20 72 65 67 69 73 74 65  e target registe
14bc0 72 2e 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20  r. This will be 
14bd0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
14be0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  e.          ** e
14bf0 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 20 20 20  xpression..     
14c00 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
14c10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14c20 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
14c30 72 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 72 67 65  rNotFound, targe
14c40 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
14c50 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
14c60 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
14c70 76 2c 20 6a 32 29 3b 0a 20 20 20 20 20 20 73 71  v, j2);.      sq
14c80 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
14c90 65 28 76 2c 20 6a 35 29 3b 0a 20 20 20 20 20 20  e(v, j5);.      
14ca0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
14cb0 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a  Pop(pParse, 1);.
14cc0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
14cd0 74 28 28 76 2c 20 22 65 6e 64 20 49 4e 20 65 78  t((v, "end IN ex
14ce0 70 72 20 72 25 64 22 2c 20 74 61 72 67 65 74 29  pr r%d", target)
14cf0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
14d00 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
14d10 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20   /*.    **    x 
14d20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a  BETWEEN y AND z.
14d30 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
14d40 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  is is equivalent
14d50 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   to.    **.    *
14d60 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c  *    x>=y AND x<
14d70 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  =z.    **.    **
14d80 20 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   X is stored in 
14d90 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20  pExpr->pLeft..  
14da0 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64    ** Y is stored
14db0 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
14dc0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20  ->a[0].pExpr..  
14dd0 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64    ** Z is stored
14de0 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
14df0 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20  ->a[1].pExpr..  
14e00 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
14e10 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
14e20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
14e30 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
14e40 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
14e50 69 73 74 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d  ist_item *pLItem
14e60 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
14e70 74 2d 3e 61 3b 0a 20 20 20 20 20 20 45 78 70 72  t->a;.      Expr
14e80 20 2a 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65   *pRight = pLIte
14e90 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20 20  m->pExpr;..     
14ea0 20 63 6f 64 65 43 6f 6d 70 61 72 65 4f 70 65 72   codeCompareOper
14eb0 61 6e 64 73 28 70 50 61 72 73 65 2c 20 70 4c 65  ands(pParse, pLe
14ec0 66 74 2c 20 26 72 31 2c 20 26 72 65 67 46 72 65  ft, &r1, &regFre
14ed0 65 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e1,.            
14ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ef0 20 20 20 20 20 20 70 52 69 67 68 74 2c 20 26 72        pRight, &r
14f00 32 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  2, &regFree2);. 
14f10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
14f20 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
14f30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
14f40 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
14f50 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47     r3 = sqlite3G
14f60 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
14f70 29 3b 0a 20 20 20 20 20 20 72 34 20 3d 20 73 71  );.      r4 = sq
14f80 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
14f90 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 63  pParse);.      c
14fa0 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
14fb0 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
14fc0 2c 20 4f 50 5f 47 65 2c 0a 20 20 20 20 20 20 20  , OP_Ge,.       
14fd0 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
14fe0 32 2c 20 72 33 2c 20 53 51 4c 49 54 45 5f 53 54  2, r3, SQLITE_ST
14ff0 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20 70 4c  OREP2);.      pL
15000 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52  Item++;.      pR
15010 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70  ight = pLItem->p
15020 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
15030 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
15040 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
15050 65 32 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e2);.      r2 = 
15060 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
15070 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52 69 67  emp(pParse, pRig
15080 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
15090 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
150a0 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
150b0 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
150c0 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
150d0 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 72  pRight, OP_Le, r
150e0 31 2c 20 72 32 2c 20 72 34 2c 20 53 51 4c 49 54  1, r2, r4, SQLIT
150f0 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20  E_STOREP2);.    
15100 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15110 4f 70 33 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 72  Op3(v, OP_And, r
15120 33 2c 20 72 34 2c 20 74 61 72 67 65 74 29 3b 0a  3, r4, target);.
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 33 29 3b 0a 20 20 20 20 20 20 73  se, r3);.      s
15160 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
15170 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 34 29  pReg(pParse, r4)
15180 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
15190 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
151a0 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20  _UPLUS: {.      
151b0 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
151c0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
151d0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
151e0 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ft, target);.   
151f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
15200 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 46  .    /*.    ** F
15210 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20 20  orm A:.    **   
15220 43 41 53 45 20 78 20 57 48 45 4e 20 65 31 20 54  CASE x WHEN e1 T
15230 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54  HEN r1 WHEN e2 T
15240 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20  HEN r2 ... WHEN 
15250 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20  eN THEN rN ELSE 
15260 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20  y END.    **.   
15270 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20 20   ** Form B:.    
15280 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 65  **   CASE WHEN e
15290 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65  1 THEN r1 WHEN e
152a0 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48  2 THEN r2 ... WH
152b0 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c  EN eN THEN rN EL
152c0 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a  SE y END.    **.
152d0 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69 73      ** Form A is
152e0 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66 6f 72   can be transfor
152f0 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65 71 75  med into the equ
15300 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20 61  ivalent form B a
15310 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a  s follows:.    *
15320 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 78 3d  *   CASE WHEN x=
15330 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20  e1 THEN r1 WHEN 
15340 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e  x=e2 THEN r2 ...
15350 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 57  .    **        W
15360 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72 4e  HEN x=eN THEN rN
15370 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20   ELSE y END.    
15380 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69 66 20  **.    ** X (if 
15390 69 74 20 65 78 69 73 74 73 29 20 69 73 20 69 6e  it exists) is in
153a0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20   pExpr->pLeft.. 
153b0 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20 70 45     ** Y is in pE
153c0 78 70 72 2d 3e 70 52 69 67 68 74 2e 20 20 54 68  xpr->pRight.  Th
153d0 65 20 59 20 69 73 20 61 6c 73 6f 20 6f 70 74 69  e Y is also opti
153e0 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65 72 65 20  onal.  If there 
153f0 69 73 20 6e 6f 0a 20 20 20 20 2a 2a 20 45 4c 53  is no.    ** ELS
15400 45 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 20  E clause and no 
15410 6f 74 68 65 72 20 74 65 72 6d 20 6d 61 74 63 68  other term match
15420 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  es, then the res
15430 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ult of the.    *
15440 2a 20 65 78 70 72 73 73 69 6f 6e 20 69 73 20 4e  * exprssion is N
15450 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20 69  ULL..    ** Ei i
15460 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73  s in pExpr->pLis
15470 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52 69  t->a[i*2] and Ri
15480 20 69 73 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   is pExpr->pList
15490 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20 20  ->a[i*2+1]..    
154a0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  **.    ** The re
154b0 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78 70 72  sult of the expr
154c0 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 52 69  ession is the Ri
154d0 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 6d   for the first m
154e0 61 74 63 68 69 6e 67 20 45 69 2c 0a 20 20 20 20  atching Ei,.    
154f0 2a 2a 20 6f 72 20 69 66 20 74 68 65 72 65 20 69  ** or if there i
15500 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45 69  s no matching Ei
15510 2c 20 74 68 65 20 45 4c 53 45 20 74 65 72 6d 20  , the ELSE term 
15520 59 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20 69  Y, or if there i
15530 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53 45  s.    ** no ELSE
15540 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20   term, NULL..   
15550 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
15560 43 41 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e  CASE: {.      in
15570 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20  t endLabel;     
15580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15590 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f  /* GOTO label fo
155a0 72 20 65 6e 64 20 6f 66 20 43 41 53 45 20 73 74  r end of CASE st
155b0 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  mt */.      int 
155c0 6e 65 78 74 43 61 73 65 3b 20 20 20 20 20 20 20  nextCase;       
155d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
155e0 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20   GOTO label for 
155f0 6e 65 78 74 20 57 48 45 4e 20 63 6c 61 75 73 65  next WHEN clause
15600 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45   */.      int nE
15610 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  xpr;            
15620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32              /* 2
15630 78 20 6e 75 6d 62 65 72 20 6f 66 20 57 48 45 4e  x number of WHEN
15640 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
15650 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
15660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15670 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
15680 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c  r */.      ExprL
15690 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
156a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
156b0 4c 69 73 74 20 6f 66 20 57 48 45 4e 20 74 65 72  List of WHEN ter
156c0 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75  ms */.      stru
156d0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
156e0 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a   *aListelem;  /*
156f0 20 41 72 72 61 79 20 6f 66 20 57 48 45 4e 20 74   Array of WHEN t
15700 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45 78  erms */.      Ex
15710 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20  pr opCompare;   
15720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15730 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20 65 78 70  /* The X==Ei exp
15740 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ression */.     
15750 20 45 78 70 72 20 63 61 63 68 65 58 3b 20 20 20   Expr cacheX;   
15760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15770 20 20 20 2f 2a 20 43 61 63 68 65 64 20 65 78 70     /* Cached exp
15780 72 65 73 73 69 6f 6e 20 58 20 2a 2f 0a 20 20 20  ression X */.   
15790 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20     Expr *pX;    
157a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157b0 20 20 20 20 20 2f 2a 20 54 68 65 20 58 20 65 78       /* The X ex
157c0 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
157d0 20 20 45 78 70 72 20 2a 70 54 65 73 74 20 3d 20    Expr *pTest = 
157e0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
157f0 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f      /* X==Ei (fo
15800 72 6d 20 41 29 20 6f 72 20 6a 75 73 74 20 45 69  rm A) or just Ei
15810 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 20 20 20   (form B) */.   
15820 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74     VVA_ONLY( int
15830 20 69 43 61 63 68 65 4c 65 76 65 6c 20 3d 20 70   iCacheLevel = p
15840 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
15850 65 6c 3b 20 29 0a 0a 20 20 20 20 20 20 61 73 73  el; )..      ass
15860 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
15870 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
15880 78 49 73 53 65 6c 65 63 74 29 20 26 26 20 70 45  xIsSelect) && pE
15890 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a  xpr->x.pList );.
158a0 20 20 20 20 20 20 61 73 73 65 72 74 28 28 70 45        assert((pE
158b0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
158c0 78 70 72 20 25 20 32 29 20 3d 3d 20 30 29 3b 0a  xpr % 2) == 0);.
158d0 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78        assert(pEx
158e0 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
158f0 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70  pr > 0);.      p
15900 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  EList = pExpr->x
15910 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c  .pList;.      aL
15920 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74  istelem = pEList
15930 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72  ->a;.      nExpr
15940 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
15950 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61 62 65 6c  ;.      endLabel
15960 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
15970 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
15980 20 20 69 66 28 20 28 70 58 20 3d 20 70 45 78 70    if( (pX = pExp
15990 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a  r->pLeft)!=0 ){.
159a0 20 20 20 20 20 20 20 20 63 61 63 68 65 58 20 3d          cacheX =
159b0 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 74 65   *pX;.        te
159c0 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d  stcase( pX->op==
159d0 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 58 2d  TK_COLUMN || pX-
159e0 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op==TK_REGISTER
159f0 20 29 3b 0a 20 20 20 20 20 20 20 20 63 61 63 68   );.        cach
15a00 65 58 2e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69  eX.iTable = sqli
15a10 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
15a20 70 50 61 72 73 65 2c 20 70 58 2c 20 26 72 65 67  pParse, pX, &reg
15a30 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Free1);.        
15a40 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
15a50 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  e1==0 );.       
15a60 20 63 61 63 68 65 58 2e 6f 70 20 3d 20 54 4b 5f   cacheX.op = TK_
15a70 52 45 47 49 53 54 45 52 3b 0a 20 20 20 20 20 20  REGISTER;.      
15a80 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d    opCompare.op =
15a90 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20   TK_EQ;.        
15aa0 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20  opCompare.pLeft 
15ab0 3d 20 26 63 61 63 68 65 58 3b 0a 20 20 20 20 20  = &cacheX;.     
15ac0 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f     pTest = &opCo
15ad0 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 7d 0a 20  mpare;.      }. 
15ae0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
15af0 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20  nExpr; i=i+2){. 
15b00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
15b10 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
15b20 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  se);.        if(
15b30 20 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20   pX ){.         
15b40 20 61 73 73 65 72 74 28 20 70 54 65 73 74 21 3d   assert( pTest!=
15b50 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  0 );.          o
15b60 70 43 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20  pCompare.pRight 
15b70 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70  = aListelem[i].p
15b80 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65  Expr;.        }e
15b90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
15ba0 54 65 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d  Test = aListelem
15bb0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
15bc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78     }.        nex
15bd0 74 43 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56  tCase = sqlite3V
15be0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
15bf0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
15c00 65 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b  e( pTest->op==TK
15c10 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 54 65 73 74  _COLUMN || pTest
15c20 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ->op==TK_REGISTE
15c30 52 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  R );.        sql
15c40 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
15c50 70 50 61 72 73 65 2c 20 70 54 65 73 74 2c 20 6e  pParse, pTest, n
15c60 65 78 74 43 61 73 65 2c 20 53 51 4c 49 54 45 5f  extCase, SQLITE_
15c70 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
15c80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
15c90 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45  Listelem[i+1].pE
15ca0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
15cb0 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  MN );.        te
15cc0 73 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c 65  stcase( aListele
15cd0 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70  m[i+1].pExpr->op
15ce0 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b  ==TK_REGISTER );
15cf0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15d00 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
15d10 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e   aListelem[i+1].
15d20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
15d30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15d40 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15d50 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 4c 61 62 65  Goto, 0, endLabe
15d60 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
15d70 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
15d80 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20  pParse, 1);.    
15d90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
15da0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e  esolveLabel(v, n
15db0 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20  extCase);.      
15dc0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
15dd0 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20  r->pRight ){.   
15de0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
15df0 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
15e00 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
15e10 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
15e20 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
15e30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
15e40 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
15e50 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31  chePop(pParse, 1
15e60 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
15e70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15e80 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15e90 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
15ea0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15eb0 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
15ec0 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  ocFailed || pPar
15ed0 73 65 2d 3e 6e 45 72 72 3e 30 20 0a 20 20 20 20  se->nErr>0 .    
15ee0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65         || pParse
15ef0 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 69  ->iCacheLevel==i
15f00 43 61 63 68 65 4c 65 76 65 6c 20 29 3b 0a 20 20  CacheLevel );.  
15f10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
15f20 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
15f30 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  ndLabel);.      
15f40 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
15f50 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15f60 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63 61 73  _TRIGGER.    cas
15f70 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20  e TK_RAISE: {.  
15f80 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d      if( !pParse-
15f90 3e 74 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20  >trigStack ){.  
15fa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
15fb0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
15fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fd0 20 20 20 20 20 22 52 41 49 53 45 28 29 20 6d 61       "RAISE() ma
15fe0 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77  y only be used w
15ff0 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d  ithin a trigger-
16000 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20  program");.     
16010 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
16020 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
16030 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 21 3d  Expr->affinity!=
16040 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20  OE_Ignore ){.   
16050 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
16060 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
16070 45 5f 52 6f 6c 6c 62 61 63 6b 20 7c 7c 0a 20 20  E_Rollback ||.  
16080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
16090 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d  Expr->affinity =
160a0 3d 20 4f 45 5f 41 62 6f 72 74 20 7c 7c 0a 20 20  = OE_Abort ||.  
160b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
160c0 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d  Expr->affinity =
160d0 3d 20 4f 45 5f 46 61 69 6c 20 29 3b 0a 20 20 20  = OE_Fail );.   
160e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
160f0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
16100 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
16110 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 73  e) );.         s
16120 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
16130 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c  (v, OP_Halt, SQL
16140 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20  ITE_CONSTRAINT, 
16150 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c  pExpr->affinity,
16160 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
16170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
16180 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
16190 30 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  0);.      } else
161a0 20 7b 0a 20 20 20 20 20 20 20 20 20 61 73 73 65   {.         asse
161b0 72 74 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  rt( pExpr->affin
161c0 69 74 79 20 3d 3d 20 4f 45 5f 49 67 6e 6f 72 65  ity == OE_Ignore
161d0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c   );.         sql
161e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
161f0 2c 20 4f 50 5f 43 6f 6e 74 65 78 74 50 6f 70 2c  , OP_ContextPop,
16200 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
16210 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16220 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
16230 2c 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74  , pParse->trigSt
16240 61 63 6b 2d 3e 69 67 6e 6f 72 65 4a 75 6d 70 29  ack->ignoreJump)
16250 3b 0a 20 20 20 20 20 20 20 20 20 56 64 62 65 43  ;.         VdbeC
16260 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 61 69 73  omment((v, "rais
16270 65 28 49 47 4e 4f 52 45 29 22 29 29 3b 0a 20 20  e(IGNORE)"));.  
16280 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
16290 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
162a0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
162b0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
162c0 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20  se, regFree1);. 
162d0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
162e0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
162f0 65 67 46 72 65 65 32 29 3b 0a 20 20 72 65 74 75  egFree2);.  retu
16300 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a  rn inReg;.}../*.
16310 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
16320 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20   to evaluate an 
16330 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73  expression and s
16340 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
16350 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73  .** into a regis
16360 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ter.  Return the
16370 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
16380 20 77 68 65 72 65 20 74 68 65 20 72 65 73 75 6c   where the resul
16390 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64  ts.** are stored
163a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
163b0 65 67 69 73 74 65 72 20 69 73 20 61 20 74 65 6d  egister is a tem
163c0 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
163d0 74 68 61 74 20 63 61 6e 20 62 65 20 64 65 61 6c  that can be deal
163e0 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e  located,.** then
163f0 20 77 72 69 74 65 20 69 74 73 20 6e 75 6d 62 65   write its numbe
16400 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49  r into *pReg.  I
16410 66 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 67  f the result reg
16420 69 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20  ister is not.** 
16430 61 20 74 65 6d 70 6f 72 61 72 79 2c 20 74 68 65  a temporary, the
16440 6e 20 73 65 74 20 2a 70 52 65 67 20 74 6f 20 7a  n set *pReg to z
16450 65 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ero..*/.int sqli
16460 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
16470 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
16480 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
16490 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74 20 72 31  *pReg){.  int r1
164a0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
164b0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
164c0 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33  int r2 = sqlite3
164d0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
164e0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31  Parse, pExpr, r1
164f0 29 3b 0a 20 20 69 66 28 20 72 32 3d 3d 72 31 20  );.  if( r2==r1 
16500 29 7b 0a 20 20 20 20 2a 70 52 65 67 20 3d 20 72  ){.    *pReg = r
16510 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
16520 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
16530 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
16540 29 3b 0a 20 20 20 20 2a 70 52 65 67 20 3d 20 30  );.    *pReg = 0
16550 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
16560 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  2;.}../*.** Gene
16570 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
16580 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70  ill evaluate exp
16590 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e  ression pExpr an
165a0 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72  d store the.** r
165b0 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74  esults in regist
165c0 65 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20  er target.  The 
165d0 72 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72  results are guar
165e0 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72  anteed to appear
165f0 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20  .** in register 
16600 74 61 72 67 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73  target..*/.int s
16610 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 50  qlite3ExprCode(P
16620 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
16630 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
16640 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e  arget){.  int in
16650 52 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Reg;..  assert( 
16660 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67  target>0 && targ
16670 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  et<=pParse->nMem
16680 20 29 3b 0a 20 20 69 6e 52 65 67 20 3d 20 73 71   );.  inReg = sq
16690 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
166a0 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
166b0 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 61 73  r, target);.  as
166c0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56  sert( pParse->pV
166d0 64 62 65 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  dbe || pParse->d
166e0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
166f0 29 3b 0a 20 20 69 66 28 20 69 6e 52 65 67 21 3d  );.  if( inReg!=
16700 74 61 72 67 65 74 20 26 26 20 70 50 61 72 73 65  target && pParse
16710 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 73  ->pVdbe ){.    s
16720 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16730 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
16740 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c  OP_SCopy, inReg,
16750 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a 20 20   target);.  }.  
16760 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 7d  return target;.}
16770 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
16780 20 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75   code that evalu
16790 74 65 73 20 74 68 65 20 67 69 76 65 6e 20 65 78  tes the given ex
167a0 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74  pression and put
167b0 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  s the result.** 
167c0 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
167d0 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d  et..**.** Also m
167e0 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
167f0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73  e expression res
16800 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65  ults into anothe
16810 72 20 22 63 61 63 68 65 22 20 72 65 67 69 73 74  r "cache" regist
16820 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79  er.** and modify
16830 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
16840 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  so that the next
16850 20 74 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c   time it is eval
16860 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65  uated,.** the re
16870 73 75 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f  sult is a copy o
16880 66 20 74 68 65 20 63 61 63 68 65 20 72 65 67 69  f the cache regi
16890 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ster..**.** This
168a0 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
168b0 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73   for expressions
168c0 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20 6d   that are used m
168d0 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65  ultiple .** time
168e0 73 2e 20 20 54 68 65 79 20 61 72 65 20 65 76 61  s.  They are eva
168f0 6c 75 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20  luated once and 
16900 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
16910 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  he expression.**
16920 20 61 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a   are reused..*/.
16930 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
16940 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61 72 73  odeAndCache(Pars
16950 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
16960 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
16970 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  et){.  Vdbe *v =
16980 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
16990 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 20 20 69    int inReg;.  i
169a0 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
169b0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
169c0 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
169d0 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
169e0 30 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72  0 );.  if( pExpr
169f0 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45  ->op!=TK_REGISTE
16a00 52 20 29 7b 20 20 0a 20 20 20 20 69 6e 74 20 69  R ){  .    int i
16a10 4d 65 6d 3b 0a 20 20 20 20 69 4d 65 6d 20 3d 20  Mem;.    iMem = 
16a20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
16a30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16a40 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp2(v, OP_Copy
16a50 2c 20 69 6e 52 65 67 2c 20 69 4d 65 6d 29 3b 0a  , inReg, iMem);.
16a60 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
16a70 65 20 3d 20 69 4d 65 6d 3b 0a 20 20 20 20 70 45  e = iMem;.    pE
16a80 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47  xpr->op = TK_REG
16a90 49 53 54 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ISTER;.  }.  ret
16aa0 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a  urn inReg;.}../*
16ab0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
16ac0 69 66 20 70 45 78 70 72 20 69 73 20 61 6e 20 63  if pExpr is an c
16ad0 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69  onstant expressi
16ae0 6f 6e 20 74 68 61 74 20 69 73 20 61 70 70 72 6f  on that is appro
16af0 70 72 69 61 74 65 0a 2a 2a 20 66 6f 72 20 66 61  priate.** for fa
16b00 63 74 6f 72 69 6e 67 20 6f 75 74 20 6f 66 20 61  ctoring out of a
16b10 20 6c 6f 6f 70 2e 20 20 41 70 70 72 6f 70 72 69   loop.  Appropri
16b20 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ate expressions 
16b30 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  are:.**.**    * 
16b40 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   Any expression 
16b50 74 68 61 74 20 65 76 61 6c 75 61 74 65 73 20 74  that evaluates t
16b60 6f 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 70  o two or more op
16b70 63 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  codes..**.**    
16b80 2a 20 20 41 6e 79 20 4f 50 5f 49 6e 74 65 67 65  *  Any OP_Intege
16b90 72 2c 20 4f 50 5f 52 65 61 6c 2c 20 4f 50 5f 53  r, OP_Real, OP_S
16ba0 74 72 69 6e 67 2c 20 4f 50 5f 42 6c 6f 62 2c 20  tring, OP_Blob, 
16bb0 4f 50 5f 4e 75 6c 6c 2c 20 0a 2a 2a 20 20 20 20  OP_Null, .**    
16bc0 20 20 20 6f 72 20 4f 50 5f 56 61 72 69 61 62 6c     or OP_Variabl
16bd0 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
16be0 6e 65 65 64 20 74 6f 20 62 65 20 70 6c 61 63 65  need to be place
16bf0 64 20 69 6e 20 61 20 0a 2a 2a 20 20 20 20 20 20  d in a .**      
16c00 20 73 70 65 63 69 66 69 63 20 72 65 67 69 73 74   specific regist
16c10 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  er..**.** There 
16c20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 66  is no point in f
16c30 61 63 74 6f 72 69 6e 67 20 6f 75 74 20 73 69 6e  actoring out sin
16c40 67 6c 65 2d 69 6e 73 74 72 75 63 74 69 6f 6e 20  gle-instruction 
16c50 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 65 78 70 72  constant.** expr
16c60 65 73 73 69 6f 6e 73 20 74 68 61 74 20 6e 65 65  essions that nee
16c70 64 20 74 6f 20 62 65 20 70 6c 61 63 65 64 20 69  d to be placed i
16c80 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 72  n a particular r
16c90 65 67 69 73 74 65 72 2e 20 20 0a 2a 2a 20 57 65  egister.  .** We
16ca0 20 63 6f 75 6c 64 20 66 61 63 74 6f 72 20 74 68   could factor th
16cb0 65 6d 20 6f 75 74 2c 20 62 75 74 20 74 68 65 6e  em out, but then
16cc0 20 77 65 20 77 6f 75 6c 64 20 65 6e 64 20 75 70   we would end up
16cd0 20 61 64 64 69 6e 67 20 61 6e 0a 2a 2a 20 4f 50   adding an.** OP
16ce0 5f 53 43 6f 70 79 20 69 6e 73 74 72 75 63 74 69  _SCopy instructi
16cf0 6f 6e 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 76  on to move the v
16d00 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 63 6f  alue into the co
16d10 72 72 65 63 74 20 72 65 67 69 73 74 65 72 0a 2a  rrect register.*
16d20 2a 20 6c 61 74 65 72 2e 20 20 57 65 20 6d 69 67  * later.  We mig
16d30 68 74 20 61 73 20 77 65 6c 6c 20 6a 75 73 74 20  ht as well just 
16d40 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  use the original
16d50 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64   instruction and
16d60 0a 2a 2a 20 61 76 6f 69 64 20 74 68 65 20 4f 50  .** avoid the OP
16d70 5f 53 43 6f 70 79 2e 0a 2a 2f 0a 73 74 61 74 69  _SCopy..*/.stati
16d80 63 20 69 6e 74 20 69 73 41 70 70 72 6f 70 72 69  c int isAppropri
16d90 61 74 65 46 6f 72 46 61 63 74 6f 72 69 6e 67 28  ateForFactoring(
16da0 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
16db0 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
16dc0 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 29  nstantNotJoin(p)
16dd0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
16de0 3b 20 20 2f 2a 20 4f 6e 6c 79 20 63 6f 6e 73 74  ;  /* Only const
16df0 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ant expressions 
16e00 61 72 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  are appropriate 
16e10 66 6f 72 20 66 61 63 74 6f 72 69 6e 67 20 2a 2f  for factoring */
16e20 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 66  .  }.  if( (p->f
16e30 6c 61 67 73 20 26 20 45 50 5f 46 69 78 65 64 44  lags & EP_FixedD
16e40 65 73 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  est)==0 ){.    r
16e50 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6e 79  eturn 1;  /* Any
16e60 20 63 6f 6e 73 74 61 6e 74 20 77 69 74 68 6f 75   constant withou
16e70 74 20 61 20 66 69 78 65 64 20 64 65 73 74 69 6e  t a fixed destin
16e80 61 74 69 6f 6e 20 69 73 20 61 70 70 72 6f 70 72  ation is appropr
16e90 69 61 74 65 20 2a 2f 0a 20 20 7d 0a 20 20 77 68  iate */.  }.  wh
16ea0 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ile( p->op==TK_U
16eb0 50 4c 55 53 20 29 20 70 20 3d 20 70 2d 3e 70 4c  PLUS ) p = p->pL
16ec0 65 66 74 3b 0a 20 20 73 77 69 74 63 68 28 20 70  eft;.  switch( p
16ed0 2d 3e 6f 70 20 29 7b 0a 23 69 66 6e 64 65 66 20  ->op ){.#ifndef 
16ee0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42  SQLITE_OMIT_BLOB
16ef0 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73  _LITERAL.    cas
16f00 65 20 54 4b 5f 42 4c 4f 42 3a 0a 23 65 6e 64 69  e TK_BLOB:.#endi
16f10 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41  f.    case TK_VA
16f20 52 49 41 42 4c 45 3a 0a 20 20 20 20 63 61 73 65  RIABLE:.    case
16f30 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20   TK_INTEGER:.   
16f40 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a   case TK_FLOAT:.
16f50 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c      case TK_NULL
16f60 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
16f70 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 74 65  RING: {.      te
16f80 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
16f90 4b 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 20 20  K_BLOB );.      
16fa0 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
16fb0 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 3b 0a  =TK_VARIABLE );.
16fc0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16fd0 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45  p->op==TK_INTEGE
16fe0 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  R );.      testc
16ff0 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46  ase( p->op==TK_F
17000 4c 4f 41 54 20 29 3b 0a 20 20 20 20 20 20 74 65  LOAT );.      te
17010 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
17020 4b 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  K_NULL );.      
17030 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
17040 3d 54 4b 5f 53 54 52 49 4e 47 20 29 3b 0a 20 20  =TK_STRING );.  
17050 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 2d 69 6e      /* Single-in
17060 73 74 72 75 63 74 69 6f 6e 20 63 6f 6e 73 74 61  struction consta
17070 6e 74 73 20 77 69 74 68 20 61 20 66 69 78 65 64  nts with a fixed
17080 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 61 72 65   destination are
17090 0a 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72  .      ** better
170a0 20 64 6f 6e 65 20 69 6e 2d 6c 69 6e 65 2e 20 20   done in-line.  
170b0 49 66 20 77 65 20 66 61 63 74 6f 72 20 74 68 65  If we factor the
170c0 6d 2c 20 74 68 65 79 20 77 69 6c 6c 20 6a 75 73  m, they will jus
170d0 74 20 65 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75  t end.      ** u
170e0 70 20 67 65 6e 65 72 61 74 69 6e 67 20 61 6e 20  p generating an 
170f0 4f 50 5f 53 43 6f 70 79 20 74 6f 20 6d 6f 76 65  OP_SCopy to move
17100 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 74 68   the value to th
17110 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 20 20  e destination.  
17120 20 20 20 20 2a 2a 20 72 65 67 69 73 74 65 72 2e      ** register.
17130 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
17140 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   0;.    }.    ca
17150 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a  se TK_UMINUS: {.
17160 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c         if( p->pL
17170 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41  eft->op==TK_FLOA
17180 54 20 7c 7c 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f  T || p->pLeft->o
17190 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b  p==TK_INTEGER ){
171a0 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  .         return
171b0 20 30 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20   0;.       }.   
171c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
171d0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
171e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
171f0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
17200 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70  1;.}../*.** If p
17210 45 78 70 72 20 69 73 20 61 20 63 6f 6e 73 74 61  Expr is a consta
17220 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  nt expression th
17230 61 74 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  at is appropriat
17240 65 20 66 6f 72 0a 2a 2a 20 66 61 63 74 6f 72 69  e for.** factori
17250 6e 67 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70  ng out of a loop
17260 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20  , then evaluate 
17270 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  the expression.*
17280 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65  * into a registe
17290 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 68  r and convert th
172a0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 74  e expression int
172b0 6f 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52 0a  o a TK_REGISTER.
172c0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  ** expression..*
172d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 76 61  /.static int eva
172e0 6c 43 6f 6e 73 74 45 78 70 72 28 57 61 6c 6b 65  lConstExpr(Walke
172f0 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
17300 20 2a 70 45 78 70 72 29 7b 0a 20 20 50 61 72 73   *pExpr){.  Pars
17310 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
17320 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73  ker->pParse;.  s
17330 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
17340 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
17350 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20  REGISTER: {.    
17360 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
17370 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  }.    case TK_FU
17380 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65  NCTION:.    case
17390 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
173a0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
173b0 4e 53 54 5f 46 55 4e 43 3a 20 7b 0a 20 20 20 20  NST_FUNC: {.    
173c0 20 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65 6e    /* The argumen
173d0 74 73 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  ts to a function
173e0 20 68 61 76 65 20 61 20 66 69 78 65 64 20 64 65   have a fixed de
173f0 73 74 69 6e 61 74 69 6f 6e 2e 0a 20 20 20 20 20  stination..     
17400 20 2a 2a 20 4d 61 72 6b 20 74 68 65 6d 20 74 68   ** Mark them th
17410 69 73 20 77 61 79 20 74 6f 20 61 76 6f 69 64 20  is way to avoid 
17420 67 65 6e 65 72 61 74 65 64 20 75 6e 6e 65 65 64  generated unneed
17430 65 64 20 4f 50 5f 53 43 6f 70 79 0a 20 20 20 20  ed OP_SCopy.    
17440 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
17450 73 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  s. .      */.   
17460 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
17470 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
17480 69 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ist;.      asser
17490 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
174a0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
174b0 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
174c0 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
174d0 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 70         int i = p
174e0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
174f0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
17500 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
17510 20 3d 20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20   = pList->a;.   
17520 20 20 20 20 20 66 6f 72 28 3b 20 69 3e 30 3b 20       for(; i>0; 
17530 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i--, pItem++){. 
17540 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74           if( pIt
17550 65 6d 2d 3e 70 45 78 70 72 20 29 20 70 49 74 65  em->pExpr ) pIte
17560 6d 2d 3e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  m->pExpr->flags 
17570 7c 3d 20 45 50 5f 46 69 78 65 64 44 65 73 74 3b  |= EP_FixedDest;
17580 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17590 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
175a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
175b0 69 73 41 70 70 72 6f 70 72 69 61 74 65 46 6f 72  isAppropriateFor
175c0 46 61 63 74 6f 72 69 6e 67 28 70 45 78 70 72 29  Factoring(pExpr)
175d0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d   ){.    int r1 =
175e0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
175f0 0a 20 20 20 20 69 6e 74 20 72 32 3b 0a 20 20 20  .    int r2;.   
17600 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
17610 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
17620 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a  se, pExpr, r1);.
17630 20 20 20 20 69 66 28 20 72 31 21 3d 72 32 20 29      if( r1!=r2 )
17640 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
17650 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
17660 31 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f  1);.    pExpr->o
17670 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b  p = TK_REGISTER;
17680 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62  .    pExpr->iTab
17690 6c 65 20 3d 20 72 32 3b 0a 20 20 20 20 72 65 74  le = r2;.    ret
176a0 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
176b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
176c0 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
176d0 2a 2a 20 50 72 65 65 76 61 6c 75 61 74 65 20 63  ** Preevaluate c
176e0 6f 6e 73 74 61 6e 74 20 73 75 62 65 78 70 72 65  onstant subexpre
176f0 73 73 69 6f 6e 73 20 77 69 74 68 69 6e 20 70 45  ssions within pE
17700 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68  xpr and store th
17710 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20  e.** results in 
17720 72 65 67 69 73 74 65 72 73 2e 20 20 4d 6f 64 69  registers.  Modi
17730 66 79 20 70 45 78 70 72 20 73 6f 20 74 68 61 74  fy pExpr so that
17740 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 73 75   the constant su
17750 62 65 78 70 72 65 73 69 6f 6e 73 0a 2a 2a 20 61  bexpresions.** a
17760 72 65 20 54 4b 5f 52 45 47 49 53 54 45 52 20 6f  re TK_REGISTER o
17770 70 63 6f 64 65 73 20 74 68 61 74 20 72 65 66 65  pcodes that refe
17780 72 20 74 6f 20 74 68 65 20 70 72 65 63 6f 6d 70  r to the precomp
17790 75 74 65 64 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a  uted values..*/.
177a0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
177b0 43 6f 64 65 43 6f 6e 73 74 61 6e 74 73 28 50 61  CodeConstants(Pa
177c0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
177d0 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c  r *pExpr){.  Wal
177e0 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72  ker w;.  w.xExpr
177f0 43 61 6c 6c 62 61 63 6b 20 3d 20 65 76 61 6c 43  Callback = evalC
17800 6f 6e 73 74 45 78 70 72 3b 0a 20 20 77 2e 78 53  onstExpr;.  w.xS
17810 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
17820 30 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20  0;.  w.pParse = 
17830 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65  pParse;.  sqlite
17840 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45  3WalkExpr(&w, pE
17850 78 70 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  xpr);.}.../*.** 
17860 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
17870 61 74 20 70 75 73 68 65 73 20 74 68 65 20 76 61  at pushes the va
17880 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65  lue of every ele
17890 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65  ment of the give
178a0 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
178b0 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65 71 75  list into a sequ
178c0 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
178d0 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74  s beginning at t
178e0 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  arget..**.** Ret
178f0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
17900 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75  f elements evalu
17910 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ated..*/.int sql
17920 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
17930 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
17940 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61  Parse,     /* Pa
17950 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
17960 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
17970 73 74 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70  st,   /* The exp
17980 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20  ression list to 
17990 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  be coded */.  in
179a0 74 20 74 61 72 67 65 74 2c 20 20 20 20 20 20 20  t target,       
179b0 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69   /* Where to wri
179c0 74 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  te results */.  
179d0 69 6e 74 20 64 6f 48 61 72 64 43 6f 70 79 20 20  int doHardCopy  
179e0 20 20 20 2f 2a 20 4d 61 6b 65 20 61 20 68 61 72     /* Make a har
179f0 64 20 63 6f 70 79 20 6f 66 20 65 76 65 72 79 20  d copy of every 
17a00 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  element */.){.  
17a10 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
17a20 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
17a30 6e 74 20 69 2c 20 6e 3b 0a 20 20 61 73 73 65 72  nt i, n;.  asser
17a40 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20  t( pList!=0 );. 
17a50 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
17a60 30 20 29 3b 0a 20 20 6e 20 3d 20 70 4c 69 73 74  0 );.  n = pList
17a70 2d 3e 6e 45 78 70 72 3b 0a 20 20 66 6f 72 28 70  ->nExpr;.  for(p
17a80 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
17a90 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49  =0; i<n; i++, pI
17aa0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  tem++){.    if( 
17ab0 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20 29 7b  pItem->iAlias ){
17ac0 0a 20 20 20 20 20 20 69 6e 74 20 69 52 65 67 20  .      int iReg 
17ad0 3d 20 63 6f 64 65 41 6c 69 61 73 28 70 50 61 72  = codeAlias(pPar
17ae0 73 65 2c 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61  se, pItem->iAlia
17af0 73 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c  s, pItem->pExpr,
17b00 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20   target+i);.    
17b10 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
17b20 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
17b30 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 52  e);.      if( iR
17b40 65 67 21 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a  eg!=target+i ){.
17b50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
17b60 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17b70 53 43 6f 70 79 2c 20 69 52 65 67 2c 20 74 61 72  SCopy, iReg, tar
17b80 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a  get+i);.      }.
17b90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17ba0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
17bb0 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
17bc0 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29  pExpr, target+i)
17bd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17be0 64 6f 48 61 72 64 43 6f 70 79 20 26 26 20 21 70  doHardCopy && !p
17bf0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
17c00 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
17c10 20 73 71 6c 69 74 65 33 45 78 70 72 48 61 72 64   sqlite3ExprHard
17c20 43 6f 70 79 28 70 50 61 72 73 65 2c 20 74 61 72  Copy(pParse, tar
17c30 67 65 74 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20  get, n);.    }. 
17c40 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
17c50 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
17c60 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c   code for a bool
17c70 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73  ean expression s
17c80 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20  uch that a jump 
17c90 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68  is made.** to th
17ca0 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69  e label "dest" i
17cb0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
17cc0 20 69 73 20 74 72 75 65 20 62 75 74 20 65 78 65   is true but exe
17cd0 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e  cution.** contin
17ce0 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72  ues straight thr
17cf0 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  u if the express
17d00 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a  ion is false..**
17d10 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
17d20 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20  ssion evaluates 
17d30 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72  to NULL (neither
17d40 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29   true nor false)
17d50 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74  , then.** take t
17d60 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a  he jump if the j
17d70 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69  umpIfNull flag i
17d80 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  s SQLITE_JUMPIFN
17d90 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ULL..**.** This 
17da0 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20  code depends on 
17db0 74 68 65 20 66 61 63 74 20 74 68 61 74 20 63 65  the fact that ce
17dc0 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75  rtain token valu
17dd0 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a  es (ex: TK_EQ).*
17de0 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61  * are the same a
17df0 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20  s opcode values 
17e00 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74  (ex: OP_Eq) that
17e10 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63   implement the c
17e20 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
17e30 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63  operation.  Spec
17e40 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  ial comments in 
17e50 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d  vdbe.c and the m
17e60 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72  kopcodeh.awk scr
17e70 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61  ipt in.** the ma
17e80 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75 73 65  ke process cause
17e90 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f   these values to
17ea0 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28   align.  Assert(
17eb0 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a  )s in the code.*
17ec0 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74  * below verify t
17ed0 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20  hat the numbers 
17ee0 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72  are aligned corr
17ef0 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ectly..*/.void s
17f00 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
17f10 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
17f20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
17f30 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49   dest, int jumpI
17f40 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a  fNull){.  Vdbe *
17f50 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
17f60 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b  e;.  int op = 0;
17f70 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
17f80 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72  = 0;.  int regFr
17f90 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ee2 = 0;.  int r
17fa0 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74  1, r2;..  assert
17fb0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  ( jumpIfNull==SQ
17fc0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
17fd0 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  || jumpIfNull==0
17fe0 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c   );.  if( v==0 |
17ff0 7c 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  | pExpr==0 ) ret
18000 75 72 6e 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70  urn;.  op = pExp
18010 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28  r->op;.  switch(
18020 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
18030 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20  TK_AND: {.      
18040 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
18050 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
18060 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
18070 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
18080 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18090 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
180a0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
180b0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
180c0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
180d0 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66 4e  Left, d2,jumpIfN
180e0 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ull^SQLITE_JUMPI
180f0 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71  FNULL);.      sq
18100 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
18110 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
18120 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
18130 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
18140 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
18150 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a  veLabel(v, d2);.
18160 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
18170 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
18180 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 1);.      brea
18190 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
181a0 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20  e TK_OR: {.     
181b0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
181c0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
181d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
181e0 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
181f0 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
18200 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
18210 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
18220 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
18230 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
18240 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
18250 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
18260 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  }.    case TK_NO
18270 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  T: {.      testc
18280 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
18290 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
182a0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
182b0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
182c0 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
182d0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
182e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
182f0 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
18300 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
18310 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
18320 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
18330 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
18340 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
18350 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54     assert( TK_LT
18360 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20  ==OP_Lt );.     
18370 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d   assert( TK_LE==
18380 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20 61  OP_Le );.      a
18390 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50  ssert( TK_GT==OP
183a0 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Gt );.      ass
183b0 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47  ert( TK_GE==OP_G
183c0 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
183d0 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20  t( TK_EQ==OP_Eq 
183e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
183f0 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b   TK_NE==OP_Ne );
18400 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
18410 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20   op==TK_LT );.  
18420 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
18430 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20  ==TK_LE );.     
18440 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
18450 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65  K_GT );.      te
18460 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47  stcase( op==TK_G
18470 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
18480 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29  ase( op==TK_EQ )
18490 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
184a0 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20  ( op==TK_NE );. 
184b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
184c0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
184d0 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
184e0 65 4f 70 65 72 61 6e 64 73 28 70 50 61 72 73 65  eOperands(pParse
184f0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
18500 26 72 31 2c 20 26 72 65 67 46 72 65 65 31 2c 0a  &r1, &regFree1,.
18510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18530 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c    pExpr->pRight,
18540 20 26 72 32 2c 20 26 72 65 67 46 72 65 65 32 29   &r2, &regFree2)
18550 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
18560 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
18570 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
18580 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
18590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
185a0 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d  1, r2, dest, jum
185b0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
185c0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
185d0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
185e0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
185f0 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
18600 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
18610 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
18620 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
18630 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  LL: {.      asse
18640 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f  rt( TK_ISNULL==O
18650 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20  P_IsNull );.    
18660 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
18670 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  NULL==OP_NotNull
18680 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
18690 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  se( op==TK_ISNUL
186a0 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  L );.      testc
186b0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  ase( op==TK_NOTN
186c0 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20  ULL );.      r1 
186d0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
186e0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
186f0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
18700 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71  Free1);.      sq
18710 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18720 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29  v, op, r1, dest)
18730 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
18740 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
18750 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
18760 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
18770 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
18780 20 2f 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e   /*    x BETWEEN
18790 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 20 20 2a   y AND z.      *
187a0 2a 0a 20 20 20 20 20 20 2a 2a 20 49 73 20 65 71  *.      ** Is eq
187b0 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20  uivalent to .   
187c0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
187d0 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a    x>=y AND x<=z.
187e0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
187f0 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73 75 63  * Code it as suc
18800 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74  h, taking care t
18810 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  o do the common 
18820 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  subexpression.  
18830 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 61 74      ** elementat
18840 69 6f 6e 20 6f 66 20 78 2e 0a 20 20 20 20 20 20  ion of x..      
18850 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 65 78  */.      Expr ex
18860 70 72 41 6e 64 3b 0a 20 20 20 20 20 20 45 78 70  prAnd;.      Exp
18870 72 20 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 20 20  r compLeft;.    
18880 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68 74    Expr compRight
18890 3b 0a 20 20 20 20 20 20 45 78 70 72 20 65 78 70  ;.      Expr exp
188a0 72 58 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  rX;..      asser
188b0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
188c0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
188d0 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
188e0 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72    exprX = *pExpr
188f0 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 65  ->pLeft;.      e
18900 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41  xprAnd.op = TK_A
18910 4e 44 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e  ND;.      exprAn
18920 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c  d.pLeft = &compL
18930 65 66 74 3b 0a 20 20 20 20 20 20 65 78 70 72 41  eft;.      exprA
18940 6e 64 2e 70 52 69 67 68 74 20 3d 20 26 63 6f 6d  nd.pRight = &com
18950 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 63 6f  pRight;.      co
18960 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47  mpLeft.op = TK_G
18970 45 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66  E;.      compLef
18980 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58  t.pLeft = &exprX
18990 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74  ;.      compLeft
189a0 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  .pRight = pExpr-
189b0 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
189c0 45 78 70 72 3b 0a 20 20 20 20 20 20 63 6f 6d 70  Expr;.      comp
189d0 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45  Right.op = TK_LE
189e0 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68  ;.      compRigh
189f0 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58  t.pLeft = &exprX
18a00 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68  ;.      compRigh
18a10 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72  t.pRight = pExpr
18a20 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  ->x.pList->a[1].
18a30 70 45 78 70 72 3b 0a 20 20 20 20 20 20 65 78 70  pExpr;.      exp
18a40 72 58 2e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69  rX.iTable = sqli
18a50 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
18a60 70 50 61 72 73 65 2c 20 26 65 78 70 72 58 2c 20  pParse, &exprX, 
18a70 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
18a80 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
18a90 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
18aa0 20 65 78 70 72 58 2e 6f 70 20 3d 20 54 4b 5f 52   exprX.op = TK_R
18ab0 45 47 49 53 54 45 52 3b 0a 20 20 20 20 20 20 74  EGISTER;.      t
18ac0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
18ad0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
18ae0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
18af0 65 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41  e(pParse, &exprA
18b00 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  nd, dest, jumpIf
18b10 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
18b20 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
18b30 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72  fault: {.      r
18b40 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
18b50 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
18b60 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31  pExpr, &regFree1
18b70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18b80 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
18b90 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a  _If, r1, dest, j
18ba0 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20  umpIfNull!=0);. 
18bb0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
18bc0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
18bd0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
18be0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
18bf0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
18c00 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
18c10 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
18c20 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b  arse, regFree1);
18c30 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
18c40 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
18c50 20 72 65 67 46 72 65 65 32 29 3b 20 20 0a 7d 0a   regFree2);  .}.
18c60 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
18c70 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65  code for a boole
18c80 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75  an expression su
18c90 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69  ch that a jump i
18ca0 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65  s made.** to the
18cb0 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66   label "dest" if
18cc0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
18cd0 69 73 20 66 61 6c 73 65 20 62 75 74 20 65 78 65  is false but exe
18ce0 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e  cution.** contin
18cf0 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72  ues straight thr
18d00 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  u if the express
18d10 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a  ion is true..**.
18d20 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
18d30 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74  sion evaluates t
18d40 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20  o NULL (neither 
18d50 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 20  true nor false) 
18d60 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20  then.** jump if 
18d70 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 53 51  jumpIfNull is SQ
18d80 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
18d90 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  or fall through 
18da0 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a  if jumpIfNull.**
18db0 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73   is 0..*/.void s
18dc0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
18dd0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
18de0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
18df0 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70  t dest, int jump
18e00 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20  IfNull){.  Vdbe 
18e10 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
18e20 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30  be;.  int op = 0
18e30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31  ;.  int regFree1
18e40 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
18e50 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree2 = 0;.  int 
18e60 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72  r1, r2;..  asser
18e70 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  t( jumpIfNull==S
18e80 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
18e90 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   || jumpIfNull==
18ea0 30 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  0 );.  if( v==0 
18eb0 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  || pExpr==0 ) re
18ec0 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  turn;..  /* The 
18ed0 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72 2d 3e  value of pExpr->
18ee0 6f 70 20 61 6e 64 20 6f 70 20 61 72 65 20 72 65  op and op are re
18ef0 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  lated as follows
18f00 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
18f10 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20    pExpr->op     
18f20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20         op.  **  
18f30 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20       ---------  
18f40 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d          --------
18f50 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  --.  **       TK
18f60 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20 20 20 20  _ISNULL         
18f70 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a   OP_NotNull.  **
18f80 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c         TK_NOTNUL
18f90 4c 20 20 20 20 20 20 20 20 20 4f 50 5f 49 73 4e  L         OP_IsN
18fa0 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ull.  **       T
18fb0 4b 5f 4e 45 20 20 20 20 20 20 20 20 20 20 20 20  K_NE            
18fc0 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20    OP_Eq.  **    
18fd0 20 20 20 54 4b 5f 45 51 20 20 20 20 20 20 20 20     TK_EQ        
18fe0 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a        OP_Ne.  **
18ff0 20 20 20 20 20 20 20 54 4b 5f 47 54 20 20 20 20         TK_GT    
19000 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a            OP_Le.
19010 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45    **       TK_LE
19020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
19030 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Gt.  **       T
19040 4b 5f 47 45 20 20 20 20 20 20 20 20 20 20 20 20  K_GE            
19050 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20    OP_Lt.  **    
19060 20 20 20 54 4b 5f 4c 54 20 20 20 20 20 20 20 20     TK_LT        
19070 20 20 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a        OP_Ge.  **
19080 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20  .  ** For other 
19090 76 61 6c 75 65 73 20 6f 66 20 70 45 78 70 72 2d  values of pExpr-
190a0 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64 65 66  >op, op is undef
190b0 69 6e 65 64 20 61 6e 64 20 75 6e 75 73 65 64 2e  ined and unused.
190c0 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  .  ** The value 
190d0 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63  of TK_ and OP_ c
190e0 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 61 72 72  onstants are arr
190f0 61 6e 67 65 64 20 73 75 63 68 20 74 68 61 74 20  anged such that 
19100 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70  we.  ** can comp
19110 75 74 65 20 74 68 65 20 6d 61 70 70 69 6e 67 20  ute the mapping 
19120 61 62 6f 76 65 20 75 73 69 6e 67 20 74 68 65 20  above using the 
19130 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73  following expres
19140 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72  sion..  ** Asser
19150 74 28 29 73 20 76 65 72 69 66 79 20 74 68 61 74  t()s verify that
19160 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e   the computation
19170 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a   is correct..  *
19180 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45 78 70 72  /.  op = ((pExpr
19190 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26  ->op+(TK_ISNULL&
191a0 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c  1))^1)-(TK_ISNUL
191b0 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69  L&1);..  /* Veri
191c0 66 79 20 63 6f 72 72 65 63 74 20 61 6c 69 67 6e  fy correct align
191d0 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20  ment of TK_ and 
191e0 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20  OP_ constants.  
191f0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  */.  assert( pEx
19200 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c  pr->op!=TK_ISNUL
19210 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e  L || op==OP_NotN
19220 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ull );.  assert(
19230 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e   pExpr->op!=TK_N
19240 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50  OTNULL || op==OP
19250 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73  _IsNull );.  ass
19260 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
19270 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_NE || op==OP_
19280 45 71 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Eq );.  assert( 
19290 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51  pExpr->op!=TK_EQ
192a0 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b   || op==OP_Ne );
192b0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
192c0 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f  ->op!=TK_LT || o
192d0 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73  p==OP_Ge );.  as
192e0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
192f0 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_LE || op==OP
19300 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Gt );.  assert(
19310 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47   pExpr->op!=TK_G
19320 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29  T || op==OP_Le )
19330 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
19340 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20  r->op!=TK_GE || 
19350 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20  op==OP_Lt );..  
19360 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
19370 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
19380 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 74 65  _AND: {.      te
19390 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
193a0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
193b0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
193c0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
193d0 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
193e0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
193f0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
19400 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
19410 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
19420 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
19430 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19440 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
19450 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20   {.      int d2 
19460 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
19470 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
19480 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
19490 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
194a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
194b0 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
194c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
194d0 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
194e0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32  pExpr->pLeft, d2
194f0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c  , jumpIfNull^SQL
19500 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
19510 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
19520 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
19530 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
19540 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
19550 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
19560 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
19570 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20  l(v, d2);.      
19580 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
19590 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a  Pop(pParse, 1);.
195a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
195b0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
195c0 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  OT: {.      sqli
195d0 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
195e0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
195f0 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
19600 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
19610 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
19620 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
19630 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
19640 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
19650 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
19660 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
19670 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
19680 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
19690 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74  TK_LT );.      t
196a0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
196b0 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LE );.      test
196c0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20  case( op==TK_GT 
196d0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
196e0 65 28 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a  e( op==TK_GE );.
196f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19700 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20  op==TK_EQ );.   
19710 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
19720 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20  =TK_NE );.      
19730 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
19740 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
19750 20 63 6f 64 65 43 6f 6d 70 61 72 65 4f 70 65 72   codeCompareOper
19760 61 6e 64 73 28 70 50 61 72 73 65 2c 20 70 45 78  ands(pParse, pEx
19770 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 31 2c 20  pr->pLeft, &r1, 
19780 26 72 65 67 46 72 65 65 31 2c 0a 20 20 20 20 20  &regFree1,.     
19790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197a0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
197b0 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 32 2c  pr->pRight, &r2,
197c0 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
197d0 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
197e0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
197f0 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
19800 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
19810 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
19820 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
19830 6c 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ll);.      testc
19840 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
19850 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
19860 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
19870 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
19880 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
19890 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
198a0 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
198b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
198c0 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
198d0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
198e0 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ( op==TK_NOTNULL
198f0 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
19900 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
19910 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
19920 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
19930 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e1);.      sqlit
19940 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19950 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20  op, r1, dest);. 
19960 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
19970 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
19980 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19990 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
199a0 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  WEEN: {.      /*
199b0 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20      x BETWEEN y 
199c0 41 4e 44 20 7a 0a 20 20 20 20 20 20 2a 2a 0a 20  AND z.      **. 
199d0 20 20 20 20 20 2a 2a 20 49 73 20 65 71 75 69 76       ** Is equiv
199e0 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20  alent to .      
199f0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 78  **.      **    x
19a00 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20  >=y AND x<=z.   
19a10 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 43     **.      ** C
19a20 6f 64 65 20 69 74 20 61 73 20 73 75 63 68 2c 20  ode it as such, 
19a30 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64  taking care to d
19a40 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62  o the common sub
19a50 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 20  expression.     
19a60 20 2a 2a 20 65 6c 65 6d 65 6e 74 61 74 69 6f 6e   ** elementation
19a70 20 6f 66 20 78 2e 0a 20 20 20 20 20 20 2a 2f 0a   of x..      */.
19a80 20 20 20 20 20 20 45 78 70 72 20 65 78 70 72 41        Expr exprA
19a90 6e 64 3b 0a 20 20 20 20 20 20 45 78 70 72 20 63  nd;.      Expr c
19aa0 6f 6d 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 45  ompLeft;.      E
19ab0 78 70 72 20 63 6f 6d 70 52 69 67 68 74 3b 0a 20  xpr compRight;. 
19ac0 20 20 20 20 20 45 78 70 72 20 65 78 70 72 58 3b       Expr exprX;
19ad0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
19ae0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
19af0 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
19b00 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 65  lect) );.      e
19b10 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70  xprX = *pExpr->p
19b20 4c 65 66 74 3b 0a 20 20 20 20 20 20 65 78 70 72  Left;.      expr
19b30 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b  And.op = TK_AND;
19b40 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64 2e 70  .      exprAnd.p
19b50 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74  Left = &compLeft
19b60 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64 2e  ;.      exprAnd.
19b70 70 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69  pRight = &compRi
19b80 67 68 74 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c  ght;.      compL
19b90 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a  eft.op = TK_GE;.
19ba0 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70        compLeft.p
19bb0 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20  Left = &exprX;. 
19bc0 20 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52       compLeft.pR
19bd0 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  ight = pExpr->x.
19be0 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
19bf0 72 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52 69 67  r;.      compRig
19c00 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20  ht.op = TK_LE;. 
19c10 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 70       compRight.p
19c20 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20  Left = &exprX;. 
19c30 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 70       compRight.p
19c40 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78  Right = pExpr->x
19c50 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  .pList->a[1].pEx
19c60 70 72 3b 0a 20 20 20 20 20 20 65 78 70 72 58 2e  pr;.      exprX.
19c70 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33  iTable = sqlite3
19c80 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
19c90 72 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65  rse, &exprX, &re
19ca0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74  gFree1);.      t
19cb0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
19cc0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78  1==0 );.      ex
19cd0 70 72 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47 49  prX.op = TK_REGI
19ce0 53 54 45 52 3b 0a 20 20 20 20 20 20 74 65 73 74  STER;.      test
19cf0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
19d00 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
19d10 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
19d20 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64  pParse, &exprAnd
19d30 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
19d40 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
19d50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
19d60 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 31 20  ult: {.      r1 
19d70 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
19d80 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
19d90 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b  xpr, &regFree1);
19da0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19db0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
19dc0 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c 20  fNot, r1, dest, 
19dd0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a  jumpIfNull!=0);.
19de0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19df0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
19e00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
19e10 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
19e20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19e30 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
19e40 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
19e50 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
19e60 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
19e70 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
19e80 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a  , regFree2);.}..
19e90 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20  /*.** Do a deep 
19ea0 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77  comparison of tw
19eb0 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  o expression tre
19ec0 65 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  es.  Return TRUE
19ed0 20 28 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a 20 69   (non-zero).** i
19ee0 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e 74  f they are ident
19ef0 69 63 61 6c 20 61 6e 64 20 72 65 74 75 72 6e 20  ical and return 
19f00 46 41 4c 53 45 20 69 66 20 74 68 65 79 20 64 69  FALSE if they di
19f10 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e  ffer in any way.
19f20 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
19f30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
19f40 6c 6c 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20  ll return FALSE 
19f50 65 76 65 6e 20 69 66 20 74 68 65 20 74 77 6f 20  even if the two 
19f60 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 72  expressions.** r
19f70 65 61 6c 6c 79 20 61 72 65 20 65 71 75 69 76 61  eally are equiva
19f80 6c 65 6e 74 2e 20 20 49 66 20 77 65 20 63 61 6e  lent.  If we can
19f90 6e 6f 74 20 70 72 6f 76 65 20 74 68 61 74 20 74  not prove that t
19fa0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  he expressions a
19fb0 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c  re.** identical,
19fc0 20 77 65 20 72 65 74 75 72 6e 20 46 41 4c 53 45   we return FALSE
19fd0 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65   just to be safe
19fe0 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  .  So if this ro
19ff0 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73  utine.** returns
1a000 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 79 6f 75   false, then you
1a010 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b   do not really k
1a020 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20  now for certain 
1a030 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78  if the two.** ex
1a040 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68  pressions are th
1a050 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20  e same.  But if 
1a060 79 6f 75 20 67 65 74 20 61 20 54 52 55 45 20 72  you get a TRUE r
1a070 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a  eturn, then you.
1a080 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65 20 74  ** can be sure t
1a090 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  he expressions a
1a0a0 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 49 6e  re the same.  In
1a0b0 20 74 68 65 20 70 6c 61 63 65 73 20 77 68 65 72   the places wher
1a0c0 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
1a0d0 65 20 69 73 20 75 73 65 64 2c 20 69 74 20 64 6f  e is used, it do
1a0e0 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f 20 67  es not hurt to g
1a0f0 65 74 20 61 6e 20 65 78 74 72 61 20 46 41 4c 53  et an extra FALS
1a100 45 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74  E - that.** just
1a110 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e   might result in
1a120 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20 73   some slightly s
1a130 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20 42 75 74  lower code.  But
1a140 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e   returning.** an
1a150 20 69 6e 63 6f 72 72 65 63 74 20 54 52 55 45 20   incorrect TRUE 
1a160 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20  could lead to a 
1a170 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  malfunction..*/.
1a180 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
1a190 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41 2c  ompare(Expr *pA,
1a1a0 20 45 78 70 72 20 2a 70 42 29 7b 0a 20 20 69 6e   Expr *pB){.  in
1a1b0 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30  t i;.  if( pA==0
1a1c0 7c 7c 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ||pB==0 ){.    r
1a1d0 65 74 75 72 6e 20 70 42 3d 3d 70 41 3b 0a 20 20  eturn pB==pA;.  
1a1e0 7d 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  }.  assert( !Exp
1a1f0 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28  rHasAnyProperty(
1a200 70 41 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pA, EP_TokenOnly
1a210 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
1a220 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1a230 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 42  asAnyProperty(pB
1a240 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
1a250 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
1a260 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
1a270 72 74 79 28 70 41 2c 20 45 50 5f 78 49 73 53 65  rty(pA, EP_xIsSe
1a280 6c 65 63 74 29 20 7c 7c 20 45 78 70 72 48 61 73  lect) || ExprHas
1a290 50 72 6f 70 65 72 74 79 28 70 42 2c 20 45 50 5f  Property(pB, EP_
1a2a0 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
1a2b0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1a2c0 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73    if( (pA->flags
1a2d0 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 21   & EP_Distinct)!
1a2e0 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45 50  =(pB->flags & EP
1a2f0 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72 65 74  _Distinct) ) ret
1a300 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d  urn 0;.  if( pA-
1a310 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 20 72 65  >op!=pB->op ) re
1a320 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73  turn 0;.  if( !s
1a330 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
1a340 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d  e(pA->pLeft, pB-
1a350 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75 72 6e  >pLeft) ) return
1a360 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
1a370 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
1a380 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52  ->pRight, pB->pR
1a390 69 67 68 74 29 20 29 20 72 65 74 75 72 6e 20 30  ight) ) return 0
1a3a0 3b 0a 0a 20 20 69 66 28 20 70 41 2d 3e 78 2e 70  ;..  if( pA->x.p
1a3b0 4c 69 73 74 20 26 26 20 70 42 2d 3e 78 2e 70 4c  List && pB->x.pL
1a3c0 69 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ist ){.    if( p
1a3d0 41 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  A->x.pList->nExp
1a3e0 72 21 3d 70 42 2d 3e 78 2e 70 4c 69 73 74 2d 3e  r!=pB->x.pList->
1a3f0 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20 30  nExpr ) return 0
1a400 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
1a410 3c 70 41 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  <pA->x.pList->nE
1a420 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1a430 20 45 78 70 72 20 2a 70 45 78 70 72 41 20 3d 20   Expr *pExprA = 
1a440 70 41 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69  pA->x.pList->a[i
1a450 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 45  ].pExpr;.      E
1a460 78 70 72 20 2a 70 45 78 70 72 42 20 3d 20 70 42  xpr *pExprB = pB
1a470 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ->x.pList->a[i].
1a480 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  pExpr;.      if(
1a490 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d   !sqlite3ExprCom
1a4a0 70 61 72 65 28 70 45 78 70 72 41 2c 20 70 45 78  pare(pExprA, pEx
1a4b0 70 72 42 29 20 29 20 72 65 74 75 72 6e 20 30 3b  prB) ) return 0;
1a4c0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
1a4d0 66 28 20 70 41 2d 3e 78 2e 70 4c 69 73 74 20 7c  f( pA->x.pList |
1a4e0 7c 20 70 42 2d 3e 78 2e 70 4c 69 73 74 20 29 7b  | pB->x.pList ){
1a4f0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1a500 20 7d 0a 0a 20 20 69 66 28 20 70 41 2d 3e 69 54   }..  if( pA->iT
1a510 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65  able!=pB->iTable
1a520 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21   || pA->iColumn!
1a530 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72  =pB->iColumn ) r
1a540 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 45  eturn 0;.  if( E
1a550 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1a560 41 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  A, EP_IntValue) 
1a570 29 7b 0a 20 20 20 20 69 66 28 20 21 45 78 70 72  ){.    if( !Expr
1a580 48 61 73 50 72 6f 70 65 72 74 79 28 70 42 2c 20  HasProperty(pB, 
1a590 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20  EP_IntValue) || 
1a5a0 70 41 2d 3e 75 2e 69 56 61 6c 75 65 21 3d 70 42  pA->u.iValue!=pB
1a5b0 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20  ->u.iValue ){.  
1a5c0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1a5d0 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
1a5e0 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pA->op!=TK_COLUM
1a5f0 4e 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65  N && pA->u.zToke
1a600 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 45 78 70  n ){.    if( Exp
1a610 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 42 2c  rHasProperty(pB,
1a620 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c   EP_IntValue) ||
1a630 20 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 3d 3d 30   pB->u.zToken==0
1a640 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
1a650 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
1a660 43 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e  Cmp(pA->u.zToken
1a670 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d  ,pB->u.zToken)!=
1a680 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
1a690 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 0;.    }.  }. 
1a6a0 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 0a 2f   return 1;.}.../
1a6b0 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
1a6c0 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41  lement to the pA
1a6d0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61  ggInfo->aCol[] a
1a6e0 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68  rray.  Return th
1a6f0 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68  e index of.** th
1a700 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20  e new element.  
1a710 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76  Return a negativ
1a720 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c  e number if mall
1a730 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  oc fails..*/.sta
1a740 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e  tic int addAggIn
1a750 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33  foColumn(sqlite3
1a760 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70   *db, AggInfo *p
1a770 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Info){.  int i;.
1a780 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20    pInfo->aCol = 
1a790 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
1a7a0 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c  cate(.       db,
1a7b0 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61  .       pInfo->a
1a7c0 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a 65  Col,.       size
1a7d0 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30  of(pInfo->aCol[0
1a7e0 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a 20 20  ]),.       3,.  
1a7f0 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f       &pInfo->nCo
1a800 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 70 49  lumn,.       &pI
1a810 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 41 6c 6c 6f  nfo->nColumnAllo
1a820 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29  c,.       &i.  )
1a830 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20  ;.  return i;.} 
1a840 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61     ../*.** Add a
1a850 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
1a860 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  the pAggInfo->aF
1a870 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52 65  unc[] array.  Re
1a880 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
1a890 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65  f.** the new ele
1a8a0 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ment.  Return a 
1a8b0 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
1a8c0 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e  if malloc fails.
1a8d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
1a8e0 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 73 71  ddAggInfoFunc(sq
1a8f0 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e  lite3 *db, AggIn
1a900 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e  fo *pInfo){.  in
1a910 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46  t i;.  pInfo->aF
1a920 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41 72 72  unc = sqlite3Arr
1a930 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20  ayAllocate(.    
1a940 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20 20 70     db, .       p
1a950 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20  Info->aFunc,.   
1a960 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f      sizeof(pInfo
1a970 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20  ->aFunc[0]),.   
1a980 20 20 20 20 33 2c 0a 20 20 20 20 20 20 20 26 70      3,.       &p
1a990 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20  Info->nFunc,.   
1a9a0 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e      &pInfo->nFun
1a9b0 63 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 20 26  cAlloc,.       &
1a9c0 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  i.  );.  return 
1a9d0 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20  i;.}    ../*.** 
1a9e0 54 68 69 73 20 69 73 20 74 68 65 20 78 45 78 70  This is the xExp
1a9f0 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20  rCallback for a 
1aa00 74 72 65 65 20 77 61 6c 6b 65 72 2e 20 20 49 74  tree walker.  It
1aa10 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69   is used to.** i
1aa20 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33  mplement sqlite3
1aa30 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
1aa40 67 61 74 65 73 28 29 2e 20 20 53 65 65 20 73 71  gates().  See sq
1aa50 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
1aa60 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f  Aggregates.** fo
1aa70 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
1aa80 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ormation..*/.sta
1aa90 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41  tic int analyzeA
1aaa0 67 67 72 65 67 61 74 65 28 57 61 6c 6b 65 72 20  ggregate(Walker 
1aab0 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
1aac0 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b  pExpr){.  int i;
1aad0 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
1aae0 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75  pNC = pWalker->u
1aaf0 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70  .pNC;.  Parse *p
1ab00 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
1ab10 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  rse;.  SrcList *
1ab20 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pSrcList = pNC->
1ab30 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49  pSrcList;.  AggI
1ab40 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20  nfo *pAggInfo = 
1ab50 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a  pNC->pAggInfo;..
1ab60 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
1ab70 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
1ab80 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20  TK_AGG_COLUMN:. 
1ab90 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
1aba0 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  N: {.      testc
1abb0 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
1abc0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b  TK_AGG_COLUMN );
1abd0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1abe0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
1abf0 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f  OLUMN );.      /
1ac00 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
1ac10 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  f the column is 
1ac20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61  in one of the ta
1ac30 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
1ac40 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65  .      ** clause
1ac50 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74   of the aggregat
1ac60 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20  e query */.     
1ac70 20 69 66 28 20 70 53 72 63 4c 69 73 74 20 29 7b   if( pSrcList ){
1ac80 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
1ac90 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1aca0 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e  tem = pSrcList->
1acb0 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  a;.        for(i
1acc0 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e  =0; i<pSrcList->
1acd0 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  nSrc; i++, pItem
1ace0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
1acf0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
1ad00 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20  l *pCol;.       
1ad10 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1ad20 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
1ad30 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  Expr, EP_TokenOn
1ad40 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29  ly|EP_Reduced) )
1ad50 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1ad60 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
1ad70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b  Item->iCursor ){
1ad80 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
1ad90 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
1ada0 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73   point, it means
1adb0 20 74 68 61 74 20 70 45 78 70 72 20 72 65 66 65   that pExpr refe
1adc0 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20  rs to a table.  
1add0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61            ** tha
1ade0 74 20 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  t is in the FROM
1adf0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61   clause of the a
1ae00 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 20  ggregate query. 
1ae10 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
1ae20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1ae30 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f  Make an entry fo
1ae40 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20  r the column in 
1ae50 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
1ae60 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 20 20   if there.      
1ae70 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20        ** is not 
1ae80 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65 20 61  an entry there a
1ae90 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20  lready..        
1aea0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
1aeb0 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
1aec0 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67        pCol = pAg
1aed0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20  gInfo->aCol;.   
1aee0 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30           for(k=0
1aef0 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  ; k<pAggInfo->nC
1af00 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c  olumn; k++, pCol
1af10 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
1af20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61     if( pCol->iTa
1af30 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  ble==pExpr->iTab
1af40 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  le &&.          
1af50 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43          pCol->iC
1af60 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43  olumn==pExpr->iC
1af70 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
1af80 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1af90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
1afa0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1afb0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6b            if( (k
1afc0 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  >=pAggInfo->nCol
1afd0 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20  umn).           
1afe0 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67    && (k = addAgg
1aff0 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73  InfoColumn(pPars
1b000 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29  e->db, pAggInfo)
1b010 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  )>=0 .          
1b020 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
1b030 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49     pCol = &pAggI
1b040 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20  nfo->aCol[k];.  
1b050 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
1b060 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e  ->pTab = pExpr->
1b070 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
1b080 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65      pCol->iTable
1b090 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
1b0a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1b0b0 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  pCol->iColumn = 
1b0c0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
1b0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
1b0e0 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  ol->iMem = ++pPa
1b0f0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
1b100 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
1b110 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d  SorterColumn = -
1b120 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
1b130 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70   pCol->pExpr = p
1b140 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
1b150 20 20 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f      if( pAggInfo
1b160 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ->pGroupBy ){.  
1b170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
1b180 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20  t j, n;.        
1b190 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
1b1a0 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f   *pGB = pAggInfo
1b1b0 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  ->pGroupBy;.    
1b1c0 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
1b1d0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
1b1e0 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61   *pTerm = pGB->a
1b1f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1b200 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72    n = pGB->nExpr
1b210 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1b220 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20    for(j=0; j<n; 
1b230 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j++, pTerm++){. 
1b240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b250 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72   Expr *pE = pTer
1b260 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
1b270 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1b280 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pE->op==TK_COLUM
1b290 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d  N && pE->iTable=
1b2a0 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26  =pExpr->iTable &
1b2b0 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
1b2c0 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c          pE->iCol
1b2d0 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn==pExpr->iCol
1b2e0 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
1b2f0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
1b300 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
1b310 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   j;.            
1b320 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1b330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b340 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
1b350 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1b360 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1b370 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f     if( pCol->iSo
1b380 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  rterColumn<0 ){.
1b390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3a0 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
1b3b0 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  umn = pAggInfo->
1b3c0 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b  nSortingColumn++
1b3d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1b3e0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
1b3f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1b400 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65  here is now an e
1b410 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72 20 69  ntry for pExpr i
1b420 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  n pAggInfo->aCol
1b430 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20 20 20  [] (either.     
1b440 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73         ** becaus
1b450 65 20 69 74 20 77 61 73 20 74 68 65 72 65 20 62  e it was there b
1b460 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65  efore or because
1b470 20 77 65 20 6a 75 73 74 20 63 72 65 61 74 65 64   we just created
1b480 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20   it)..          
1b490 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    ** Convert the
1b4a0 20 70 45 78 70 72 20 74 6f 20 62 65 20 61 20 54   pExpr to be a T
1b4b0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66  K_AGG_COLUMN ref
1b4c0 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20  erring to that. 
1b4d0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41             ** pA
1b4e0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65  ggInfo->aCol[] e
1b4f0 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20  ntry..          
1b500 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
1b510 20 45 78 70 72 53 65 74 49 72 72 65 64 75 63 69   ExprSetIrreduci
1b520 62 6c 65 28 70 45 78 70 72 29 3b 0a 20 20 20 20  ble(pExpr);.    
1b530 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
1b540 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e  AggInfo = pAggIn
1b550 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo;.            
1b560 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41  pExpr->op = TK_A
1b570 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  GG_COLUMN;.     
1b580 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41         pExpr->iA
1b590 67 67 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20  gg = k;.        
1b5a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1b5b0 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20       } /* endif 
1b5c0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
1b5d0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f  Item->iCursor */
1b5e0 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e  .        } /* en
1b5f0 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63  d loop over pSrc
1b600 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  List */.      }.
1b610 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
1b620 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  _Prune;.    }.  
1b630 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
1b640 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
1b650 2f 2a 20 54 68 65 20 70 4e 43 2d 3e 6e 44 65 70  /* The pNC->nDep
1b660 74 68 3d 3d 30 20 74 65 73 74 20 63 61 75 73 65  th==0 test cause
1b670 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
1b680 74 69 6f 6e 73 20 69 6e 20 73 75 62 71 75 65 72  tions in subquer
1b690 69 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ies.      ** to 
1b6a0 62 65 20 69 67 6e 6f 72 65 64 20 2a 2f 0a 20 20  be ignored */.  
1b6b0 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 6e 44 65      if( pNC->nDe
1b6c0 70 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pth==0 ){.      
1b6d0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
1b6e0 65 20 69 66 20 70 45 78 70 72 20 69 73 20 61 20  e if pExpr is a 
1b6f0 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f  duplicate of ano
1b700 74 68 65 72 20 61 67 67 72 65 67 61 74 65 20 0a  ther aggregate .
1b710 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
1b720 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65  ion that is alre
1b730 61 64 79 20 69 6e 20 74 68 65 20 70 41 67 67 49  ady in the pAggI
1b740 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20  nfo structure.  
1b750 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1b760 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
1b770 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41  func *pItem = pA
1b780 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20  ggInfo->aFunc;. 
1b790 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
1b7a0 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
1b7b0 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
1b7c0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1b7d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
1b7e0 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c  re(pItem->pExpr,
1b7f0 20 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20   pExpr) ){.     
1b800 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1b810 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b820 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1b830 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75  i>=pAggInfo->nFu
1b840 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
1b850 2f 2a 20 70 45 78 70 72 20 69 73 20 6f 72 69 67  /* pExpr is orig
1b860 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65  inal.  Make a ne
1b870 77 20 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49  w entry in pAggI
1b880 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20  nfo->aFunc[].   
1b890 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1b8a0 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43      u8 enc = ENC
1b8b0 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20  (pParse->db);.  
1b8c0 20 20 20 20 20 20 20 20 69 20 3d 20 61 64 64 41          i = addA
1b8d0 67 67 49 6e 66 6f 46 75 6e 63 28 70 50 61 72 73  ggInfoFunc(pPars
1b8e0 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29  e->db, pAggInfo)
1b8f0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1b900 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  i>=0 ){.        
1b910 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1b920 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1b930 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
1b940 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
1b950 20 70 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e   pItem = &pAggIn
1b960 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20  fo->aFunc[i];.  
1b970 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
1b980 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
1b990 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
1b9a0 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  m->iMem = ++pPar
1b9b0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
1b9c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1b9d0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1b9e0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
1b9f0 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
1ba00 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d    pItem->pFunc =
1ba10 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
1ba20 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
1ba30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ba40 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f      pExpr->u.zTo
1ba50 6b 65 6e 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  ken, sqlite3Strl
1ba60 65 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54  en30(pExpr->u.zT
1ba70 6f 6b 65 6e 29 2c 0a 20 20 20 20 20 20 20 20 20  oken),.         
1ba80 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1ba90 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45 78 70 72  >x.pList ? pExpr
1baa0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
1bab0 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20   : 0, enc, 0);. 
1bac0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
1bad0 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
1bae0 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  _Distinct ){.   
1baf0 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
1bb00 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50  ->iDistinct = pP
1bb10 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
1bb20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1bb30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1bb40 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20  Item->iDistinct 
1bb50 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
1bb60 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
1bb70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1bb80 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20    /* Make pExpr 
1bb90 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70  point to the app
1bba0 72 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e 66  ropriate pAggInf
1bbb0 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79  o->aFunc[] entry
1bbc0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1bbd0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1bbe0 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28  rHasAnyProperty(
1bbf0 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f  pExpr, EP_TokenO
1bc00 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
1bc10 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 53  );.        ExprS
1bc20 65 74 49 72 72 65 64 75 63 69 62 6c 65 28 70 45  etIrreducible(pE
1bc30 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 45  xpr);.        pE
1bc40 78 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20  xpr->iAgg = i;. 
1bc50 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41         pExpr->pA
1bc60 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66  ggInfo = pAggInf
1bc70 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  o;.        retur
1bc80 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
1bc90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1bca0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
1bcb0 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69  inue;.}.static i
1bcc0 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67  nt analyzeAggreg
1bcd0 61 74 65 73 49 6e 53 65 6c 65 63 74 28 57 61 6c  atesInSelect(Wal
1bce0 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
1bcf0 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
1bd00 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
1bd10 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  NC = pWalker->u.
1bd20 70 4e 43 3b 0a 20 20 69 66 28 20 70 4e 43 2d 3e  pNC;.  if( pNC->
1bd30 6e 44 65 70 74 68 3d 3d 30 20 29 7b 0a 20 20 20  nDepth==0 ){.   
1bd40 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2b 2b 3b 0a   pNC->nDepth++;.
1bd50 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
1bd60 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70  elect(pWalker, p
1bd70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 70 4e 43  Select);.    pNC
1bd80 2d 3e 6e 44 65 70 74 68 2d 2d 3b 0a 20 20 20 20  ->nDepth--;.    
1bd90 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
1bda0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1bdb0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
1bdc0 75 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ue;.  }.}../*.**
1bdd0 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 67 69 76   Analyze the giv
1bde0 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f  en expression lo
1bdf0 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67  oking for aggreg
1be00 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  ate functions an
1be10 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62 6c  d.** for variabl
1be20 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  es that need to 
1be30 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
1be40 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61  pParse->aAgg[] a
1be50 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b 65 20 61 64  rray..** Make ad
1be60 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73  ditional entries
1be70 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e   to the pParse->
1be80 61 41 67 67 5b 5d 20 61 72 72 61 79 20 61 73 20  aAgg[] array as 
1be90 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a  necessary..**.**
1bea0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
1beb0 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
1bec0 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65 78  led after the ex
1bed0 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65  pression has bee
1bee0 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79  n.** analyzed by
1bef0 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
1bf00 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76  xprNames()..*/.v
1bf10 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
1bf20 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
1bf30 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e  (NameContext *pN
1bf40 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  C, Expr *pExpr){
1bf50 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77  .  Walker w;.  w
1bf60 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
1bf70 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
1bf80 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  e;.  w.xSelectCa
1bf90 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65  llback = analyze
1bfa0 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65  AggregatesInSele
1bfb0 63 74 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20  ct;.  w.u.pNC = 
1bfc0 70 4e 43 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  pNC;.  sqlite3Wa
1bfd0 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72  lkExpr(&w, pExpr
1bfe0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  );.}../*.** Call
1bff0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
1c000 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20  yzeAggregates() 
1c010 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73  for every expres
1c020 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78  sion in an.** ex
1c030 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
1c040 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
1c050 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a  r of errors..**.
1c060 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  ** If an error i
1c070 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61  s found, the ana
1c080 6c 79 73 69 73 20 69 73 20 63 75 74 20 73 68 6f  lysis is cut sho
1c090 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rt..*/.void sqli
1c0a0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
1c0b0 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78  gList(NameContex
1c0c0 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74  t *pNC, ExprList
1c0d0 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75   *pList){.  stru
1c0e0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
1c0f0 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
1c100 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
1c110 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  .    for(pItem=p
1c120 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
1c130 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
1c140 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
1c150 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
1c160 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
1c170 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  pNC, pItem->pExp
1c180 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  r);.    }.  }.}.
1c190 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
1c1a0 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 72 65 67  a single new reg
1c1b0 69 73 74 65 72 20 66 6f 72 20 75 73 65 20 74 6f  ister for use to
1c1c0 20 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65 72   hold some inter
1c1d0 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 2e 0a  mediate result..
1c1e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65  */.int sqlite3Ge
1c1f0 74 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a  tTempReg(Parse *
1c200 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70  pParse){.  if( p
1c210 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d  Parse->nTempReg=
1c220 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1c230 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1c240 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50  .  }.  return pP
1c250 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d  arse->aTempReg[-
1c260 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  -pParse->nTempRe
1c270 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61  g];.}../*.** Dea
1c280 6c 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73 74  llocate a regist
1c290 65 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69 6c  er, making avail
1c2a0 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 20 66  able for reuse f
1c2b0 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  or some other.**
1c2c0 20 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20   purpose..**.** 
1c2d0 49 66 20 61 20 72 65 67 69 73 74 65 72 20 69 73  If a register is
1c2e0 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
1c2f0 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f 6c   used by the col
1c300 75 6d 6e 20 63 61 63 68 65 2c 20 74 68 65 6e 0a  umn cache, then.
1c310 2a 2a 20 74 68 65 20 64 61 6c 6c 6f 63 61 74 69  ** the dallocati
1c320 6f 6e 20 69 73 20 64 65 66 65 72 72 65 64 20 75  on is deferred u
1c330 6e 74 69 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 20  ntil the column 
1c340 63 61 63 68 65 20 6c 69 6e 65 20 74 68 61 74 20  cache line that 
1c350 75 73 65 73 0a 2a 2a 20 74 68 65 20 72 65 67 69  uses.** the regi
1c360 73 74 65 72 20 62 65 63 6f 6d 65 73 20 73 74 61  ster becomes sta
1c370 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
1c380 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1c390 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  g(Parse *pParse,
1c3a0 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 66   int iReg){.  if
1c3b0 28 20 69 52 65 67 20 26 26 20 70 50 61 72 73 65  ( iReg && pParse
1c3c0 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79  ->nTempReg<Array
1c3d0 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65  Size(pParse->aTe
1c3e0 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20 69 6e  mpReg) ){.    in
1c3f0 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20  t i;.    struct 
1c400 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20  yColCache *p;.  
1c410 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
1c420 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
1c430 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
1c440 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
1c450 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65        if( p->iRe
1c460 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20 20  g==iReg ){.     
1c470 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20     p->tempReg = 
1c480 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
1c490 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n;.      }.    }
1c4a0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65  .    pParse->aTe
1c4b0 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54  mpReg[pParse->nT
1c4c0 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67  empReg++] = iReg
1c4d0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
1c4e0 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c  llocate or deall
1c4f0 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66  ocate a block of
1c500 20 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69 76   nReg consecutiv
1c510 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2f 0a 69  e registers.*/.i
1c520 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d  nt sqlite3GetTem
1c530 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  pRange(Parse *pP
1c540 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b  arse, int nReg){
1c550 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69  .  int i, n;.  i
1c560 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67   = pParse->iRang
1c570 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72  eReg;.  n = pPar
1c580 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20  se->nRangeReg;. 
1c590 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 26 26 20   if( nReg<=n && 
1c5a0 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63  !usedAsColumnCac
1c5b0 68 65 28 70 50 61 72 73 65 2c 20 69 2c 20 69 2b  he(pParse, i, i+
1c5c0 6e 2d 31 29 20 29 7b 0a 20 20 20 20 70 50 61 72  n-1) ){.    pPar
1c5d0 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b 3d  se->iRangeReg +=
1c5e0 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73   nReg;.    pPars
1c5f0 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d 20  e->nRangeReg -= 
1c600 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nReg;.  }else{. 
1c610 20 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 6e     i = pParse->n
1c620 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73  Mem+1;.    pPars
1c630 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b  e->nMem += nReg;
1c640 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b  .  }.  return i;
1c650 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  .}.void sqlite3R
1c660 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
1c670 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1c680 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65  nt iReg, int nRe
1c690 67 29 7b 0a 20 20 69 66 28 20 6e 52 65 67 3e 70  g){.  if( nReg>p
1c6a0 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
1c6b0 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
1c6c0 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65 67  nRangeReg = nReg
1c6d0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52  ;.    pParse->iR
1c6e0 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b 0a  angeReg = iReg;.
1c6f0 20 20 7d 0a 7d 0a                                  }.}.